<?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 Solutions &lt;br/&gt;- Jobs: Subcontractors, Stockholm Sweden</title>
	<guid>http://www.erlang-solutions.com/jobs/detail/33/</guid>
	<link>http://www.erlang-solutions.com/jobs/detail/33/</link>
	<description>We are looking for subcontractors available on a full time basis with immediate start on a rolling three months contract.&lt;br /&gt;&lt;br /&gt;Roles will involve working as part of a small team of Erlang developers from our Stockholm Office.&lt;br /&gt;&lt;br /&gt;You should have experience of developing reliable, fault tolerant applications in Erlang. Experience with linux/bsd, networking, riak and erlang web/nitrogen is highly desirable.&lt;br /&gt;&lt;br /&gt;Knowledge of SMS communications protocols, SIP, Telecom and embedded will assist in your consideration for this role.&lt;br /&gt;&lt;br /&gt;Immediate start to contract if you are the right person. Rates to reflect skill level and aptitude.</description>
	<pubDate>Thu, 02 Sep 2010 11:30:28 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: TextOne for iPhone, with photo sharing!</title>
	<guid>http://www.process-one.net/en/blogs/article/textone_for_iphone_with_photo_sharing/</guid>
	<link>http://www.process-one.net/en/blogs/article/textone_for_iphone_with_photo_sharing/</link>
	<description>&lt;p&gt;Our iPhone version of TextOne, the simple and fast messenger for smartphones, has received a nice photo sharing feature.&lt;/p&gt; &lt;p&gt;TextOne, the simple, light and fast smartphone messenger, is now offering a new feature to share photos with your friends.&lt;/p&gt;
&lt;p&gt;Easy, a new icon appears at the top right of the conversation screen, you just need to tap it.&lt;/p&gt;
&lt;p&gt;There, you can choose to take a picture or select one from your albums... and add the text you wish.&lt;/p&gt;
&lt;div&gt;&lt;img src=&quot;http://www.process-one.net/images/uploads/IMG_0045.PNG&quot; width=&quot;160&quot; /&gt;&lt;/div&gt;
&lt;p&gt;This will appear in the conversation as a taped instant photo, like any other messages.&lt;/p&gt;
&lt;div&gt;&lt;img src=&quot;http://www.process-one.net/images/uploads/IMG_0040.PNG&quot; width=&quot;160&quot; /&gt;&lt;/div&gt;
&lt;p&gt;You can also browse the photos exchanged with your contacts.&lt;/p&gt;
&lt;div&gt;&lt;img src=&quot;http://www.process-one.net/images/uploads/IMG_0044.PNG&quot; width=&quot;160&quot; /&gt; &lt;img src=&quot;http://www.process-one.net/images/uploads/IMG_0043.PNG&quot; width=&quot;160&quot; /&gt;&lt;/div&gt;
&lt;p&gt;Of course, this also works with TextOne Pink!&lt;/p&gt;
&lt;div&gt;&lt;img src=&quot;http://www.process-one.net/images/uploads/Pink.png&quot; width=&quot;160&quot; /&gt;&lt;/div&gt;
&lt;p&gt;Photo sharing in TextOne will let you share good moments with the people to whom you are close. Or alternatively play ;-)&lt;/p&gt;
&lt;p&gt;And finally, you can play with it&lt;/p&gt;
&lt;div&gt;&lt;img src=&quot;http://www.process-one.net/images/uploads/IMG_0042.PNG&quot; width=&quot;160&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 02 Sep 2010 08:43:34 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: What's New in CouchDB 1.0 Security 'n Stuff</title>
	<guid>tag:damienkatz.net,2010://1.586</guid>
	<link>http://damienkatz.net/2010/08/whats_new_in_couchdb_10_securi.html</link>
	<description>&lt;p&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;div&gt;Today, I get a little help from Rebecca. She's writing a CouchApp, an
application that is served right out of CouchDB and that lives in the browser.
It has no middle tier application server in Ruby or Java. The application and
display logic is written in JavaScript, the user interface is HTML &amp;amp; CSS, the
backend is CouchDB and uses Ajax to shove JSON back and forth.&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.couch.io/post/1027100082/whats-new-in-couchdb-1-0-part-4-securityn-stuff&quot;&gt;What's new in CouchDB 1.0 -- Part 4: Security 'n Stuff: Users, Authentication, Authorisation and Permissions&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 01 Sep 2010 00:36:22 +0000</pubDate>
</item>
<item>
	<title>Programming in the 21st Century: Common Sense, Part 1</title>
	<guid>http://prog21.dadgum.com/78.html</guid>
	<link>http://prog21.dadgum.com/78.html</link>
	<description>There's a photo of mine in the September 2010 issue of &lt;a href=&quot;http://en.wikipedia.org/wiki/Popular_Photography_Magazine&quot;&gt;Popular Photography&lt;/a&gt;. I'm excited about it; my photo credits are few and far between, and it brings back the &lt;a href=&quot;http://prog21.dadgum.com/46.html&quot;&gt;feelings&lt;/a&gt; I had when I wrote for magazines long ago. Completely ignoring the subject of the image, there are couple of surprising facts about it.
&lt;br /&gt;&lt;br /&gt;The first is that it was a taken on a circa-2004 Canon PowerShot G5, a camera with a maximum resolution of five megapixels.
&lt;br /&gt;&lt;br /&gt;The second is that it's a doubly-compressed JPEG. The original photo was a JPEG, then I adjusted the colors and contrast a bit, and saved it out as a new JPEG. Each save lost some of the image quality. I was perfectly willing to submit the adjusted photo as a giant TIFF to avoid that second compression step, but was told not to worry about it; the JPEG would be fine.
&lt;br /&gt;&lt;br /&gt;Yet there it is: the five megapixel, doubly-compressed photo, printed across almost two pages of the magazine. And those two technical facts are irrelevant. I can't tell the difference; it looks great in print.
&lt;br /&gt;&lt;br /&gt;Now it &lt;b&gt;is&lt;/b&gt; an impressionistic shot, so it could just be that the technical flaws aren't noticeable in this case. Fortunately, I have another anecdote to back it up.
&lt;br /&gt;&lt;br /&gt;Last year I was in New Mexico and took a lot of photos. After I got back home, I decided to get a few photo books printed. The source images were all twelve megapixel JPEGs, but the book layout software recommended a six megapixel limit. I cut the resolution in half, again twice-compressing them. When I got the finished books back, the full-page photos were sharp and beautiful.
&lt;br /&gt;&lt;br /&gt;The standard, pedantic advice about printing photos is that resolution is everything. Shoot as high as possible. Better yet, save everything as RAW files, so there's no lossy compression. Any JPEG compression below maximum is unacceptable. Double-compression is an error of the highest order, one only made by rank amateurs. And so it goes. But I know from personal experience that while it sounds authoritative, and while it's most likely given in a well-meaning manner, it's advice that's endlessly repeated in a loose, &quot;how could it possibly be wrong?&quot; sort of way and never actually tested.</description>
	<pubDate>Tue, 31 Aug 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>Erlang Inside: Russia’s numerous contributions to the Erlang community – Dmitrii Dimandt, creator of erlanger.ru</title>
	<guid>http://erlanginside.com/?p=191</guid>
	<link>http://erlanginside.com/erlang-in-russia-guest-post-from-dmitrii-dimandt-191</link>
	<description>Erlang Inside is sponsored by Inaka Networks, Erlang consultants combining experience with Telecom to build high performance web applications. This week, Erlang Inside has a guest post from Dmitrii Dimandt, a Russian developer and creator of the site erlanger.ru. I&amp;#8217;d like to talk about the Russian Erlang community and what it&amp;#8217;s doing with Erlang. In [...]</description>
	<pubDate>Mon, 30 Aug 2010 16:58:43 +0000</pubDate>
</item>
<item>
	<title>Chicago Erlang User Group: 6/2/2010 OTP Plus</title>
	<guid>tag:blogger.com,1999:blog-2706443342944599131.post-177823659720456521</guid>
	<link>http://chicagoerlangusergroup.blogspot.com/2010/08/622010-otp-plus.html</link>
	<description>Here's the video from the group meeting on 6/2/2010 on &quot;How to use OTP&quot;.   OTP makes coding with Erlang just so much easier.   OTP just abstracts so much coding away.   Jon Patton discussed using gen_servers and Tristan Sloughter discussed using gen_supervisors.   Great talks guys!!A couple of other impromptu talks were also given.  Martin Logan talked about terminology and how we can discuss and</description>
	<pubDate>Sun, 29 Aug 2010 21:15:00 +0000</pubDate>
	<author>noreply@blogger.com (Barry Nicholson)</author>
</item>
<item>
	<title>Nicolas Charpentier's blog: Next language to learn: Haskell</title>
	<guid>http://charpi.net/blog/?p=228</guid>
	<link>http://charpi.net/blog/2010/08/28/next-language-to-learn-haskell/</link>
	<description>Remembering  &amp;#8221;The pragmatic programmer: Fro, Journeyman to Master&amp;#8221;, each developer should learn a new language each year.
This year, I will give its chance to Haskell.
Why Haskell ?
Scala was a candidate for this year but Haskell has a strong reputation in the functional world. I came to functional with Erlang because of its concurrent and distribution [...]</description>
	<pubDate>Sat, 28 Aug 2010 19:36:45 +0000</pubDate>
</item>
<item>
	<title>Programming in the 21st Century: Personal Programming</title>
	<guid>http://prog21.dadgum.com/77.html</guid>
	<link>http://prog21.dadgum.com/77.html</link>
	<description>I've mentioned &lt;a href=&quot;http://prog21.dadgum.com/56.html&quot;&gt;before&lt;/a&gt; that this site is generated by a small Perl script. How small? Exactly 6838 bytes, which includes comments and an HTML template. Mentioning Perl may horrify you if you came here to read about Erlang, but it's a good match for the problem. Those 6838 bytes have been so pleasant to work on that I wanted to talk about them a bit.
&lt;br /&gt;&lt;br /&gt;I've used well-known blogging applications, and each time I've come away with the same bad taste, one that's caused by a combination of quirky rich formatting and having to edit text in a small window inside of a browser. I don't want to worry about presentation details: choosing fonts, line spacing, etc. It's surprising how often there are subtle mismatches between the formatting shown in a WYSIWYG editing window and what the final result looks like. Where did that extra blank line come from? Why do some paragraphs have padding below them but others don't?
&lt;br /&gt;&lt;br /&gt;I decided to see if I could bypass all of that and have a folder of entries marked-up with basic annotations, then have a way to convert that entire folder into a real site. And that's pretty much what I ended up with. The sidebar and &quot;Previously&quot; list and dated permalink are all automatically generated. Ditto for the atom feed and &lt;a href=&quot;http://prog21.dadgum.com/archives.html&quot;&gt;archives&lt;/a&gt; page. The command-line formatter lets me rebuild any page, defaulting to the newest entry. If I want to change the overall layout of the site, I can regenerate all of the pages in a second or so.
&lt;br /&gt;&lt;br /&gt;There are still legitimate questions about the path I chose. &quot;Why not grab an open source program and modify it to fit your needs?&quot; &quot;You do realize that you decided to write an entirely new system from scratch, just because you didn't like a few things in existing programs; surely that's a serious net loss?&quot;
&lt;br /&gt;&lt;br /&gt;My response is simple: I did it because it was &lt;i&gt;easy&lt;/i&gt;. If I get annoyed with some feature of Microsoft Word, I'm not going to think even for a second about writing my own alternative. But the site generation program just took a bit of tinkering here and there over the course of a weekend. It never felt daunting. It didn't require anything I'd label as &quot;engineering.&quot; I spent more time getting the site design and style sheet right, something I would have done even if I used other software.
&lt;br /&gt;&lt;br /&gt;Since then, I've made small adjustments and additions to the original script. I added the archive page nine months later. Earlier this year I added a fix for some smaller feed aggregation sites that don't properly handle relative links. Just today I added mark-up support for block quotes. That last one took ten minutes and four lines of code.
&lt;br /&gt;&lt;br /&gt;If this suddenly got complicated, if I needed to support &lt;a href=&quot;http://prog21.dadgum.com/57.html&quot;&gt;reader comments&lt;/a&gt; and ten different feed formats and who knows what else, I'd give it up. I have no interest in turning these 6838 bytes into something that requires a grand architecture to keep from collapsing. But there's some magic in a solution that's direct, reliable, easy to understand, and one that fits my personal vision of how it should work.
&lt;br /&gt;&lt;br /&gt;(If you liked this, you might like &lt;a href=&quot;http://prog21.dadgum.com/49.html&quot;&gt;Micro-Build Systems and the Death of a Prominent DSL&lt;/a&gt;.)</description>
	<pubDate>Sat, 28 Aug 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: Why Large Hadron Collider Scientists are Using CouchDB</title>
	<guid>tag:damienkatz.net,2010://1.585</guid>
	<link>http://damienkatz.net/2010/08/why_large_hadron_collider_scie.html</link>
	<description>&lt;p&gt;A nice article on ReadWriteWeb: &lt;a href=&quot;http://www.readwriteweb.com/enterprise/2010/08/lhc-couchdb.php&quot;&gt;http://www.readwriteweb.com/enterprise/2010/08/lhc-couchdb.php&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the case study: &lt;a href=&quot;http://www.couch.io/case-study-cern&quot;&gt;http://www.couch.io/case-study-cern&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 27 Aug 2010 02:51:27 +0000</pubDate>
</item>
<item>
	<title>Erlang Solutions &lt;br/&gt;- Jobs: Junior Systems Engineer at Erlang Solutions, London, Stockholm or Krakow (travel to client locations may be required)</title>
	<guid>http://www.erlang-solutions.com/jobs/detail/32/</guid>
	<link>http://www.erlang-solutions.com/jobs/detail/32/</link>
	<description>With our portfolio of customer facing projects increasing in all our offices, we are looking for talented individuals to join our young and dynamic teams. You will need to be passionate about Erlang and believe it can be the next Java. The right candidate will join a small team of highly skilled systems engineers developing software in Erlang/OTP. You will gain valuable experience in exciting state-of-the-art systems within the Telecom, Financial Services, Banking, Messaging, Automotive and Logistics sectors. As our clients are spread on six continents, fear of flying is unfortunately a &amp;#8220;no no&amp;#8221;.&amp;#160; &lt;br /&gt;&lt;br /&gt;1.&amp;#160;&amp;#160;&amp;#160; Responsibilities:&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; Research, design, development, test and support of Erlang and related software &lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; Develop solutions using distributed concurrent programming, software &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; packaging and release &lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; Write code in Erlang and occasionally in other languages such as C, Java, Clojure, Haskell, Scala &amp;#38; Objective-C to name but a few of our favourites.&lt;br /&gt;&lt;br /&gt;2.&amp;#160;&amp;#160;&amp;#160; Skills and experience required: &lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; Be passionate about Erlang&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; A minimum of 1 year&amp;#8217;s Erlang programming even if it has been a hobby or &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; academic project&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; Experience with other languages such as C and Java, and it's always good to have another perspective&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; Knowledge of Distributed Computing, and revision control software&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (preferably GIT or Subversion)&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; Experience of implementation of soft real time servers&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; Experience with interconnection protocols (HTTP, XMPP, SMPP, ...)&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; Experience with Linux, OS X and Solaris operating systems&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; Experience with web front-end development will be a plus&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; Experience with Agile Methods, including Test Driven Development will be&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; an advantage&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; Problem-solving and thinking laterally as part of a team, or individually, to meet the needs of the project&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; Good verbal and written communication in English &lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; Good customer facing and presentation skills.&lt;br /&gt;&lt;br /&gt;3. Minimum Education, Certification, Training:&lt;br /&gt;A degree in Computer Science, preferably a Masters. &lt;br /&gt;&lt;br /&gt;4. Eligibility:&lt;br /&gt;The right candidate will work in a rapidly expanding company and community, receive a competitive salary with full benefits and stock options. Applicants will be considered only if they are currently eligible to work in the EU, but remote work will be considered for ideal candidates. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
	<pubDate>Thu, 26 Aug 2010 11:30:30 +0000</pubDate>
</item>
<item>
	<title>Erlang Solutions &lt;br/&gt;- Jobs: Senior Systems Engineer at Erlang Solutions , Location:  London, Stockholm or Krakow (travel to client locations may be required)</title>
	<guid>http://www.erlang-solutions.com/jobs/detail/31/</guid>
	<link>http://www.erlang-solutions.com/jobs/detail/31/</link>
	<description>With our portfolio of customer facing projects increasing in all our offices, we are now looking for talented individuals to join us. They will need to like travel, be passionate about Erlang and see a future in this technology area.&lt;br /&gt;The right candidate will lead and programme in a small team of highly skilled systems engineers in developing Erlang/OTP software to meet customer requirements. &lt;br /&gt;Selected candidates will be leading the development of state-of-the-art Erlang systems in the Telecom, Financial Services, Banking, Messaging, Automotive and Logistics sectors. &lt;br /&gt;&lt;br /&gt;1.&amp;#160;&amp;#160; &amp;#160;Responsibilities:&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160; &amp;#160;Research, design, development, test and support of Erlang based software &lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160; &amp;#160;Develop solutions using distributed concurrent programming, software &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; packaging and release &lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160; &amp;#160;Write code in Erlang and occasionally in other languages such as C, Java, Clojure, Haskell, Scala &amp;#38; Objective-C to name but a few of our favourites&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160; &amp;#160;Evaluation of open source Erlang killer apps&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160; &amp;#160;Mentoring and coaching junior staff.&lt;br /&gt;&lt;br /&gt;2.&amp;#160;&amp;#160; &amp;#160;Skills and experience required: &lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160; &amp;#160;Be passionate about Erlang&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160; &amp;#160;Superstar programming skills in Erlang/OTP, possibly 3 or more years &amp;#160;&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160; &amp;#160;Experience with other Programming languages&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160; &amp;#160;Knowledge of Distributed Computing, and revision control software&amp;#160;&amp;#160; &amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (preferably Git and Subversion)&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160; &amp;#160;Experience of implementation of soft real time servers&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160; &amp;#160;Experience with interconnection protocols (HTTP, XMPP, SMPP, ...)&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160; &amp;#160;Experience with web front-end development is an advantage &amp;#160;&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160; &amp;#160;Experience with mainstream operating systems, including Linux, OS X &amp;#38; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Solaris derivatives &lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160; &amp;#160;Experience with Agile Methods, including Test Driven Development &lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160; &amp;#160;Experience of planning, estimating and leading a team is an advantage&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160; &amp;#160;Good verbal and written communication in English &lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160; &amp;#160;Good presentation skills and public speaking experience.&lt;br /&gt;&lt;br /&gt;3. Minimum Education, Certification, Training:&lt;br /&gt;A degree in Computer Science, preferably a Masters. &lt;br /&gt;&lt;br /&gt;4. Eligibility:&lt;br /&gt;The right candidate will work in a rapidly expanding company and community, receive a competitive salary with full benefits and stock options. Applicants will be considered only if they are currently eligible to work in the EU, but remote work will be considered for ideal candidates. &lt;br /&gt;&lt;br /&gt;</description>
	<pubDate>Thu, 26 Aug 2010 11:15:28 +0000</pubDate>
</item>
<item>
	<title>Erlang Solutions &lt;br/&gt;- Jobs: Open Source Support Engineers at Erlang Solutions, London, Stockholm or Krakow (occasional travel may be required)</title>
	<guid>http://www.erlang-solutions.com/jobs/detail/30/</guid>
	<link>http://www.erlang-solutions.com/jobs/detail/30/</link>
	<description>We&amp;#8217;re looking for people with world class technical and communication skills and a strong desire to see Erlang become the next Java. Experience in supporting and troubleshooting Open Source applications, preferably in Erlang, is a must.&lt;br /&gt;If you know what open source development is all about, we definitively want to hear from you. Experience of trouble-shooting C applications or virtual machines is certainly a plus.&lt;br /&gt;&amp;#160;&lt;br /&gt;1.&amp;#160;&amp;#160;&amp;#160;&amp;#160; Responsibilities:&lt;br /&gt;&amp;#183;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Maintaining Erlang / OTP systems and distributions&lt;br /&gt;&amp;#183;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Working closely with Erlang enthusiasts, the open source community as well as customers&amp;#8217; operational and technical support staff on community patches&lt;br /&gt;&amp;#183;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Maintaining SLAs and response times with our clients&lt;br /&gt;&amp;#183;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Experienced individuals will help establish the support process as well as service levels and agreements&lt;br /&gt;&amp;#160;&lt;br /&gt;2.&amp;#160;&amp;#160;&amp;#160;&amp;#160; Skills and experience required&lt;br /&gt;&amp;#183;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Be passionate about Erlang&lt;br /&gt;&amp;#183;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Superstar trouble-shooting skills in Erlang/OTP&amp;#160; &lt;br /&gt;&amp;#183;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Experience with other languages, including C and Java&lt;br /&gt;&amp;#183;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Experience contributing to or enabling open source&lt;br /&gt;&amp;#183;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Familiarity with Git and other revision control systems&lt;br /&gt;&amp;#183;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Database administration skills in Couchdb, Riak, and obviously Mnesia&lt;br /&gt;&amp;#183;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Experience with Ejabberd, Rabbitmq, Disco and other open source Erlang killer applications&lt;br /&gt;&amp;#183;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Comfortable with Linux, Unix, Vxworks and other embedded/desktop operating systems&lt;br /&gt;&amp;#183;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Experience of providing software support as well as being in previous customer facing roles will be a distinct advantage&lt;br /&gt;&amp;#183;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Good verbal and written communication in English.&lt;br /&gt;&amp;#160;&lt;br /&gt;3. Minimum Education, Certification, Training: A degree in Computer Science, preferably a Masters.&lt;br /&gt;&amp;#160;&lt;br /&gt;4. Eligibility:&lt;br /&gt;The right candidate will work in a rapidly expanding company and community, receive a competitive salary with full benefits and stock options. Applicants will be considered only if they are currently eligible to work in the EU, but remote work will be considered for ideal candidates.&lt;br /&gt;&lt;br /&gt;&amp;#160;</description>
	<pubDate>Thu, 26 Aug 2010 11:15:28 +0000</pubDate>
</item>
<item>
	<title>Erlang Solutions &lt;br/&gt;- News: 25 August 2010: Erlang User Conference Registration Open with a Very-Early Bird Rate!</title>
	<guid>http://www.erlang-solutions.com/news/1/entry/1172</guid>
	<link>http://www.erlang-solutions.com/news/1/entry/1172</link>
	<description>Registration for the &lt;a href=&quot;http://www.erlang-factory.com/conference/ErlangUserConference2010&quot; target=&quot;_blank&quot;&gt;Sixteenth International Erlang User Conference&lt;/a&gt; and &lt;a href=&quot;http://www.erlang-factory.com/conference/ErlangUserConference2010/university&quot; target=&quot;_blank&quot;&gt;Erlang University&lt;/a&gt; courses are now open. The first 100 people to register will receive a Very-Early Bird Discount and pay only SEK 750 including VAT! &lt;span&gt;DON&amp;#8217;T MISS OUT as last year's conference sold out.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href=&quot;http://www.erlang-factory.com/conference/ErlangUserConference2010&quot; target=&quot;_blank&quot;&gt;Sixteenth International Erlang User Conference&lt;/a&gt; will take place in Stockholm, on the 16th November 2010.&lt;br /&gt;&lt;br /&gt;In addition to the conference itself, there will be the &lt;a href=&quot;http://www.erlang-factory.com/conference/ErlangUserConference2010/university&quot; target=&quot;_blank&quot;&gt;Erlang University&lt;/a&gt; - three-day Erlang training courses from 17th to 19th November. There will also be a day of Erlang Tutorials on the 15th.&lt;br /&gt;&lt;br /&gt;Registering for one of the University courses: &lt;a href=&quot;http://www.erlang-factory.com/conference/ErlangUserConference2010/university/erlangexpress&quot; target=&quot;_blank&quot;&gt;Erlang Express&lt;/a&gt; or &lt;a href=&quot;http://www.erlang-factory.com/conference/ErlangUserConference2010/university/optexpress&quot; target=&quot;_blank&quot;&gt;OTP Express&lt;/a&gt; includes entry to the Erlang User Conference, so don't waste time and &lt;a href=&quot;https://www.erlang-factory.com/conference/ErlangUserConference2010/register&quot; target=&quot;_blank&quot;&gt;register now&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Speakers and talks will be announced shortly. &lt;br /&gt;&lt;br /&gt;</description>
	<pubDate>Wed, 25 Aug 2010 16:47:09 +0000</pubDate>
</item>
<item>
	<title>Erlang Factory News: Erlang User Conference Registration Open with a Very-Early Bird Rate!</title>
	<guid>http://erlang-factory.com/news/rss/0a96f60f0e819af2d572a9dc61a21b38</guid>
	<link></link>
	<description>&lt;p&gt;Registration for the Sixteenth International Erlang User Conference and&amp;nbsp;&lt;a href=&quot;http://erlang-factory.com/../conference/ErlangUserConference2010/university&quot; target=&quot;_blank&quot;&gt;Erlang University&lt;/a&gt; courses are now open. The first 100 people to register will receive a   Very-Early Bird Discount and pay only SEK 750 including VAT! &lt;strong&gt;DON&amp;rsquo;T MISS OUT&lt;/strong&gt; as last year's conference sold out.&lt;/p&gt;</description>
	<pubDate>Wed, 25 Aug 2010 13:46:30 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: The Little Comedian</title>
	<guid>tag:damienkatz.net,2010://1.584</guid>
	<link>http://damienkatz.net/2010/08/the_little_comedian.html</link>
	<description>&lt;p&gt;Gwen: Knock knock.&lt;/p&gt;

&lt;p&gt;Me: Who's there?&lt;/p&gt;

&lt;p&gt;Gwen: Knock knock.&lt;/p&gt;

&lt;p&gt;Me: Who's there?&lt;/p&gt;

&lt;p&gt;Gwen: Knock knock.&lt;/p&gt;

&lt;p&gt;Me: Who's there?&lt;/p&gt;

&lt;p&gt;Gwen: Banana!&lt;/p&gt;

&lt;p&gt;Me: Banana who?&lt;/p&gt;

&lt;p&gt;Gwen: Orange you glad I didn't say orange again?&lt;/p&gt;

&lt;p&gt;Us: BWAHAHAHA!&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;mt-enclosure mt-enclosure-image&quot;&gt;&lt;a href=&quot;http://damienkatz.net/pics/Photo%20on%202010-08-20%20at%2018.46.jpg&quot;&gt;&lt;img alt=&quot;Photo on 2010-08-20 at 18.46.jpg&quot; src=&quot;http://damienkatz.net/assets_c/2010/08/Photo on 2010-08-20 at 18.46-thumb-450x337.jpg&quot; width=&quot;450&quot; height=&quot;337&quot; class=&quot;mt-image-none&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
	<pubDate>Sat, 21 Aug 2010 01:53:18 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: Tsung 1.3.3 has been released</title>
	<guid>http://www.process-one.net/en/blogs/article/tsung_1.3.3_has_been_released/</guid>
	<link>http://www.process-one.net/en/blogs/article/tsung_1.3.3_has_been_released/</link>
	<description>&lt;p&gt;Tsung 1.3.3 fixes severals bugs. It fixes support for SSL with erlang R14A.&lt;/p&gt; &lt;p&gt;Tsung 1.3.3 brings some minor bugfixes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fixed parent proxy not working in 1.3.x (tested with 1.3.2 and 1.3.0).&lt;/li&gt;
&lt;li&gt;fixed url substitution is broken in some cases&lt;/li&gt;
&lt;li&gt;fixed Tsung not using sessions with low probabilities&lt;/li&gt;
&lt;li&gt;fixed SSL not working with erlang R14A&lt;/li&gt;
&lt;li&gt;fixed failure when a proxy is used and an URL substitution is set&lt;/li&gt;
&lt;li&gt;fixed HTTP cookies support when a proxy is used&lt;/li&gt;
&lt;li&gt;fixed hanging at the beginning using distributed setup&lt;/li&gt;
&lt;li&gt;fixed &quot;if&quot; statement, which is not allowed in a transaction&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Thu, 19 Aug 2010 16:18:31 +0000</pubDate>
</item>
<item>
	<title>Erlang Solutions &lt;br/&gt;- News: 19 August 2010: Ulf Wiger CTO of Erlang Solutions will be presenting at Cracow Grid Workshop ‘10.</title>
	<guid>http://www.erlang-solutions.com/news/1/entry/1168</guid>
	<link>http://www.erlang-solutions.com/news/1/entry/1168</link>
	<description>Presenting at the conference which runs October 11th - 13th in Krakow, Poland&lt;span&gt;, &lt;/span&gt;Ulf will look at how Erlang is breaking out of the clusters of the last century and entering today's cloud computing environments.&lt;br /&gt;&amp;#160; &lt;br /&gt;The main objective of the Cracow Grid Workshops, which were initiated in 2001, is to support the community of researchers, developers, and practitioners who work in the fascinating field of e-Science, grid systems, and their applications. It will also be celebrating its 10th Anniversary this year. &lt;br /&gt;&amp;#160; &lt;br /&gt;For more information please visit the CGW &amp;#8217;10 &lt;a href=&quot;http://www.cyfronet.krakow.pl/cgw10&quot; target=&quot;_blank&quot;&gt;website&lt;/a&gt;. &lt;span&gt;&lt;br /&gt;&lt;/span&gt;</description>
	<pubDate>Thu, 19 Aug 2010 14:02:15 +0000</pubDate>
</item>
<item>
	<title>Erlang Solutions &lt;br/&gt;- News: 17 August 2010: Ulf Wiger of Erlang Solutions will be presenting at Yow! Australia 2010 in Brisbane and Melbourne</title>
	<guid>http://www.erlang-solutions.com/news/1/entry/1164</guid>
	<link>http://www.erlang-solutions.com/news/1/entry/1164</link>
	<description>Ulf will be giving a talk titled, Erlang Warps Your Mind: Concurrency-Oriented Programming , and two workshops, Erlang: A Language for Programming Reliable Systems and Erlang/OTP System Principles.&lt;br /&gt;&amp;#160;&lt;br /&gt;During &amp;#8220;Erlang Warps Your Mind: Concurrency-Oriented Programming&amp;#8221; he will try to show how learning Erlang will make you a better programmer.&lt;br /&gt;&amp;#160;&lt;br /&gt;&amp;#8220;Erlang: A Language for Programming Reliable Systems&amp;#8221;, a hands on tutorial, will give you an introduction to the Erlang programming language.&lt;br /&gt;&amp;#160;&lt;br /&gt;During &amp;#8220;Erlang/OTP System Principles&quot; you will get an insight in to the theory and concepts behind Erlang design principles, learning how concurrency design patterns they are used to build industrial grade systems.&lt;br /&gt;&amp;#160;&lt;br /&gt;The &lt;a href=&quot;http://www.yowconference.com.au/index.html&quot; target=&quot;_blank&quot;&gt;YOW! Australia 2010&lt;/a&gt; Developer Conference offers outstanding opportunities to learn more about the latest practices, technologies and methods and for building innovative software solutions with the opportunity to hear and meet international software experts and network with the other talented developers in Australia.&lt;br /&gt;&amp;#160;&lt;br /&gt;Melbourne Dates: The talk will be&amp;#160; 2-3 December with the workshops on November 30th to December 1st. &lt;br /&gt;Brisbane Dates: The Talk will be 6December 6th-7th with the workshops on December 8th-9th.&lt;br /&gt;&lt;br /&gt;For more information on the conference, click &lt;a href=&quot;http://www.yowconference.com.au/index.html&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt; and for more information on Ulf&amp;#8217;s presentations click &lt;a href=&quot;http://www.yowconference.com.au/brisbane/speakers/details.html?speakerId=1687&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;. &lt;br /&gt;&amp;#160;&amp;#160; &lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;</description>
	<pubDate>Tue, 17 Aug 2010 08:47:07 +0000</pubDate>
</item>
<item>
	<title>Erlware: ErlangCamp - Erlang and OTP Workshop in Chicago Oct 23 and 24</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-3046911927303715073</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/ZDaZ9qAY7dg/erlangcamp-erlang-and-otp-workshop-in.html</link>
	<description>ErlangCamp is here! You may have seen the announcement on the erlang.org already. ErlangCamp is a two day hands on workshop for those interested in learning how to go from novices or experienced levels of programming Erlang to being able to confidently write production grade Erlang/OTP services.

ErlangCamp is an opportunity to learn from those who have done a ton with OTP and Erlang and put many
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/Th7kd46tFO-WiymVaGzNUcu41ac/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/Th7kd46tFO-WiymVaGzNUcu41ac/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/Th7kd46tFO-WiymVaGzNUcu41ac/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/Th7kd46tFO-WiymVaGzNUcu41ac/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/ZDaZ9qAY7dg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 14 Aug 2010 13:18:50 +0000</pubDate>
	<author>martinjlogan@erlware.org (Martin J. Logan)</author>
</item>
<item>
	<title>Damien Katz: WARNING: CouchDB 1.0.0 Data Loss bug</title>
	<guid>tag:damienkatz.net,2010://1.583</guid>
	<link>http://damienkatz.net/2010/08/warning_couchdb_10_data_loss_b.html</link>
	<description>&lt;p&gt;&lt;strong&gt;Update August 13, 2010. A data recovery tool now available: &lt;/strong&gt; &lt;a href=&quot;http://wiki.couchone.com/page/repair-tool&quot;&gt;http://wiki.couchone.com/page/repair-tool&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;if you are running CouchDB 1.0.0 with the default delayed commit setting, you are subject to serious data loss on restart. See this page for instructions how to force all outstanding commits and configure your server at runtime to run in the safer full commit mode: &lt;a href=&quot;http://couchdb.apache.org/notice/1.0.1.html&quot;&gt;http://couchdb.apache.org/notice/1.0.1.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The page also includes details of the bug and a postmortem.&lt;/p&gt;

&lt;p&gt;0.11.1 and earlier are unaffected. Servers with delayed commits turned off are unaffected.  1.0.1 will be coming shortly that fixes the problem in all configurations.&lt;/p&gt;

&lt;p&gt;DO NOT COMPACT THE DATABASE! Compaction throws away any lost updates permanently.&lt;/p&gt;

&lt;p&gt;Data recovery is coming. The CouchDB core contributors are working on a utility to reliably recover lost updates, so no data is lost as long the database file is not compacted.&lt;/p&gt;</description>
	<pubDate>Fri, 13 Aug 2010 18:42:41 +0000</pubDate>
</item>
<item>
	<title>Erlang Solutions &lt;br/&gt;- News: 12 August 2010: Hans Nilsson of Erlang Solutions will be presenting at Java Zone 2010</title>
	<guid>http://www.erlang-solutions.com/news/1/entry/1163</guid>
	<link>http://www.erlang-solutions.com/news/1/entry/1163</link>
	<description>In his talk entitled &lt;span&gt;&amp;#8220;Introducing Erlang to the OO Community&amp;#8221;&lt;/span&gt;. Hans will look at&amp;#160; whether anything at all can be modelled without objects? He will describe why Erlang, originally invented to handle the next generation of Telecom products, has become successful in a much wider range of sectors including embedded devices, messaging systems, banking and e-commerce.&lt;br /&gt;&lt;br /&gt;He will also introduce the Erlang programming language, describing how to do more with less. Hans will be giving examples on the syntax and constructs which allow Erlang programs to be 4 : 10 times shorter than their counterparts in Java, C and C++ while achieving 99,999% availability. He will provide examples not only of the Ericsson success stories, but also from banking, finance, distributed databases, instant messaging and web2.0, describing how Erlang has found its role in these market segments.&lt;br /&gt;&lt;br /&gt;For more information click &lt;a href=&quot;http://javazone.no/incogito10/events/JavaZone%202010/sessions#7dc796d9-e121-4fbb-a2d5-2162e7755333&quot; target=&quot;_self&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;</description>
	<pubDate>Thu, 12 Aug 2010 14:16:56 +0000</pubDate>
</item>
<item>
	<title>Jordan Wilberding: ErlangCamp Chicago 2010</title>
	<guid>http://blog.diginux.net/?p=67</guid>
	<link></link>
	<description>I am happy to to announce ErlangCamp Chicago 2010 (http://erlangcamp.com/) has gone live and is ready to take registrations. This has been in planning for quite a while between Martin Logan, Eric Merritt, Tristan Sloughter, and myself. We are trying to help build the Erlang community here in the U.S. We hope by providing an [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=blog.diginux.net&amp;blog=933922&amp;post=67&amp;subd=diginux&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 09 Aug 2010 19:29:06 +0000</pubDate>
</item>
<item>
	<title>Chicago Erlang User Group: ErlangCamp Chicago 2010 Registration Open</title>
	<guid>tag:blogger.com,1999:blog-2706443342944599131.post-326203861245882543</guid>
	<link>http://chicagoerlangusergroup.blogspot.com/2010/08/erlangcamp-chicago-2010-registration_08.html</link>
	<description>We are pleased to announce ErlangCamp Chicago 2010 (http://erlangcamp.com/) has gone live and is ready to take registrations. If you want to learn how to build production ready Erlang/OTP systems, this workshop is for you.</description>
	<pubDate>Mon, 09 Aug 2010 01:31:00 +0000</pubDate>
	<author>noreply@blogger.com (Jordan Wilberding)</author>
</item>
<item>
	<title>EazyErl!: erlang: Simple Debug macro</title>
	<guid>tag:blogger.com,1999:blog-855944390206940143.post-1145348141157059748</guid>
	<link>http://easyerl.blogspot.com/2010/07/simple-debug-macro.html</link>
	<description>When testing things I need some quick way to debug &quot;a la&quot; printf() style. Old habits :)&lt;br /&gt;&lt;br /&gt;Here's is the simple debug macro I use:&lt;br /&gt;&lt;pre&gt;-ifdef(debug).&lt;br /&gt;-define(DEBUG(Format, Args), io:format(&quot;~s.~w: DEBUG: &quot; ++ Format, [ ?MODULE, ?LINE | Args])).&lt;br /&gt;-else.&lt;br /&gt;-define(DEBUG(Format, Args), true).&lt;br /&gt;-endif.&lt;br /&gt;&lt;/pre&gt;Write it down in a &quot;debug.hrl&quot; file, then you only need to add this line in any file header:&lt;br /&gt;&lt;pre&gt;-include(&quot;debug.hrl&quot;).&lt;br /&gt;&lt;/pre&gt;This simple macro gives you the module name and the line number. This saves me a lot of time.&lt;br /&gt;&lt;br /&gt;Then you need to define the &quot;debug&quot; atom to let your macro do what you want. The compile:file/2 handles options for this, the syntax is &lt;a href=&quot;http://erldocs.com/R14A/compiler/compile.html?i=5&amp;search=compile#file/2&quot;&gt;{d, debug}&lt;/a&gt;&lt;br /&gt;&lt;a name=&quot;more&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can also use some simple helper module to compile multiples files using simple regexp:&lt;br /&gt;Here's the code: &lt;br /&gt;&lt;pre&gt;-module(utils_compile).&lt;br /&gt;&lt;br /&gt;-export([c/1, c/2, d/1, d/2]).&lt;br /&gt;&lt;br /&gt;c(FilePattern) -&amp;gt;&lt;br /&gt; c(FilePattern, &quot;../ebin&quot;).&lt;br /&gt;&lt;br /&gt;c(FilePattern, OutDir) -&amp;gt;&lt;br /&gt; filelib:fold_files(&quot;.&quot;, FilePattern ++ &quot;.erl$&quot;, false, &lt;br /&gt; fun(X, _Acc) -&amp;gt; &lt;br /&gt;  io:format(&quot;Compiling ~p~n&quot;, [ X ]), &lt;br /&gt;  compile:file(X, [{outdir, OutDir}, report]) end, []).&lt;br /&gt;&lt;br /&gt;d(FilePattern) -&amp;gt;&lt;br /&gt; d(FilePattern, &quot;../ebin&quot;).&lt;br /&gt;&lt;br /&gt;d(FilePattern, OutDir) -&amp;gt;&lt;br /&gt; filelib:fold_files(&quot;.&quot;, FilePattern ++ &quot;.erl$&quot;, false, &lt;br /&gt; fun(X, _Acc) -&amp;gt; &lt;br /&gt;  io:format(&quot;Compiling (debug) ~p~n&quot;, [ X ]), &lt;br /&gt;  compile:file(X, [{outdir, OutDir}, {d, debug}, report]) end, []).&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-1145348141157059748?l=easyerl.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sat, 07 Aug 2010 14:46:25 +0000</pubDate>
	<author>noreply@blogger.com (rolphin)</author>
</item>
<item>
	<title>ejabberd@jabber.ru: ejabberd 3.0.0-alpha-1 - for alpha-testing only</title>
	<guid>http://www.ejabberd.im/4191 at http://www.ejabberd.im</guid>
	<link>http://www.ejabberd.im/ejabberd-3.0.0-alpha-1</link>
	<description>&lt;p&gt;This first alpha includes three major changes compared to &lt;a href=&quot;http://www.ejabberd.im/ejabberd-2.1.5&quot;&gt;ejabberd 2.1.5&lt;/a&gt;: exmpp library is used, gen_storage for a database abstraction layer, and Massive Hosting which isn't yet usable.&lt;/p&gt;
&lt;p&gt;Many tables have changed both in Mnesia and MySQL/PgSQL/ODBC. Fortunately, now ejabberd is able to create tables, update the tables and reformat their content in Mnesia and also in external databases. Or at least it should do.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.ejabberd.im/ejabberd-3.0.0-alpha-1&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 06 Aug 2010 22:01:26 +0000</pubDate>
</item>
<item>
	<title>Erlang Inside: ErlangCamp Chicago 2010 – Oct 23rd/24th</title>
	<guid>http://erlanginside.com/?p=187</guid>
	<link>http://erlanginside.com/erlangcamp-chicago-2010-oct-23rd24th-187</link>
	<description>Incredibly cheap at $100.00 USD - Two days of Erlang/OTP sessions in Chicago - check it out. &lt;a href=&quot;http://erlangcamp.com/&quot;&gt;http://erlangcamp.com/&lt;/a&gt;</description>
	<pubDate>Fri, 06 Aug 2010 17:35:32 +0000</pubDate>
</item>
<item>
	<title>1011 Ltd Blog: Why Google Wave &quot;failed&quot;</title>
	<guid>tag:1011ltd.com,2010-08-06:/web/blog/why_wave_failed</guid>
	<link>http://www.1011ltd.com/</link>
	<description>&lt;p&gt;
Google Announced this week that they &lt;a href=&quot;http://googleblog.blogspot.com/2010/08/update-on-google-wave.html&quot;&gt;&quot;don't plan to continue Wave as a standalone product&quot;&lt;/a&gt;, which was a surprise. The twitterverse and technology press went crazy with the news. Even the Financial Times &lt;a href=&quot;http://www.ft.com/cms/s/2/c8d0b62e-a01e-11df-81eb-00144feabdc0.html?ftcamp=rss&quot;&gt;reported&lt;/a&gt; on the demise of Wave. I've been involved on the fringes of Wave, building clients, gadgets, prototyping servers, using the web client extensively, but since Google I/O 2010 I don't think I've touched it. Why did it &quot;fail&quot;, and how can other projects learn from the mistakes?
&lt;/p&gt;

&lt;div&gt;&lt;a href=&quot;http://www.1011ltd.com/web/blog/post/why_wave_failed&quot;&gt;continue reading...&lt;/a&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 06 Aug 2010 09:19:00 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: CouchDB Diplom Thesis</title>
	<guid>tag:damienkatz.net,2010://1.582</guid>
	<link>http://damienkatz.net/2010/08/couchdb_diplom_thesis.html</link>
	<description>&lt;blockquote&gt;&lt;div&gt;It's whooping 163 pages containing all the nitty-gritty-researchy details on why CouchDB is the number one choice for writing distributed applications in both the small and large scale.&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.couch.io/post/903223195/diplom-thesis-realisation-of-a-distributed-application&quot;&gt;Diplom Thesis: Realisation of a Distributed Application Using the Document-Oriented Database CouchDB by Lena Herrmann&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;mt-enclosure mt-enclosure-image&quot;&gt;&lt;a href=&quot;http://blog.couch.io/post/903223195/diplom-thesis-realisation-of-a-distributed-application&quot;&gt;&lt;img alt=&quot;diplom_couchdb.jpg&quot; src=&quot;http://damienkatz.net/pics/diplom_couchdb.jpg&quot; width=&quot;450&quot; height=&quot;336&quot; class=&quot;mt-image-none&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 06 Aug 2010 00:30:46 +0000</pubDate>
</item>
<item>
	<title>Erlang Solutions &lt;br/&gt;- News: 05 August 2010: Announcing the call for submissions for the Erlang User Conference 2010 in Stockholm.</title>
	<guid>http://www.erlang-solutions.com/news/1/entry/1161</guid>
	<link>http://www.erlang-solutions.com/news/1/entry/1161</link>
	<description>The 2010 &lt;span&gt;Erlang User Conference&lt;/span&gt; in
Stockholm will be held on &lt;strong&gt;Tuesday the 16th of November&lt;/strong&gt;. Monday
the 15th of November will be dedicated to &lt;span&gt;Erlang&lt;/span&gt; &lt;strong&gt;&lt;span&gt;Tools Tutorials&lt;/span&gt;&lt;/strong&gt;, the Erlang User
Conference will take place on the 16&lt;sup&gt;th&lt;/sup&gt; November. With &lt;span&gt;The Erlang
University&lt;/span&gt; training courses being held on the 17&lt;sup&gt;th &lt;/sup&gt;- 19th November.

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;We
have now opened the call for talks and tutorials for the 2010 conference. Talk
submissions should be 30 minutes in length, including five minutes for a
Q&amp;#38;A session. Tutorial submissions can be of 1.5 or 3 hours in duration and
should be aimed at a technical audience. For your chance to present at the
Erlang User conference 2010 submit a talk via the &lt;strong&gt;&lt;span&gt;&lt;a href=&quot;http://www.erlang-factory.com/conference/ErlangUserConference2010/submit_talk&quot;&gt;EUC2010
Submissions page&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;.&lt;span&gt;&amp;#160;
&lt;/span&gt;The deadline is the 10&lt;sup&gt;th&lt;/sup&gt; September at the latest.&lt;/p&gt;</description>
	<pubDate>Thu, 05 Aug 2010 14:33:09 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: We are hiring open source contributors!</title>
	<guid>tag:damienkatz.net,2010://1.581</guid>
	<link>http://damienkatz.net/2010/08/we_are_hiring_open_source_cont.html</link>
	<description>&lt;p&gt;We are hiring front end and back end engineers, documentation writer, trainer, release engineer and managers. Must have an open source background. See our jobs page for more info:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://couch.io/jobs&quot;&gt;http://couch.io/jobs&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 04 Aug 2010 23:36:27 +0000</pubDate>
</item>
<item>
	<title>ejabberd@jabber.ru: ejabberd 2.1.5 - Fifth bugfix release</title>
	<guid>http://www.ejabberd.im/4184 at http://www.ejabberd.im</guid>
	<link>http://www.ejabberd.im/ejabberd-2.1.5</link>
	<description>&lt;p&gt;ejabberd 2.1.5 has been released. It contains several minor bugfixes and a few improvements.&lt;/p&gt;
&lt;p&gt;This is a short list of changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Erlang/OTP R12 support fixed&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.erlang.org/&quot;&gt;Erlang/OTP&lt;/a&gt; R14A support added&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openssl.org/&quot;&gt;OpenSSL&lt;/a&gt; 0.9.8 or higher is required&lt;/li&gt;
&lt;li&gt;BOSH: New optional connection attribute process-delay&lt;/li&gt;
&lt;li&gt;C2S: Don't ask for client certificate when using tls&lt;/li&gt;
&lt;li&gt;C2S: Inform client that SSL session caching is disabled&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;http://www.ejabberd.im/ejabberd-2.1.5&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 03 Aug 2010 16:35:54 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: ejabberd 2.1.5 and exmpp 0.9.5 bugfix releases</title>
	<guid>http://www.process-one.net/en/blogs/article/ejabberd_2.1.5_and_exmpp_0.9.5_bugfix_releases/</guid>
	<link>http://www.process-one.net/en/blogs/article/ejabberd_2.1.5_and_exmpp_0.9.5_bugfix_releases/</link>
	<description>&lt;p&gt;We are pleased to announce the bugfix releases ejabberd 2.1.5 and exmpp 0.9.5.&lt;/p&gt; &lt;h1&gt;Regarding ejabberd 2.1.5:&lt;/h1&gt;
&lt;p&gt;The main changes are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Erlang/OTP R12 support fixed&lt;/li&gt;
&lt;li&gt;Erlang/OTP R14A support added&lt;/li&gt;
&lt;li&gt;OpenSSL 0.9.8 or higher is required&lt;/li&gt;
&lt;li&gt;BOSH: New optional connection attribute process-delay&lt;/li&gt;
&lt;li&gt;C2S: Don't ask for client certificate when using TLS&lt;/li&gt;
&lt;li&gt;C2S: Inform client that SSL session caching is disabled&lt;/li&gt;
&lt;li&gt;CTL: Fix problem when FIREWALL_WINDOW options for erl kernel were used&lt;/li&gt;
&lt;li&gt;CTL: Some systems delete the lock dir; in such case don't use Flock at all&lt;/li&gt;
&lt;li&gt;Caps: Support all the hash functions required by XEP-0115&lt;/li&gt;
&lt;li&gt;Config: Fix typo in --enable-transient_supervisors&lt;/li&gt;
&lt;li&gt;Config: New configure option: --enable-nif&lt;/li&gt;
&lt;li&gt;Extauth: Support parallel script running&lt;/li&gt;
&lt;li&gt;MUC: Allow admins to see private rooms in disco&lt;/li&gt;
&lt;li&gt;ODBC: Correct handling of SQL boolean types&lt;/li&gt;
&lt;li&gt;ODBC: Discard too old queued requests (the caller has already got a timeout)&lt;/li&gt;
&lt;li&gt;ODBC: Fixes wrong SQL escaping when --enable-full-xml is set&lt;/li&gt;
&lt;li&gt;ODBC: Use ets instead of asking supervisor in ejabberd_odbc_sup:get_pids/1&lt;/li&gt;
&lt;li&gt;Pubsub: Enforce disco features results&lt;/li&gt;
&lt;li&gt;S2S: When logging s2s out connection attempt or success, log if TLS is used&lt;/li&gt;
&lt;li&gt;Shared Rosters: When account is deleted, delete also member of stored rosters&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Release Notes&lt;/h2&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/ejabberd/release_notes/release_note_ejabberd_2.1.5&quot;&gt;http://www.process-one.net/en/ejabberd/release_notes/release_note_ejabberd_2.1.5&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&amp;nbsp; installation path and the configuration options.&lt;/p&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;p&gt;The list of solved tickets since previous version is available on ProcessOne bug tracker:&lt;br /&gt;&lt;a href=&quot;http://redir.process-one.net/ejabberd-2.1.5&quot;&gt;http://redir.process-one.net/ejabberd-2.1.5&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ejabberd 2.1.5 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/ejabberd/downloads&quot;&gt;http://www.process-one.net/en/ejabberd/downloads&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h1&gt;Regarding exmpp 0.9.5:&lt;/h1&gt;
&lt;p&gt;Brief summary of changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add method to retrieve underling connection properties&lt;/li&gt;
&lt;li&gt;Configurable Zlib support&lt;/li&gt;
&lt;li&gt;Fix BOSH that didn't work&lt;/li&gt;
&lt;li&gt;Modify exmpp_component to use exmpp_socket instead of exmpp_tcp&lt;/li&gt;
&lt;li&gt;Negotiate zlib compression before OR after SASL&lt;/li&gt;
&lt;li&gt;Raise requirement to Erlang/OTP R12B-5&lt;/li&gt;
&lt;li&gt;Replace calls to OTP module ssl_pkix with public_key&lt;/li&gt;
&lt;li&gt;STARTTLS support&lt;/li&gt;
&lt;li&gt;Session enhancements&lt;/li&gt;
&lt;li&gt;Stream compression support for session&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;p&gt;exmpp home page:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://support.process-one.net/doc/display/EXMPP/&quot;&gt;http://support.process-one.net/doc/display/EXMPP/&lt;/a&gt; or easier to remember: &lt;a href=&quot;http://exmpp.org/&quot;&gt;http://exmpp.org/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Download exmpp 0.9.5 source code package from:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://download.process-one.net/exmpp/&quot;&gt;http://download.process-one.net/exmpp/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can also check the ProcessOne Labs page:&lt;/p&gt;
&lt;p&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>Tue, 03 Aug 2010 15:35:28 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: Getting Your Open Source Project to 1.0</title>
	<guid>tag:damienkatz.net,2010://1.580</guid>
	<link>http://damienkatz.net/2010/07/getting_your_open_source_proje_1.html</link>
	<description>&lt;p&gt;The project I founded, Apache CouchDB, &lt;a href=&quot;http://www.nytimes.com/external/idg/2010/07/14/14idg-couchdb-nosql-database-ready-for-production-use-58614.html&quot;&gt;recently hit 1.0&lt;/a&gt;. I'm very proud :)&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;mt-enclosure mt-enclosure-image&quot;&gt;&lt;img alt=&quot;saucelabscupcakes.jpg&quot; src=&quot;http://damienkatz.net/pics/saucelabscupcakes.jpg&quot; width=&quot;450&quot; height=&quot;435&quot; class=&quot;mt-image-none&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;em&gt;Awesome 1.0 cupcakes from Sauce Labs.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It's been a long time, but we finally produced a release that's complete, performs well and is rock solid.&lt;/p&gt;

&lt;p&gt;Already CouchDB is on over 10 million machines. It's used by big respected websites (like the BBC) and groundbreaking organizations (Mozilla and Canonical). We run on most *nix, OS X, Windows, and even Android phones. Have dozens of frameworks and client libraries available. There are &lt;a href=&quot;http://couchdb.apache.org/docs/books.html&quot;&gt;2 books available&lt;/a&gt; for sale right now. There is a venture capital backed startup, &lt;a href=&quot;https://cloudant.com/&quot;&gt;Cloudant&lt;/a&gt;, that offers CouchDB hosting and scales to huge datasets. And I'm CEO of another venture backed ($2 million invested) 12 person start-up, &lt;a href=&quot;http://couch.io&quot;&gt;Couchio&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So how did I get here? It took a lot of time and effort (almost 5 years!), and the help of a lot of people. Here are some tips of what it took to get CouchDB to 1.0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Successful open source projects need a reason for being. You need to decide why you are creating a project and what problems it solves. Whether it's one or many reasons, you need to figure out what they are and explain them.&lt;/p&gt;

&lt;p&gt;Perhaps you are making something new, that hasn't existed. Why hasn't it existed it before? No had the idea? No one had the will to carry it through? Or maybe you are making something that's already in existence, like an HTTP server. What are your reasons? Simpler, faster, more features, different license?&lt;/p&gt;

&lt;p&gt;If you are just doing it as a learning exercise, that's fine. But don't expect to attract a community until you can explain why it's useful beyond you own personal goals.&lt;/p&gt;

&lt;p&gt;With CouchDB, my reasons were:&lt;br /&gt;
1. A schemaless document database with views, bi-directional replication and conflict detection to enable disconnected operation would be really useful.&lt;br /&gt;
2. I wanted to understand more about creating distributed systems and database internals.&lt;/p&gt;

&lt;p&gt;No one cares about reason #2 except for me. But the first reason is compelling.&lt;/p&gt;

&lt;p&gt;Make sure you can tell people why your project exists and what it's good for. And put the reasons on your project site where people can find them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Comes First&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't start a project unless you have a deep commitment to being a strong coder.&lt;/p&gt;

&lt;p&gt;Now I'm not saying you must be a strong coder to participate in a project. Not at all. I'm saying that you must be strong coder to lead one. Maybe you'll get lucky and somehow attract a some really good coders to your project. But most really good coders go to projects with already solid codebases, or start their own.&lt;/p&gt;

&lt;p&gt;Also, you don't have to be a strong coder when you start out, but you should know the basics and have a strong desire to learn and get better. Don't expect to attract anyone to your project until you have a substantial amount of working code that isn't a big ball of spaghetti.&lt;/p&gt;

&lt;p&gt;With CouchDB, I always emphasized the quality of the high-level design and code implementation. We cannot under any circumstances lose or corrupt your committed data, or get things into an inconsistent state. Reliability and durability are absolutely imperative. Any design or implementation that doesn't meet these goals doesn't make it into the project.&lt;/p&gt;

&lt;p&gt;Some projects might not have an emphasis on the reliability, but on absolute performance. That's a fine choice to make, but make sure your users know what they are trading off. And then actually deliver on the performance.&lt;/p&gt;

&lt;p&gt;As the project moves along, you will need to ensure the code quality (reliability, performance, resource, usage, etc) is improving over time. If you aren't a good coder, you won't be able to do this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Know What You Aren't&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Almost as important as knowing what your project is trying to accomplish, is know what it isn't trying to accomplish.&lt;/p&gt;

&lt;p&gt;When your project starts to get traction, but before it's done, you'll get a lot of people who want the project to work more like things they've used in the past. New users might think your goals and abilities are cool, but they'd trade it all for just a little more. They'll want everything your project does, plus a pony.&lt;/p&gt;

&lt;p&gt;The problem is feature and scope creep. Even if you are successfully keeping the project on track, the community may get slowed down dealing with people trying to make it something it's not. Stating clearly what your project isn't trying to do or be helps make it much easier to explain what you can't implement or change.&lt;/p&gt;

&lt;p&gt;Now, you can't define everything your project isn't. (It's not a video game. It's not accounting software. It's not a banana. It's not a rainbow. etc.). But you can find the things it's related to, overlaps with, or might be confused with, and explicitly say it's not those things.&lt;/p&gt;

&lt;p&gt;With CouchDB, because we are a database, people often asked us to add features that were in traditional RDBMS's, but didn't fit well with the CouchDB data model. Not being intimately familiar with CouchDB's model and how it all fits together, they don't realize that what they're asking for simply doesn't work. But because we explicitly stated on the project site we aren't a relational database and aren't trying to replace relational databases, it made it much easier to explain why those features weren't a good fit for what CouchDB is trying to accomplish.&lt;/p&gt;

&lt;p&gt;So if you don't clearly define what your project isn't, often people will try to make it into those things. This can damage the community, as moving forward is slower and people feel like they aren't being listened to. Be explicit what you aren't, and it makes it much easier to focus on what you actually are.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't Do Everything (Well)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So you are superstar coder, your code is clear and concise and high quality, you write clear complete documentation, your create all the tests, and you fix every bug. You are awesome!&lt;/p&gt;

&lt;p&gt;Thing is, you might be awesome, but until you actually get a community behind the project, the project will be limited in an absolute sense by what a single person can produce. And if you are doing everything, that's not a whole lot. Trying to do everything well means you'll probably never actually release anything.&lt;/p&gt;

&lt;p&gt;Unfortunately, at first, you _will_ need to do everything. But just don't do everything really well. Instead, you'll have do some things crappily, and then move on. In addition to writing all the code, you'll need to: Create a project site. Explain your project. Write documentation. Do the releases. Start a bug tracker. Create a mailing list and answer questions. And you'll have to do most of these things poorly if you want to keep moving the ball forward.&lt;/p&gt;

&lt;p&gt;You'll have to do some things poorly. But you'll need to pick a few things that you do really well and execute on those things. (The code should be one of the things you do well).&lt;/p&gt;

&lt;p&gt;And everything you do, you'll need to make it easy for others to participate. To add patches, to update and create documentation, make bug reports and send patches. And make it clear that help is desired.&lt;/p&gt;

&lt;p&gt;Don't get hung up on trying to make everything perfect. That just paralyzes you. But by picking a few things to do well, you will attract people to help you with the things you aren't doing well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Community Wants to Help&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open Source is awesome in the way it attracts people who just want to help make something cool. Many people want to contribute their time, but only if they think their help will amount to something in the long run. They don't want to spend time and effort on something that doesn't yet show potential or might be abandoned if the creators lose interest.&lt;/p&gt;

&lt;p&gt;If you have a solid codebase, then it becomes much easier to attract people to your community. If people can recognize there is at least something high quality about your project, but it's lacking in some areas, people will want to help you in those areas. But you have to have the high quality pieces in place. People don't want to be the one excellent contributor to dreck. They'd rather not have their efforts associated at all.&lt;/p&gt;

&lt;p&gt;They do want to be a part of something great. They want to add their work and make it even better. They want to contribute to projects where the total excellence of the project reflects well on them and their efforts. They want to make the world a better place, and don't want their efforts wasted.&lt;/p&gt;

&lt;p&gt;And people who like making the world a better place are exactly the kind of people you want to attract. You want people to have pride in their contributions, and to feel like they are really positively affecting the things they care about. Those people have lots of projects to choose where they can add their time and talents. If they feel their efforts on your project are wasted, they are gone. Make sure the people who show a strong desire to contribute aren't ignored, and feel like their efforts will eventually amount to something.&lt;/p&gt;

&lt;p&gt;Being a part of Apache has helped CouchDB tremendously. Partially it's because Apache has helped our visibility and credibility. But it's also because we've adopted the &quot;Apache Way&quot;, which is more focused on the community aspects of a project than on any specific contributor. Without our amazingly active community, CouchDB would be far behind where it is now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Community Is Often Incompetent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately, many people who will want to help you will produce contributions of poor quality. You will have deal with this &quot;help&quot;, and do so diplomatically. The best way to point out the shortcomings with their contributions is to identify what needs improvement without denigrating their overall effort. This can be hard, and many don't want to hear why their efforts aren't up to the project's standards.&lt;/p&gt;

&lt;p&gt;Sometimes you have to hurt peoples feelings. But it's better to be honest then to have the quality of your project brought down. If they can't handle the feedback, so be it. The good news is the people who do listen to constructive criticism and actually improve the quality of their contributions are incredibly valuable. Look for these people and nurture their involvement.&lt;/p&gt;

&lt;p&gt;With CouchDB, we try to listen to all members of our community, but we only grant commit access to the ones who have shown high quality contributions. Our committers are our first line of defense against poor code and design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paul Graham Was Right&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It seems to make sense to choose a mainstream language for your project. The more mainstream it is, the larger the potential community you can attract. While that's true to an extent, the quality of the community is more important than its absolute size. Much more important.&lt;/p&gt;

&lt;p&gt;Using a mainstream language means you are also competing for contributor's time from other projects in the same language. So the pool is large, but in the end, you still have to attract quality developers from other things competing for their attention. And the competition might actually be stronger in that larger pool.&lt;/p&gt;

&lt;p&gt;The more mainstream a language, the more likely it is that a random developer knows it because it's what they use at work. They aren't necessarily interested in being more productive, being more reliable, or whatever. They are interested in getting paid, and they choose their language not for elegance, power or performance, but for the number of job openings available.&lt;/p&gt;

&lt;p&gt;If you pick a non-mainstream, more esoteric language, you tend to get a higher quality of developer. You tend to find people who absolutely love programming and building, and choose their languages not based on the scale of pay, but because they make the developers and projects more powerful. So while the total pool of contributors is smaller, they tend to give a higher quality of contribution. You get a much better signal to noise ratio.&lt;/p&gt;

&lt;p&gt;As Paul Graham explained in &lt;a href=&quot;http://www.paulgraham.com/avg.html&quot;&gt;Beating the Averages&lt;/a&gt;, the exotic languages tend to attract devs who love to learn and expand their toolbox. You'll attract more of the types of devs who don't mind creating new code to fill in the gaps, or diving into source to find a bug. They aren't afraid of what they don't know, they actually get excited by the chance to learn and do something new.&lt;/p&gt;

&lt;p&gt;But if you pick enterprisey language X, you might find you are spending more of your time fixing problems and dealing with developers who just don't &quot;get it&quot;. If you aren't careful, this can drown your project and bring the total code quality down to the point where you can't find good devs to help you anymore. With the less popular, esoteric languages, that tends to be less of a problem and you get a higher quality of contribution in general.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Your Brain&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I can keep listing all the stuff we did, but you aren't creating the same project under the same circumstances. Pretty much everything I've said here, we've &lt;em&gt;not&lt;/em&gt; followed at some point during the project. Often it was to the detriment of the project, but sometimes it just didn't make sense to blindly follow a rule or guideline.&lt;/p&gt;

&lt;p&gt;You have a brain, and using it is the most important thing to remember at anytime. Projects can't follow cookie cutter rules. Even the &quot;Apache Way&quot;, as I've discovered, means different things to different people, often at different times.&lt;/p&gt;

&lt;p&gt;So take my advice here with a grain of salt, and use your brain to figure out what's actually important to you, your project and it's community. Good luck!&lt;/p&gt;</description>
	<pubDate>Sun, 01 Aug 2010 17:38:17 +0000</pubDate>
</item>
<item>
	<title>Hypothetical Labs: Part 1: Introducing riak_core</title>
	<guid>http://weblog.hypotheticalabs.com/?p=539</guid>
	<link>http://weblog.hypotheticalabs.com/?p=539</link>
	<description>&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;What is riak_core?&lt;/h2&gt;
&lt;p&gt;
  &lt;code&gt;riak_core&lt;/code&gt; is a single OTP application which provides all the services necessary to write a modern, well-behaved distributed application. &lt;code&gt;riak_core&lt;/code&gt; began as part of &lt;a href=&quot;http://wiki.basho.com&quot;&gt;Riak&lt;/a&gt;. Since the code was generally useful in building all kinds of distributed applications &lt;a href=&quot;http://www.basho.com&quot;&gt;we&lt;/a&gt; decided to refactor and separate the core bits into their own codebase to make it easier to use.
  &lt;/p&gt;
&lt;p&gt;
  Distributed systems are complex and some of that complexity shows in the amount of features available in &lt;code&gt;riak_core&lt;/code&gt;. Rather than dive deeply into code, I&amp;#8217;m going to separate the features into broad categories and give an overview of each.
  &lt;/p&gt;
&lt;p&gt;
  &lt;em&gt;Note: If you&amp;#8217;re the impatient type and want to skip ahead and start reading code, you can check out the source to &lt;code&gt;riak_core&lt;/code&gt; via &lt;a href=&quot;http://bitbucket.org/basho/riak_core&quot;&gt;hg&lt;/a&gt; or &lt;a href=&quot;http://github.com/basho/riak_core&quot;&gt;git&lt;/a&gt;.&lt;/em&gt;
  &lt;/p&gt;
&lt;h3&gt;Node Liveness &amp;amp; Membership&lt;/h3&gt;
&lt;p&gt;
  &lt;code&gt;riak_core_node_watcher&lt;/code&gt; is the process responsible for tracking the status of nodes within a riak_core cluster. It uses &lt;code&gt;net_kernel&lt;/code&gt; to efficiently monitor many nodes. &lt;code&gt;riak_core_node_watcher&lt;/code&gt; also has the capability to take a node out of the cluster programmatically. This is useful in situations where a brief node outage is necessary but you don&amp;#8217;t want to stop the server software completely.
  &lt;/p&gt;
&lt;p&gt;
  &lt;code&gt;riak_core_node_watcher&lt;/code&gt; also provides an API for advertising and locating services around the cluster. This is useful in clusters where nodes provide a specialized service, like a CUDA compute node, which is used by other nodes in the cluster.
  &lt;/p&gt;
&lt;p&gt;
  &lt;code&gt;riak_core_node_watch_events&lt;/code&gt; cooperates with &lt;code&gt;riak_core_node_watcher&lt;/code&gt; to generate events based on node activity, i.e. joining or leaving the cluster, etc. Interested parties can register callback functions which will be called as events occur.
  &lt;/p&gt;
&lt;h3&gt;Partitioning &amp;amp; Distributing Work&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;riak_core&lt;/code&gt; uses a master/worker configuration on each node to manage the execution of work units. Consistent hashing is used to determine which target node(s) to send the request and the master process on each node farms out the request to the actual workers. &lt;code&gt;riak_core&lt;/code&gt; calls worker processes &lt;code&gt;vnode&lt;/code&gt;s. The coordinating process is the &lt;code&gt;vnode_master&lt;/code&gt;.
  &lt;/p&gt;
&lt;p&gt;The partitioning and distribution logic inside &lt;code&gt;riak_core&lt;/code&gt; also handles hinted handoff when required. Hinted handoff occurs as a result of a node failure or outage. In order to assure availability, most clustered systems will use operational nodes in place of down nodes. When the down node comes back the cluster needs to migrate the data from its temporary home on the substitute nodes to the data&amp;#8217;s permanent home on the restored node. This process is called hinted handoff and is managed by components inside &lt;code&gt;riak_core&lt;/code&gt;. &lt;code&gt;riak_core&lt;/code&gt; also handles migrating partitions to new nodes when they join the cluster such that all work continues to be evenly partitioned to all cluster members.
  &lt;/p&gt;
&lt;p&gt;
  &lt;code&gt;riak_core_vnode_master&lt;/code&gt; starts all the worker vnodes on a given node and routes requests to&lt;br /&gt;
  the vnodes as the cluster runs.
  &lt;/p&gt;
&lt;p&gt;
  &lt;code&gt;riak_core_vnode&lt;/code&gt; is an OTP behavior wrapping all the boilerplate logic required to implement a vnode. Application-specific vnodes need to implement a handful of callback functions in order to participate in handoff sessions and receive work units from the master.
  &lt;/p&gt;
&lt;h3&gt;Cluster State&lt;/h3&gt;
&lt;p&gt;A &lt;code&gt;riak_core&lt;/code&gt; cluster stores global state in a ring structure. The state information is transferred between nodes in the cluster in a controlled manner to keep all cluster members in sync. This process is referred to as &amp;#8220;gossiping&amp;#8221;.
  &lt;/p&gt;
&lt;p&gt;&lt;code&gt;riak_core_ring&lt;/code&gt; is the module used to create and manipulate the ring state data shared by all nodes in the cluster. Ring state data includes items like partition ownership and cluster-specific ring metadata. Riak KV stores bucket metadata in the ring metadata, for example.
  &lt;/p&gt;
&lt;p&gt;&lt;code&gt;riak_core_ring_manager&lt;/code&gt; manages the cluster ring for a node. It is the main entry point for application code accessing the ring, via &lt;code&gt;riak_core_ring_manager:get_my_ring/1&lt;/code&gt;, and also keeps a persistent snapshot of the ring in sync with the current ring state.
  &lt;/p&gt;
&lt;p&gt;&lt;code&gt;riak_core_gossip&lt;/code&gt; manages the ring gossip process and insures the ring is generally consistent across the cluster.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;What&amp;#8217;s the plan?&lt;/h2&gt;
&lt;p&gt;Over the next several months  I&amp;#8217;m going to cover the process of building a real application in a series of posts to this blog where each post covers some aspect of system building with &lt;code&gt;riak_core&lt;/code&gt;. All of the source to the application will be published under the Apache2 licensed and shared via a public repo on github.
  &lt;/p&gt;
&lt;p&gt;And what type of application will we build? Since the goal of this series is to illustrate how to build distributed systems using &lt;code&gt;riak_core&lt;/code&gt; and also satisfy my own technical curiosity I&amp;#8217;ve decided to build a distributed graph database. A graph database should provide enough use cases to really exercise &lt;code&gt;riak_core&lt;/code&gt; while at the same time not obscuring the core learning experience in tons of complexity.
  &lt;/p&gt;
&lt;p&gt;
  Thanks to Sean Cribbs and Andy Gross for providing helpful review and feedback.
 &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Fri, 30 Jul 2010 17:30:09 +0000</pubDate>
</item>
<item>
	<title>Learn You Some Erlang: Errors and Processes</title>
	<guid>http://learnyousomeerlang.com/errors-and-processes</guid>
	<link>http://learnyousomeerlang.com/errors-and-processes</link>
	<description>Errors and Processes might be the last chapter released before Learn You Some Erlang hits its one year mark (see: http://ferd.ca/learn-you-some-erlang-a-year-in.html). Thanks to all dedicated readers and reviewers. This chapter covers the building blocks of error management with concurrent Erlang: linking processes together, handling different signals sent between processes when they crash, monitoring actors and naming them. This should be the last material required before we build a real concurrent application in Erlang.</description>
	<pubDate>Thu, 29 Jul 2010 12:30:00 +0000</pubDate>
</item>
<item>
	<title>Programming in the 21st Century: Stop the Vertical Tab Madness</title>
	<guid>http://prog21.dadgum.com/76.html</guid>
	<link>http://prog21.dadgum.com/76.html</link>
	<description>In &lt;a href=&quot;http://prog21.dadgum.com/75.html&quot;&gt;One Small Step Toward Reducing Programming Language Complexity&lt;/a&gt; I added &quot;Who even knows what &quot;\v&quot; (vertical tab) does?&quot; as an off the cuff comment. Re-reading that made me realize something that's blatantly obvious in retrospect, so obvious that I've gone all this time without noticing it:
&lt;br /&gt;&lt;br /&gt;No one is actually using the vertical tab escape sequence.
&lt;br /&gt;&lt;br /&gt;And I truly mean &quot;no one.&quot; If I could stealthily patch the compiler for any language supporting the &quot;\v&quot; escape so I'd receive mail whenever it occurred in source code, then I could trace actual uses of it. I'm willing to bet that all the mail would come from beginners trying to figure out what the heck &quot;\v&quot; actually does, and then giving up when they realize it doesn't do anything. That's because it &lt;i&gt;doesn't&lt;/i&gt; do anything, except with some particular printers and terminal emulators, and in those cases you're better off not relying on it anyway.
&lt;br /&gt;&lt;br /&gt;And yet this crazy old feature, one that no one understands or uses, one that doesn't even do anything in most cases, not only gets special syntax in modern programming languages, it's consistently given space in the documentation, even in tutorials. It's in the official &lt;a href=&quot;http://www.lua.org/pil/2.4.html&quot;&gt;Lua docs&lt;/a&gt;. It's in MIT &lt;a href=&quot;http://web.mit.edu/10.001/Web/Course_Notes/c_Notes/tips_printf.html&quot;&gt;web course notes&lt;/a&gt; about &lt;tt&gt;printf&lt;/tt&gt;. It's in the books &lt;a href=&quot;http://www.amazon.com/Programming-Python-Complete-Introduction-Language/dp/0137129297&quot;&gt;Programming in Python 3&lt;/a&gt; and &lt;a href=&quot;http://www.amazon.com/Python-Essential-Reference-David-Beazley/dp/0672328623&quot;&gt;Python Essential Reference&lt;/a&gt;. It's in an &lt;a href=&quot;http://www.tutorialspoint.com/python/python_strings.htm&quot;&gt;introduction to Python strings&lt;/a&gt;. It's in the standard &lt;a href=&quot;http://www.erlang.org/doc/reference_manual/data_types.html&quot;&gt;Erlang documentation&lt;/a&gt;, too.
&lt;br /&gt;&lt;br /&gt;[Insert conspiracy theory involving the Illuminati here.]
&lt;br /&gt;&lt;br /&gt;Here's my simple plea: stop it. Stop mentioning vertical tabs in tutorials and language references. Drop the &quot;\v&quot; sequence in all future programming languages. Retroactively remove it from recent languages, like Python 3.0. Yes, ASCII character number 11 isn't going away, but there's no reason to draw attention to a relic of computing past.
&lt;br /&gt;&lt;br /&gt;Surprisingly, the &quot;\v&quot; sequence was removed from one language during the last decade: Perl. And even more surprisngly, there's a &lt;a href=&quot;http://www.forth200x.org/escaped-strings.html&quot;&gt;2010 proposal&lt;/a&gt; to add escaped character sequences, including vertical tab, to the famously minimal language, Forth.
&lt;br /&gt;&lt;br /&gt;(If you liked this, you might like &lt;a href=&quot;http://prog21.dadgum.com/32.html&quot;&gt;Kilobyte Constants, a Simple and Beautiful Idea that Hasn't Caught On&lt;/a&gt;.)</description>
	<pubDate>Thu, 29 Jul 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>Joe's Blog: SurgeCon 2010</title>
	<guid>http://www.joeandmotorboat.com/?p=1038</guid>
	<link>http://www.joeandmotorboat.com/2010/07/27/surgecon-2010/</link>
	<description>&lt;p&gt;&lt;img class=&quot;alignnone&quot; title=&quot;surge&quot; src=&quot;http://s.omniti.net/surge/i/present/logo-main.png&quot; alt=&quot;&quot; width=&quot;271&quot; height=&quot;123&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If you haven&amp;#8217;t heard about &lt;a href=&quot;http://omniti.com/surge/2010&quot;&gt;Surge&lt;/a&gt;, it&amp;#8217;s a new web operations conference presented by the smart folks at OmniTI. They have amassed a good list of speakers including guys like John Allspaw and Theo Schlossnagle. I also happen to have been invited to talk about the cloud, &lt;a href=&quot;https://cloudant.com/&quot;&gt;Cloudant&lt;/a&gt; and all sorts of good stuff. &lt;/p&gt;</description>
	<pubDate>Wed, 28 Jul 2010 03:00:34 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: CouchCamp is Coming Soon!</title>
	<guid>tag:damienkatz.net,2010://1.578</guid>
	<link>http://damienkatz.net/2010/07/couchcamp_is_coming_soon.html</link>
	<description>&lt;p&gt;&lt;span class=&quot;mt-enclosure mt-enclosure-image&quot;&gt;&lt;a href=&quot;http://www.couch.io/couchcamp&quot;&gt;&lt;img alt=&quot;713448945.png&quot; src=&quot;http://damienkatz.net/pics/713448945.png&quot; width=&quot;426&quot; height=&quot;200&quot; class=&quot;mt-image-none&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.couch.io/couchcamp&quot;&gt;CouchCamp, September 8-10&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the place to be to learn and hack on Apache CouchDB. In honor of the recent 1.0 release, for a limited time it's only &lt;em&gt;$500&lt;/em&gt;, with accommodations.&lt;/p&gt;

&lt;p&gt;In addition to unconference style discussions, we've got some great speakers:&lt;a href=&quot;http://twitter.com/selenamarie&quot;&gt; Selena Deckelman&lt;/a&gt;, &lt;a href=&quot;http://kryogenix.org/&quot;&gt;Stuart Langridge&lt;/a&gt;, &lt;a href=&quot;http://www.sauria.com/blog&quot;&gt;Ted Leung&lt;/a&gt;, &lt;a href=&quot;http://www.postgresql.org/community/contributors/&quot;&gt;Josh Berkus&lt;/a&gt;, &lt;a href=&quot;http://ajaxian.com/about-us&quot;&gt;Dion Almaer&lt;/a&gt; and me :)&lt;/p&gt;

&lt;p&gt;One thing I'm really excited to talk about is our work porting CouchDB to mobile platforms. Android, iOS, RIM, etc. We've got some very cool stuff coming :)&lt;/p&gt;</description>
	<pubDate>Mon, 26 Jul 2010 17:10:07 +0000</pubDate>
</item>
<item>
	<title>Programming in the 21st Century: One Small Step Toward Reducing Programming Language Complexity</title>
	<guid>http://prog21.dadgum.com/75.html</guid>
	<link>http://prog21.dadgum.com/75.html</link>
	<description>I've taught Python a couple of times. Something that experience made clear to me is just how many concepts and features there are, even in a language designed to be simple. I kept finding myself saying &quot;Oh, and there's one more thing...&quot;
&lt;br /&gt;&lt;br /&gt;Take something that you'd run into early on, like displaying what's in a dictionary:
&lt;pre&gt;for key, value in dictionary.iteritems():
   print key, value
&lt;/pre&gt;Tuples are a bit odd in Python, so I put off talking about them as long as possible, but that's what &lt;tt&gt;iteritems&lt;/tt&gt; returns, so no more dodging that. There's multiple assignment, too. And what the heck is &lt;tt&gt;iteritems&lt;/tt&gt; anyway? Why not just use the &lt;tt&gt;keys&lt;/tt&gt; method instead? Working out a clean path that avoids constant footnotes takes some effort.
&lt;br /&gt;&lt;br /&gt;This isn't specific to Python. Pick any language and it likely contains a larger interconnected set of features than it first appears. Languages tend to continually grow, too, so this just gets worse over time. Opportunities to reverse that trend--backward compatibility be damned!--would be most welcome. Let me propose one.
&lt;br /&gt;&lt;br /&gt;The humble string constant has a few gotchas. How to print a string containing quotes, for example. In Python that's easy, just use single quotes around the string that has double quotes in it. It's a little more awkward in Erlang and other languages. Now open the file &quot;c:\my_project\input.txt&quot; under windows. You need to type &quot;c:\\my_projects\\input.txt&quot;, but first you've got to say &quot;Oh, and there's one more thing&quot; and explain about how backslashes work in strings.
&lt;br /&gt;&lt;br /&gt;Which would be fine...except the backslash notation for string constants is, in the twenty-first century, an anachronism.
&lt;br /&gt;&lt;br /&gt;Who ever uses &quot;\a&quot; (bell)? Or &quot;\b&quot; (backspace)? Who even knows what &quot;\v&quot; (vertical tab) does? The escape sequence that gets used more than all the others combined is &quot;\n&quot; (newline), but you rarely want to use it directly because end-of-line markers vary between operating systems. It's simpler to have a print function that puts a &quot;return&quot; at the end one that doesn't. Then there's &quot;\t&quot; (tab), but it has it's own set of quirks, and it's almost always better to use spaces instead. The price for supporting a feature that few people use is core confusion about what a string literal is in the first place. &quot;The length of &quot;\n\n&quot; isn't four? What?&quot;
&lt;br /&gt;&lt;br /&gt;There's an easy solution to all of this. Strings are literal, with no escapes of any kind. Special characters are either predefined constants (e.g., &lt;tt&gt;TAB&lt;/tt&gt;, &lt;tt&gt;CR&lt;/tt&gt;, &lt;tt&gt;LF&lt;/tt&gt;) or created through a few functions (e.g., &lt;tt&gt;char(Value)&lt;/tt&gt;, &lt;tt&gt;unicode(Name)&lt;/tt&gt;). Normal string concatenation pastes them all together. In Python:
&lt;pre&gt;&quot;Content-type: text/plain&quot; + NL + NL
&lt;/pre&gt;In Erlang:
&lt;pre&gt;&quot;Content-type: text/plain&quot; ++ NL ++ NL
&lt;/pre&gt;In both cases, the compiler mashes everything together into one string. There's no actual concatenation taking place at runtime.
&lt;br /&gt;&lt;br /&gt;Note that in Python you can get rid of backslash notation by preceding a string with the &quot;r&quot; character (meaning &quot;raw&quot;), like this:
&lt;pre&gt;r&quot;c:\my_projects\input.txt&quot;
&lt;/pre&gt;But that adds another feature to the language, one to patch up the problems caused by the first.
&lt;br /&gt;&lt;br /&gt;(If you liked this, you might like &lt;a href=&quot;http://prog21.dadgum.com/20.html&quot;&gt;In Praise of Non-Alphanumeric Identifiers&lt;/a&gt;.)</description>
	<pubDate>Sat, 24 Jul 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>Erlang Inside: Erlang and REST – an interview with Steve Vinoski</title>
	<guid>http://erlanginside.com/?p=185</guid>
	<link>http://erlanginside.com/erlang-and-rest-an-interview-with-steve-vinoski-185</link>
	<description>Interview recorded at Erlang Factory, where Steve Vinoski discusses the key concepts of RPC frameworks such as CORBA, and how that compares to REST, and how Erlang fits into both worlds</description>
	<pubDate>Thu, 22 Jul 2010 12:23:21 +0000</pubDate>
</item>
<item>
	<title>Joe's Blog: Adding Health Checks to Deckard from Chef.</title>
	<guid>http://www.joeandmotorboat.com/?p=1029</guid>
	<link>http://www.joeandmotorboat.com/2010/07/19/adding-health-checks-to-deckard-from-chef/</link>
	<description>&lt;p&gt;Recently, we (at &lt;a href=&quot;https://cloudant.com/&quot;&gt;Cloudant&lt;/a&gt;) &lt;a href=&quot;http://www.joeandmotorboat.com/2010/06/04/just-opensourced-gaff-and-deckard/&quot;&gt;open sourced Deckard&lt;/a&gt;, a HTTP content check monitoring system based on CouchDB. One of the best bits about using Couch is that it gives you a ReST API and with Deckard it can be used to add new health checks. Doing a simple PUT adds new URLs to monitor. At &lt;a href=&quot;https://cloudant.com/&quot;&gt;Cloudant&lt;/a&gt; we love &lt;a href=&quot;http://www.opscode.com/&quot;&gt;Chef&lt;/a&gt; and use it for everything. Chef has things called resources and providers. &lt;a href=&quot;http://wiki.opscode.com/display/chef/Resources&quot;&gt;Resources&lt;/a&gt; are abstractions that describe the state you want a machine to be in. &lt;a href=&quot;http://wiki.opscode.com/display/chef/Providers&quot;&gt;Providers&lt;/a&gt; perform the actions described by a resource. A good example is using the &lt;a href=&quot;http://wiki.opscode.com/display/chef/Resources#Resources-Package&quot;&gt;package&lt;/a&gt; resource on Centos uses yum while on Ubuntu it uses apt-get. The resource abstracts that away, letting the provider (and node) deal with the specifics on how to install the package. This makes your recipes nice and DRY, use the same code to install packages on all sorts of platforms. There are resources and providers for anything from installing packages to even one I wrote for executing Erlang code via erl_call. One resource that works well with Deckard is the &lt;a href=&quot;http://wiki.opscode.com/display/chef/Resources#Resources-HTTPRequest&quot;&gt;HTTP request resource&lt;/a&gt;, using it makes it very easy to add health checks from your cookbooks. We use something like the following code to add checks to new nodes at Cloudant:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;This code will add the document describing the check to the monitor_content_check database and then create a file so we can use &amp;#8220;not_if&amp;#8221; and Chef won&amp;#8217;t attempt to add the check twice. Pretty cool stuff and even more reason that everything should have an API. Even cooler than this example would be to use Chef Search to do the same thing but I&amp;#8217;ll save that for another blog post.&lt;/p&gt;</description>
	<pubDate>Mon, 19 Jul 2010 20:52:09 +0000</pubDate>
</item>
<item>
	<title>Trapexit's Erlang Blog Filter: New Column, New Interview</title>
	<guid>http://steve.vinoski.net/blog/?p=610</guid>
	<link>http://steve.vinoski.net/blog/2010/07/17/new-column-new-interview/</link>
	<description>&lt;p&gt;A couple newsworthy items:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://steve.vinoski.net/pdf/IC-Getting_Started_with_Google_App_Engine_and_Clojure.pdf&quot;&gt;July/August 2010 issue&lt;/a&gt; (PDF) of &lt;a rel=&quot;nofollow&quot;&gt;&lt;em&gt;The Functional Web&lt;/em&gt;&lt;/a&gt; column is available, this time with guest columnist &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.aaronbedra.com/&quot;&gt;Aaron Bedra&lt;/a&gt; writing about using &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://clojure.org/&quot;&gt;Clojure&lt;/a&gt; and the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://compojure.org/&quot;&gt;Compojure web framework&lt;/a&gt; on the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/appengine/&quot;&gt;Google App Engine&lt;/a&gt; platform. Pretty interesting read, and plenty of code examples.
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://sadekdrobi.com/&quot;&gt;Sadek Drobi&lt;/a&gt; interviewed me about Erlang and REST at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.erlang-factory.com/&quot;&gt;Erlang Factory&lt;/a&gt; back in March, and the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.infoq.com/interviews/steve-vinoski-erlang-rest&quot;&gt;interview is now up at InfoQ&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Sat, 17 Jul 2010 18:01:47 +0000</pubDate>
</item>
<item>
	<title>Programming in the 21st Century: Free Your Technical Aesthetic from the 1970s</title>
	<guid>http://prog21.dadgum.com/74.html</guid>
	<link>http://prog21.dadgum.com/74.html</link>
	<description>In the early 1990s, I used Unix professionally for a few years. It wasn't the official Unix, nor was it Linux, but Sun's variant called SunOS. By &quot;used&quot; I mean I wrote commercial, embedded software entirely a Unix environment. I edited 10,000+ line files in vi. Not vim. The original &quot;one file loaded at a time&quot; vi.
&lt;br /&gt;&lt;br /&gt;At the time, Unix felt clunky and &lt;i&gt;old&lt;/i&gt;. I spent a lot of time in a library room down the hall, going through the shelves of manuals. It took me a long time to discover the &lt;tt&gt;umask&lt;/tt&gt; command for changing the default file permissions and to understand the difference between &lt;tt&gt;.bashrc&lt;/tt&gt; and &lt;tt&gt;.bash_profile&lt;/tt&gt; and how to use &lt;tt&gt;tar&lt;/tt&gt;.
&lt;br /&gt;&lt;br /&gt;By way of comparison, on my home PC I used a third-party command shell called 4DOS (later 4NT, and it's still available for Windows 7 as &lt;a href=&quot;http://www.jpsoft.com/tccledes.htm&quot;&gt;TCC LE&lt;/a&gt;). It had a wonderful command line history mechanism: type part of a command, then press up-arrow. The bash bang-notation felt like some weird mainframe relic. 4DOS had a built-in, full-screen text file viewer. The Unix equivalent was the minimalist &lt;tt&gt;less&lt;/tt&gt; command. 4DOS help was colorful and pretty and hyperlinked. Documentation paged through as &lt;tt&gt;man&lt;/tt&gt; pages was several steps backward.
&lt;br /&gt;&lt;br /&gt;The Unix system nailed the core tech that consumer-level computers were way behind on: stability and responsiveness in a networked, multitasking environment. It was ugly, but reliable.
&lt;br /&gt;&lt;br /&gt;In 2006, I got back into using Unix again (aside from some day-job stuff with Linux ten years ago) in the guise of OS X on a MacBook. The &lt;tt&gt;umask&lt;/tt&gt; command is still there. Ditto for &lt;tt&gt;.bashrc&lt;/tt&gt; and &lt;tt&gt;.bash_profile&lt;/tt&gt; and all the odd command line switches for &lt;tt&gt;tar&lt;/tt&gt; and the clunky bang-notation for history. I'm torn between wonderment that all those same quirks and design choices still live on...and shocked incredulity that all those same quirks and design choices live on.
&lt;br /&gt;&lt;br /&gt;Enough time has passed since the silly days of crazed Linux advocacy that I'm comfortable pointing out the three reasons Unix makes sense:
&lt;br /&gt;&lt;br /&gt;1. It works.&lt;br /&gt;
2. It's reliable.&lt;br /&gt;
3. It stays constant.
&lt;br /&gt;&lt;br /&gt;But don't--do not--ever, make the mistake of those benefits being a reason to use Unix as a basis for your technical or design aesthetic. Yes, there are some textbook cases where pipelining commands together is impressive, but that's a minor point. Yes, having a small tool for a specific job sometimes works, but it just as often doesn't. (&quot;Those days are dead and gone and the eulogy was delivered by Perl,&quot; &lt;a href=&quot;http://interviews.slashdot.org/article.pl?sid=04/10/18/1153211&quot;&gt;Rob Pike, 2004&lt;/a&gt;.) Use Unix-like systems because of the three benefits above, and simultaneously realize that it's a crusty old system from a bygone era. If you put it up on a pedestal as a thing of beauty, you lose all hope of breaking away from a sadly outdated programmer aesthetic.
&lt;br /&gt;&lt;br /&gt;(If you liked this, you might like &lt;a href=&quot;http://prog21.dadgum.com/22.html&quot;&gt;My Road to Erlang&lt;/a&gt;.)</description>
	<pubDate>Sat, 17 Jul 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>Erlang Factory News: Erlang User Conference 2010 Talk Submission Open!</title>
	<guid>http://erlang-factory.com/news/rss/ebb05fd4f5d158147e2ce5d47dfea6d6</guid>
	<link></link>
	<description>&lt;p&gt;The 2010 Erlang User Conference in Stockholm will be held on &lt;strong&gt;Tuesday  16th November 2010&lt;/strong&gt;. The venue will again be the Old Astoria Cinema  in Nybrogatan.&lt;/p&gt;
&lt;p&gt;On Monday November 15th there will be a day of tutorials. This will  allow delegates to again optimise their visit to Stockholm to take in  both these events.&lt;/p&gt;
&lt;p&gt;We have opened the submissions page. To submit a proposal for a talk  or tutorial, visit the &lt;a href=&quot;http://erlang-factory.com/../../conference/ErlangUserConference2010/submit_talk&quot; target=&quot;_self&quot;&gt;Talk Submission&lt;/a&gt; page.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;More details will be forthcoming in the near future. Keep a look out  or join the Erlang Factory Mailing list!&lt;/p&gt;</description>
	<pubDate>Wed, 14 Jul 2010 19:46:14 +0000</pubDate>
</item>
<item>
	<title>Programming in the 21st Century: Explaining Functional Programming to Eight-Year-Olds</title>
	<guid>http://prog21.dadgum.com/73.html</guid>
	<link>http://prog21.dadgum.com/73.html</link>
	<description>&quot;Map&quot; and &quot;fold&quot; are two fundamentals of functional programming. One of them is trivially easy to understand and use. The other is not, but that has more to do with trying to fit it into a particular view of functional programming than with it actually being tricky.
&lt;br /&gt;&lt;br /&gt;There's not much to say about map. Given a list and a function, you create a new list by applying the same function to each element. There's even special syntax for this in some languages which removes any confusion about whether the calling sequence is &lt;tt&gt;map(Function, List)&lt;/tt&gt; or &lt;tt&gt;map(List, Function)&lt;/tt&gt;. Here's Erlang code to increment the values in &lt;tt&gt;List&lt;/tt&gt;:
&lt;pre&gt;[X + 1 || X &amp;lt;- List]
&lt;/pre&gt;Fold, well, it's not nearly so simple. Just the description of it sounds decidedly imperative: accumulate a result by iterating through the elements in a list. It takes three parameters: a base value, a list, and a function. The last of these maps a value and the current accumulator to a new accumulator. In Erlang, here's a fold that sums a list:
&lt;pre&gt;lists:foldl(fun(X, Sum) -&amp;gt; X + Sum end, 0, List)
&lt;/pre&gt;It's short, but it's an awkward conciseness. Now we've two places where the parameter order can be botched. I always find myself having to stop and think about the mechanics of how folding works--and the difference between left and right folding, too (&lt;tt&gt;lists:foldl&lt;/tt&gt; is a left fold). I would hardly call this complicated, but that step of having to pause and run through the details in my head keeps it from being mindlessly intuitive.
&lt;br /&gt;&lt;br /&gt;Compare this to the analog in array languages like APL and J. The &quot;insert&quot; operation inserts a function between all the elements of a list and evaluates it. Going back to the sum example, it would be &quot;&lt;tt&gt;+/&lt;/tt&gt;&quot; in J, or &quot;insert addition.&quot; So this:
&lt;pre&gt;1 2 3 4 5 6
&lt;/pre&gt;turns to this:
&lt;pre&gt;1 + 2 + 3 + 4 + 5 + 6
&lt;/pre&gt;giving a result of 21. The mechanics here are so simple that you could explain them to a class of second graders and not worry about them being confused. There's nothing about iterating or accumulating or a direction of traversal or even parameters. It's just...insertion.
&lt;br /&gt;&lt;br /&gt;Now there are some edge cases to worry about, such as &quot;What does it mean to insert a function between the elements of a list of length 1&quot;? Or an empty list for that matter. The standard array language solution is to associate a base value with operators, like addition, so summing a list containing the single value 27 is treated as &lt;tt&gt;0 + 27&lt;/tt&gt;. I'm not going to argue that APL's insert is more general than fold, because it certainly isn't. You can do all sorts of things with the accumulator in a traditional fold (for example, computing the maximum and minimum values of a list at the same time).
&lt;br /&gt;&lt;br /&gt;But in terms of raw simplicity of understanding, insert flat-out beats fold. That begs the question: Is the difficulty many programmers have in grasping functional programming &lt;i&gt;inherent&lt;/i&gt; in the basic concept of non-destructively operating on values, or is it in the popular abstractions that have been built-up to describe functional programming?
&lt;br /&gt;&lt;br /&gt;(If you liked this, you might like &lt;a href=&quot;http://prog21.dadgum.com/14.html&quot;&gt;Functional Programming Archaeology&lt;/a&gt;.)</description>
	<pubDate>Fri, 09 Jul 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>Erlang Inside: PostgreSQL Erlang client library epgsql supports asynchronous messages from LISTEN/NOTIFY events</title>
	<guid>http://erlanginside.com/?p=178</guid>
	<link>http://erlanginside.com/posgresql-client-epgsql-listen-notify-erlang-178</link>
	<description>If you use PostgreSQL with Erlang, you're probably already familiar with the epgsql client library. Something that slipped my attention was the addition of...</description>
	<pubDate>Thu, 08 Jul 2010 19:27:05 +0000</pubDate>
</item>
<item>
	<title>Erlware: A Brief Overview of Concurrency.</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-5153150474665316027</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/B91MSuPw5ms/brief-overview-of-concurrency.html</link>
	<description>Introduction

Over the last few weeks I have had several conversations with people about concurrency, more specifically the ways in which shared information is handled in concurrent languages. I have gotten the impression that there isn't really a good understanding of whats out there in the world of concurrency. That being the case it would be a good idea to just give a quick overview of some of
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/xptI95K_Fijieql3QevwieDQdgA/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/xptI95K_Fijieql3QevwieDQdgA/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/xptI95K_Fijieql3QevwieDQdgA/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/xptI95K_Fijieql3QevwieDQdgA/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/B91MSuPw5ms&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 08 Jul 2010 16:33:57 +0000</pubDate>
	<author>noreply@blogger.com (Eric Merritt)</author>
</item>
<item>
	<title>Process-one Blogs: ProcessOne releases OneCached, a Memcached in erlang</title>
	<guid>http://www.process-one.net/en/blogs/article/processone_releases_onecached_a_memcached_in_erlang/</guid>
	<link>http://www.process-one.net/en/blogs/article/processone_releases_onecached_a_memcached_in_erlang/</link>
	<description>&lt;p&gt;ProcessOne has just released OneCached, a Memcached server and client  implementation written in Erlang.&lt;/p&gt; &lt;p&gt;OneCached is a new Memcached server and client  implementation  written from scratch in Erlang by ProcessOne.&lt;/p&gt;
&lt;p&gt;From the &lt;a href=&quot;http://memcached.org/&quot;&gt;Memcached&lt;/a&gt; website:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;What is Memcached?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Free &amp;amp; open source, high-performance, distributed memory object  caching system, generic in nature, but intended for use in speeding up  dynamic web applications by alleviating database load.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Memcached is an in-memory key-value store for small chunks of  arbitrary data (strings, objects) from results of database calls, API  calls, or page rendering.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Memcached is simple yet powerful. Its simple design promotes quick  deployment, ease of development, and solves many problems facing large  data caches. Its API is available for most popular languages.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;OneCached supports the set, add, replace, get, incr, decr, delete,  flush_all and quit commands. It doesn't handle expiration time.&lt;/p&gt;
&lt;p&gt;You call pull the source code from the public repository at: &lt;a href=&quot;https://git.process-one.net/onecached&quot;&gt;https://git.process-one.net/onecached&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre&gt;git clone git:&lt;span&gt;//git.process-one.net/onecached/mainline.git&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To compile, just run make, and to start, just type:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre&gt;bin/onecachedctl start&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;OneCached is released under the Erlang Public License (EPL), version  1.1. It is available from &lt;a href=&quot;http://www.process-one.net/en/labs/&quot;&gt;ProcessOne Labs&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Mon, 05 Jul 2010 16:29:53 +0000</pubDate>
</item>
<item>
	<title>Erlang Inside: New Erlang job board – totally-erlang.com</title>
	<guid>http://erlanginside.com/?p=176</guid>
	<link>http://erlanginside.com/new-erlang-job-board-erlang-job-list-176</link>
	<description>The Zotonic guys put together a new Erlang job board at http://totally-erlang.com/</description>
	<pubDate>Mon, 05 Jul 2010 11:27:25 +0000</pubDate>
</item>
<item>
	<title>RedHotErlang: Playing with LFE macros</title>
	<guid>http://www.redhoterlang.com/web/55c9fafd59899d721907c9740d3386a1</guid>
	<link>http://www.redhoterlang.com/web/plink?id=55c9fafd59899d721907c9740d3386a1</link>
	<description>Summertime, it's warm, it's sunny, I'm on vaccation, it's [LFE][1]-time.

[Lisp macros][2] are cool. With a Lisp macro you do program transformations where you have the full language available to express these transformations. This means that you *ea...</description>
	<pubDate>Sat, 03 Jul 2010 06:48:46 +0000</pubDate>
</item>
<item>
	<title>Programming in the 21st Century: What Do People Like?</title>
	<guid>http://prog21.dadgum.com/72.html</guid>
	<link>http://prog21.dadgum.com/72.html</link>
	<description>I wrote &lt;a href=&quot;http://prog21.dadgum.com/58.html&quot;&gt;Flickr as a Business Simulator&lt;/a&gt; in earnest, but I think it was interpreted more as a theoretical piece. When you build something with the eventual goal of releasing it to the world, the key question is &quot;Will people like this?&quot; And, really, you just won't know until you do it. There's nothing like the actions of tens of thousands of independently acting individuals who have no regard for your watertight theories. What Flickr provides is a way to make lots of quick little &quot;product&quot; releases, and see if your expectations line up with reality. Is this my primary use of Flickr? No! But the educational opportunity is there, regardless. Click on a photo to go to the Flickr page.
&lt;br /&gt;&lt;br /&gt;The rest of this entry is an annotated list of some photos I've posted to Flickr, with both my conjectures of how they'd be received and what actually happened. In each case the photo comes first with the commentary following.
&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/jhague/940969/&quot; title=&quot;Untitled&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/1/940969_9c0ff82273.jpg&quot; alt=&quot;&quot; height=&quot;375&quot; border=&quot;0&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;br /&gt;I sat on this photo for a while after shooting it. I thought it was cliche, something everyone had already seen many times. A real photographer wouldn't bother to recreate such an image. Then I posted it...and it got an immediate string of comments and favorites. It's still one my top ten overall Flickr photos according to the stats system. My invented emphasis on originality didn't matter.
&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/jhague/130509761/&quot; title=&quot;Untitled&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/50/130509761_7a34c13e98.jpg&quot; alt=&quot;&quot; height=&quot;375&quot; border=&quot;0&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;br /&gt;I thought these skid marks in front of a local liquor superstore were photoworthy, but the result didn't grab me. Like the sunset wheat photo, it took on a life of its own on Flickr. Was the hook in the impossibility of those tire tracks? That they look like a signature? Why was I unable to see the appeal before uploading it? It even ended up--with permission--in Scott Berkun's &lt;a href=&quot;http://oreilly.com/catalog/9780596527051&quot;&gt;The Myths of Innovation&lt;/a&gt; (O'Reilly, 2007).
&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/jhague/4686649049/&quot; title=&quot;Untitled&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1276/4686649049_01e9375fab.jpg&quot; alt=&quot;&quot; height=&quot;333&quot; border=&quot;0&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;br /&gt;This one I liked immediately. The red arrow. The odd framing. The blown-out white background that makes the rust pop. The Flickr reaction...well there wasn't one. Is the industrial decay photo niche saturated? Would it have been a hit if I worked at getting hundreds of dedicated followers first? Or maybe I like it because it's better than other photos I've taken recently, but not all that great in absolute terms?
&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/jhague/782011904/&quot; title=&quot;I'm lovin' IT&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1263/782011904_e4b52d4a71.jpg&quot; alt=&quot;I'm lovin' IT&quot; height=&quot;500&quot; border=&quot;0&quot; width=&quot;333&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;br /&gt;Oh so cleverly titled &quot;I'm Lovin' IT!&quot; I knew this was a novelty. It pulled in some novelty linkage as a ha-ha photo of the day sort of thing. It didn't get anywhere near the exposure of that Yahoo ad next to the 404 distance on a home run fence. The traffic from &quot;I'm Lovin' IT!&quot; was transient, adding points to the view counter, but as they weren't Flickr users they didn't add comments or favorites. In the end it was an empty success.</description>
	<pubDate>Thu, 01 Jul 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: Hosted.IM gets gateways to legacy IM systems</title>
	<guid>http://www.process-one.net/en/blogs/article/hosted.im_gets_gateways_to_legacy_im_systems/</guid>
	<link>http://www.process-one.net/en/blogs/article/hosted.im_gets_gateways_to_legacy_im_systems/</link>
	<description>&lt;p&gt;&lt;span&gt;The XMPP service for your domains has just received a  much demanded feature: gateways to legacy IM systems.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span&gt;Hosted.IM is the cloud service for everything IM, by  ProcessOne. This service is free for up to 5 users teams.&lt;br /&gt;&lt;br /&gt;We have  added gateways to main legacy IM systems in the world:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;AOL:  aol.hosted.im&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;ICQ: icq.hosted.im&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;MSN: msn.hosted.im&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Twitter:  twitter.hosted.im&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Yahoo: yahoo.hosted.im&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt;These gateways are also free for  up to 5 users teams.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 30 Jun 2010 15:08:08 +0000</pubDate>
</item>
<item>
	<title>Erlang Inside: erldocs.com updated with R14A support, mochiweb, and available for your own projects</title>
	<guid>http://erlanginside.com/?p=169</guid>
	<link>http://erlanginside.com/erldocs-com-updated-with-r14a-support-mochiweb-and-available-for-your-own-projects-169</link>
	<description>Dale Harvey just recently updated erldocs.com with R14A support. If you are doing any erlang development, or even looking to just learn a bit about erlang, I highly recommend using erldocs over the official documentation.</description>
	<pubDate>Tue, 29 Jun 2010 12:53:43 +0000</pubDate>
</item>
<item>
	<title>Programming in the 21st Century: Tricky When You Least Expect It</title>
	<guid>http://prog21.dadgum.com/71.html</guid>
	<link>http://prog21.dadgum.com/71.html</link>
	<description>Here's a problem: You've got a satellite dish that can be rotated to any absolute angle from 0 to 360 degrees. If you think of the dish as being attached to a pole sticking out of the ground, that's what the dish rotates around. Given a starting angle and a desired angle, how many degrees do you rotate the dish by?
&lt;br /&gt;&lt;br /&gt;An example should clarify this. If the initial angle is 0 degrees, and the goal is to be at 10 degrees, that's easy. You rotate by 10 degrees. If you're at 10 degrees and you want to end up at 8 degrees, then rotate -2 degrees. It looks at lot like all you have to do is subtract the starting angle from the ending angle, and that's that.
&lt;br /&gt;&lt;br /&gt;But if the starting angle is 10 and the ending angle is 350...hmmm. 350 - 10 = 340, but that's the long way around. No one would do that. It makes more sense to rotate by -20 degrees. With this in mind and some experimenting, here's a reasonable looking solution (in Erlang, but it could easily be any language):
&lt;pre&gt;angle_diff(Begin, End) -&amp;gt;
   D = End - Begin,
   DA = abs(D),
   case DA &amp;gt; 180 of
      true -&amp;gt; -(360 - DA);
      _ -&amp;gt; D
   end.
&lt;/pre&gt;It seems to cover some quickie test cases, including those listed above. Now try &lt;tt&gt;angle_diff(270, 0)&lt;/tt&gt;. The expected answer is 90. But this function returns -90. Oops.
&lt;br /&gt;&lt;br /&gt;This is starting to sound like the introduction to a book by &lt;a href=&quot;http://www.cs.utexas.edu/users/EWD/&quot;&gt;Dijkstra&lt;/a&gt;. He'd have called this problem solving method &quot;guessing,&quot; and it's hard to disagree with that assessment. When I run into problems like this that look so simple, and I feel like I'm randomly poking at them to get the right answers, I'm always surprised. So many messy problems are solved as part of the core implementation or standard library in most modern languages, that it's unusual to run into something this subtle.
&lt;br /&gt;&lt;br /&gt;In Python or Erlang I never worry about sorting, hash functions, heap management, implementing regular expressions, fancy string comparison algorithms such as Boyer-Moore, and so on. Most of the time I write fairly straightforward code that's just basic logic and manipulation of simple data structures. Behind the scenes, that code is leaning heavily on technically difficult underpinnings, but that doesn't change how pleasant things are most of the time. Every once in a while, though, the illusion of all the hard problems being solved for me is shattered, and I run into something that initially seems trivial, yet it takes real effort to work out a correct solution.
&lt;br /&gt;&lt;br /&gt;Here's a version of the &lt;tt&gt;angle_diff&lt;/tt&gt; function that handles the cases the previous version didn't:
&lt;pre&gt;angle_diff(Begin, End) -&amp;gt;
   D = End - Begin,
   DA = abs(D),
   case {DA &amp;gt; 180, D &amp;gt; 0} of
      {true, true} -&amp;gt; DA - 360;
      {true, _}    -&amp;gt; 360 - DA;
      _ -&amp;gt; D
   end.
&lt;/pre&gt;Don't be surprised if it takes some thought to determine if this indeed handles all cases.
&lt;br /&gt;&lt;br /&gt;(If you liked this, you might like &lt;a href=&quot;http://prog21.dadgum.com/41.html&quot;&gt;Let's Take a Trivial Problem and Make it Hard&lt;/a&gt;.)</description>
	<pubDate>Tue, 29 Jun 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>BGH's Blog: Erlang Programming Exercise: 5-2</title>
	<guid>http://benjaminhalsted.com/?p=243</guid>
	<link>http://benjaminhalsted.com/2010/06/erlang-programming-exercise-5-2/</link>
	<description>&lt;p&gt;Exercise 5-2 involves changing the frequency server from earlier in the chapter. Here is the task list:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Restrict the deallocation of a frequency so that only the client that allocated it can deallocate it.&lt;/li&gt;
&lt;li&gt;Fix a bug: Deallocating a frequency that isn't allocated crashes the server&lt;/li&gt;
&lt;li&gt;Only allow shutdown of the frequency server if there are no allocated frequencies&lt;/li&gt;
&lt;li&gt;Limit the number of frequencies a client can allocate to 3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I worked through the tasks and then had a bit of fun with the server. I changed the shutdown sequence so that deallocations work while shutting down but allocations return an error. Once all of the outstanding frequencies have been returned it will complete the shutdown.&lt;/p&gt;
&lt;p&gt;As you can see in the code below, I was playing around with typer and dialyzer. Please take a look and let me know if you have any suggestions. &lt;/p&gt;
&lt;p&gt;Thanks!&lt;br /&gt;
  Halzy&lt;/p&gt;
&lt;p&gt;[erlang]&lt;br /&gt;
-module(frequency).&lt;br /&gt;
-export([start/0, stop/0, allocate/0, deallocate/1, deallocate_all/0]).&lt;/p&gt;
&lt;p&gt;-export([init/0]).&lt;/p&gt;
&lt;p&gt;-define(SERVER, ?MODULE).&lt;/p&gt;
&lt;p&gt;-type frequency() :: pos_integer().&lt;br /&gt;
-type used_frequency() :: { frequency(), pid() }.&lt;/p&gt;
&lt;p&gt;-record(state, {&lt;br /&gt;
	  free = [] :: [frequency()],&lt;br /&gt;
	  allocated = [] :: [used_frequency()],&lt;br /&gt;
	  shutting_down = false :: boolean(),&lt;br /&gt;
	  max_allocations = 3 :: pos_integer()&lt;br /&gt;
	 }).&lt;/p&gt;
&lt;p&gt;%% These are the start functions used to create and&lt;br /&gt;
%% initialize the server.&lt;/p&gt;
&lt;p&gt;start() -&gt;&lt;br /&gt;
    register(?SERVER, spawn(?MODULE, init, [])).&lt;/p&gt;
&lt;p&gt;-spec init() -&gt; ok.&lt;br /&gt;
init() -&gt;&lt;br /&gt;
    State = #state{&lt;br /&gt;
      free=get_frequencies()&lt;br /&gt;
     },&lt;br /&gt;
    loop(State).&lt;/p&gt;
&lt;p&gt;% Hard Coded&lt;br /&gt;
-spec get_frequencies() -&gt; [frequency()].&lt;br /&gt;
get_frequencies() -&gt;&lt;br /&gt;
    [10, 11, 12, 13, 14, 15].&lt;/p&gt;
&lt;p&gt;%% The client Functions&lt;/p&gt;
&lt;p&gt;-spec stop() -&gt; ok.&lt;br /&gt;
stop() -&gt;&lt;br /&gt;
    call(stop).&lt;/p&gt;
&lt;p&gt;-spec allocate() -&gt; {error, atom()} | pos_integer().&lt;br /&gt;
allocate() -&gt;&lt;br /&gt;
    call(allocate).&lt;/p&gt;
&lt;p&gt;-spec deallocate(frequency()) -&gt; ok.&lt;br /&gt;
deallocate(Freq) -&gt;&lt;br /&gt;
    call({deallocate, Freq}).&lt;/p&gt;
&lt;p&gt;-spec deallocate_all() -&gt; ok.&lt;br /&gt;
deallocate_all() -&gt;&lt;br /&gt;
    call(deallocate_all).&lt;/p&gt;
&lt;p&gt;%% We hide all message passing and the message&lt;br /&gt;
%% protocol in a functional interface&lt;/p&gt;
&lt;p&gt;call(Message) -&gt;&lt;br /&gt;
    ?SERVER ! {request, self(), Message},&lt;br /&gt;
    receive&lt;br /&gt;
	{reply, Reply} -&gt;&lt;br /&gt;
	    Reply&lt;br /&gt;
    end.&lt;/p&gt;
&lt;p&gt;%% The Main Loop&lt;/p&gt;
&lt;p&gt;-spec loop(#state{}) -&gt; ok.&lt;br /&gt;
%% [bgh] if we are shutting down, and have no outstanding frequencies, end&lt;br /&gt;
loop(#state{shutting_down=true, allocated=[]}) -&gt;&lt;br /&gt;
    ok;&lt;br /&gt;
loop(#state{shutting_down=ShuttingDown}=State) -&gt;&lt;br /&gt;
    receive&lt;br /&gt;
	{request, Pid, allocate} when false==ShuttingDown -&gt;&lt;br /&gt;
	    {UpdatedState, Reply} = allocate(State, Pid),&lt;br /&gt;
	    reply(Pid, Reply),&lt;br /&gt;
	    loop(UpdatedState);&lt;br /&gt;
	{request, Pid, stop} when false==ShuttingDown -&gt;&lt;br /&gt;
	    reply(Pid, ok),&lt;br /&gt;
	    loop(State#state{shutting_down=true});&lt;br /&gt;
	{request, Pid, {deallocate, Freq}} -&gt;&lt;br /&gt;
	    UpdatedState = deallocate(State, Pid, Freq),&lt;br /&gt;
	    reply(Pid, ok),&lt;br /&gt;
	    loop(UpdatedState);&lt;br /&gt;
	{request, Pid, deallocate_all} -&gt;&lt;br /&gt;
	    UpdatedState = deallocate_all(State, Pid),&lt;br /&gt;
	    reply(Pid, ok),&lt;br /&gt;
	    loop(UpdatedState);&lt;br /&gt;
	{request, Pid, _} when true == ShuttingDown -&gt;&lt;br /&gt;
	    reply(Pid, {error, shutting_down}),&lt;br /&gt;
	    loop(State)&lt;br /&gt;
    end.&lt;/p&gt;
&lt;p&gt;reply(Pid, Reply) -&gt;&lt;br /&gt;
    Pid ! {reply, Reply}.&lt;/p&gt;
&lt;p&gt;%% The Internal Help Functions used to allocate and&lt;br /&gt;
%% deallocate frequencies.&lt;/p&gt;
&lt;p&gt;-spec allocate(#state{free::[]}, pid()) -&gt;&lt;br /&gt;
		      {#state{}, {error, no_frequency}};&lt;br /&gt;
	      (#state{free::[frequency(),...]}, pid()) -&gt;&lt;br /&gt;
		      {#state{}, {error, max_allocations}} |&lt;br /&gt;
		      {#state{}, {ok, frequency()}}.&lt;br /&gt;
allocate(#state{free=[]}=State, _Pid) -&gt;&lt;br /&gt;
    {State, {error, no_frequency}};&lt;br /&gt;
allocate(#state{free=[Freq|Free], allocated=Allocated}=State, Pid) -&gt;&lt;br /&gt;
    case can_allocate(Allocated, Pid, State#state.max_allocations) of&lt;br /&gt;
	false -&gt;&lt;br /&gt;
	    {State, {error, max_allocations}};&lt;br /&gt;
	true -&gt;&lt;br /&gt;
	    {State#state{free=Free, allocated=[{Freq, Pid}|Allocated]}, {ok, Freq}}&lt;br /&gt;
    end.&lt;/p&gt;
&lt;p&gt;-spec deallocate(#state{}, pid(), frequency()) -&gt; #state{}.&lt;br /&gt;
deallocate(#state{free=Free, allocated=Allocated}=State, Pid, Freq) -&gt;&lt;br /&gt;
    case lists:keytake(Freq, 1, Allocated) of&lt;br /&gt;
	false -&gt;&lt;br /&gt;
	    State;&lt;br /&gt;
	{value, {Freq, Pid}, NewAllocated} -&gt;&lt;br /&gt;
	    State#state{free=[Freq|Free], allocated=NewAllocated};&lt;br /&gt;
	{value, {Freq, _WrongPid}, _NewAllocated} -&gt;&lt;br /&gt;
	    State&lt;br /&gt;
    end.&lt;/p&gt;
&lt;p&gt;-spec pid_match(used_frequency(), pid()) -&gt; boolean().&lt;br /&gt;
pid_match({_Freq, Pid}, Pid) -&gt; true;&lt;br /&gt;
pid_match({_Freq, _OtherPid}, _Pid) -&gt; false.&lt;/p&gt;
&lt;p&gt;-spec deallocate_all(#state{}, pid()) -&gt; #state{}.&lt;br /&gt;
deallocate_all(#state{free=Free, allocated=Allocated}=State, Pid) -&gt;&lt;br /&gt;
    {ToDeallocate, UpdatedAllocated} = lists:partition(fun(Elem) -&gt; pid_match(Elem, Pid) end, Allocated),&lt;br /&gt;
    {ReleasedFreqs, _Pids} = lists:unzip(ToDeallocate),&lt;br /&gt;
    UpdatedFree = ReleasedFreqs ++ Free,&lt;br /&gt;
    State#state{free=UpdatedFree, allocated=UpdatedAllocated}.&lt;/p&gt;
&lt;p&gt;-spec can_allocate([used_frequency()], pid(), pos_integer()) -&gt; boolean().&lt;br /&gt;
can_allocate(Allocated, Pid, MaxFrequencies) -&gt;&lt;br /&gt;
    {PidFrequencies, _Other} = lists:partition(fun(Elem) -&gt; pid_match(Elem, Pid) end, Allocated),&lt;br /&gt;
    length(PidFrequencies)  MaxFrequencies.&lt;br /&gt;
[/erlang]&lt;/p&gt;</description>
	<pubDate>Mon, 28 Jun 2010 15:19:28 +0000</pubDate>
</item>
<item>
	<title>Erlang Inside: Spanish Language Erlang List</title>
	<guid>http://erlanginside.com/?p=167</guid>
	<link>http://erlanginside.com/spanish-language-erlang-list-167</link>
	<description>If you&amp;#8217;re looking for Spanish language group to discuss Erlang, Mariano Guerra recently started &amp;#8220;ErlAr&amp;#8220;, a mailing list for all things Erlang, but in Castellano. Mariano is the author of Efene, a Javascript-syntax language that compiles to Erlang bytecode. I&amp;#8217;m planning an interview with Mariano on Efene soon. There is a small but growing group [...]</description>
	<pubDate>Fri, 25 Jun 2010 01:52:50 +0000</pubDate>
</item>
<item>
	<title>1011 Ltd Blog: Elegant XML SAX parsing using Erlang's pattern matching</title>
	<guid>tag:1011ltd.com,2010-06-24:/web/blog/elegant_xml_parsing</guid>
	<link>http://www.1011ltd.com/</link>
	<description>&lt;p&gt;
Yesterday I wrote some code for parsing an XML file with Erlang's built-in SAX parser. It turned out that the events generated by the SAX
parser, combined with the pattern matching in Erlang yielded a really elegant solution. 
&lt;/p&gt;

&lt;div&gt;&lt;a href=&quot;http://www.1011ltd.com/web/blog/post/elegant_xml_parsing&quot;&gt;continue reading...&lt;/a&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 24 Jun 2010 17:00:00 +0000</pubDate>
</item>
<item>
	<title>Learn You Some Erlang: More On Multiprocessing</title>
	<guid>http://learnyousomeerlang.com/more-on-multiprocessing</guid>
	<link>http://learnyousomeerlang.com/more-on-multiprocessing</link>
	<description>This chapter's a bit of an extension on the practical aspects of the Hitchhiker's Guide to Concurrency. New multiprocessing and concurrent aspects of Erlang are seen, including how to hold state in processes, useful abstractions when passing messages, how to handle timeouts and then selective receives for prioritizing messages. I'm publishing this chapter in English on the night of our French-Canadian national holiday, so enjoy!</description>
	<pubDate>Thu, 24 Jun 2010 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: Case study: Arc International</title>
	<guid>http://www.process-one.net/en/blogs/article/case_study_arc_international/</guid>
	<link>http://www.process-one.net/en/blogs/article/case_study_arc_international/</link>
	<description>&lt;p&gt;Arc International has migrated away from a proprietary solution to the open source, and open standards ejabberd and Psi, realising cost-savings and productivity increase.&lt;/p&gt; &lt;p&gt;Arc International is well known for distributing famous tableware brands such as Luminarc&amp;reg;, Arcoroc, Chef&amp;amp;Sommelier, Pyrex and Cristal d&amp;rsquo;Arques Paris. With 12,000 employees around the world, from Europe to Asia, and the Middle East to North America, they needed to lower the costs of their previous solutions.&lt;/p&gt;
&lt;p&gt;They have chosen ejabberd, as an open-source, scalable XMPP platform. In conjunction, with the Psi cllent Arc International has achive their goals of cost-savings and high-quality service.&lt;/p&gt;
&lt;p&gt;The cost-savings have benefitted from a lower TCP on IT, as well as reduced telephone bills, while providing a same feature-set to the employees worldwide.&lt;/p&gt;
&lt;p&gt;Read our &lt;a href=&quot;http://www.process-one.net/en/customers/case_studies/&quot;&gt;case study&lt;/a&gt; on the website, or &lt;a href=&quot;http://www.process-one.net/resources/case_studies/ProcessOne_Arc_Int_Case_Study.pdf&quot;&gt;as a PDF&lt;/a&gt; (582 KB).&lt;/p&gt;</description>
	<pubDate>Wed, 23 Jun 2010 10:22:20 +0000</pubDate>
</item>
<item>
	<title>RedHotErlang: Dizzy thoughts</title>
	<guid>http://www.redhoterlang.com/web/09fdf1b17aaa09df65e42d47fbf49bae</guid>
	<link>http://www.redhoterlang.com/web/plink?id=09fdf1b17aaa09df65e42d47fbf49bae</link>
	<description>On the bus home today I was reading the first chapter of [Programming Clojure][1]. The text, which is excellent, discuss the motives behind Clojure. The bus however, was stinking hot and I started to doze off. I was in a strange state of being half a...</description>
	<pubDate>Tue, 22 Jun 2010 20:52:43 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: Migrating From MySQL to CouchDB</title>
	<guid>tag:damienkatz.net,2010://1.576</guid>
	<link>http://damienkatz.net/2010/06/migrating_from_mysql_to_couchd.html</link>
	<description>&lt;p&gt;Here is a detailed white paper from John P. Woods of &lt;a href=&quot;http://www.interactivemediums.com/&quot;&gt;Interactive Mediums&lt;/a&gt;, going into depth about their migration of their mobile marketing archive from MySQL to CouchDB.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.couch.io/migrating-to-couchdb&quot;&gt;http://www.couch.io/migrating-to-couchdb&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 22 Jun 2010 18:08:51 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: CouchCamp, aka BurningCouch!</title>
	<guid>tag:damienkatz.net,2010://1.575</guid>
	<link>http://damienkatz.net/2010/06/couchcamp_aka_burningcouch.html</link>
	<description>&lt;p&gt;&lt;span class=&quot;mt-enclosure mt-enclosure-image&quot;&gt;&lt;img alt=&quot;713448945.png&quot; src=&quot;http://damienkatz.net/pics/713448945.png&quot; width=&quot;426&quot; height=&quot;200&quot; class=&quot;mt-image-none&quot; /&gt;&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://couchcamp2010.eventbrite.com/&quot;&gt;Registration for CouchCamp&lt;/a&gt; is now open. &lt;a href=&quot;http://www.couch.io/couchcamp&quot;&gt;CouchCamp&lt;/a&gt; is our conference about CouchDB, September 8th - 10th 2010 at Walker Creek Ranch, north of the Bay area.&lt;/p&gt;

&lt;p&gt;This is the event to learn all about CouchDB and it's innards, the community, and how much beer I can drink before hurling. It's going to be fun!&lt;/p&gt;</description>
	<pubDate>Tue, 22 Jun 2010 17:12:57 +0000</pubDate>
</item>
<item>
	<title>RedHotErlang: Permutations</title>
	<guid>http://www.redhoterlang.com/web/a4ac64ecf68545ce5fd1fb27bc4e5931</guid>
	<link>http://www.redhoterlang.com/web/plink?id=a4ac64ecf68545ce5fd1fb27bc4e5931</link>
	<description>Permutations
==========

Permuting things is fun. Rearranging all the furniture's in a room 
is one kind of permutation.
Generating all combinations of the string &quot;ABC&quot; will give you five 
more strings.
&quot;ACB&quot;
&quot;BAC&quot;
&quot;BCA&quot;
&quot;CAB&quot;
&quot;CBA&quot;

In general you w...</description>
	<pubDate>Sun, 20 Jun 2010 15:29:41 +0000</pubDate>
</item>
<item>
	<title>Erlang Eclipse IDE: [erlide] Regular update site upgraded</title>
	<guid>http://sourceforge.net/news/?group_id=58889&amp;id=288298</guid>
	<link>http://sourceforge.net/news/?group_id=58889&amp;id=288298</link>
	<description>The regular update site at &lt;a href=&quot;http://erlide.org&quot;&gt;http://erlide.org&lt;/a&gt; has been updated to the now not so new p2 update manager format. Only the latest 0.8.3 build is available there.&lt;br /&gt;&lt;br /&gt;Older stable releases are to be found at &lt;a href=&quot;http://erlide.org/update_classic,&quot;&gt;http://erlide.org/update_classic,&lt;/a&gt; if needed.&lt;br /&gt;&lt;br /&gt;This is so that we can appear on the Eclipse marketplace, which will be integrated in Eclipse in the upcoming 3.6 version.&lt;br /&gt;&lt;br /&gt;regards,&lt;br /&gt;Vlad</description>
	<pubDate>Sat, 19 Jun 2010 20:21:55 +0000</pubDate>
	<author>vladdu@users.sourceforge.net (Vlad Dumitrescu)</author>
</item>
<item>
	<title>RedHotErlang: Erlang Factory, London 2010</title>
	<guid>http://www.redhoterlang.com/web/4fcdb6ceb9ed2729a80e9d9aca5fe97c</guid>
	<link>http://www.redhoterlang.com/web/plink?id=4fcdb6ceb9ed2729a80e9d9aca5fe97c</link>
	<description>I went to London recently to attend the Erlang Factory conference. We were a bunch of people coming from [Klarna][1], as you can see below:

[1]: http://www.klarna.com/

&amp;lt;img width=&quot;50%&quot; src=&quot;/blob/ab62b2625d4ec6b6f16b631508b87c48&quot;/&amp;gt;

And if you do s...</description>
	<pubDate>Sat, 19 Jun 2010 17:22:08 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: How Software Is Built: Apache CouchDB</title>
	<guid>tag:damienkatz.net,2010://1.574</guid>
	<link>http://damienkatz.net/2010/06/how_software_is_built_apache_c.html</link>
	<description>&lt;p&gt;Here is a detailed interview I recently did for HowSoftwareIsBuilt.com about CouchDB, document databases, cloud and replication:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://howsoftwareisbuilt.com/2010/06/18/interview-with-damien-katz-apache-couchdb/&quot;&gt;http://howsoftwareisbuilt.com/2010/06/18/interview-with-damien-katz-apache-couchdb/&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 18 Jun 2010 18:31:23 +0000</pubDate>
</item>
<item>
	<title>1011 Ltd Blog: HOWTO Choose a NoSQL Database</title>
	<guid>tag:1011ltd.com,2010-06-18:/web/blog/how_to_choose_a_nosql_database</guid>
	<link>http://www.1011ltd.com/</link>
	<description>&lt;p&gt;
The past year has seen an EXPLOSION in NoSQL databases. It feels like every month there a new contender to consider. The choice is fantastic,
but can also be problematic. If there are so many options, how do you choose which one fits your problem the best? The most information 
I've seen to date focusses on the features and performance of each. Those are important, but...
&lt;/p&gt;

&lt;div&gt;&lt;a href=&quot;http://www.1011ltd.com/web/blog/post/how_to_choose_a_nosql_database&quot;&gt;continue reading...&lt;/a&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 18 Jun 2010 13:30:00 +0000</pubDate>
</item>
<item>
	<title>Erlang Factory News: Erlang User Conference Date Announced</title>
	<guid>http://erlang-factory.com/news/rss/c0f1fbdd76f34b7a379cda6b42a0ae1a</guid>
	<link></link>
	<description>&lt;p&gt;The 2010 Erlang User Conference in Stockholm will be held on &lt;strong&gt;Tuesday  16th November 2010&lt;/strong&gt;. The venue will again be the Old Astoria  Cinema in Nybrogatan.&lt;/p&gt;
&lt;p&gt;On Monday 15th November there will be a &lt;a href=&quot;http://www.protest-project.eu/&quot;&gt;ProTest (Property-based Testing)&lt;/a&gt; seminar series held at the Ericsson conference faciilities. This will  allow delegates to again optimise their visit to Stockholm to take in  both these events.&lt;/p&gt;
&lt;p&gt;More details will be forthcoming in the near future. Keep a look out!&lt;/p&gt;</description>
	<pubDate>Fri, 18 Jun 2010 10:45:49 +0000</pubDate>
</item>
<item>
	<title>Erlang Eclipse IDE: [erlide] Dropped support for R11</title>
	<guid>http://sourceforge.net/news/?group_id=58889&amp;id=288182</guid>
	<link>http://sourceforge.net/news/?group_id=58889&amp;id=288182</link>
	<description>Version 0.8.1.201005250801 is the last to support R11, unless it will be required by enough users (or payed for with enough beers!) This is because R14 can no longer load R11 beam files and we don't have resources to keep two tracks alive.&lt;br /&gt;&lt;br /&gt;Version 0.8.3.201006171129 is functionally identical except that the  Erlang code is compiled with R12.&lt;br /&gt;&lt;br /&gt;regards,&lt;br /&gt;Vlad</description>
	<pubDate>Thu, 17 Jun 2010 12:51:46 +0000</pubDate>
	<author>vladdu@users.sourceforge.net (Vlad Dumitrescu)</author>
</item>
<item>
	<title>Trapexit News Feed: Trapexit News :: tryerlang.org is Live!</title>
	<guid>http://www.trapexit.org/forum/viewtopic.php?p=56344#56344</guid>
	<link>http://www.trapexit.org/forum/viewtopic.php?p=56344#56344</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: tryerlang.org is Live!&lt;br /&gt;
Posted: Wed Jun 16, 2010 1:29 pm (GMT 0)&lt;br /&gt;
Topic Replies: 0&lt;br /&gt;&lt;br /&gt;
&lt;span class=&quot;postbody&quot;&gt;tryerlang.org is an interactive hands-on tutorial that allows you to try the power of Erlang directly in the browser. Try the power of the Erlang shell without installing anything to your machine! Visit: &lt;a href=&quot;http://www.tryerlang.org&quot; target=&quot;_blank&quot;&gt;http://www.tryerlang.org&lt;/a&gt;
&lt;/span&gt;&lt;br /&gt;</description>
	<pubDate>Wed, 16 Jun 2010 13:31:28 +0000</pubDate>
</item>
<item>
	<title>Erlware: Build Process Integration</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-7002800913331855534</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/-8ejQyKYHik/build-process-integration.html</link>
	<description>IntroductionThis post isn't going to be Erlang or Language oriented at all. One of my other hobbies revolves around the build process and build process tools. Over the last few years I have been spending a lot of time thinking about improving them, making the build process more transparent etc. I have a way to do that, I believe. Unfortunately, it would take the cooperation of build too 
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/9CEbfnWvcwmoURec9drfnrEJUJg/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/9CEbfnWvcwmoURec9drfnrEJUJg/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/9CEbfnWvcwmoURec9drfnrEJUJg/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/9CEbfnWvcwmoURec9drfnrEJUJg/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/-8ejQyKYHik&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 16 Jun 2010 08:52:05 +0000</pubDate>
	<author>noreply@blogger.com (Eric Merritt)</author>
</item>
<item>
	<title>Damien Katz: Miscellaneous CouchDB News</title>
	<guid>tag:damienkatz.net,2010://1.572</guid>
	<link>http://damienkatz.net/2010/06/miscellaneous_couchdb_news.html</link>
	<description>&lt;p&gt;Awesome New Hires: We've recently hired &lt;a href=&quot;http://vmx.cx/&quot;&gt;Volker Mische&lt;/a&gt; of GeoCouch, and CouchDB contributor &lt;a href=&quot;http://fdmanana.wordpress.com/&quot;&gt;Filipe Manana&lt;/a&gt;. These guys are damn good!&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.couch.io/case-study-anologue&quot;&gt;CouchDB Case Study: Anologue&lt;/a&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;div&gt;&quot;It was difficult to continue programming at times, as I could hardly see through the tears of joy.&quot;&lt;p&gt;- Jon Adams, Chief Architect of Anologue &lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;CouchCamp: &lt;a href=&quot;http://www.couch.io/couchcamp&quot;&gt;September 8th - 10th 2010&lt;/a&gt; Registration will open soon.&lt;/p&gt;</description>
	<pubDate>Tue, 15 Jun 2010 16:58:21 +0000</pubDate>
</item>
<item>
	<title>1011 Ltd Blog: CV Bling</title>
	<guid>tag:1011ltd.com,2010-06-14:/web/blog/cv_bling</guid>
	<link>http://www.1011ltd.com/</link>
	<description>&lt;p&gt;
I love mainting my CV. As much as I love doing the dishes. This time around though, I'm hoping to make things a little bit more exciting and a little bit less painful for the future.
&lt;/p&gt;

&lt;div&gt;&lt;a href=&quot;http://www.1011ltd.com/web/blog/post/cv_bling&quot;&gt;continue reading...&lt;/a&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 14 Jun 2010 21:55:00 +0000</pubDate>
</item>
<item>
	<title>Programming in the 21st Century: A Ramble Through Erlang IO Lists</title>
	<guid>http://prog21.dadgum.com/70.html</guid>
	<link>http://prog21.dadgum.com/70.html</link>
	<description>The IO List is a handy data type in Erlang, but not one that's not often discussed in tutorials. It's any binary. Or any list containing integers between 0 and 255. Or any arbitrarily nested list containing either of those two things. Like this:
&lt;pre&gt;[10, 20, &quot;hello&quot;, &amp;lt;&amp;lt;&quot;hello&quot;,65&amp;gt;&amp;gt;, [&amp;lt;&amp;lt;1,2,3&amp;gt;&amp;gt;, 0, 255]]
&lt;/pre&gt;The key to IO lists is that you never flatten them. They get passed directly into low-level runtime functions (such as &lt;tt&gt;file:write_file&lt;/tt&gt;), and the flattening happens without eating up any space in your Erlang process. Take advantage of that! Instead of appending values to lists, use nesting instead. For example, here's a function to put a string in quotes:
&lt;pre&gt;quote(String) -&amp;gt; $&quot; ++ String ++ $&quot;.
&lt;/pre&gt;If you're working with IO lists, you can avoid the append operations completely (and the second &quot;++&quot; above results in an entirely new version of &lt;tt&gt;String&lt;/tt&gt; being created). This version uses nesting instead:
&lt;pre&gt;quote(String) -&amp;gt; [$&quot;, String, $&quot;].
&lt;/pre&gt;This creates three list elements no matter how long the initial string is. The first version creates &lt;tt&gt;length(String) + 2&lt;/tt&gt; elements. It's also easy to go backward and un-quote the string: just take the second list element. Once you get used to nesting you can avoid most append operations completely.
&lt;br /&gt;&lt;br /&gt;One thing that that nested list trick is handy for is manipulating filenames. Want to add a directory name and &quot;.png&quot; extension to a filename? Just do this:
&lt;pre&gt;[Directory, $/, Filename, &quot;.png&quot;]
&lt;/pre&gt;Unfortunately, filenames in the &lt;tt&gt;file&lt;/tt&gt; module are not true IO lists. You can pass in deep lists, but they get flattened by an Erlang function (&lt;tt&gt;file:file_name/1&lt;/tt&gt;), not the runtime system. That means you can still dodge appending lists in your own code, but things aren't as efficient behind the scenes as they could be. And &quot;deep lists&quot; in this case means &lt;i&gt;only&lt;/i&gt; lists, not binaries. Strangely, these deep lists can also contain atoms, which get expanded via &lt;tt&gt;atom_to_list&lt;/tt&gt;.
&lt;br /&gt;&lt;br /&gt;Ideally filenames would be IO lists, but for compatibility reasons there's still the need to support atoms in filenames. That brings up an interesting idea: why not allow atoms as part of the general IO list specification? It makes sense, as the runtime system has access to the atom table, and there's a simple correspondence between an atom and how it gets encoded in a binary; 'atom' is treated the same as &quot;atom&quot;. I find I'm often calling &lt;tt&gt;atom_to_list&lt;/tt&gt; before sending data to external ports, and that would no longer be necessary.</description>
	<pubDate>Sun, 13 Jun 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>Erlang at Work: epgsql Moved to GitHub</title>
	<guid>tag:blogger.com,1999:blog-24387664416792918.post-4565310557888394877</guid>
	<link>http://www.erlangatwork.com/2010/06/epgsql-moved-to-github.html</link>
	<description>epgsql development has picked up steam in the past few days with changes to support some of the upcoming features of PostgreSQL 9.0, bug fixes, and support for delivering asynchronous &lt;a href=&quot;http://www.postgresql.org/docs/8.4/static/libpq-notice-processing.html&quot;&gt;notices&lt;/a&gt; and notifications from the &lt;a href=&quot;http://www.postgresql.org/docs/8.4/static/sql-listen.html&quot;&gt;LISTEN&lt;/a&gt;/&lt;a href=&quot;http://www.postgresql.org/docs/8.4/static/sql-notify.html&quot;&gt;NOTIFY&lt;/a&gt; mechanism which will be much improved in PostgreSQL 9.0.&lt;br /&gt;&lt;br /&gt;I've also moved development to GitHub since git has become my primary version control system. You'll find the new master repository here:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://github.com/wg/epgsql&quot;&gt;http://github.com/wg/epgsql&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The old mercurial repositories will no longer be updated, but I'll leave them up for the time being. If you're a mercurial user please accept my apologies. I'm a big fan of hg but maintaining two repositories would be too much work, and git has a few killer features that convinced me to switch.&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/24387664416792918-4565310557888394877?l=www.erlangatwork.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 07 Jun 2010 22:43:20 +0000</pubDate>
	<author>noreply@blogger.com (Will Glozer)</author>
</item>
<item>
	<title>Joe's Blog: Just Opensourced: Gaff and Deckard</title>
	<guid>http://www.joeandmotorboat.com/?p=1021</guid>
	<link>http://www.joeandmotorboat.com/2010/06/04/just-opensourced-gaff-and-deckard/</link>
	<description>&lt;p&gt;&lt;em&gt;This post was stolen from my original post on the &lt;/em&gt;&lt;a href=&quot;http://blog.cloudant.com/just-opensourced-gaff-and-deckard&quot;&gt;&lt;em&gt;Cloudant blog&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Today we released two open source projects that have been in use internally at Cloudant for some time now, &lt;a href=&quot;http://github.com/joewilliams/gaff&quot;&gt;Gaff&lt;/a&gt; and &lt;a href=&quot;http://github.com/joewilliams/deckard&quot;&gt;Deckard&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All of our infrastructure is in the cloud and as such we need a way for disperate systems to all request resources, this is where Gaff comes in. Gaff is a pubsub daemon for asynchronously talking to cloud APIs using AMQP. Currently it supports a subset of the Dynect (DNS), Slicehost and EC2 APIs and uses &lt;a href=&quot;http://twitter.com/geemus&quot;&gt;geemus&lt;/a&gt;&amp;#8216; awesome &lt;a href=&quot;http://github.com/geemus/fog&quot;&gt;fog&lt;/a&gt; Ruby library. The basic workflow for Gaff is to send &lt;a href=&quot;http://json-rpc.org/&quot;&gt;JSON-RPC&lt;/a&gt; formated messages to an AMQP exchange with a routing key corresponding to the API you are talking to, you could be sending these messages from a web application or another service.  Each message gets routed to an API specific queue and is picked up by Gaff and turned into the appropriate API call, starting, stopping, modifying your servers on EC2 or elsewhere.&lt;/p&gt;
&lt;p&gt;We have a lot of CouchDB instances to keep tabs on to do this we wrote Deckard. Deckard is a HTTP check monitoring system based on CouchDB. Yo dawg! What better than to monitor CouchDB with CouchDB (and some Ruby)? Deckard supports basic HTTP content checks, email alerts, SMS alerts (via email) for on-call rotations, basic maintenance scheduling, replication latency alerts (between two Couches) and even has EC2 Elastic IP support for failover between two EC2 instances. Best of all since it&amp;#8217;s based on Couch you get an API for free, just PUT a doc in the HTTP checks database and you get a new HTTP check the next time Deckard runs.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Checkout these and my other projects on &lt;/em&gt;&lt;a href=&quot;http://github.com/joewilliams&quot;&gt;&lt;em&gt;GitHub&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and follow &lt;/em&gt;&lt;a href=&quot;http://twitter.com/cloudant&quot;&gt;&lt;em&gt;Cloudant&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a href=&quot;http://twitter.com/williamsjoe&quot;&gt;&lt;em&gt;myself&lt;/em&gt;&lt;/a&gt;&lt;em&gt; on Twitter.&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 04 Jun 2010 21:18:50 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: ejabberd 2.1.4 and exmpp 0.9.4 bugfix releases</title>
	<guid>http://www.process-one.net/en/blogs/article/ejabberd_2.1.4_and_exmpp_0.9.4_bugfix_releases/</guid>
	<link>http://www.process-one.net/en/blogs/article/ejabberd_2.1.4_and_exmpp_0.9.4_bugfix_releases/</link>
	<description>&lt;p&gt;We are pleased to announce the bugfix releases ejabberd 2.1.4 and exmpp 0.9.4.&lt;/p&gt; &lt;h2&gt;Regarding ejabberd 2.1.4:&lt;/h2&gt;
&lt;h3&gt;Brief summary of changes:&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bounce messages when closing c2s session&lt;/li&gt;
&lt;li&gt;Bugfixes when handling Service Discovery to contacts&lt;/li&gt;
&lt;li&gt;Don't send error stanza as reply to error stanza&lt;/li&gt;
&lt;li&gt;Don't store blocked messages in offline queue&lt;/li&gt;
&lt;li&gt;Extauth: Optionally cache extauth users in mnesia&lt;/li&gt;
&lt;li&gt;Full support for XEP-0115 Entity Capabilities v1.5&lt;/li&gt;
&lt;li&gt;HTTP-Bind: Remove 100ms delay, export functions for prebinding methods&lt;/li&gt;
&lt;li&gt;LDAP: Inband password change, Extensible match support, and ldap_tls_verify&lt;/li&gt;
&lt;li&gt;Localization: Updated most translations&lt;/li&gt;
&lt;li&gt;MUC: Refactor code to reduce calls to get_affiliation and get_role&lt;/li&gt;
&lt;li&gt;ODBC: Add created_at column also to PostgreSQL schema&lt;/li&gt;
&lt;li&gt;PAM: New option pam_userinfotype to provide username or JID&lt;/li&gt;
&lt;li&gt;Pubsub: Send node notification. Enforce presence_based_delivery, show_values&lt;/li&gt;
&lt;li&gt;Vcard: Automatic vcard avatar addition in presence&lt;/li&gt;
&lt;li&gt;WebAdmin: New Access rule webadmin_view for read-only&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Check the Release Notes for a more complete list of changes:&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.process-one.net/en/ejabberd/release_notes/release_note_ejabberd_2.1.4&quot;&gt;http://www.process-one.net/en/ejabberd/release_notes/release_note_ejabberd_2.1.4&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://redir.process-one.net/ejabberd-2.1.4&quot;&gt;http://redir.process-one.net/ejabberd-2.1.4&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Download&lt;/h3&gt;
&lt;p&gt;ejabberd 2.1.4 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/ejabberd/downloads&quot;&gt;http://www.process-one.net/en/ejabberd/downloads&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;Regarding exmpp 0.9.4:&lt;/h2&gt;
&lt;h3&gt;Brief summary of changes:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Add unexpected-request with cancel needed by pubsub&lt;/li&gt;
&lt;li&gt;Caps: Add exmpp_caps to the compilation scripts&lt;/li&gt;
&lt;li&gt;Caps: Move Caps erlang records to a header file&lt;/li&gt;
&lt;li&gt;Handle the case that the payload is incorrectly defined in error stanzas&lt;/li&gt;
&lt;li&gt;Preliminary documentation of functions from ejabberd 2 available in exmpp&lt;/li&gt;
&lt;li&gt;Remove unexpected-request with cancel as this is pubsub specific&lt;/li&gt;
&lt;li&gt;Support for SRV DNS query&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;exmpp home page:&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://support.process-one.net/doc/display/EXMPP/&quot;&gt;http://support.process-one.net/doc/display/EXMPP/&lt;/a&gt;&lt;br /&gt;or easier to remember: &lt;a href=&quot;http://exmpp.org/&quot;&gt;http://exmpp.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Download&lt;/h3&gt;
&lt;p&gt;Download exmpp 0.9.4 source code package from:&lt;a href=&quot;http://download.process-one.net/exmpp/&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&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>Fri, 04 Jun 2010 11:16:41 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: CouchDB on your TV</title>
	<guid>tag:damienkatz.net,2010://1.571</guid>
	<link>http://damienkatz.net/2010/06/couchdb_on_your_tv.html</link>
	<description>&lt;p&gt;After &lt;a href=&quot;http://damienkatz.net/2010/05/google_denies_our_commercial.html&quot;&gt;initially getting rejected for sound issues&lt;/a&gt;, Google Ads has finally approved our awesome Couchio commercial.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://vimeo.com/12280699&quot;&gt;GoogleAds Commercial Version&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So we've aired this commercial 11 times so far, 5 times during Robot Chicken, twice duringAqua Teen Hunger Force, once during Tim and Eric's Awesome Show, Great Job! and 3 times on VH1.&lt;/p&gt;

&lt;p&gt;It has gone to a total of 321,253 impressions, which means 321,253 people have seen Chris running like a lunatic around the streets of Oakland, singing the CouchDB praises.&lt;/p&gt;

&lt;p&gt;This has cost us a total of $709.57!&lt;/p&gt;

&lt;blockquote&gt;&lt;div&gt;Just saw a commercial for CouchDB. Seriously. I'm at a loss for words. #couchdb #couchio&lt;p&gt;&lt;a href=&quot;http://twitter.com/jrgarcia/statuses/15244999117&quot;&gt;@jrgarcia&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;Someday CouchDB will actually be inside your TV, you can watch CouchDB while watching your CouchDB TV from your couch.Yo dawg.&lt;/p&gt;</description>
	<pubDate>Fri, 04 Jun 2010 00:53:54 +0000</pubDate>
</item>
<item>
	<title>ejabberd@jabber.ru: ejabberd 2.1.4 - Fourth bugfix release</title>
	<guid>http://www.ejabberd.im/4088 at http://www.ejabberd.im</guid>
	<link>http://www.ejabberd.im/ejabberd-2.1.4</link>
	<description>&lt;p&gt;ejabberd 2.1.4 has been released. It contains many bugfixes and some improvements.&lt;/p&gt;
&lt;p&gt;This is a short list of changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bounce messages when closing c2s session&lt;/li&gt;
&lt;li&gt;Bugfixes when handling Service Discovery to contacts&lt;/li&gt;
&lt;li&gt;Don't send error stanza as reply to error stanza&lt;/li&gt;
&lt;li&gt;Don't store blocked messages in offline queue&lt;/li&gt;
&lt;li&gt;Extauth: Optionally cache extauth users in mnesia&lt;/li&gt;
&lt;li&gt;Full support for XEP-0115 Entity Capabilities v1.5&lt;/li&gt;
&lt;li&gt;HTTP-Bind (BOSH): Remove unneeded 100 ms delay, and export functions to facilitate prebinding methods&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;http://www.ejabberd.im/ejabberd-2.1.4&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 02 Jun 2010 16:29:16 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: ProcessOne at Google I/O: slides and photos</title>
	<guid>http://www.process-one.net/en/blogs/article/processone_at_google_i_o/</guid>
	<link>http://www.process-one.net/en/blogs/article/processone_at_google_i_o/</link>
	<description>&lt;p&gt;ProcessOne has joined the developer Sandbox in Google I/O 2010, in the  wave  area.&lt;/p&gt; &lt;div&gt;At the Google I/O event, we were sharing the space with innovative small business  gadget products (Caseish, Twilio), as well as large companies demoing their  use of the Wave protocol (Oracle, Salesforce, SAP, Novell).&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;ProcessOne  set itself apart by demoing a working and federated implementation of  the Google Wave protocol. The implementation has been made from scratch  and demonstrates that the protocol can federate and work well between two  completely different code bases (Google and ProcessOne).&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Here  are the slides explaining the scenario we were demoing on our pod:&lt;/div&gt;
&lt;div&gt;
&lt;div id=&quot;__ss_4368090&quot;&gt;&lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/mremond/waveone-server-and-client-by-processone&quot; title=&quot;WaveOne server and client by ProcessOne&quot;&gt;WaveOne server and client by ProcessOne&lt;/a&gt;&lt;/strong&gt; 







&lt;div&gt;View more &lt;a href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/mremond&quot;&gt;Micka&amp;euml;l R&amp;eacute;mond&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;A few pictures form the event.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Moscone Center West:&lt;/div&gt;
&lt;div&gt;&lt;img height=&quot;486&quot; src=&quot;http://www.process-one.net/images/uploads/2010-05-19_08.33_.34_.jpg&quot; width=&quot;648&quot; /&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;In the Developers Sandbox:&lt;/div&gt;
&lt;div&gt;&lt;img height=&quot;486&quot; src=&quot;http://www.process-one.net/images/uploads/2010-05-19_09.03_.19_.jpg&quot; width=&quot;648&quot; /&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Zoom to Wave pod:&lt;/div&gt;
&lt;div&gt;&lt;img height=&quot;486&quot; src=&quot;http://www.process-one.net/images/uploads/2010-05-19_10.40_.41_.jpg&quot; width=&quot;648&quot; /&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;An finally zoom to ProcessOne's booth:&lt;/div&gt;
&lt;div&gt;&lt;img height=&quot;486&quot; src=&quot;http://www.process-one.net/images/uploads/2010-05-20_18.29_.26_.jpg&quot; width=&quot;648&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 01 Jun 2010 17:38:28 +0000</pubDate>
</item>
<item>
	<title>Erlang Factory News: Only 1 week left!</title>
	<guid>http://erlang-factory.com/news/rss/d1a6ef28abaa44ec73f885a8133df097</guid>
	<link></link>
	<description>There is only 1 week left to the Erlang Factory London. The Erlang University courses will start on 7th June and will be followed by the two-day Conference which starts on Thursday 10th.&lt;br /&gt;&lt;br /&gt;There are still a few remaining places left on the &lt;a href=&quot;http://www.erlang-factory.com/conference/London2010/university&quot;&gt;Erlang University&lt;/a&gt; training courses: Erlang Express, Erlang OTP Express and Web Programming with Erlang. &lt;br /&gt;&lt;br /&gt;If you haven't registered yet, you can still get a last minute seat - &lt;a href=&quot;https://www.erlang-factory.com/conference/London2010/register&quot;&gt;Book Now&lt;/a&gt;!&lt;br /&gt;</description>
	<pubDate>Tue, 01 Jun 2010 09:46:00 +0000</pubDate>
</item>
<item>
	<title>Joe's Blog: Beyond BigData.</title>
	<guid>http://www.joeandmotorboat.com/?p=979</guid>
	<link>http://www.joeandmotorboat.com/2010/05/31/beyond-bigdata/</link>
	<description>&lt;p&gt;BigData is a big deal. It&amp;#8217;s changing how we look at data and analytics, but it isn&amp;#8217;t the end. What are the enablers of BigData? First and foremost, cheap computing resources (CPU, disks, memory, bandwidth, etc) all thanks to &lt;a href=&quot;http://en.wikipedia.org/wiki/Moore's_law&quot;&gt;Moore&amp;#8217;s Law&lt;/a&gt;. Today even startups have the ability to afford huge amounts of computing power, the likes previously only the big boys could afford. Additionally, this has given rise to commodity hardware and cloud computing, which only furthers the proliferation of large amounts cheap, quickly-provisioned, computing resources. Second, to apply all that power, we have open source data processing systems based on years of distributed systems research, like &lt;a href=&quot;http://hadoop.apache.org/&quot;&gt;Hadoop&lt;/a&gt;, and many incarnations of &lt;a href=&quot;http://en.wikipedia.org/wiki/Nosql&quot;&gt;NoSQL&lt;/a&gt;. The development of open source data processing sytems has allowed proliferation of systems that scale, which only the highly capitalized could afford, until recently. These two things alone have allowed for the democratization of BigData. A guy in a garage can process terabytes of data with little more than a credit card and elbow grease.&lt;/p&gt;
&lt;p&gt;With all these tools and recently acquired computing power, where are we going? Of course we can expect datasets to continue to grow, and the computational complexity of our data processing to increase, as well as compute power to continue to rise (GPGPUs, multicore and so on). In addition, I anticipate the emergence of something I&amp;#8217;m calling &lt;em&gt;NewData&lt;/em&gt;. NewData will build on what we have currently with the BigData, but will include some trends just beginning to take off. First, the development of ubiquitous public APIs (&lt;a href=&quot;http://stochasticresonance.wordpress.com/2009/04/01/meatcloud-manifesto/&quot;&gt;Meatcloud Manifesto&lt;/a&gt;). Public APIs have yet to proliferate to all online systems. As a consequence, there is still a lot of screen scraping going on. By having easily query-able and parse-able datasets available through ubiquitous APIs, consuming the internet with machines is easier making the application of BigData more powerful. &lt;a href=&quot;http://developer.netflix.com/&quot;&gt;Netflix&lt;/a&gt; is a good example of this. Second and similarly enabling will be the development of standardized public datasets. Current datasets are generally hard to find and use, standardized dataset formats will enable BigData analysis to be more productive and not waste time munging. &lt;a href=&quot;http://www.data.gov/&quot;&gt;Data.gov&lt;/a&gt; is a start. These two developments are yet to be fully realized in current systems but will allow for the rise of NewData. As these developments begin to roll out we will begin to see changes to how our BigData systems look. NewData systems will be less concerned with how big the data is and what it looks like, but will emphasize derivation of more information from the data. &lt;a href=&quot;http://techcrunch.com/2010/03/16/big-data-freedom/&quot;&gt;Bradford Cross gets this&lt;/a&gt;, and as a result &lt;a href=&quot;http://flightcaster.com/&quot;&gt;FlightCaster&lt;/a&gt; is an early example of what I mean by &lt;em&gt;NewData&lt;/em&gt;.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The scale of data and computations is an important issue, but the data age is less about the raw size of your data, and more about the cool stuff you can do with it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Asking the right questions of the data is important, especially if you&amp;#8217;re trying to do cool stuff. The &lt;a href=&quot;http://freakonomics.blogs.nytimes.com/&quot;&gt;Freakonomics&lt;/a&gt; guys proved this a few times over. NewData will be about creating value from data, and asking the right questions is worth as much as the answers. The key enablers of this will be using new found APIs and datasets to combine data from disperate sources in ways that BigData couldn&amp;#8217;t. Asking questions that we wouldn&amp;#8217;t have thought to ask of BigData. Where BigData was about a handful of datasets at most, NewData will be about dozens of datasets. The mashup is the cornerstone of NewData.&lt;/p&gt;
&lt;p&gt;That being said, we will need new systems to process this data and enable us to ask these questions. NewData analysis will need inter-process communication and collaboration. Currently, systems like Hadoop process data by splitting the data up and processing chunks in parallel on hundreds to thousands of machines. Processes are isolated from the other processes. This will continue, but NewData will require more from these systems to ask deeper questions. Complex inter-process communication will be needed to ask these questions. Think of the simplicity of writing Map/Reduce jobs, the robustness of Hadoop, the workflow and dataflow of &lt;a href=&quot;http://www.cascading.org/&quot;&gt;Cascading&lt;/a&gt; and &lt;a href=&quot;http://research.microsoft.com/en-us/projects/dryadlinq/&quot;&gt;DryadLINQ&lt;/a&gt;, respectively, and the power of a message passing system like &lt;a href=&quot;http://en.wikipedia.org/wiki/Message_Passing_Interface&quot;&gt;MPI&lt;/a&gt;. These jobs will likely include large in-memory collaborative computations across thousands of machines. Where data locality was key in BigData, both data and memory-locality (&lt;a href=&quot;http://en.wikipedia.org/wiki/Non-Uniform_Memory_Access&quot;&gt;NUMA/ccNUMA&lt;/a&gt;) will be important in NewData.&lt;/p&gt;
&lt;p&gt;It is clear that BigData still has some runway before NewData takes over. However, if the trends in the democratization of compute and processing continue (beyond Hadoop and EC2), and the opening of APIs and datasets proliferate online and off, NewData and it&amp;#8217;s new questions, mashups, and systems are inevitable. Where having readily available compute resources and the software to use it defined BigData, NewData will be defined solely by asking the right questions, the algorithms to derive answers, and the systems used to produce them.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thanks to &lt;a href=&quot;http://twitter.com/mlmilleratmit&quot;&gt;Mike Miller&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/lusciouspear&quot;&gt;Bradford Stephens&lt;/a&gt; and my awesome wife &lt;a href=&quot;http://twitter.com/xprimerw&quot;&gt;Erin&lt;/a&gt; for the help on this article.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Follow me on &lt;a href=&quot;http://twitter.com/williamsjoe&quot;&gt;twitter&lt;/a&gt;.&lt;br /&gt;
&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 31 May 2010 16:54:23 +0000</pubDate>
</item>
<item>
	<title>RedHotErlang: Rebar template support for gettext</title>
	<guid>http://www.redhoterlang.com/web/138dc1b1f8720f5c4f38864e4f0c338f</guid>
	<link>http://www.redhoterlang.com/web/plink?id=138dc1b1f8720f5c4f38864e4f0c338f</link>
	<description>I have added [gettext][1] support to my [rebar templates][2]. This makes it very
easy to internationalize a Nitrogen webapp. To show how this works I'll create
a simple example. First, we create the project using rebar:

[1]: http://github.com/etnt/g...</description>
	<pubDate>Sat, 29 May 2010 14:11:01 +0000</pubDate>
</item>
<item>
	<title>Erlware: Why Not To Use Distributed Supervision</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-8946991708665971332</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/Eq3xSmeY6rw/why-not-to-use-distributed-supervision.html</link>
	<description>Let's take the example of distributed supervision. Let's say we have one supervisor on node A that supervises children on node B and node C. What happens if network throughput slows down on the connection from Node A to Node B? This isn't transparent to the Supervisor on Node A. What should the supervisor on Node A do in this case? It has no contact with node B, so it's unsure whether or not the 
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/MqixcatrdcYkW7w7HF0hnxQ8qmk/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/MqixcatrdcYkW7w7HF0hnxQ8qmk/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/MqixcatrdcYkW7w7HF0hnxQ8qmk/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/MqixcatrdcYkW7w7HF0hnxQ8qmk/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/Eq3xSmeY6rw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 27 May 2010 09:52:21 +0000</pubDate>
	<author>noreply@blogger.com (Eric Merritt)</author>
</item>
<item>
	<title>Damien Katz: High Performance CouchDB</title>
	<guid>tag:damienkatz.net,2010://1.570</guid>
	<link>http://damienkatz.net/2010/05/high_performance_couchdb.html</link>
	<description>&lt;p&gt;At Couchio we are working with a company that makes high performance database appliances. These are complete system stacks where all the components, software and interconnects are carefully chosen, modified and optimized. They can deliver performance and scalability that's often an order of magnitude better than what can be accomplished by assembling your own systems with commodity components, and reducing overall hardware and admin costs.&lt;/p&gt;

&lt;p&gt;So if you are a user of Apache CouchDB and are interested in high performance CouchDB servers, we'd love to talk with you to help us shape our plans and offerings, and potentially join an early adopters program. Email me at damien@couch.io.&lt;/p&gt;</description>
	<pubDate>Tue, 25 May 2010 18:47:06 +0000</pubDate>
</item>
<item>
	<title>Erlang Factory News: Early-Bird Registration Ends in Just ONE WEEK!</title>
	<guid>http://erlang-factory.com/news/rss/d706ee57b67ae0154dafa8430a38e1de</guid>
	<link></link>
	<description>Early-Bird Registration for the Erlang Factory London 2010 ends on &lt;span&gt;31st May&lt;/span&gt;, so you have only one week to &lt;span&gt;save&lt;/span&gt; up to&lt;span&gt; £200&lt;/span&gt; (incl. VAT)!&lt;br /&gt;&lt;br /&gt;There are only 2 weeks left to the biggest Erlang gathering in London. List of the speakers, the tracks and talks as well as the programme of the conference are now available on &lt;a href=&quot;http://www.erlang-factory.com/conference/London2010&quot;&gt;www.erlang-factory.com/conference/London2010&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Don't miss out and &lt;a href=&quot;https://www.erlang-factory.com/conference/London2010/register&quot;&gt;register&lt;/a&gt; today. &lt;br /&gt;</description>
	<pubDate>Mon, 24 May 2010 11:30:51 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: WaveOne, a wave server and client by ProcessOne</title>
	<guid>http://www.process-one.net/en/blogs/article/waveone_a_wave_server_by_processone/</guid>
	<link>http://www.process-one.net/en/blogs/article/waveone_a_wave_server_by_processone/</link>
	<description>&lt;p&gt;WaveOne, the new wave server developped by ProcessOne, has been demoed at Google I/O.&lt;/p&gt; &lt;p&gt;&lt;span&gt;ProcessOne has been invited to join the Wave area in  Google Developer Sandbox at Google I/O 2010 in San Francisco.&lt;br /&gt;&lt;br /&gt;Micka&amp;euml;l  R&amp;eacute;mond, the founder of ProcessOne, has been invited by Google in the  context of the Google I/O event, to write &lt;a href=&quot;http://googlecode.blogspot.com/2010/05/waveone-wave-server-implementation.html&quot;&gt;a blog post to introduce  WaveOne&lt;/a&gt;, our own wave server implementation.&lt;br /&gt;&lt;br /&gt;WaveOne is basically  an ejabberd module, so it is written in Erlang. It features an  Operationnal Transform engine, as well as a Wave Store. It means that  with the help of a client, you can - on your own WaveOne server  installation - create, edit, store and share wavelets.&lt;br /&gt;&lt;br /&gt;The  WaveOne extension to our XMPP client OneTeam enables you to manage your  wavelets (and blips), like create, edit, as well as add participants to  wavelets, still on your own WaveOne server installation.&lt;br /&gt;&lt;br /&gt;With the  WaveOne client and server, you can collaborate in real-time internally,  as well as externally, thanks to the federation capability. WaveOne  supports federation with Google Wave in both directions. You can host  the wavelets on your local server and have remote participants or you  can do the reverse and participate to wavelets hosted on the Google  server. This enables you to add participants, or be added as  participant, to wavelets hosted on any wave server. Everything works in  real time with character by character support.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Here is a screenshot that shows a wavelet (containing two blips) edited both on Google Wave and ProcessOne's WaveOne:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img height=&quot;212&quot; src=&quot;http://www.process-one.net/images/uploads/WaveOne_federation.png&quot; width=&quot;485&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;The result is  much like having your own e-mail or XMPP client and server under your  own control. This is built on the power of XMPP-based federation.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;A handy feature of our WaveOne implementation is the capability to share a textarea of a webpage, for collaborative real-time text editing. This has been demoed at Google I/O, and has received much interest. Here are some sample screenshots.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The user &lt;/span&gt;&lt;span&gt;right-clicks in &lt;/span&gt;&lt;span&gt;a textarea, and shares it:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img height=&quot;220&quot; src=&quot;http://www.process-one.net/images/uploads/WaveOne_share_textarea_on_wave.png&quot; width=&quot;295&quot; /&gt;&lt;/p&gt;
&lt;p&gt;He adds participants to the wavelet:&lt;/p&gt;
&lt;p&gt;&lt;img height=&quot;102&quot; src=&quot;http://www.process-one.net/images/uploads/WaveOne_add_paticipants.png&quot; width=&quot;275&quot; /&gt;&lt;/p&gt;
&lt;p&gt;All participants can collaboratively edit the text in real-time:&lt;/p&gt;
&lt;p&gt;&lt;img height=&quot;155&quot; src=&quot;http://www.process-one.net/images/uploads/WaveOne_edit_wavelet.png&quot; width=&quot;348&quot; /&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 21 May 2010 14:00:41 +0000</pubDate>
</item>
<item>
	<title>Learn You Some Erlang: The Hitchhiker's Guide to Concurrency</title>
	<guid>http://learnyousomeerlang.com/the-hitchhikers-guide-to-concurrency</guid>
	<link>http://learnyousomeerlang.com/the-hitchhikers-guide-to-concurrency</link>
	<description>I was a bit slow to produce this chapter, but I'll blame that on my laptop dying on me and playoffs Hockey (watching a game as I'm writing this!) Anyway, this is the first chapter to really talk about Erlang's concurrency. Because of this, I'm taking a theoretical approach and visiting the language's history a little bit, explaining the rationale and doing a quick overview of how processes work in Erlang. I also take a look at the concepts of concurrency and parallelism to make sure everyone will be on the same level no matter what their background is. I also show the basic building blocks of concurrent Erlang: spawning processes, sending messages and then receiving them.</description>
	<pubDate>Fri, 21 May 2010 13:30:00 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: I'm in your phone</title>
	<guid>tag:damienkatz.net,2010://1.569</guid>
	<link>http://damienkatz.net/2010/05/im_in_your_phone.html</link>
	<description>&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.couch.io/post/613382692/look-at-what-nitin-did-here-after-registering-at&quot;&gt;CouchDB on Motorola Droid&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://28.media.tumblr.com/tumblr_l2pzv0EYrS1qb3bkxo1_500.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.couch.io/post/616185137/look-at-my-couch-it-runs-on-a-nokia-n900&quot;&gt;And on Nokia n900&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 21 May 2010 00:53:14 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: CouchDB Rap</title>
	<guid>tag:damienkatz.net,2010://1.568</guid>
	<link>http://damienkatz.net/2010/05/couchdb_rap.html</link>
	<description>&lt;p&gt;&lt;p&gt;&lt;a href=&quot;http://vimeo.com/11852209&quot;&gt;I Use Couch DB&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.h-online.com/open/features/Couchio-rap-literally-about-CouchDB-1004451.html&quot;&gt;Premiered today on The H&lt;/a&gt;. Nice.&lt;/p&gt;</description>
	<pubDate>Fri, 21 May 2010 00:44:40 +0000</pubDate>
</item>
<item>
	<title>Scattered Thoughts: about</title>
	<guid>http://scattered-thoughts.net/
/one/1274/311378/673056</guid>
	<link></link>
	<pubDate>Wed, 19 May 2010 23:22:58 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: TextOne for Android, simple texting for even more smartphones</title>
	<guid>http://www.process-one.net/en/blogs/article/textone_for_android_simple_texting_for_even_more_smartphones/</guid>
	<link>http://www.process-one.net/en/blogs/article/textone_for_android_simple_texting_for_even_more_smartphones/</link>
	<description>&lt;p&gt;TextOne is now available for Android devices, enabling smartphone lovers to text friends and contacts the smart and easy way.&lt;/p&gt; &lt;p&gt;ProcessOne has released an early version of TextOne, the smart text messaging application for smartphones, for the Android platform. As on the iPhone, it features one-to-one chats, and simple groupchats. TextOne also provides reliability mechanisms like visual delivery notification. Of course TextOne for Android and TextOne for iPhone are fully interoperable.&lt;/p&gt;
&lt;p&gt;TextOne is better than:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SMS:        
&lt;ul&gt;
&lt;li&gt;because you can exchange messages freely at no cost&lt;/li&gt;
&lt;li&gt;because you can groupchat&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;IM/chat:        
&lt;ul&gt;
&lt;li&gt;because you have reliability mechanisms&lt;/li&gt;
&lt;li&gt;because you don't need a useless presence icon, just send ans  receive simply&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As an early version, you may experience some bugs and weirdnesses. You can report them on the dedicated &lt;a href=&quot;http://www.process-one.net/en/forum/viewforum/25/&quot;&gt;TextOne forum&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;TextOne for Android works starting from Android 1.5.&lt;/p&gt;
&lt;p&gt;Here are some screenshots, so you can have an idea on its look and feel:&lt;/p&gt;
&lt;p&gt;The conversation list:&lt;/p&gt;
&lt;p&gt;&lt;img height=&quot;400&quot; src=&quot;http://www.process-one.net/images/uploads/TextOne_Android_conversation_list.png&quot; width=&quot;240&quot; /&gt;&lt;/p&gt;
&lt;p&gt;And the conversation screen:&lt;/p&gt;
&lt;p&gt;&lt;img height=&quot;400&quot; src=&quot;http://www.process-one.net/images/uploads/TextOne_Android_conversation.png&quot; width=&quot;240&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Please feel free to download and play with TextOne for Android in version 0.8.4. It is currently available on the Android  Market.&lt;/p&gt;
&lt;p&gt;TextOne Android is free during the beta period. A TextOne extended version for Android 2.0 to use the native content management feature is scheduled.&lt;/p&gt;</description>
	<pubDate>Wed, 19 May 2010 15:17:53 +0000</pubDate>
</item>
<item>
	<title>RedHotErlang: New Layout</title>
	<guid>http://www.redhoterlang.com/web/47c625740ddd7217b7bf8f8bc722939e</guid>
	<link>http://www.redhoterlang.com/web/plink?id=47c625740ddd7217b7bf8f8bc722939e</link>
	<description>RedHotErlang has got a new layout. The old layout had been around for some years now and I wanted to move the code base to use Nitrogen-2.0. So, gone is the desktop style structure with no visible page loads. Now the site is using a more normal page ...</description>
	<pubDate>Tue, 18 May 2010 18:59:30 +0000</pubDate>
</item>
<item>
	<title>Erlang Solutions &lt;br/&gt;- News: 17 May 2010: Erlang Solutions awarded a Knowledge Transfer Partnership with the Kent Business School</title>
	<guid>http://www.erlang-solutions.com/news/1/entry/1159</guid>
	<link>http://www.erlang-solutions.com/news/1/entry/1159</link>
	<description>Erlang Solutions is proud to announce that a third KTP project has been accepted by the &lt;a href=&quot;http://www.ktponline.org.uk/&quot; target=&quot;_blank&quot;&gt;Knowledge Partnerships Programme&lt;/a&gt; (KTP). This is in addition to the Reusable Components project that recently completed and the E-Learning/E-Certification Project that began in October 2009. This project will be a strategic marketing project together with the University of Kent, who have been our Academic partners in the other two projects and with whom Erlang Solutions has a strong partnership.&lt;br /&gt;&lt;br /&gt;The main purpose of the project will be to establish and nurture a marketing orientation within the company and improve current marketing processes from a tactical and strategic perspective.</description>
	<pubDate>Mon, 17 May 2010 10:17:36 +0000</pubDate>
</item>
<item>
	<title>Erlang Solutions &lt;br/&gt;- News: 26 April 2010: Hans Nilsson joins Erlang Solutions as Senior Consultant</title>
	<guid>http://www.erlang-solutions.com/news/1/entry/1152</guid>
	<link>http://www.erlang-solutions.com/news/1/entry/1152</link>
	<description>Erlang Solutions Ltd proudly welcomes one of the world's most experienced and capable Erlang experts into our team.&lt;br /&gt;&lt;br /&gt;Hans Nilsson joined the Ericsson Computer Science Lab in 1988, the year after Joe Armstrong. For the first two years, he worked on the development of the highly regarded SICSTUS Prolog. In 1995 together with&amp;#160; Claes Wikstr&amp;#246;m, he developed the Mnesia DBMS and Mnemosyne query language, and then went on to study the budding Voice over IP field. He implemented his first Erlang-based SIP stack in 1998, while the standard (RFC2543) was not yet in stable draft. Hans presented his SIP-ISDN Gateway at the Erlang User Conference 1997.&lt;br /&gt;&lt;br /&gt;After a couple of years developing a residential Ethernet switch at Ericsson, Hans returned to Voice over IP. He established himself as one of Ericsson's leading SIP experts, and was the company's representative in the GSM Association SIP Technical Expert Group. Meanwhile, he was the technical lead on a large product development project based on his SIP implementation. Before joining Erlang Solutions, he worked in a tiger team doing advanced prototyping with Erlang in close cooperation with the Intel Performance Lab.&lt;br /&gt;&lt;br /&gt;Hans is also a key member of the &lt;a href=&quot;http://www.protest-project.eu/&quot; target=&quot;_blank&quot;&gt;ProTest&lt;/a&gt; EU Project, where his work on property-baseddata mining of packet trace logs and QuickCheck verification of SIP parsers have been highly influential. As Erlang Solutions is an active member of that project, his involvement will continue.&lt;br /&gt;&lt;br /&gt;With the addition of Hans Nilsson, Erlang Solutions is able to offer world-class expertise in the Voice over IP field.</description>
	<pubDate>Fri, 14 May 2010 15:16:46 +0000</pubDate>
</item>
<item>
	<title>Erlang Solutions &lt;br/&gt;- News: 10 May 2010: Erlang Solutions Announces Opening of New Office in Stockholm, Sweden</title>
	<guid>http://www.erlang-solutions.com/news/1/entry/1155</guid>
	<link>http://www.erlang-solutions.com/news/1/entry/1155</link>
	<description>Erlang Solutions Ltd has opened a new office in central Stockholm. The new office and and staff with extensive knowledge of Erlang will allow the company to better serve its large client-base in Sweden and worldwide. The expansion also provides an expanded training portfolio and facilities. It is envisaged that Erlang community will meet here at regularly organised Erlang User Group Meetings. In addition Erlang Solutions will be able to accommodate more students for internships, training and certification.&lt;br /&gt;&lt;br /&gt;Erlang Solutions&amp;#8217; new office is located at&lt;span&gt; Saltm&amp;#228;targatan 5, 113 59 Stockholm,&lt;/span&gt; &lt;span&gt;Sweden&lt;/span&gt; and can be reached by phone at &lt;span&gt;+46 - (0) 8 - 120 424 00&lt;/span&gt;</description>
	<pubDate>Fri, 14 May 2010 15:16:46 +0000</pubDate>
</item>
<item>
	<title>BGH's Blog: Silence</title>
	<guid>http://benjaminhalsted.com/2010/05/silence/</guid>
	<link>http://benjaminhalsted.com/2010/05/silence/</link>
	<description>&lt;p&gt;The blog has been a bit quiet. I've been rewriting some of our server software at work in Erlang and it's taken up most of my free time. I'm about done with it, so we should see the posts pick up again soon.&lt;/p&gt;
&lt;p&gt;Cheers,&lt;br /&gt;
  Halzy&lt;/p&gt;</description>
	<pubDate>Thu, 13 May 2010 14:49:19 +0000</pubDate>
</item>
<item>
	<title>Programming in the 21st Century: How to Think Like a Pioneer</title>
	<guid>http://prog21.dadgum.com/69.html</guid>
	<link>http://prog21.dadgum.com/69.html</link>
	<description>Here's an experiment to try at home: do a Google image search for &quot;integrated development environment.&quot; Take some time to go through the first several pages of pictures.
&lt;br /&gt;&lt;br /&gt;Even if you had no idea what an IDE was, the patterns are obvious. There's a big area with text in it, and on the left side of the screen is a pane that looks a lot like Windows Explorer: a collection of folders and files in a tree view, each with icons. Some folders are closed and have little plus signs next to them. Others are expanded and you can see the files contained within them. To be perfectly fair, this project area is sometimes on the right side of the window instead of the left. Variety is the spice of life and all that.
&lt;br /&gt;&lt;br /&gt;Why have IDEs settled into this pattern of having a project view take up twenty percent or more of the entire left or right side of the window?
&lt;br /&gt;&lt;br /&gt;The answer is shallower than you may expect. Someone who decides to create an IDE uses the existing programs he or she is familiar with as models. In other words, &quot;because that's how it's supposed to be.&quot;
&lt;br /&gt;&lt;br /&gt;There's no solid reason the project view pane has to be the way it usually is. In fact, there are some good arguments against doing it that way. First, you are typically either looking at the project view or you're editing a file, not doing both at the same time. Yet the project view is always there, taking up screen real estate, sometimes a lot of screen real estate if highly nested folders are expanded. That view is made even wider by having icons to the left of each filename, even though most projects consist of one or two file types and they could be differentiated with color or an outline instead of a contrived icon attempting to evoke &quot;file of Java code.&quot;
&lt;br /&gt;&lt;br /&gt;Second, a long, thin pane containing files and folders doesn't give a particularly deep or even interesting view of a large project. Open a folder and it might fill the whole pane, and all the other folders are now offscreen.
&lt;br /&gt;&lt;br /&gt;Are there better options? Sure! The first problem, of losing screen space to a persistent view of the project hierarchy, can be alleviated by a hot key that brings up a full-screen overlay. When you want to see the project as a whole, hit a key. Press escape to make it go away (or double-click a file to edit it).
&lt;br /&gt;&lt;br /&gt;The data presented in this overlay doesn't need to be a tree view. A simple option is to group related files into colored boxes, much like folders, except you can see the contents the whole time. With the narrow, vertical format out of the way, there can be multiple columns of boxes filling the space. Now you can see 100+ files at a time instead of a dozen.
&lt;br /&gt;&lt;br /&gt;It might make more sense to display modules as shapes, each connected by lines to the modules which are imported. Or provide multiple visualizations of the project, each for a different purpose.
&lt;br /&gt;&lt;br /&gt;Someone, sometime, and probably not all that long ago, came up with the canonical &quot;project view on the left side of the window&quot; design for IDEs. And you may wonder how that person arrived at that solution. After all, there were no prior IDEs to use for guidance. I think the answer is a basic one: because it's a solution that worked and was better than what came before. No magic. No in-depth comparison of a dozen possibilities. Clearly a way to see all the files in a project is better than a raw window in a text editor where there's no concept of &quot;project&quot; whatsoever. That solution wasn't the best solution that could ever exist in the entire future history of IDEs, but it sure fooled people into thinking it was.
&lt;br /&gt;&lt;br /&gt;If you want to think like a pioneer, focus on the problem you're trying to solve. The actual problem. Don't jump directly to what everyone else is doing and then rephrase your problem in terms of that solution. In the IDE case, the problem is &quot;How can I present a visual overview of a project,&quot; not &quot;How can I write a tree viewer like in all other other IDEs I've ever seen?&quot;</description>
	<pubDate>Thu, 13 May 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>1011 Ltd Blog: Google Wave @ BCS SPA - slides</title>
	<guid>tag:1011ltd.com,2010-05-10:/web/blog/bcs_spa_wave_talk</guid>
	<link>http://www.1011ltd.com/</link>
	<description>&lt;p&gt;
Here are the slides from the presentation I gave at &lt;a href=&quot;http://www.bcs-spa.org/cgi-bin/view/SPA/GoogleWaveHypeRealityAndFuture&quot;&gt;BCS SPA on the 5th of May&lt;/a&gt;. They're really not that useful without actually hearing the talk, because I don't believe in creating slides that people just read. But you might find them useful if you were there.&lt;/p&gt;

&lt;div&gt;&lt;a href=&quot;http://www.1011ltd.com/web/blog/post/bcs_spa_wave_talk&quot;&gt;continue reading...&lt;/a&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 10 May 2010 18:01:12 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: TextOne Pink: iPhone messaging with style, for the ladies</title>
	<guid>http://www.process-one.net/en/blogs/article/textone_pink_iphone_messaging_with_style_for_the_ladies/</guid>
	<link>http://www.process-one.net/en/blogs/article/textone_pink_iphone_messaging_with_style_for_the_ladies/</link>
	<description>&lt;p&gt;ProcessOne has released a new version of TextOne: TextOne Pink.&lt;/p&gt; &lt;p&gt;TextOne is our new application for simple messaging between smartphones, with groupchat. TextOne has now a sister: TextOne Pink! It is aimed at the ladies worldwide. This is the same strong product designed with extreme simplicity and reliability in mind.&lt;/p&gt;
&lt;p&gt;Here are a few sample screenshots...&lt;/p&gt;
&lt;p&gt;Splash screen:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Splash screen&quot; src=&quot;http://www.process-one.net/images/uploads/Default.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Conversation screen:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.process-one.net/images/uploads/PinkScreenshot1.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Conversation list:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.process-one.net/images/uploads/PinkScreenshot2.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Group chat:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.process-one.net/images/uploads/PinkScreenshot3.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Search &quot;TextOne&quot; on the AppStore, you will find both &quot;TextOne&quot; and &quot;TextOne Pink&quot;. Simply choose your version and a username, and start conversations!&lt;/p&gt;
&lt;p&gt;You can talk about TextOne and share your tips and tricks &lt;a href=&quot;http://www.process-one.net/en/forum/viewforum/25/&quot; title=&quot;TextOne&quot;&gt;on the forum&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Mon, 10 May 2010 15:00:47 +0000</pubDate>
</item>
<item>
	<title>Erlang Factory News: Countdown to the Erlang Factory London</title>
	<guid>http://erlang-factory.com/news/rss/54912fa5de508665d7d28d42ed6475f1</guid>
	<link></link>
	<description>There are&lt;span&gt; only 4 weeks left&lt;/span&gt; to the Erlang Factory London. If you haven't registered yet, you can still do this by clicking &lt;a href=&quot;https://www.erlang-factory.com/conference/London2010/register&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We have new confirmed speakers: &lt;span&gt;Peter Andersson&lt;/span&gt;&lt;br /&gt;(Developer at Erlang/OTP),&lt;span&gt;Mariano Guerra&lt;/span&gt; (creator of the Efene programming language), &lt;span&gt;Erik Stenman&lt;/span&gt; (CTO of Klarna) and &lt;span&gt;Daniel Widgren&lt;/span&gt; and &lt;span&gt;Michael Nordström&lt;/span&gt; (Erlang hackers at Klarna).&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/London2010/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.</description>
	<pubDate>Mon, 10 May 2010 14:01:11 +0000</pubDate>
</item>
<item>
	<title>Chicago Erlang User Group: CEUG April 21st meeting slides - Switching from Python and Java to Erlang</title>
	<guid>tag:blogger.com,1999:blog-2706443342944599131.post-2841576013781987109</guid>
	<link>http://chicagoerlangusergroup.blogspot.com/2010/05/ceug-april-21st-meeting-slides.html</link>
	<description>Chris and Garrett have been kind enough to share their slides on moving to Erlang from Python and Java, respectively. Video of Chris's talk can be found here, while video of Garrett's talk can be found here. Finally, there was a joint Q&amp;amp;A session which can be found here.Our next meeting is tentatively schedule for June 2nd at Orbitz. The meeting will cover the reasons why to choose OTP for all</description>
	<pubDate>Thu, 06 May 2010 22:17:00 +0000</pubDate>
	<author>noreply@blogger.com (Jordan Wilberding)</author>
</item>
<item>
	<title>Damien Katz: CouchDB Case Studies</title>
	<guid>tag:damienkatz.net,2010://1.566</guid>
	<link>http://damienkatz.net/2010/05/couchdb_case_studies.html</link>
	<description>&lt;p&gt;We've just put up our new &lt;a href=&quot;http://www.couch.io/case-studies&quot;&gt;CouchDB case studies page&lt;/a&gt;. So far we have the &lt;a href=&quot;http://www.bbc.co.uk/&quot;&gt;BBC&lt;/a&gt;, &lt;a href=&quot;http://www.assaydepot.com/&quot;&gt;Assay Depot&lt;/a&gt; and &lt;a href=&quot;http://www.interactivemediums.com/&quot;&gt;Interactive Mediums&lt;/a&gt;, and more in the works. And if you are interested in being profiled for a case study, &lt;a href=&quot;http://blog.couch.io/post/576869253/new-couchdb-case-studies-posted-and-we-want-to-hear&quot;&gt;see this post&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Thu, 06 May 2010 21:10:31 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: Announcing New Erlang Native GeoCouch</title>
	<guid>tag:damienkatz.net,2010://1.565</guid>
	<link>http://damienkatz.net/2010/05/announcing_new_erlang_native_g.html</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://vmx.cx/cgi-bin/blog/index.cgi/geocouch-the-future-is-now%3A2010-05-03%3Aen%2CCouchDB%2CPython%2CErlang%2Cgeo&quot;&gt;GeoCouch: The Future is Now&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;div&gt;An idea has become reality. Exactly two years after the blog post with the initial vision, a new version of GeoCouch is finished. It's a huge step forward. The first time the dependencies were narrowed down to CouchDB itself. No Python, no SpatiaLite any longer, it's pure Erlang. GeoCouch is tightly integrated with CouchDB, so you'll get all the nice features you love about CouchDB.&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;Awesome work Volker!&lt;/p&gt;</description>
	<pubDate>Wed, 05 May 2010 22:25:58 +0000</pubDate>
</item>
<item>
	<title>RedHotErlang: rebar templates</title>
	<guid>http://www.redhoterlang.com/web/93c0d68814f9d92b2560492529fd14dd</guid>
	<link>http://www.redhoterlang.com/web/plink?id=93c0d68814f9d92b2560492529fd14dd</link>
	<description>When I start a new little project of mine, I've had a big ugly shell script that creates the various source files I need. I can now say goodby to that script and instead make use of [rebar][1]'s template functionality.

[Rebar][1] templates are locat...</description>
	<pubDate>Tue, 04 May 2010 11:52:33 +0000</pubDate>
</item>
<item>
	<title>Erlang Factory News: New Speakers and the Very Early-Bird discount!</title>
	<guid>http://erlang-factory.com/news/rss/e1296aec13bff4987a6254b52db9b62a</guid>
	<link></link>
	<description>We have new amazing &lt;a href=&quot;http://erlang-factory.com/../../conference/London2010/speakers&quot;&gt;speakers&amp;nbsp; &lt;/a&gt;for the Erlang Factory: Mariano Guerra (Creator of Efene and Emesene IM), Laura M. Castro from University of A Coruña, Michael Nordström and Daniel Widgren from Klarna, Ulf Norell and John Hughes from QuviQ AB.&lt;br /&gt;To see all Speakers please click &lt;a href=&quot;http://erlang-factory.com/../../conference/London2010/speakers&quot;&gt;here&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;span&gt;Hurry!&lt;/span&gt; The Very Early Bird offer for the Erlang Factory London 2010 has been
extended to &lt;span&gt;Friday 7th May&lt;/span&gt;. Take advantage of this and book soon to
&lt;span&gt;save up to £400&lt;/span&gt; off the standard price!&lt;br /&gt;</description>
	<pubDate>Tue, 04 May 2010 10:31:46 +0000</pubDate>
</item>
<item>
	<title>Joe's Blog: Availability, the Cloud and Everything</title>
	<guid>http://www.joeandmotorboat.com/?p=1016</guid>
	<link>http://www.joeandmotorboat.com/2010/05/31/availability-the-cloud-and-everything/</link>
	<description>&lt;p&gt;Finally posted my presentation at &lt;a href=&quot;http://erlang-factory.com/conference/SFBay2010&quot;&gt;Erlang Factory&lt;/a&gt;, &lt;a href=&quot;http://www.washingtontechnology.org/&quot;&gt;WTIA Cloud SIG&lt;/a&gt; and &lt;a href=&quot;http://www.meetup.com/Seattle-Hadoop-HBase-NoSQL-Meetup/&quot;&gt;Seattle Scalability Meetup&lt;/a&gt; here on the blog.&lt;/p&gt;
&lt;div id=&quot;__ss_3567217&quot;&gt;&lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/logicalstack/availability-the-cloud-and-everything&quot; title=&quot;Availability, the Cloud and Everything&quot;&gt;Availability, the Cloud and Everything&lt;/a&gt;&lt;/strong&gt;
&lt;div&gt;View more &lt;a href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/logicalstack&quot;&gt;logicalstack&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;</description>
	<pubDate>Sat, 01 May 2010 17:37:42 +0000</pubDate>
</item>
<item>
	<title>Erlang Examples: Building Erlang B13R04 in CentOS 5.4</title>
	<guid>http://erlangexamples.com/?p=105</guid>
	<link>http://feedproxy.google.com/~r/ErlangExamples/~3/Xo8NCuoaxOw/</link>
	<description>&lt;p&gt;Last post was about &lt;a href=&quot;http://erlangexamples.com/2010/04/05/building-erlang-b13r04-in-ubuntu-9-10-karmic/&quot;&gt;building Erlang B13R04 in Ubuntu&lt;/a&gt;. For CentOS, it&amp;#8217;s somehow the same with &lt;strong&gt;yum&lt;/strong&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
sudo yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel&lt;br /&gt;
wget http://www.erlang.org/download/otp_src_R13B04.tar.gz&lt;br /&gt;
tar xfvz otp_src_R13B04.tar.gz&lt;br /&gt;
cd otp_src_R13B04/&lt;br /&gt;
./configure --with-ssl&lt;br /&gt;
sudo make install&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
However, I haven&amp;#8217;t found the similar package to &lt;strong&gt;xsltproc&lt;/strong&gt; and &lt;strong&gt;fop&lt;/strong&gt; yet. But it&amp;#8217;s only for building the documentation which I don&amp;#8217;t really need.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/ErlangExamples/~4/Xo8NCuoaxOw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 30 Apr 2010 15:36:34 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: Create a Custom CouchDB indexer</title>
	<guid>tag:damienkatz.net,2010://1.563</guid>
	<link>http://damienkatz.net/2010/04/create_a_custom_couchdb_indexe.html</link>
	<description>&lt;p&gt;Recently I worked with &lt;a href=&quot;http://vmx.cx/&quot;&gt;Volker Mische&lt;/a&gt; to help him create a new R-Tree geo-spacial indexer for CouchDB, the details of which he'll be announcing soon.&lt;/p&gt;

&lt;p&gt;And not only that, he took the time to write up a tutorial how to create you own customer indexer. If you wanted to write a new full text indexer in Erlang for CouchDB, this tutorial is the place to start. Awesome work!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://vmx.cx/couchdb/tutorial/indexer.html&quot;&gt;http://vmx.cx/couchdb/tutorial/indexer.html&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 30 Apr 2010 02:43:04 +0000</pubDate>
</item>
<item>
	<title>BGH's Blog: Erlang Programming Exercise: 4-2</title>
	<guid>http://benjaminhalsted.com/?p=199</guid>
	<link>http://benjaminhalsted.com/2010/04/erlang-programming-exercise-4-2/</link>
	<description>&lt;p&gt;I've finished with the process ring. I've done this exercise once before when reading &quot;Programming Erlang&quot;. Last time I had the processes create each other and set up the connections, this time they were created and linked by the start function. The code is much cleaner this time around. &lt;/p&gt;
&lt;p&gt;The basic idea is that you create a number of processes and each process knows the process id of it's neighbor in the ring. When a process receives a message, it should forward it on to it's neighbor. You then send X number of messages into the ring and watch your laptop turn into a skillet. &lt;/p&gt;
&lt;p&gt;Please review the code and let me know if you have any suggestions.&lt;br /&gt;
[erlang]&lt;br /&gt;
-module(four_two).&lt;/p&gt;
&lt;p&gt;-export([start/3, test/0]).&lt;br /&gt;
-export([process_loop/0, process_loop/1]).&lt;/p&gt;
&lt;p&gt;test() -&gt;&lt;br /&gt;
    FirstPid = start(10,4,&quot;This is a message&quot;),&lt;/p&gt;
&lt;p&gt;    %% [bgh] after 15 second, kill it automatically&lt;br /&gt;
    receive&lt;br /&gt;
    after&lt;br /&gt;
	15000 -&gt;&lt;br /&gt;
	    stop(FirstPid)&lt;br /&gt;
    end.&lt;/p&gt;
&lt;p&gt;stop(Pid) -&gt;&lt;br /&gt;
    Pid ! {stop, 0}.&lt;/p&gt;
&lt;p&gt;start(M, N, Message) -&gt;&lt;br /&gt;
    %% [bgh] start N processes&lt;br /&gt;
    Pids = lists:reverse(lists:foldl(&lt;br /&gt;
				   fun(_Number,PidList) -&gt;&lt;br /&gt;
					   NewPid = spawn(?MODULE, process_loop, []),&lt;br /&gt;
					   [NewPid|PidList]&lt;br /&gt;
				   end,&lt;br /&gt;
				   [],&lt;br /&gt;
				   lists:seq(1, N)&lt;br /&gt;
				 )),&lt;/p&gt;
&lt;p&gt;    %% [bgh] Shift the one off the front, and put it on the end&lt;br /&gt;
    NeighborPids = rotate_array(Pids),&lt;/p&gt;
&lt;p&gt;    %% [bgh] link the N processes together&lt;br /&gt;
    link_pids(Pids, NeighborPids),&lt;/p&gt;
&lt;p&gt;    [FirstPid|_OtherPids] = Pids,&lt;/p&gt;
&lt;p&gt;    %% [bgh] start the message sending by sending M messages to PID&lt;br /&gt;
    send_messages_to_pid(M, Message, FirstPid),&lt;/p&gt;
&lt;p&gt;    %% [bgh] start the processes sending messages&lt;br /&gt;
    FirstPid.&lt;/p&gt;
&lt;p&gt;rotate_array([]) -&gt;&lt;br /&gt;
    [];&lt;br /&gt;
rotate_array([First|_]=List) when length(List) =:= 1 -&gt;&lt;br /&gt;
    [First];&lt;br /&gt;
rotate_array([First|Remainder]) -&gt;&lt;br /&gt;
    io:format(&quot;~p ~p~n&quot;, [First,Remainder]),&lt;br /&gt;
    lists:append(Remainder,[First]).&lt;/p&gt;
&lt;p&gt;send_messages_to_pid(M, Message, FirstPid) when M &gt; 0 -&gt;&lt;br /&gt;
    FirstPid ! {message, Message},&lt;br /&gt;
    send_messages_to_pid(M-1, Message, FirstPid);&lt;br /&gt;
send_messages_to_pid(_M, _Message, _FirstPid) -&gt;&lt;br /&gt;
    ok.&lt;/p&gt;
&lt;p&gt;link_pids([], []) -&gt;&lt;br /&gt;
    ok;&lt;br /&gt;
link_pids([Pid|Pids], [NPid|NeighborPids]) -&gt;&lt;br /&gt;
    Pid ! {link, NPid},&lt;br /&gt;
    link_pids(Pids, NeighborPids).&lt;/p&gt;
&lt;p&gt;process_loop() -&gt;&lt;br /&gt;
    receive&lt;br /&gt;
	{link, Pid} -&gt;&lt;br /&gt;
	    process_loop({Pid, 0});&lt;br /&gt;
	Other -&gt;&lt;br /&gt;
	    io:format(&quot;Ignored ~p~n&quot;, [Other]),&lt;br /&gt;
	    process_loop()&lt;br /&gt;
    end.&lt;/p&gt;
&lt;p&gt;process_loop({Pid, Count}) -&gt;&lt;br /&gt;
    receive&lt;br /&gt;
	{message, Message} -&gt;&lt;br /&gt;
	    Pid ! {message, Message},&lt;br /&gt;
	    process_loop({Pid, Count+1});&lt;br /&gt;
	{stop, CountSum} -&gt;&lt;br /&gt;
	    Pid ! {stop, Count+CountSum},&lt;br /&gt;
	    io:format(&quot;~p is shutting down, saw ~p messages~n&quot;, [self(), Count+CountSum]);&lt;br /&gt;
	Other -&gt;&lt;br /&gt;
	    io:format(&quot;Ignored ~p~n&quot;, [Other]),&lt;br /&gt;
	    process_loop({Pid, Count})&lt;br /&gt;
    end.&lt;br /&gt;
[/erlang]&lt;/p&gt;
&lt;p&gt;Cheers,&lt;br /&gt;
  Halzy&lt;/p&gt;</description>
	<pubDate>Wed, 28 Apr 2010 00:32:57 +0000</pubDate>
</item>
<item>
	<title>RedHotErlang: pingis.org</title>
	<guid>http://www.redhoterlang.com/web/5343b863ee613035479eccda29dfca1e</guid>
	<link>http://www.redhoterlang.com/web/plink?id=5343b863ee613035479eccda29dfca1e</link>
	<description>At my [work][1] we are keen Table Tennis players. So we just had to create a score registration system to create some ranking statistics and what not.

Well, I and my collegue [Jordi][2] has now setup the first version of [pingis.org][3]. As usual, w...</description>
	<pubDate>Tue, 27 Apr 2010 17:06:55 +0000</pubDate>
</item>
<item>
	<title>Yariv's Blog: PicLike</title>
	<guid>http://yarivsblog.com/?p=324</guid>
	<link>http://feedproxy.google.com/~r/YarivsBlog/~3/-flT4KHQMpE/</link>
	<description>&lt;p&gt;Check out PicLike, the new app I made using the Flickr API, Google App Engine and the Facebook Like button: &lt;a href=&quot;http://piclike.appspot.com&quot;&gt;http://piclike.appspot.com&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/YarivsBlog/~4/-flT4KHQMpE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 27 Apr 2010 16:30:57 +0000</pubDate>
</item>
<item>
	<title>Erlang Factory News: New Speakers for the Erlang Factory London 2010</title>
	<guid>http://erlang-factory.com/news/rss/68c81f28d8c887795dc62f6bf953984a</guid>
	<link></link>
	<description>We would like to announce new Speakers for the&lt;a href=&quot;http://www.erlang-factory.com/conference/London2010&quot;&gt; Erlang Factory London&lt;/a&gt;: the designer and co-implementer of F# - Don Syme, Jan Lehnardt - CouchDB committer and evangelist, system engineer and back-end systems architect - Lahav Savir, Alvaro Videla - the lead developer for TheNetCircle.com.&lt;br /&gt;&lt;br /&gt;To see all Speakers please click &lt;a href=&quot;http://www.erlang-factory.com/conference/London2010/speakers&quot;&gt;here&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;span&gt;Reminder:&lt;/span&gt; The Very Early-Bird Discount for the Erlang Factory London 2010 Expires &lt;span&gt;This Friday&lt;/span&gt;! &lt;a href=&quot;https://www.erlang-factory.com/conference/London2010/register&quot;&gt;Register&lt;/a&gt; now and&lt;span&gt; save up to&amp;nbsp; £400!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;</description>
	<pubDate>Mon, 26 Apr 2010 10:16:10 +0000</pubDate>
</item>
<item>
	<title>Chicago Erlang User Group: CEUG April 21st meeting video - 3 of 3  (Q and A)</title>
	<guid>tag:blogger.com,1999:blog-2706443342944599131.post-2737360270783756154</guid>
	<link>http://chicagoerlangusergroup.blogspot.com/2010/04/ceug-april-21st-meeting-video-3-of-3-q.html</link>
	<description>This is the final video in our series. There was quite a lot of interesting QA as usual and we have it all recorded here.</description>
	<pubDate>Sat, 24 Apr 2010 18:05:00 +0000</pubDate>
	<author>martinjlogan@erlware.org (Martin J. Logan)</author>
</item>
<item>
	<title>Chicago Erlang User Group: CEUG April 21st meeting video - 2 of 3  (Garrett on Java to Erlang.)</title>
	<guid>tag:blogger.com,1999:blog-2706443342944599131.post-8286911659082199442</guid>
	<link>http://chicagoerlangusergroup.blogspot.com/2010/04/ceug-april-21st-meeting-video-2-of-3.html</link>
	<description>This is the second Erlang OTP video for the Chicago Erlang User Group April 21st meeting. Garrett covers transitioning to Erlang from Python and also does a great job talking about why Erlang in the first place. He humorously covers broad topics in this video from the Erlang standard library, to recursion, to how OTP is like Django!  Definitely worth watching.If you are interested in coming to</description>
	<pubDate>Sat, 24 Apr 2010 18:04:00 +0000</pubDate>
	<author>martinjlogan@erlware.org (Martin J. Logan)</author>
</item>
<item>
	<title>Chicago Erlang User Group: CEUG April 21st meeting video - 1 of 3  (Chris on Java to Erlang.)</title>
	<guid>tag:blogger.com,1999:blog-2706443342944599131.post-6675023477554757152</guid>
	<link>http://chicagoerlangusergroup.blogspot.com/2010/04/we-had-great-chicago-erlang-user-group.html</link>
	<description>We had a great chicago erlang user group meeting this April the 21st.  With almost 40 in attendance it was a packed house for sure.  We had two great talks. First was Chris Duesing on easing the transition to Erlang from Java and then Garrett Smith did similar but from a Python perspective.  Following that we had a long Q &amp;amp; A session.  Here is the video of Chris's talk.  He covers in the video</description>
	<pubDate>Sat, 24 Apr 2010 17:55:00 +0000</pubDate>
	<author>martinjlogan@erlware.org (Martin J. Logan)</author>
</item>
<item>
	<title>Programming in the 21st Century: How Much Processing Power Does it Take to be Fast?</title>
	<guid>http://prog21.dadgum.com/68.html</guid>
	<link>http://prog21.dadgum.com/68.html</link>
	<description>First, watch &lt;a href=&quot;http://www.youtube.com/watch?v=IIGrqUJoBns&quot;&gt;this&lt;/a&gt;.
&lt;br /&gt;&lt;br /&gt;It's Defender, an arcade game released thirty years ago. I went out of my way to find footage running on the original hardware, not emulated on a modern computer. (There's &lt;a href=&quot;http://www.youtube.com/watch?v=Y56cVduEkYs&quot;&gt;clearer video&lt;/a&gt; from an emulator if you prefer.)
&lt;br /&gt;&lt;br /&gt;Here's the first point of note: Defender is running on a 1MHz 8-bit processor. That's right ONE megahertz. This was before the days of pipelined, superscalar architectures, so if an instruction took 5 cycles to execute, it always took 5 cycles.
&lt;br /&gt;&lt;br /&gt;Here's the second: Unlike a lot of games from the early 1980s, there's no hardware-assisted graphics. No honest-to-goodness sprites where the video processor does all the work. No hardware to move blocks of memory around. The screen is just a big bitmap, and all drawing of the enemies, the score, the scrolling mountains, the special effects, is handled by the same processor that's running the rest of the code.
&lt;br /&gt;&lt;br /&gt;To be fair, the screen is only 320x256 with four bits per pixel. But remember, this was 1980, and home computers released up until mid-1985 didn't have that combination of resolution and color.
&lt;br /&gt;&lt;br /&gt;Now it's 2010, and there's much amazement at the responsiveness of the &lt;a href=&quot;http://prog21.dadgum.com/59.html&quot;&gt;iPad&lt;/a&gt;. And why shouldn't it be responsive? There's a 32-bit, gigahertz CPU in there that can run multiple instructions at the same time. Images are moved around by a separate processor dedicated entirely to graphics. When you flick your finger across the screen and some images slide around, &lt;i&gt;there's very little computation involved&lt;/i&gt;. The CPU is tracking some input and sending some commands to the GPU. The GPU is happy to render what you want, and a couple of 2D images is way below the tens of thousands of texture-mapped polygons that it was designed to handle.
&lt;br /&gt;&lt;br /&gt;Okay, JPEG decompression takes some effort. Ditto for drawing curve-based, anti-aliased fonts. And of course there's overhead involved in the application framework where messages get passed around to delegates and so on. None of this justifies the assumption that it takes amazing computing power to provide a responsive user experience. We're so used to interfaces being clunky and static, and programs taking long to load, and there being unsettling pauses when highlighting certain menu items, that we &lt;em&gt;expect&lt;/em&gt; it.
&lt;br /&gt;&lt;br /&gt;All the fawning over the speed iPad is a good reminder that it doesn't have to be this way.
&lt;br /&gt;&lt;br /&gt;(If you liked this, you might like &lt;a href=&quot;http://prog21.dadgum.com/52.html&quot;&gt;Slow Languages Battle Across Time&lt;/a&gt;.)</description>
	<pubDate>Sat, 24 Apr 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>BGH's Blog: Erlang Programming Exercise: 4-1</title>
	<guid>http://benjaminhalsted.com/?p=195</guid>
	<link>http://benjaminhalsted.com/2010/04/erlang-programming-exercise-4-1/</link>
	<description>&lt;p&gt;I'm glad to be past chapter 3, and that I took the time to go through the exercises. I would highly suggest to anybody learning Erlang to do the same. They helped me learn the syntax of the language and to become much more comfortable in Erlang. I also found the erlang man pages to be very helpful. For example, to get the full documentation for the lists module you type &quot;erl -man lists&quot; in a shell.&lt;/p&gt;
&lt;p&gt;Before jumping into the exercises for chapter four I went back and re-read the chapter. It's a nice reminder of how Erlang is different from the languages I use for work. I'm still having trouble trying to grok the activity vs task mentality, it's so different from what I'm used to.&lt;/p&gt;
&lt;p&gt;Exercise 4-1 I found to be much easier than 3-10. The goal is to start up a process that prints out messages you send to it, but to have the interaction with that process through a public interface. &lt;/p&gt;
&lt;p&gt;Here is the interface you are supposed to maintain:&lt;br /&gt;
[erlang]&lt;br /&gt;
echo:start() ⇒ ok&lt;br /&gt;
echo:print(Term) ⇒ ok&lt;br /&gt;
echo:stop() ⇒ ok&lt;br /&gt;
[/erlang]&lt;/p&gt;
&lt;p&gt;Since I've been naming my modules after the exercise chapter and number I changed 'echo' to four_one. Here is my solution:&lt;/p&gt;
&lt;p&gt;[erlang]&lt;br /&gt;
-module(four_one).&lt;br /&gt;
-export([start/0,print/1,stop/0]).&lt;/p&gt;
&lt;p&gt;-export([loop/0]).&lt;/p&gt;
&lt;p&gt;start() -&gt;&lt;br /&gt;
	Pid = spawn(four_one,loop,[]),&lt;br /&gt;
	register(four_one, Pid),&lt;br /&gt;
	ok.&lt;/p&gt;
&lt;p&gt;print(Term) -&gt;&lt;br /&gt;
	four_one ! {print, Term},&lt;br /&gt;
	ok.&lt;/p&gt;
&lt;p&gt;stop() -&gt;&lt;br /&gt;
	four_one ! stop,&lt;br /&gt;
	ok.&lt;/p&gt;
&lt;p&gt;loop() -&gt;&lt;br /&gt;
	receive&lt;br /&gt;
		stop -&gt; ok;&lt;br /&gt;
		{print, Term} -&gt;&lt;br /&gt;
			io:format(&quot;~p~n&quot;, [Term]),&lt;br /&gt;
			loop()&lt;br /&gt;
	end.&lt;br /&gt;
[/erlang]&lt;/p&gt;
&lt;p&gt;Cheers,&lt;br /&gt;
  Halzy&lt;/p&gt;</description>
	<pubDate>Thu, 22 Apr 2010 15:41:17 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: ProcessOne Hosted.IM adds paid plans for XMPP hosting services</title>
	<guid>http://www.process-one.net/en/blogs/article/processones_hosted.im_adds_paid_plans_for_xmpp_hosting_services/</guid>
	<link>http://www.process-one.net/en/blogs/article/processones_hosted.im_adds_paid_plans_for_xmpp_hosting_services/</link>
	<description>&lt;p&gt;ProcessOne has upgraded &lt;a href=&quot;http://hosted.im/&quot;&gt;Hosted.IM&lt;/a&gt; with paid services for teams of more  than 5 users.&lt;/p&gt; &lt;p&gt;Hosted.IM, the XMPP hosting service launched by ProcessOne in the  last summer, has undergone a major change, by accepting paid plans, for  work teams of more than 5 users for your own domain name. Hosted.IM will  also let you add as many domains as you like, still without the need to  manage the burden of administrative tasks.&lt;/p&gt;
&lt;p&gt;Hosted.IM still provides XMPP services like federation to Gtalk,  Talkr.IM, and other federated XMPP servers and gateways to legacy IM  systems like MSN, ICQ, Yahoo, AIM, as well as the microblogging silo  Twitter.&lt;/p&gt;
&lt;p&gt;With the new Hosted.IM, you can buy credits when you want from the  IMStore. This will enable you to add users to your existing plan. At any  time you can access you current balance, as well usage reports and  recent operations.&lt;/p&gt;
&lt;p&gt;Previously, Hosted.IM enabled domains to host up to 10 users at not  charge: this has changed to 5 users. We will continue to host existing  free domains with up to 10 users. New domains will need to buy credits  in order to register more than 5 users.&lt;/p&gt;
&lt;p&gt;In order to use Hosted.IM, the first step is to register a username  with an existing e-mail account. Then you can configure your DNS, and  after some synchronization delay, access your newly created XMPP  accounts.&lt;/p&gt;
&lt;p&gt;Run your own instant messaging service, without worrying about the  administration hassle: join &lt;a href=&quot;http://hosted.im/&quot;&gt;Hosted.IM&lt;/a&gt; now.&lt;/p&gt;</description>
	<pubDate>Wed, 21 Apr 2010 14:59:13 +0000</pubDate>
</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, 21 Apr 2010 14:21:40 +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, 21 Apr 2010 14:21:40 +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, 21 Apr 2010 14:21:20 +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, 21 Apr 2010 14:21:20 +0000</pubDate>
</item>
<item>
	<title>Erlang Factory News: First confirmed speakers for the Erlang Factory London 2010</title>
	<guid>http://erlang-factory.com/news/rss/2fd228fa948a4713884256f25162b4d2</guid>
	<link></link>
	<description>We are proud to announce the first confirmed speakers for the &lt;a href=&quot;http://www.erlang-factory.com/conference/London2010&quot;&gt;Erlang Factory London 2010&lt;/a&gt;:&amp;nbsp; the inventor of Scala -Martin Odersky, Robert Virding – the inventor of Erlang and Bluetail co-founder, the Father of Erlang - Joe Armstrong, Justin Sheehy and Rusty Klophaus from Basho Technologies, Github co-founder - Tom Preston-Werner, the creator of Erjang - Kresten Krab Thorup, Scott Lystig Fritchie from Gemini Mobile Technologies and Mark Zweifel and William Larson from Yahoo!&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Be aware!&lt;/span&gt; Each day there are more and more people registering for the Erlang Factory London 2010. &lt;a href=&quot;https://www.erlang-factory.com/conference/London2010/register&quot;&gt;Register&lt;/a&gt; before it sells out!&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
	<pubDate>Wed, 21 Apr 2010 14:20:56 +0000</pubDate>
</item>
<item>
	<title>Erlang Factory News: Registration for the Erlang Factory London is open!</title>
	<guid>http://erlang-factory.com/news/rss/d3c606e5161b005f9ac986fdefd1c44d</guid>
	<link></link>
	<description>The &lt;a href=&quot;http://www.erlang-factory.com/conference/London2010&quot;&gt;Erlang Factory London 2010&lt;/a&gt; will be held on &lt;span&gt;10th and 11th June&lt;/span&gt; in the &lt;span&gt;Old Session
House&lt;/span&gt;. On 7th, 8th and 9th June there will be also &lt;a href=&quot;http://www.erlang-factory.com/conference/London2010/university&quot;&gt;Erlang University&lt;/a&gt; courses taking place: Erlang Express, Erlang OTP Express,
QuickCheck for Erlang developers and Web Programming with Erlang.&lt;br /&gt;&lt;br /&gt;Don't miss out Very Early-Bird discount - &lt;a href=&quot;https://www.erlang-factory.com/conference/London2010/register&quot;&gt;register&lt;/a&gt; by Friday, &lt;span&gt;30th April 2010&lt;/span&gt; and save &lt;span&gt;£200&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description>
	<pubDate>Wed, 21 Apr 2010 14:20:56 +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, 21 Apr 2010 14:20:54 +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, 21 Apr 2010 14:20:54 +0000</pubDate>
</item>
<item>
	<title>Erlang Announce List: Erlang announce mailing list :: Erlang/OTP now at Github</title>
	<guid>http://www.trapexit.org/forum/viewtopic.php?p=51128#51128</guid>
	<link>http://www.trapexit.org/forum/viewtopic.php?p=51128#51128</link>
	<description>Author: Anonymous&lt;br /&gt;
Subject: Erlang/OTP now at Github&lt;br /&gt;
Posted: Wed Nov 25, 2009 2:14 pm (GMT 0)&lt;br /&gt;
Topic Replies: 0&lt;br /&gt;&lt;br /&gt;
&lt;span class=&quot;postbody&quot;&gt;The official git repository for Erlang/OTP can now be found at Github:
&lt;br /&gt;

&lt;br /&gt;
&lt;a href=&quot;http://github.com/erlang/otp&quot; target=&quot;_blank&quot;&gt;http://github.com/erlang/otp&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Build instructions can be found at:
&lt;br /&gt;

&lt;br /&gt;
&lt;a href=&quot;http://wiki.github.com/erlang/otp&quot; target=&quot;_blank&quot;&gt;http://wiki.github.com/erlang/otp&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
We plan to add more wiki pages with additional information in the
&lt;br /&gt;
near future.
&lt;br /&gt;

&lt;br /&gt;
-- 
&lt;br /&gt;
Björn Gustavsson, Erlang/OTP, Ericsson AB
&lt;br /&gt;

&lt;br /&gt;
________________________________________________________________
&lt;br /&gt;
erlang-announce mailing list. See &lt;a href=&quot;http://www.erlang.org/faq.html&quot; target=&quot;_blank&quot;&gt;http://www.erlang.org/faq.html&lt;/a&gt;
&lt;br /&gt;
erlang-announce (at) erlang.org
&lt;br /&gt;

&lt;br /&gt;
 Post received from mailinglist
&lt;/span&gt;&lt;br /&gt;</description>
	<pubDate>Wed, 21 Apr 2010 14:19:48 +0000</pubDate>
</item>
<item>
	<title>Erlang Announce List: Erlang announce mailing list :: Erlang/OTP R13B03 has been released</title>
	<guid>http://www.trapexit.org/forum/viewtopic.php?p=51124#51124</guid>
	<link>http://www.trapexit.org/forum/viewtopic.php?p=51124#51124</link>
	<description>Author: Anonymous&lt;br /&gt;
Subject: Erlang/OTP R13B03 has been released&lt;br /&gt;
Posted: Wed Nov 25, 2009 1:56 pm (GMT 0)&lt;br /&gt;
Topic Replies: 0&lt;br /&gt;&lt;br /&gt;
&lt;span class=&quot;postbody&quot;&gt;Bug fix release : otp_src_R13B03
&lt;br /&gt;
Build date      : 2009-11-23
&lt;br /&gt;

&lt;br /&gt;
This is R13B03, the third maintenance release for the R13B major release.
&lt;br /&gt;

&lt;br /&gt;
You can find the README file for the release at
&lt;br /&gt;

&lt;br /&gt;
  &lt;a href=&quot;http://www.erlang.org/download/otp_src_R13B03.readme&quot; target=&quot;_blank&quot;&gt;http://www.erlang.org/download/otp_src_R13B03.readme&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
The source distribution and binary distribution for Windows can be
&lt;br /&gt;
downloaded from
&lt;br /&gt;

&lt;br /&gt;
  &lt;a href=&quot;http://www.erlang.org/download/otp_src_R13B03.tar.gz&quot; target=&quot;_blank&quot;&gt;http://www.erlang.org/download/otp_src_R13B03.tar.gz&lt;/a&gt;
&lt;br /&gt;
  &lt;a href=&quot;http://www.erlang.org/download/otp_win32_R13B03.exe&quot; target=&quot;_blank&quot;&gt;http://www.erlang.org/download/otp_win32_R13B03.exe&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
The distribution can also be downloaded using the BitTorrent
&lt;br /&gt;
protocol. Use the following torrent files to download the source
&lt;br /&gt;
distribution and binary distribution for Windows:
&lt;br /&gt;

&lt;br /&gt;
  &lt;a href=&quot;http://www.erlang.org/download/otp_src_R13B03.tar.gz.torrent&quot; target=&quot;_blank&quot;&gt;http://www.erlang.org/download/otp_src_R13B03.tar.gz.torrent&lt;/a&gt;
&lt;br /&gt;
  &lt;a href=&quot;http://www.erlang.org/download/otp_win32_R13B03.exe.torrent&quot; target=&quot;_blank&quot;&gt;http://www.erlang.org/download/otp_win32_R13B03.exe.torrent&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Note: To unpack the TAR archive you need a GNU TAR compatible program.
&lt;br /&gt;

&lt;br /&gt;
For installation instructions please read the README file that is part
&lt;br /&gt;
of the distribution.
&lt;br /&gt;

&lt;br /&gt;
The on-line documentation can be found at: &lt;a href=&quot;http://www.erlang.org/doc/&quot; target=&quot;_blank&quot;&gt;http://www.erlang.org/doc/&lt;/a&gt;
&lt;br /&gt;
You can also download the complete HTML documentation or the Unix manual files
&lt;br /&gt;

&lt;br /&gt;
  &lt;a href=&quot;http://www.erlang.org/download/otp_doc_html_R13B03.tar.gz&quot; target=&quot;_blank&quot;&gt;http://www.erlang.org/download/otp_doc_html_R13B03.tar.gz&lt;/a&gt;
&lt;br /&gt;
  &lt;a href=&quot;http://www.erlang.org/download/otp_doc_man_R13B03.tar.gz&quot; target=&quot;_blank&quot;&gt;http://www.erlang.org/download/otp_doc_man_R13B03.tar.gz&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
We also want to thank those that sent us patches, suggestions and bug
&lt;br /&gt;
reports,
&lt;br /&gt;

&lt;br /&gt;
The OTP Team
&lt;br /&gt;

&lt;br /&gt;
-- 
&lt;br /&gt;
Björn Gustavsson, Erlang/OTP, Ericsson AB
&lt;br /&gt;

&lt;br /&gt;
________________________________________________________________
&lt;br /&gt;
erlang-announce mailing list. See &lt;a href=&quot;http://www.erlang.org/faq.html&quot; target=&quot;_blank&quot;&gt;http://www.erlang.org/faq.html&lt;/a&gt;
&lt;br /&gt;
erlang-announce (at) erlang.org
&lt;br /&gt;

&lt;br /&gt;
 Post received from mailinglist
&lt;/span&gt;&lt;br /&gt;</description>
	<pubDate>Wed, 21 Apr 2010 14:19:48 +0000</pubDate>
</item>
<item>
	<title>BGH's Blog: Erlang Programming Exercise: 3-10</title>
	<guid>http://benjaminhalsted.com/?p=190</guid>
	<link>http://benjaminhalsted.com/2010/04/erlang-programming-exercise-3-10/</link>
	<description>&lt;p&gt;Exercise 3-10 has you take unstructured text and make filled text, then later, justified text. &lt;/p&gt;
&lt;p&gt;Now, it's trivial to justify the text, you could even do it in a single pass, but I wanted to solve both the filled text and the text justification at the same time. To make development faster, I wrote some test stubs (at the bottom of the file) that would load the text from disk, and call the interface functions. &lt;/p&gt;
&lt;p&gt;textProcess and justifyText do basically the same thing, with justifyText trying to figure out how many extra spaces to put in each gap. They start out by creating a list of tuples of {Word, WordLength} and then passing that list into makeWordLines/4 which builds lines. At this point, passing the lines into wordLinesToString/2 will solve the filled text part of the problem. To solve the justified text part, the lines are passed into justifyWordLines/2 which will calculate how many extra spaces per gap are needed and call wordLineToString/5 to turn the line into a string.&lt;/p&gt;
&lt;p&gt;My implementation suffers from floating point arithmetic problems. Some lines will not get the last space in the last gap because the gap value is 0.999999999999 instead of 1. &lt;img src=&quot;http://benjaminhalsted.com/wp-includes/images/smilies/icon_sad.gif&quot; alt=&quot;:(&quot; class=&quot;wp-smiley&quot; /&gt;  This could be solved in a couple of ways, but I'm ready to move into chapter 4.&lt;/p&gt;
&lt;p&gt;Looking at the code now, it's very verbose and can probably be done more succinctly.&lt;br /&gt;
[erlang]&lt;br /&gt;
-module(threeten).&lt;br /&gt;
-export([textProcess/2, justifyText/2, testProcess/1, testJustify/1]).&lt;/p&gt;
&lt;p&gt;textProcess(Text, Width) -&gt;&lt;br /&gt;
	TokenText = tokenizeText(Text),&lt;br /&gt;
	WordLines = makeWordLines(TokenText, Width, Width, []),&lt;br /&gt;
	wordLinesToString(WordLines).&lt;/p&gt;
&lt;p&gt;justifyText(Text, Width) -&gt;&lt;br /&gt;
	TokenText = tokenizeText(Text),&lt;br /&gt;
	WordLines = makeWordLines(TokenText, Width, Width, []),&lt;br /&gt;
	justifyWordLines(WordLines, Width).&lt;/p&gt;
&lt;p&gt;justifyWordLines(WordLines, Width) -&gt;&lt;br /&gt;
	justifyWordLines(WordLines, Width, []).&lt;/p&gt;
&lt;p&gt;justifyWordLines([], _Width, JustifiedLines) -&gt;&lt;br /&gt;
	lists:flatten(lists:reverse(JustifiedLines));&lt;br /&gt;
justifyWordLines([[]|WordLines], Width, JustifiedLines) -&gt;&lt;br /&gt;
	justifyWordLines(WordLines, Width, JustifiedLines);&lt;br /&gt;
justifyWordLines([Line|WordLines], Width, JustifiedLines) -&gt;&lt;br /&gt;
	SpacesPerGap = case length(WordLines) of&lt;br /&gt;
		0 -&gt; 0; % the last line isn't justified&lt;br /&gt;
		_Other -&gt; spacesPerGap(Line, Width)&lt;br /&gt;
	end,&lt;br /&gt;
	JustifiedString = lists:reverse(wordLineToString(Line, 0, &quot;&quot;, SpacesPerGap, 0)),&lt;br /&gt;
	justifyWordLines(WordLines, Width, [JustifiedString|JustifiedLines]).&lt;/p&gt;
&lt;p&gt;spacesPerGap([], _Width) -&gt;&lt;br /&gt;
	0;&lt;br /&gt;
spacesPerGap(Line, Width) -&gt;&lt;br /&gt;
	Words = length(Line),&lt;br /&gt;
	WordLength = lists:foldr(fun({_Word, Length}, Accum) -&gt; Length + Accum end, 0, Line),&lt;br /&gt;
	ExtraSpaces = Width - WordLength - Words + 1,&lt;br /&gt;
	Gaps = Words-1,&lt;br /&gt;
	if&lt;br /&gt;
		Gaps = 0 -&gt; 0;&lt;br /&gt;
		ExtraSpaces = 0 -&gt; 0;&lt;br /&gt;
		ExtraSpaces &gt; 0 -&gt; ExtraSpaces / Gaps&lt;br /&gt;
	end.&lt;/p&gt;
&lt;p&gt;wordLinesToString(WordLines) -&gt;&lt;br /&gt;
	lists:flatten(wordLinesToString(WordLines, [])).&lt;/p&gt;
&lt;p&gt;wordLinesToString([], Strings) -&gt;&lt;br /&gt;
	lists:reverse(Strings);&lt;br /&gt;
wordLinesToString([[]|WordLines], String) -&gt;&lt;br /&gt;
	wordLinesToString(WordLines, String);&lt;br /&gt;
wordLinesToString([Line|WordLines], String1) -&gt;&lt;br /&gt;
	String2 = wordLineToString(Line, 0, String1, 0, 0),&lt;br /&gt;
	wordLinesToString(WordLines, String2).&lt;/p&gt;
&lt;p&gt;wordLineToString([], _WordNumber, String, _SpacesPerGap, _GapLeftover) -&gt;&lt;br /&gt;
	NewLine = &quot;\n&quot;,&lt;br /&gt;
	[NewLine|String];&lt;br /&gt;
wordLineToString([{Word, _Length}|Line], WordNumber, String, SpacesPerGap, _GapLeftover) when WordNumber == 0 -&gt;&lt;br /&gt;
	wordLineToString(Line, WordNumber+1, [Word|String], SpacesPerGap, SpacesPerGap);&lt;br /&gt;
wordLineToString([{Word1, _Length}|Line], WordNumber1, String, SpacesPerGap, GapLeftover1) -&gt;&lt;br /&gt;
	WordNumber2 = WordNumber1+1,				% figure out the current word number&lt;br /&gt;
	Spaces = erlang:trunc(GapLeftover1)		,	% drop the decimal places&lt;br /&gt;
	GapLeftover2 = GapLeftover1 - Spaces + SpacesPerGap,	% adjust the remaining leftover&lt;br /&gt;
	Word2 = [string:copies(&quot; &quot;, Spaces+1)|Word1],&lt;br /&gt;
	wordLineToString(Line, WordNumber2, [Word2|String], SpacesPerGap, GapLeftover2).&lt;/p&gt;
&lt;p&gt;% end case, out of words&lt;br /&gt;
makeWordLines([], _Width, _WidthLeft, [LastLine|Lines]) -&gt;&lt;br /&gt;
	ReversedLastLine = lists:reverse(LastLine),&lt;br /&gt;
	AllLines = [ReversedLastLine|Lines],&lt;br /&gt;
	lists:reverse(AllLines);&lt;br /&gt;
% if the line is currently empty, and the word length is = than the length of the line&lt;br /&gt;
makeWordLines([{_Word, Length}=Token|Tokens], Width, WidthLeft, [[]|Lines]) when Length = Width -&gt;&lt;br /&gt;
	makeWordLines(Tokens, Width, WidthLeft-Length, [[Token]|Lines]);&lt;br /&gt;
% line with words, and the word length is = the length left&lt;br /&gt;
makeWordLines([{_Word, Length}=Token|Tokens], Width, WidthLeft, [LastLine|Lines]) when Length  WidthLeft -&gt;&lt;br /&gt;
	makeWordLines(Tokens, Width, WidthLeft-Length-1, [[Token|LastLine]|Lines]);&lt;br /&gt;
% if the line is empty, and the word length is &gt; the width of the line&lt;br /&gt;
makeWordLines([{_Word, Length}=Token|Tokens], Width, _WidthLeft, [[]|Lines]) when Length &gt; Width -&gt;&lt;br /&gt;
	makeWordLines(Tokens, Width, 0, [[Token]|Lines]);&lt;br /&gt;
% if there is no more space on the line, reverse the tokens on the last line and push a new one on the stack&lt;br /&gt;
makeWordLines(Tokens, Width, _WidthLeft, [LastLine|Lines]) -&gt;&lt;br /&gt;
	ReversedLastLine = lists:reverse(LastLine),&lt;br /&gt;
	PreviousLines = [ReversedLastLine|Lines],&lt;br /&gt;
	makeWordLines(Tokens, Width, Width, [[]|PreviousLines]);&lt;br /&gt;
% initial case where we have no existing lines on the stack&lt;br /&gt;
makeWordLines(Tokens, Width, WidthLeft, []) -&gt;&lt;br /&gt;
	makeWordLines(Tokens, Width, WidthLeft, [[]]).&lt;/p&gt;
&lt;p&gt;tokenizeText(Text) -&gt;&lt;br /&gt;
	Tokens = string:tokens(Text, &quot; \t\r\n&quot;),&lt;br /&gt;
	measureTokens([], Tokens).&lt;/p&gt;
&lt;p&gt;measureTokens(Measured, []) -&gt;&lt;br /&gt;
	lists:reverse(Measured);&lt;br /&gt;
measureTokens(Measured, [Token|Tokens]) -&gt;&lt;br /&gt;
	Length = string:len(Token),&lt;br /&gt;
	measureTokens([{Token, Length}|Measured], Tokens).&lt;/p&gt;
&lt;p&gt;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
%% Loading Test Stubs %%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&lt;/p&gt;
&lt;p&gt;testProcess(Width) -&gt;&lt;br /&gt;
	{ok, Text} = readFileText('threeten.text'),&lt;br /&gt;
	io:format(&quot;~s~n&quot;, [textProcess(Text, Width)]).&lt;br /&gt;
testJustify(Width) -&gt;&lt;br /&gt;
	{ok, Text} = readFileText('threeten.text'),&lt;br /&gt;
	io:format(&quot;~s~n&quot;, [justifyText(Text, Width)]).&lt;/p&gt;
&lt;p&gt;readFileText(Filename) -&gt;&lt;br /&gt;
        case file:open(Filename, read) of&lt;br /&gt;
                {ok, IoDevice} -&gt;&lt;br /&gt;
                        Words = loadRawTextLines([], IoDevice),&lt;br /&gt;
                        file:close(IoDevice),&lt;br /&gt;
			{ok, Words};&lt;br /&gt;
                {error, Reason} -&gt; {error, Reason}&lt;br /&gt;
        end.&lt;/p&gt;
&lt;p&gt;loadRawTextLines(Lines, IoDevice) -&gt;&lt;br /&gt;
        case file:read_line(IoDevice) of&lt;br /&gt;
		{ok, Line} -&gt; loadRawTextLines([Line|Lines], IoDevice);&lt;br /&gt;
                eof -&gt; lists:flatten(lists:reverse(Lines))&lt;br /&gt;
        end.&lt;br /&gt;
[/erlang]&lt;/p&gt;
&lt;p&gt;Cheers,&lt;br /&gt;
  Halzy&lt;/p&gt;</description>
	<pubDate>Wed, 21 Apr 2010 02:06:14 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: Why is this man so damn happy?</title>
	<guid>tag:damienkatz.net,2010://1.562</guid>
	<link>http://damienkatz.net/2010/04/why_is_this_man_so_damn_happy.html</link>
	<description>&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://vimeo.com/10993778&quot;&gt;CouchDB!&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Sat, 17 Apr 2010 19:34:46 +0000</pubDate>
</item>
<item>
	<title>Caoyuan's Blog: NetBeans(6.8) plugin for Scala 2.8.0 RC1</title>
	<guid>http://blogtrader.net/blog/NetBeansPluginForScala2_8_0RC1</guid>
	<link>http://blogtrader.net/blog/NetBeansPluginForScala2_8_0RC1</link>
	<description>&lt;p&gt;
I'm please to announce the &lt;a class=&quot;wiki&quot; href=&quot;http://blogtrader.net/wiki/NetBeans&quot;&gt;NetBeans&lt;/a&gt; (6.8) plugin for Scala 2.8.0
RC1 is available now. It's a maintain release to catch up with Scala
2.8.0 RC1.
&lt;/p&gt;
&lt;p&gt;
The packed plugins is downloadable at:
&lt;a class=&quot;ext-link&quot; href=&quot;http://sourceforge.net/projects/erlybird/files/nb-scala/6.8v1.1.0rc2/&quot;&gt;&lt;span class=&quot;icon&quot;&gt; &lt;/span&gt;http://sourceforge.net/projects/erlybird/files/nb-scala/6.8v1.1.0rc2/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
It requires Scala 2.8.0 RC1, which is available at:
&lt;a class=&quot;ext-link&quot; href=&quot;http://www.scala-lang.org/downloads&quot;&gt;&lt;span class=&quot;icon&quot;&gt; &lt;/span&gt;http://www.scala-lang.org/downloads&lt;/a&gt;. For maven project, it's under
&lt;a class=&quot;ext-link&quot; href=&quot;http://www.scala-tools.org/repo-releases&quot;&gt;&lt;span class=&quot;icon&quot;&gt; &lt;/span&gt;http://www.scala-tools.org/repo-releases&lt;/a&gt;, with version number
&quot;2.8.0.RC1&quot;
&lt;/p&gt;
&lt;p&gt;
Please refer to &lt;a class=&quot;ext-link&quot; href=&quot;http://wiki.netbeans.org/Scala68v1&quot;&gt;&lt;span class=&quot;icon&quot;&gt; &lt;/span&gt;http://wiki.netbeans.org/Scala68v1&lt;/a&gt; for the
installation/upgrading information.
&lt;/p&gt;</description>
	<pubDate>Thu, 15 Apr 2010 05:02:06 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: Oaklandish</title>
	<guid>tag:damienkatz.net,2010://1.561</guid>
	<link>http://damienkatz.net/2010/04/oaklandish.html</link>
	<description>&lt;p&gt;Go to Tai Chi at 4 pm Tues. &amp;amp; Thurs. at Gold's Gym Oakland. &lt;a href=&quot;http://www.goldsgym.com/gyms/calendar.php?gymID=0339&quot;&gt;http://www.goldsgym.com/gyms/calendar.php?gymID=0339&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;mt-enclosure mt-enclosure-image&quot;&gt;&lt;a href=&quot;http://damienkatz.net/pics/IMAG0008.jpg&quot;&gt;&lt;img alt=&quot;IMAG0008.jpg&quot; src=&quot;http://damienkatz.net/pics/IMAG0008-thumb-400x268.jpg&quot; width=&quot;400&quot; height=&quot;268&quot; class=&quot;mt-image-none&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 14 Apr 2010 16:26:03 +0000</pubDate>
</item>
<item>
	<title>LShift on Erlang: SpringSource / VMWare Acquire Rabbit Technologies</title>
	<guid>http://www.lshift.net/blog/?p=493</guid>
	<link>http://www.lshift.net/blog/2010/04/14/springsource-vmware-acquire-rabbit-technologies</link>
	<description>&lt;p&gt;SpringSource, a division of VMware, Inc. today announced the acquisition by VMware of Rabbit Technologies, Ltd, a company set up by LShift and partners Monadic and CohesiveFT.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.lshift.net/news/rabbitmqacquired.html&quot;&gt;Read the full story&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 14 Apr 2010 13:05:28 +0000</pubDate>
</item>
<item>
	<title>Joe's Blog: Still Alive.</title>
	<guid>http://www.joeandmotorboat.com/?p=977</guid>
	<link>http://www.joeandmotorboat.com/2010/04/13/still-alive/</link>
	<description>&lt;p&gt;I am still alive and still maintain the blog but haven&amp;#8217;t had time to post recently. Lots of cool stuff brewing at &lt;a href=&quot;https://cloudant.com/&quot;&gt;Cloudant&lt;/a&gt;. Follow me on &lt;a href=&quot;http://twitter.com/williamsjoe&quot;&gt;Twitter&lt;/a&gt; for more immediate updates. In the mean time keep following me here and hopefully I&amp;#8217;ll have some blog inspiration soon.&lt;/p&gt;</description>
	<pubDate>Tue, 13 Apr 2010 23:10:17 +0000</pubDate>
</item>
<item>
	<title>Undefined And Most Likely Disastrous: Twitter Killed My Blog</title>
	<guid>tag:blogger.com,1999:blog-32868518.post-6417199262150954256</guid>
	<link>http://blog.argv0.net/2010/04/twitter-killed-by-blog.html</link>
	<description>In case you haven't noticed, this blog is dead.  Find me on &lt;a href=&quot;http://twitter.com/argv0&quot;&gt;Twitter&lt;/a&gt; or at &lt;a href=&quot;http://blog.basho.com&quot;&gt;The Basho Blog&lt;/a&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/32868518-6417199262150954256?l=blog.argv0.net&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 13 Apr 2010 17:26:00 +0000</pubDate>
	<author>noreply@blogger.com (andy)</author>
</item>
<item>
	<title>Erlang Inside: RabbitMQ acquired by SpringSource/VMWare</title>
	<guid>http://erlanginside.com/?p=162</guid>
	<link>http://erlanginside.com/rabbitmq-acquired-springsource-vmware-162</link>
	<description>Erlang-based RabbitMQ was acquired today by SpringSource...</description>
	<pubDate>Tue, 13 Apr 2010 13:40:31 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: ProcessOne at Google I/O Developer Sandbox 2010</title>
	<guid>http://www.process-one.net/en/blogs/article/processone_at_google_i_o_developer_sandbox_2010/</guid>
	<link>http://www.process-one.net/en/blogs/article/processone_at_google_i_o_developer_sandbox_2010/</link>
	<description>&lt;p&gt;We have been selected to demonstrate our WaveOne server and preview client in &lt;a href=&quot;http://code.google.com/events/io/2010/sandbox.html&quot; title=&quot;ProcessOne at Google Developer Sandbox 2010&quot;&gt;Google I/O developer sandbox&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;ProcessOne will be presenting many of its new products as a preview technology implementation, among which:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WaveOne server and extension module for &lt;a href=&quot;http://www.ejabberd.im/&quot;&gt;ejabberd&lt;/a&gt; XMPP server.&lt;/li&gt;
&lt;li&gt;Various example client implementations using the Wave protocol from XMPP: &lt;a href=&quot;http://www.process-one.net/en/solutions/oneteam/&quot;&gt;OneTeam for Firefox&lt;/a&gt; client extension, and &lt;a href=&quot;http://tkabber.jabber.ru/&quot;&gt;Tkabber&lt;/a&gt; support.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://xmpp.org/extensions/xep-0166.html&quot;&gt;Jingle&lt;/a&gt; and &lt;a href=&quot;http://code.google.com/p/jinglenodes/&quot;&gt;Jingle&lt;/a&gt; &lt;a href=&quot;http://xmpp.org/extensions/inbox/jingle-nodes.html&quot;&gt;Nodes&lt;/a&gt; XMPP calling with our OneTeam client.&lt;/li&gt;
&lt;li&gt;The roadmap for the future of our XMPP and Wave collaborative platform.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We are also preparing various surprises for the people who can attend Google I/O (Did I say Android?).&lt;/p&gt;
&lt;p&gt;This is going to be an extraordinary event for us. See you there!&lt;/p&gt; 
    [&lt;a href=&quot;http://www.process-one.net/en/blogs/article/processone_at_google_i_o_developer_sandbox_2010/&quot;&gt;More...&lt;/a&gt;]</description>
	<pubDate>Tue, 13 Apr 2010 08:49:46 +0000</pubDate>
</item>
<item>
	<title>Learn You Some Erlang: A Short Visit to Common Data Structures</title>
	<guid>http://learnyousomeerlang.com/a-short-visit-to-common-data-structures</guid>
	<link>http://learnyousomeerlang.com/a-short-visit-to-common-data-structures</link>
	<description>Chances are you now understand the functional subset of Erlang pretty well and could read many programs without a problem. However, I still feel like there's a few things missing. In this last chapter about the functional subset of Erlang, I cover concepts such as records, key-value stores, sets and other data structures that are part of the standard library.</description>
	<pubDate>Tue, 13 Apr 2010 00:00:00 +0000</pubDate>
</item>
<item>
	<title>RedHotErlang: Collective Intelligence</title>
	<guid>http://www.redhoterlang.com/web/6879d458a6e267d1eadd200dea4f9915</guid>
	<link>http://www.redhoterlang.com/web/plink?id=6879d458a6e267d1eadd200dea4f9915</link>
	<description>I'm reading a great book named: [Collective Intelligence][1]. I have only read the first three chapters so far. It takes time though, since I'm [re-implementing][2] the examples in Erlang, but it has also been great fun.

[1]: http://oreilly.com/cata...</description>
	<pubDate>Mon, 12 Apr 2010 17:41:00 +0000</pubDate>
</item>
<item>
	<title>RedHotErlang: Webmachine and multiple IP/Ports</title>
	<guid>http://www.redhoterlang.com/web/ee6664f1ad7efc0835b66f3b9696865d</guid>
	<link>http://www.redhoterlang.com/web/plink?id=ee6664f1ad7efc0835b66f3b9696865d</link>
	<description>I've been playing around with [Webmachine][1] lately and I like it a lot. In the 1.5 release Host specifications was added to the dispatch.conf file. This makes it possible to support several hosts in the same Webmachine system. It looks something li...</description>
	<pubDate>Sat, 10 Apr 2010 15:49:10 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: Slides: Real time Web Application with XMPP and Wave</title>
	<guid>http://www.process-one.net/en/blogs/article/slides_real_time_web_application_with_xmpp_and_wave/</guid>
	<link>http://www.process-one.net/en/blogs/article/slides_real_time_web_application_with_xmpp_and_wave/</link>
	<description>&lt;p&gt;This is the slides of the talk I have given at Erlang Factory 2010 event in San Francisco.&lt;/p&gt; &lt;p&gt;Here are the slides of my presentation on XMPP and our implementation of Wave protocol:&lt;/p&gt;
&lt;div id=&quot;__ss_3658058&quot;&gt;&lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/mremond/real-time-web-application-with-xmpp-and-wave&quot; title=&quot;Real time Web Application with XMPP and Wave&quot;&gt;Real time Web Application with XMPP and Wave&lt;/a&gt;&lt;/strong&gt; 






&lt;div&gt;View more &lt;a href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/mremond&quot;&gt;Micka&amp;euml;l R&amp;eacute;mond&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Next blog post will present a screencast of the federation demonstration between our OneWave server and Google Sandbox.&lt;/p&gt;</description>
	<pubDate>Wed, 07 Apr 2010 16:30:32 +0000</pubDate>
</item>
<item>
	<title>BGH's Blog: Erlang Programming Exercise: 3-9</title>
	<guid>http://benjaminhalsted.com/?p=182</guid>
	<link>http://benjaminhalsted.com/2010/04/erlang-programming-exercise-3-9/</link>
	<description>&lt;p&gt;In exercise three-nine you are to read some text into a &lt;em&gt;raw document&lt;/em&gt; (list of lines) and then into a &lt;em&gt;document&lt;/em&gt; (list of words). With this data you generate an index for the words to which lines they were on:&lt;/p&gt;
&lt;p&gt;{ &quot;Erlang&quot;, [1,1,2,4,5,6,6,98,100,102,102] }&lt;/p&gt;
&lt;p&gt;After you have the word to line index, pretty print the index such that the example above would result in:&lt;/p&gt;
&lt;p&gt;&quot;Erlang 1-2,4-6,98,100,102&quot;&lt;/p&gt;
&lt;p&gt;I decided to start using more of the library functions in order to become more familiar with them. I used the lists/foldr function more than anything else since it lets you visit every element in a list and maintain an accumulator. It was particularly useful in situations where I didn't want to do any pattern matching on the argument, like when I broke the lines into words. It was not useful when I tried to generate the tuples needed for the pretty printed line numbers, this could have been done using a switch statement but I found the code more elegant using the recursive pattern matching. &lt;/p&gt;
&lt;p&gt;Instead of copy/pasting a chunk of text into erl every time I wanted to test it, I made the indexer load a file from disk. I also aligned the line numbers, having them all start on the same column made a big difference visually. Here's an example run:&lt;/p&gt;
&lt;p&gt;[shell]&lt;br /&gt;
1&gt; threenine:index(&quot;./threenine.erl&quot;).&lt;br /&gt;
0                          70&lt;br /&gt;
1                          2, 30, 32, 37, 41, 57, 80&lt;br /&gt;
2                          64&lt;br /&gt;
binary                     77&lt;br /&gt;
bs                         71&lt;br /&gt;
case                       5, 22, 37&lt;br /&gt;
cleannumbers               46, 51-60&lt;br /&gt;
close                      8, 14&lt;br /&gt;
concat                     87-88&lt;br /&gt;
...&lt;br /&gt;
updatedlinenumbers         46-47&lt;br /&gt;
updatedwordindex           41-42&lt;br /&gt;
updatewordindexlinenumbers 17, 44&lt;br /&gt;
when                       57&lt;br /&gt;
[/shell]&lt;/p&gt;
&lt;p&gt;Here is the code:&lt;/p&gt;
&lt;p&gt;[erlang]&lt;br /&gt;
-module(threenine).&lt;br /&gt;
-export([index/1]).&lt;/p&gt;
&lt;p&gt;index(Filename) -&gt;&lt;br /&gt;
	case file:open(Filename, read) of&lt;br /&gt;
		{ok, IoDevice} -&gt;&lt;br /&gt;
			indexFile(IoDevice),&lt;br /&gt;
			file:close(IoDevice);&lt;br /&gt;
		{error, Reason} -&gt; {error, Reason}&lt;br /&gt;
	end.&lt;/p&gt;
&lt;p&gt;indexFile(IoDevice) -&gt;&lt;br /&gt;
	RawDocument = loadRawDocument([], IoDevice),&lt;br /&gt;
	file:close(IoDevice),&lt;br /&gt;
	Document = loadDocument(RawDocument),&lt;br /&gt;
	WordIndex1 = indexWords(Document),&lt;br /&gt;
	WordIndex2 = updateWordIndexLineNumbers(WordIndex1),&lt;br /&gt;
	prettyPrintWordIndex(WordIndex2),&lt;br /&gt;
	ok.&lt;/p&gt;
&lt;p&gt;loadRawDocument(Lines, IoDevice) -&gt;&lt;br /&gt;
	case file:read_line(IoDevice) of&lt;br /&gt;
		{ok, Line} -&gt; loadRawDocument([Line|Lines], IoDevice);&lt;br /&gt;
		eof -&gt; lists:reverse(Lines)&lt;br /&gt;
	end.&lt;/p&gt;
&lt;p&gt;loadDocument(RawDocument) -&gt;&lt;br /&gt;
	MakeDoc = fun(Line, {LineNo, Document}) -&gt;&lt;br /&gt;
		Tokens = string:tokens(Line, &quot;\r\n\t {,}-&gt;:;[]().|\\=/~\&quot;'+_&quot;),&lt;br /&gt;
		{LineNo+1, [{LineNo, Tokens}|Document]}&lt;br /&gt;
	end,&lt;br /&gt;
	{_LineNumber, Document} = lists:foldl(MakeDoc, {1, []}, RawDocument),&lt;br /&gt;
	lists:reverse(Document).&lt;/p&gt;
&lt;p&gt;indexWordsFun(Word, {LineNo, WordIndex}) -&gt;&lt;br /&gt;
	LowerWord = string:to_lower(Word),&lt;br /&gt;
	LineNumbersList = case lists:keyfind(LowerWord, 1, WordIndex) of&lt;br /&gt;
		{LowerWord, LineNumbers} -&gt; LineNumbers;&lt;br /&gt;
		false -&gt; []&lt;br /&gt;
	end,&lt;br /&gt;
	UpdatedWordIndex = lists:keystore(LowerWord, 1, WordIndex, {LowerWord, [LineNo|LineNumbersList]}),&lt;br /&gt;
	{LineNo, UpdatedWordIndex}.&lt;/p&gt;
&lt;p&gt;updateWordIndexLineNumbers(WordIndex) -&gt;&lt;br /&gt;
	Update = fun({Word, LineNumbers}, NewWordIndex) -&gt;&lt;br /&gt;
		UpdatedLineNumbers = cleanNumbers(LineNumbers, []),&lt;br /&gt;
		[{Word, UpdatedLineNumbers}|NewWordIndex]&lt;br /&gt;
	end,&lt;br /&gt;
	lists:foldr(Update, [], WordIndex).&lt;/p&gt;
&lt;p&gt;cleanNumbers([], CleanNumbers) -&gt;&lt;br /&gt;
	CleanNumbers;&lt;br /&gt;
cleanNumbers([Number|LineNumbers], []) -&gt;&lt;br /&gt;
	cleanNumbers(LineNumbers, [{Number, Number}]);&lt;br /&gt;
cleanNumbers([Number|LineNumbers], [{_Start, Number}|_Tail]=NewNumbers) -&gt;&lt;br /&gt;
	cleanNumbers(LineNumbers, NewNumbers);&lt;br /&gt;
cleanNumbers([Number|LineNumbers], [{Start, End}|Tail]) when Number == End+1 -&gt;&lt;br /&gt;
	cleanNumbers(LineNumbers, [{Start, Number}|Tail]);&lt;br /&gt;
cleanNumbers([Number|LineNumbers], NewNumbers) -&gt;&lt;br /&gt;
	cleanNumbers(LineNumbers, [{Number, Number}|NewNumbers]).&lt;/p&gt;
&lt;p&gt;indexWords(Document) -&gt;&lt;br /&gt;
	IndexWords = fun({LineNo, Words}, WordIndex) -&gt;&lt;br /&gt;
		{LineNo, WordIndex2} = lists:foldr(fun indexWordsFun/2, {LineNo, WordIndex}, Words),&lt;br /&gt;
		WordIndex2&lt;br /&gt;
	end,&lt;br /&gt;
	lists:foldr(IndexWords, [], Document).&lt;/p&gt;
&lt;p&gt;makePrintFormat(WordIndex) -&gt;&lt;br /&gt;
	MaxLength = lists:foldr(fun({Word,_Lines}, Max) -&gt; erlang:max(string:len(Word), Max) end, 0, WordIndex),&lt;br /&gt;
	io_lib:format(&quot;~~-~Bs ~~s~~n&quot;, [MaxLength]).&lt;/p&gt;
&lt;p&gt;prettyPrintWordIndex(WordIndex) -&gt;&lt;br /&gt;
	PrintFormat = makePrintFormat(WordIndex),&lt;br /&gt;
	PrintWord = fun({Word, LineNumbers}, Format) -&gt;&lt;br /&gt;
		PrettyLineNumbers = makePrettyLineNumbers(LineNumbers),&lt;br /&gt;
		io:format(list_to_binary(PrintFormat), [Word, PrettyLineNumbers]),&lt;br /&gt;
		Format&lt;br /&gt;
	end,&lt;br /&gt;
	lists:foldr(PrintWord, PrintFormat, lists:reverse(lists:keysort(1,WordIndex))).&lt;/p&gt;
&lt;p&gt;getPrettyLineNumbers(Result, []) -&gt;&lt;br /&gt;
	Result;&lt;br /&gt;
getPrettyLineNumbers(Result, [{Number,Number}|LineNumbers]) -&gt;&lt;br /&gt;
	getPrettyLineNumbers([integer_to_list(Number)|Result], LineNumbers);&lt;br /&gt;
getPrettyLineNumbers(Result, [{Start,End}|LineNumbers]) -&gt;&lt;br /&gt;
	Range1=string:concat(integer_to_list(Start), &quot;-&quot;),&lt;br /&gt;
	Range2=string:concat(Range1, integer_to_list(End)),&lt;br /&gt;
	getPrettyLineNumbers([Range2|Result], LineNumbers).&lt;/p&gt;
&lt;p&gt;makePrettyLineNumbers(LineNumbers) -&gt;&lt;br /&gt;
	RangedLineNumbers = getPrettyLineNumbers([], LineNumbers),&lt;br /&gt;
	string:join(RangedLineNumbers, &quot;, &quot;).&lt;br /&gt;
[/erlang]&lt;/p&gt;
&lt;p&gt;Cheers,&lt;br /&gt;
 -Halzy&lt;/p&gt;</description>
	<pubDate>Wed, 07 Apr 2010 15:18:58 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: New set of iPhone applications: Oneteam for Gtalk and TextOne</title>
	<guid>http://www.process-one.net/en/blogs/article/new_set_of_iphone_applications_oneteam_for_gtalk_and_textone/</guid>
	<link>http://www.process-one.net/en/blogs/article/new_set_of_iphone_applications_oneteam_for_gtalk_and_textone/</link>
	<description>&lt;p&gt;We have recently released a new set of applications on Apple AppStore to complete our professionnal XMPP offering on iPhone. Both applications are targeting end users.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://itunes.apple.com/app/oneteam-for-gtalk/id364146671&quot;&gt;OneTeam for Gtalk&lt;/a&gt; is a lightweight standalone version of &lt;a href=&quot;http://itunes.apple.com/app/oneteam-3-2-with-push-support/id292511942&quot;&gt;OneTeam for iPhone&lt;/a&gt;. It supports user id with either @gmail.com or @googlemail.com domain names. It is as cleaned and streamlined as OneTeam for iPhone and supports push for Gtalk through an XMPP proxy server, which makes it an exclusivity on Apple AppStore. Note that the proxy server is used only when pushed is enabled.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://itunes.apple.com/app/textone/id364809007&quot;&gt;TextOne&lt;/a&gt; is a very simple, session-less, presence-less messaging client. It supports exclusive features like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Message &lt;strong&gt;reliability&lt;/strong&gt; to ensure delivery garantee: you are warned if the message could not reach the end user.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simple groupchat&lt;/strong&gt;: You can message a group of friends (in any combination) and reply will go to every one in the original conversation. We used it for a while and yes, this is really a must have and killer feature on mobile.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are a few screenshots of &lt;strong&gt;OneTeam for Gtalk&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.process-one.net/images/uploads/OneTeam_Gtalk_roster.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.process-one.net/images/uploads/OneTeam_Gtalk_contact.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.process-one.net/images/uploads/OneTeam_Gtalk_profile.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img height=&quot;480&quot; src=&quot;http://www.process-one.net/images/uploads/OneTeam_Gtalk_push.png&quot; width=&quot;320&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Here is a couple of screenshots for &lt;strong&gt;TextOne&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.process-one.net/images/uploads/TextOne_contact.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.process-one.net/images/uploads/TextOne_messages.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Your feedback is of course welcome on our forum:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.process-one.net/en/forum/viewforum/16/&quot;&gt;OneTeam forum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.process-one.net/en/forum/viewforum/25/&quot;&gt;TextOne forum&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: both applications cost 0,79 euros.&lt;/p&gt;</description>
	<pubDate>Tue, 06 Apr 2010 15:17:17 +0000</pubDate>
</item>
<item>
	<title>Erlang Examples: Building Erlang B13R04 in Ubuntu 9.10 Karmic</title>
	<guid>http://erlangexamples.com/?p=100</guid>
	<link>http://feedproxy.google.com/~r/ErlangExamples/~3/h-o5WHlhxF4/</link>
	<description>&lt;p&gt;Frankly speaking, I always use apt-get to install Erlang rather than building from source&amp;#8230; lazy huh? Unfortunately, when I apt-get in Ubuntu 9.10 Karmic, only Erlang/OTP R13B01 (5.7.2) is available whereas the latest is R13B04 (5.7.5) which is required to build &lt;a title=&quot;Riak&quot; href=&quot;http://riak.basho.com&quot; target=&quot;_blank&quot;&gt;Riak&lt;/a&gt; (actually &lt;a title=&quot;rebar&quot; href=&quot;http://bitbucket.org/basho/rebar/&quot; target=&quot;_blank&quot;&gt;rebar&lt;/a&gt; requires 5.7.4 and above)&amp;#8230;&lt;/p&gt;
&lt;p&gt;It takes around 10-15 min to build, and these are the required libraries and dependencies&lt;/p&gt;
&lt;pre&gt;sudo apt-get install build-essential m4 libncurses5-dev libssl-dev xsltproc fop
axel -n 20 http://www.erlang.org/download/otp_src_R13B04.tar.gz
tar xfvz otp_src_R13B04.tar.gz
cd otp_src_R13B04/
./configure --with-ssl
sudo make install&lt;/pre&gt;
&lt;p&gt;Here i&amp;#8217;m using &lt;strong&gt;axel&lt;/strong&gt; for fast download, it&amp;#8217;s your choice to use &lt;strong&gt;curl&lt;/strong&gt; or &lt;strong&gt;wget&lt;/strong&gt;.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/ErlangExamples/~4/h-o5WHlhxF4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 05 Apr 2010 14:03:14 +0000</pubDate>
</item>
<item>
	<title>Ulf Wiger: Erlang.org traffic no longer exponential</title>
	<guid>http://ulf.wiger.net/weblog/?p=184</guid>
	<link>http://ulf.wiger.net/weblog/2010/04/05/erlang-org-traffic-no-longer-exponential/</link>
	<description>&lt;p&gt;Bjarne Däcker, who has been tracking download and web site statistics on erlang.org for years, just produced a new graphic.&lt;/p&gt;
&lt;div id=&quot;attachment_185&quot; class=&quot;wp-caption alignnone&quot;&gt;&lt;a href=&quot;http://ulf.wiger.net/weblog/wp-content/uploads/2010/04/erlang-org-traffic-jan10.gif&quot;&gt;&lt;img src=&quot;http://ulf.wiger.net/weblog/wp-content/uploads/2010/04/erlang-org-traffic-jan10-300x225.gif&quot; alt=&quot;Visits to http://www.erlang.org up to March 2010&quot; title=&quot;erlang-org-traffic-jan10&quot; width=&quot;300&quot; height=&quot;225&quot; class=&quot;size-medium wp-image-185&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Visits to http://www.erlang.org up to March 2010&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;For years, the erlang.org graph has been nicely exponential. This latest peak seems to break the pattern. It will be interesting to see what follows.&lt;/p&gt;
&lt;p&gt;(Update: Looking closer at the graph, it appears to stretch as far as to March 2010. I changed the caption, but left the URL unchanged.)&lt;/p&gt;
&lt;p&gt;(Update 2: Closer inspection suggests that this is indeed measurement error. Google analytics, which also takes mirrors into account, reports a steady, but decidedly less dramatic, rise. The number of visitors to &lt;a href=&quot;http://www.erlang.org&quot;&gt;erlang.org&lt;/a&gt; is now at ca 80,000/month, up from ca 57,000/month in September 2008.)&lt;/p&gt;</description>
	<pubDate>Mon, 05 Apr 2010 11:00:07 +0000</pubDate>
</item>
<item>
	<title>REALITY.SYS: Nativ implementierte Funktionen in Erlang</title>
	<guid>http://www.brakmic.de/?p=409</guid>
	<link>http://www.brakmic.de/index.php/2010/04/05/nativ-implementierte-funktionen-in-erlang/</link>
	<description>&lt;p&gt;Ein interessantes, neues Feature in Erlang sind die NIFs (native implemented functions). Diese Funktionen werden auf die gleiche Art und Weise angewandt wie die reinen Erlang-Funktionen. NIFs ermöglichen, unter anderem, ein über bestimmte Vorgaben abgesichertes Zugreifen auf externen Code. Jedes NIF-Modul muss bestimmte Callbacks implementieren, damit ein ordentliches Verwalten derselben möglich ist. Die Callbacks sind: &lt;strong&gt;load&lt;/strong&gt;, &lt;strong&gt;reload&lt;/strong&gt;, &lt;strong&gt;upgrade &lt;/strong&gt;und &lt;strong&gt;unload&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Jeder dieser Funktionen erwarter ein &lt;em&gt;ErlNifEnv* &lt;/em&gt;Argument sowie einen void-Pointer auf Modul-spezifische Daten. Und bis auf unload hat jeder Callback noch ein load-Argument vom Typ &lt;em&gt;ERL_NIF_TERM&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Gegeben ist ein Modul namens &lt;em&gt;funcModule.c&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt; static int load(ErlNifEnv* env, void** priv, ERL_NIF_TERM load_info)
 {
        return 0;
 }&lt;/pre&gt;
&lt;p&gt;[...andere Funktionen haben dieselbe Signatur...]&lt;/p&gt;
&lt;p&gt;Bei &lt;strong&gt;unload &lt;/strong&gt;schaut es aber etwas anders aus:&lt;/p&gt;
&lt;pre&gt;static void unload(ErlNifEnv* env, void* priv)
{
        return;
}&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;funcModule.c&lt;/em&gt; erhält auch die eigens geschriebene Funktion an und fügt sie in eine Struktur vom Typ &lt;em&gt;ErlNifFunc&lt;/em&gt; ein.&lt;/p&gt;
&lt;pre&gt;static ERL_NIF_TERM func1(ErlNifEnv* env, ERL_NIF_TERM arg)
{
  [... eigener Code ... ]
}&lt;/pre&gt;
&lt;pre&gt;static ErlNifFunc exported_funcs[] =
{
   {&quot;func1&quot;, 1, func1}
};&lt;/pre&gt;
&lt;p&gt;Der Aufbau der Sturuktur ist folgenermaßen:&lt;em&gt; Erlang-Funktionsname&lt;/em&gt;, &lt;em&gt;Arity &lt;/em&gt;(d.h. die &lt;em&gt;Stelligkeit &lt;/em&gt;der Funktion, d.h. wiederum: &lt;span&gt;wieviele Parameter erwartet sie&lt;/span&gt;) und der&lt;em&gt; C-Name&lt;/em&gt; der Funktion)&lt;/p&gt;
&lt;p&gt;Diese Struktur wird über das folgende Makro &amp;#8220;bekannt gemacht&amp;#8221;:&lt;/p&gt;
&lt;pre&gt;ERL_NIF_INIT(funcModule, exported_funcs, load, reload, upgrade, unload)&lt;/pre&gt;
&lt;p&gt;Das Modul wird jetzt kompiliert und anschließend vom Erlang-Code aus angewandt:&lt;/p&gt;
&lt;pre&gt;-module(func_consumer).
-export([start/0,func1/1]).

start() -&amp;gt;
         erlang:load_nif(&quot;funcModule&quot;,0).
func1(_Value) -&amp;gt;
         nif_error(?LINE).
nif_error(Line) -&amp;gt;
         exit({nif_not_loaded,module,?MODULE,line,Line}).&lt;/pre&gt;
&lt;p&gt;Der Aufbau ist denkbar einfach: zuerst wird das externe C-Modul mittels der Funktion &amp;#8220;start&amp;#8221; geladen. Danach versucht die exportierte func1 ausgeführt zu werden. Wenn mit dem C-Modul alles ordentlich verlaufen ist, wird die zuvor in C definierte Funktion ausgeführt, ansonsten gibt es einen Erlang-Fehler inklusive der Angaben, wo dieser passierte und in welchem Modul.&lt;/p&gt;
&lt;p&gt;Somit ist die Ausführung ausfallsicher, denn im Falle eines Problems auf der C-Seite gibt es immer zumindest eine lesbare Erlang-Fehlermeldung.&lt;/p&gt;
&lt;p&gt;Mehr Details zu diesem nützlichen Erlang-Feature gibt es hier zu lesen (die Beispiel-Codes in diesem Beitrag basieren auf diesem Tutorial):&lt;a title=&quot;Erlang-NIFs&quot; href=&quot;http://www.davispj.com/2009/11/23/erlang-nif-test.html&quot; target=&quot;_blank&quot;&gt; http://www.davispj.com/2009/11/23/erlang-nif-test.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Technische Details zu NIFs gibt es hier: &lt;a href=&quot;http://www.erlang.org/doc/man/erl_nif.html&quot; target=&quot;_blank&quot;&gt;http://www.erlang.org/doc/man/erl_nif.html&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 05 Apr 2010 10:48:27 +0000</pubDate>
</item>
<item>
	<title>REALITY.SYS: Erlang Concurrency</title>
	<guid>http://www.brakmic.de/?p=406</guid>
	<link>http://www.brakmic.de/index.php/2010/04/05/erlang-concurrency/</link>
	<description>&lt;p&gt;Erlang&amp;#8217;s concurrency model has been used in commercial systems for well over 15 years, but what differentiates it from other technologies &amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://fora.tv/2008/11/19/Erlang_Concurrency_Whats_the_Fuss&quot;&gt;http://fora.tv/2008/11/19/Erlang_Concurrency_Whats_the_Fuss&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 05 Apr 2010 09:36:43 +0000</pubDate>
</item>
<item>
	<title>Programming in the 21st Century: Rethinking Programming Language Tutorials</title>
	<guid>http://prog21.dadgum.com/67.html</guid>
	<link>http://prog21.dadgum.com/67.html</link>
	<description>Imagine you've never programmed before, and the first language you're learning is Lua. Why not start with the official &lt;a href=&quot;http://www.lua.org/pil/&quot;&gt;book&lt;/a&gt; about Lua? Not too far in you run across this paragraph:
&lt;br /&gt;&lt;br /&gt;&lt;i&gt;The table type implements associative arrays. An associative array is an array that can be indexed not only with numbers, but also with strings or any other value of the language, except nil. Moreover, tables have no fixed size; you can add as many elements as you want to a table dynamically. Tables are the main (in fact, the only) data structuring mechanism in Lua, and a powerful one. We use tables to represent ordinary arrays, symbol tables, sets, records, queues, and other data structures, in a simple, uniform, and efficient way. Lua uses tables to represent packages as well. When we write io.read, we mean &quot;the read entry from the io package&quot;. For Lua, that means &quot;index the table io using the string &quot;read&quot; as the key&quot;.&lt;/i&gt;
&lt;br /&gt;&lt;br /&gt;All right, where to start with this? &quot;Associative arrays&quot;? The topic at hand is tables, and they're defined as being synonymous with an odd term that's almost certainly unfamiliar. Ah, okay, &quot;associative array&quot; is defined in the next sentence, but it goes off track quickly. &quot;Indexed&quot; gets casually used; there's the assumption that the reader understands about arrays and indexing. Then there's the curious addendum of &quot;except nil.&quot; All this talk of arrays and association and indexing, and the novice's head is surely swimming, and then the author throws in that little clarification, &quot;except nil,&quot; as if that's the question sure to be on the mind of someone who has just learned of the existence of something called a table.
&lt;br /&gt;&lt;br /&gt;I've only dissected two sentences of that paragraph so far.
&lt;br /&gt;&lt;br /&gt;Really, I should stop, but I can't resist the declaration &quot;Lua uses tables to represent packages as well.&quot; Who is that sentence written for exactly? It has no bearing on what a table is or how to use one; it's a five mile high view showing that a beautifully invisible language feature--packages--is really not so invisible and instead relies on this table idea which hasn't been explained yet.
&lt;br /&gt;&lt;br /&gt;I don't mean to single out Lua here. I can easily find tutorials for other languages that have the same problems. Every Haskell tutorial trots out laziness and folding and type systems far too early and abstractly. Why? Because those are the concerns of people who write Haskell tutorials.
&lt;br /&gt;&lt;br /&gt;To really learn to program, you have to go around in circles and absorb a lot of information. You need to get immersed in the terminology. You'll be exposed to the foibles and obsessions of language communities. You'll absorb beliefs that were previously absorbed by people who went on to write programming tutorials. It's hard to come out of the process without being transformed. Not only will you have learned to program, but all that nonsense that you struggled with (&quot;We use tables to represent ordinary arrays...&quot;) no longer matters, because you &lt;b&gt;get&lt;/b&gt; it. After that point it's difficult to see the madness, but it's still there.
&lt;br /&gt;&lt;br /&gt;Programming language tutorials shouldn't be about leaning languages. They should be about something interesting, and you learn the language in the process.
&lt;br /&gt;&lt;br /&gt;If you want to learn to play guitar, the wrong approach is to pick up a book about music theory and a chart showing where all the notes are on the fretboard. There's a huge gap between knowing all that stuff and actually playing songs. That's why good music lessons involve playing recognizable songs throughout the process. But what do we get in programming tutorials? Hello World. Fibonacci sequences. Much important manipulation of &quot;foo.&quot;
&lt;br /&gt;&lt;br /&gt;Not all tutorials are this way. &lt;a href=&quot;http://norvig.com/paip.html&quot;&gt;Paradigms of Artificial Intelligence Programming&lt;/a&gt; is a survey of classic AI programs mixed together with enough details about Lisp to understand them. I've mentioned others in &lt;a href=&quot;http://prog21.dadgum.com/19.html&quot;&gt;Five Memorable Books About Programming&lt;/a&gt;. But I still want to see more. &quot;Image Processing in Lua.&quot; &quot;Massively Multiplayer Games in Erlang.&quot; &quot;Exploring Music Theory (using Python).&quot;
&lt;br /&gt;&lt;br /&gt;I'll give a real example of how &quot;Image Processing in Lua&quot; could work. You can convert the RGB values of a pixel to a monochrome intensity value by multiplying Red, Green, and Blue by 0.3, 0.6, and 0.1 respectively, and summing the results. That's an easily understandable Lua function:
&lt;pre&gt;function intensity(r, g, b)
   return r*0.3 + g*0.6 + b*0.1
end
&lt;/pre&gt;If each color value ranges from 0 to 255, then a full white pixel should return the maximum intensity:
&lt;pre&gt;intensity(255, 255, 255)
&lt;/pre&gt;and it does: 255. This tiny program opens the door for showing how the R, G, and B values can be grouped together into a single thing...and that turns out to be a table! There's also the opportunity to show that each color element can be named, instead of remembering a fixed order:
&lt;pre&gt;{green=255, blue=255, red=255}
&lt;/pre&gt;Rewriting the &quot;intensity&quot; function first using tables and then using tables with named elements should hammer home what a table is and how it gets used. There was no need to mention any techy tangentials, like &quot;tables have no fixed size.&quot; (That can go in a terse reference doc.)
&lt;br /&gt;&lt;br /&gt;After all, the reason to learn a programming language is to do something useful with it, not simply to know the language.
&lt;br /&gt;&lt;br /&gt;(If you liked this, you might like &lt;a href=&quot;http://prog21.dadgum.com/48.html&quot;&gt;The World's Most Mind-Bending Language Has the Best Development Environment&lt;/a&gt;.)</description>
	<pubDate>Sat, 03 Apr 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>BGH's Blog: Erlang Programming Exercise: 3-8-4 &amp; 3-8-5</title>
	<guid>http://benjaminhalsted.com/?p=180</guid>
	<link>http://benjaminhalsted.com/2010/04/erlang-programming-exercise-3-8-4-3-8-5/</link>
	<description>&lt;p&gt;I enjoyed coding up 3-8-4 and 3-8-5. It took just a couple hours to finish the pair. In the first one you implement a compiler for a stack machine, in the second you implement the stack machine. There is a lot to think about. How does a stack machine work? What will you be generating? How do the instructions for (3+4)+5 differ from 3+(4+5)? How will the stack machine differ from the evaluator in 3-8-2?&lt;/p&gt;
&lt;p&gt;Starting out I looked up &lt;a href=&quot;http://en.wikipedia.org/wiki/Stack_machine&quot;&gt;stack machine on Wikipedia&lt;/a&gt; and found a link to &lt;a href=&quot;http://en.wikipedia.org/wiki/Instruction_set#Number_of_operands&quot;&gt;&quot;0-operand&quot; instruction sets&lt;/a&gt; that had enough information for me to get going. I decided to keep all of my instructions one token long for simplicity. I have 'add' and 'sub' which use the first two arguments off of the stack, 'umin' (unary minus) only uses the the first item off of the stack. I don't have a need for a 'pop' instruction and decided that 'push' was the default. As an example, adding 1+2 would look like: [1, 2, add]. The numbers would get pushed onto the stack, and then add would take the first two items off of the stack, add them together and place the results back onto the stack.&lt;/p&gt;
&lt;p&gt;I may at a later time go back and change the instruction set to have proper push and pop instructions, but for now, this worked.&lt;/p&gt;
&lt;p&gt;[erlang]&lt;br /&gt;
-module(threeeightyfour).&lt;br /&gt;
-export([compile/1]).&lt;/p&gt;
&lt;p&gt;translateInstruction(unary_minus) -&gt; umin;&lt;br /&gt;
translateInstruction(minus) -&gt; sub;&lt;br /&gt;
translateInstruction(plus) -&gt; add.&lt;/p&gt;
&lt;p&gt;compileExpression(Instructions, []) -&gt;&lt;br /&gt;
	Instructions;&lt;/p&gt;
&lt;p&gt;compileExpression(Instructions, [{num, Value}|Expressions]) -&gt;&lt;br /&gt;
	compileExpression([Value|Instructions], Expressions);&lt;/p&gt;
&lt;p&gt;compileExpression(Instructions, [{Operator, Value}|Expressions]) -&gt;&lt;br /&gt;
	Op = translateInstruction(Operator),&lt;br /&gt;
	OpInstructions = [Op|Instructions],&lt;br /&gt;
	ValueExp = [Value|Expressions],&lt;br /&gt;
	compileExpression(OpInstructions, ValueExp);&lt;/p&gt;
&lt;p&gt;compileExpression(Instructions, [{Operator, LHS, RHS}|Expressions]) -&gt;&lt;br /&gt;
	Op = translateInstruction(Operator),&lt;br /&gt;
	OpInstructions = [Op|Instructions],&lt;br /&gt;
	RightExp = [RHS|Expressions],&lt;br /&gt;
	LeftExp = [LHS|RightExp],&lt;br /&gt;
	compileExpression(OpInstructions, LeftExp).&lt;/p&gt;
&lt;p&gt;compileExpression(Expression) -&gt;&lt;br /&gt;
	compileExpression([], [Expression]).&lt;/p&gt;
&lt;p&gt;compile(Results, []) -&gt;&lt;br /&gt;
	lists:reverse(Results);&lt;br /&gt;
compile(Results, [CurrentExpression|Expressions]) -&gt;&lt;br /&gt;
	Result = compileExpression(CurrentExpression),&lt;br /&gt;
	compile([Result|Results], Expressions).&lt;/p&gt;
&lt;p&gt;compile(Expressions) -&gt;&lt;br /&gt;
	compile([], Expressions).&lt;br /&gt;
[/erlang]&lt;/p&gt;
&lt;p&gt;And the stack simulator:&lt;br /&gt;
[erlang]&lt;br /&gt;
-module(threeeightyfive).&lt;br /&gt;
-export([simulate/1]).&lt;/p&gt;
&lt;p&gt;simulator([Value|_Stack], []) -&gt;&lt;br /&gt;
	Value;&lt;br /&gt;
simulator([Value|Stack], [umin|Instructions]) -&gt;&lt;br /&gt;
	UminValue = -1 * Value,&lt;br /&gt;
	simulator([UminValue|Stack], Instructions);&lt;br /&gt;
simulator([FirstValue|Stack], [sub|Instructions]) -&gt;&lt;br /&gt;
	[SecondValue|MoreStack] = Stack,&lt;br /&gt;
	simulator([FirstValue - SecondValue|MoreStack], Instructions);&lt;br /&gt;
simulator([FirstValue|Stack], [add|Instructions]) -&gt;&lt;br /&gt;
	[SecondValue|MoreStack] = Stack,&lt;br /&gt;
	simulator([FirstValue + SecondValue|MoreStack], Instructions);&lt;br /&gt;
simulator(Stack, [Number|Instructions]) -&gt;&lt;br /&gt;
	simulator([Number|Stack], Instructions).&lt;/p&gt;
&lt;p&gt;simulator(Instructions) -&gt;&lt;br /&gt;
	simulator([], Instructions).&lt;/p&gt;
&lt;p&gt;simulate(Results, []) -&gt;&lt;br /&gt;
	lists:reverse(Results);&lt;br /&gt;
simulate(Results, [Instructions|ArraysOfInstructions]) -&gt;&lt;br /&gt;
	Result = simulator(Instructions),&lt;br /&gt;
	simulate([Result|Results], ArraysOfInstructions).&lt;/p&gt;
&lt;p&gt;simulate(ArraysOfInstructions) -&gt;&lt;br /&gt;
	simulate([], ArraysOfInstructions).&lt;br /&gt;
[/erlang]&lt;/p&gt;
&lt;p&gt;Cheers,&lt;br /&gt;
 -Halzy&lt;/p&gt;</description>
	<pubDate>Fri, 02 Apr 2010 14:33:43 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: New Strategic Guide released: from Real-time to Interpersonal Web</title>
	<guid>http://www.process-one.net/en/blogs/article/new_strategic_guide_released_from_real-time_to_interpersonal_web/</guid>
	<link>http://www.process-one.net/en/blogs/article/new_strategic_guide_released_from_real-time_to_interpersonal_web/</link>
	<description>&lt;p&gt;ProcessOne has just released a new strategic guide explaining the underlying trends of the web evolution and how this will lead to the interpersonal web, the core business of ProcessOne.&lt;/p&gt; &lt;p&gt;Instant messaging has grown so rapidly in popularity and usage that it is shaping the next era in the evolution of the Internet. This Strategic Guide explains how demand for more real-time communication and personalized content is leading to the emergence of the Interpersonal Web.&lt;/p&gt;
&lt;p&gt;The reference document is published on IMtrends: &lt;a href=&quot;http://www.process-one.net/en/imtrends/article/strategic_guide_the_interpersonal_web/&quot;&gt;Strategic  Guide: The Interpersonal Web&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Further articles with explain how to build this Interpersonal web thanks to ProcessOne technologies.&lt;/p&gt;
&lt;p&gt;Your comments are welcome.&lt;/p&gt;</description>
	<pubDate>Thu, 01 Apr 2010 13:21:02 +0000</pubDate>
</item>
<item>
	<title>Erlware: SF Erlang Factory Talks and Slides</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-8280401743874306872</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/HiAxANbNHNA/sf-erlang-factory-talks-and-slides.html</link>
	<description>For those of you who would like to view the presentation slides from the speakers, these are now available here: http://www.erlang-factory.com/conference/SFBay2010/talks (please click on the icon underneath the individual talk description). Erlang Solutions have posted most of the photos from the conference on Flickr: http://www.flickr.com/photos/erlang-consulting/collections/72157623733690054/
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/9gUNShHp1EzkTaMoNyQSmYNOheY/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/9gUNShHp1EzkTaMoNyQSmYNOheY/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/9gUNShHp1EzkTaMoNyQSmYNOheY/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/9gUNShHp1EzkTaMoNyQSmYNOheY/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/HiAxANbNHNA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 01 Apr 2010 13:03:39 +0000</pubDate>
	<author>martinjlogan@erlware.org (Martin J. Logan)</author>
</item>
<item>
	<title>Erlware: Erlang Factory: Steve Vinoski: Using Erlang in a Carrier Grade Media Distribution Switch</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-5782098169438364616</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/PQEHmOnrWOg/steve-vanoski-using-erlang-in-carrier.html</link>
	<description>Steve spent his first 6 years as a hardware test engineer.  Spent 17 years doing enterprise middlware with, horrors, corba.  Left that world and discovered Erlang - became depressed when he saw how much easier the previous 17 years could have been.  Part of the reason that he left and joined Verivue, the media delivery startup he is currently with, was because of Erlang. Verivue runs a managed 
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/CV7UltbqeZZQDYBzMOXXJw83jEQ/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/CV7UltbqeZZQDYBzMOXXJw83jEQ/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/CV7UltbqeZZQDYBzMOXXJw83jEQ/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/CV7UltbqeZZQDYBzMOXXJw83jEQ/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/PQEHmOnrWOg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 31 Mar 2010 14:55:42 +0000</pubDate>
	<author>martinjlogan@erlware.org (Martin J. Logan)</author>
</item>
<item>
	<title>Process-one Blogs: Strategic Guide: The Interpersonal Web</title>
	<guid>http://www.process-one.net/en/imtrends/article/strategic_guide_the_interpersonal_web/</guid>
	<link>http://www.process-one.net/en/imtrends/article/strategic_guide_the_interpersonal_web/</link>
	<description>&lt;p&gt;Instant messaging has grown so rapidly in popularity and usage that it is shaping the next era in the evolution of the Internet. This Strategic Guide explains how demand for more real-time communication and personalised content is leading to the emergence of the Interpersonal Web.&lt;/p&gt; &lt;p&gt;Download the document:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;English version:&amp;nbsp;&lt;a href=&quot;http://www.process-one.net/resources/research/ProcessOne_Strategic_Guide-Interpersonal_Web.pdf&quot;&gt;Strategic Guide: The Interpersonal Web&lt;/a&gt;&amp;nbsp;(PDF).&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Tue, 30 Mar 2010 17:59:34 +0000</pubDate>
</item>
<item>
	<title>Process-one News: Strategic Guide: The Interpersonal Web</title>
	<guid>http://www.process-one.net/en/news/article/strategic_guide_the_interpersonal_web/#When:17:59:34Z</guid>
	<link>http://www.process-one.net/en/imtrends/article/strategic_guide_the_interpersonal_web/</link>
	<description>&lt;p&gt;Download the document:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;English version:&amp;nbsp;&lt;a href=&quot;http://www.process-one.net/resources/research/ProcessOne_Strategic_Guide-Interpersonal_Web.pdf&quot;&gt;Strategic Guide: The Interpersonal Web&lt;/a&gt;&amp;nbsp;(PDF).&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Tue, 30 Mar 2010 17:59:34 +0000</pubDate>
</item>
<item>
	<title>Trapexit's Erlang Blog Filter: &amp;#8220;Erlang the Movie&amp;#8221; Poster</title>
	<guid>http://steve.vinoski.net/blog/?p=597</guid>
	<link>http://steve.vinoski.net/blog/2010/03/29/erlang-the-movie-poster/</link>
	<description>&lt;p&gt;They handed out this poster at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.erlang-factory.com/conference/SFBay2010&quot;&gt;Erlang Factory&lt;/a&gt;. Brilliant!&lt;br /&gt;&lt;center&gt;&lt;img alt=&quot;Erlang the Movie&quot; width=&quot;500&quot; height=&quot;700&quot; /&gt;&lt;/center&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 29 Mar 2010 16:47:19 +0000</pubDate>
</item>
<item>
	<title>LShift on Erlang: On the limits of concurrency: Worker Pools in Erlang</title>
	<guid>http://www.lshift.net/blog/?p=485</guid>
	<link>http://www.lshift.net/blog/2010/03/29/on-the-limits-of-concurrency-worker-pools-in-erlang</link>
	<description>&lt;p&gt;A worker pool is a very common pattern, and they exist in the standard libraries for many languages. The idea is simple: submit some sort of closure to a service which commits to running the closure in the future in some thread. Normally the work is shared out among many different threads and in the absence of anything fancier, one assumes a first-come-first-served queue of closures.&lt;/p&gt;

&lt;p&gt;Erlang, with its light-weight process model is not a language which you would expect would require such an approach: processes are dirt cheap, and the scheduler maps processes onto threads when they are ready to be run &amp;#8212; in many ways, the ErlangVM is a glorified implementation of a worker pool, only one that does pre-emption and other fancy features, in a very similar way to an OS kernel. However, we recently found in RabbitMQ a need for a worker pool.&lt;span id=&quot;more-485&quot;&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;At various points in RabbitMQ, we use mnesia transactions to ensure that state that is held by mnesia (for example, the existence or otherwise of a queue) is updated safely. A client recently informed us that he was creating 10,000 connections, each connection was creating a queue, with exclusive set (which means the queue must be deleted automatically when the connection disappears), and then dropping all the connections at the same time. RabbitMQ would become very unresponsive, for a very very long time. A small amount of head scratching and some quick testing led to the conclusion that this was creating 10,000 transactions, all on the same table, all of which were continuously colliding with each other and thus having to be restarted. Here, the realisation is that there is frequently no good reason to allow more mnesia transactions to go on at the same time than you have cores available &amp;#8212; the probability of a collision will rise exponentially with the number of concurrently in flight transactions.&lt;/p&gt;

&lt;p&gt;The solution here is to submit all of these transactions to a worker pool which has the same number of workers as there are CPU cores in the system. As a result, the probability of a collision is greatly reduced, and things progress much much faster. In many ways, this is a good example of where hinting to the underlying VM as to how it should schedule different jobs would result in massively improved performance.&lt;/p&gt;

&lt;p&gt;One interesting gotcha with this solution is the issue of nested transactions. Mnesia handles these very well indeed, but if we wrap every transaction in a submission to the worker pool, we stop mnesia from knowing that these transactions are nested (which means we lose the unrolling of the inner ones if the outer one subsequently fails), and furthermore, we risk deadlock if every worker in the pool is waiting on another nested transaction to complete. To solve this problem, on submission of a closure, we detect whether or not we are already in a worker pool process, and if we are, we just run the closure in the current process without submission at all. This means that nested transactions are correctly run in the same process as their parent, and we don&amp;#8217;t reach deadlock.&lt;/p&gt;

&lt;p&gt;The code is already QA&amp;#8217;d and merged into our &lt;a href=&quot;http://hg.rabbitmq.com/rabbitmq-server/file/default/&quot;&gt;default branch&lt;/a&gt; and is in the three modules &lt;a href=&quot;http://hg.rabbitmq.com/rabbitmq-server/file/default/src/worker_pool_sup.erl&quot;&gt;worker_pool_sup&lt;/a&gt; (which is the module you just need to start up, it&amp;#8217;ll then start everything else), &lt;a href=&quot;http://hg.rabbitmq.com/rabbitmq-server/file/default/src/worker_pool_worker.erl&quot;&gt;worker_pool_worker&lt;/a&gt; (the actual workers who do the, erm, work), and &lt;a href=&quot;http://hg.rabbitmq.com/rabbitmq-server/file/default/src/worker_pool.erl&quot;&gt;worker_pool&lt;/a&gt; (which is the module to which you submit your jobs). Note that the submission is synchronous, thus you will be returned the result of your closures. Furthermore, your closures are responsible for catching any errors that might occur and returning them to you as values. Finally, note that you&amp;#8217;ll also need our &lt;a href=&quot;http://hg.rabbitmq.com/rabbitmq-server/file/default/src/gen_server2.erl&quot;&gt;gen_server2&lt;/a&gt; module as the worker_pool and worker_pool_worker modules both use this.&lt;/p&gt;</description>
	<pubDate>Mon, 29 Mar 2010 09:35:18 +0000</pubDate>
</item>
<item>
	<title>Trapexit's Erlang Blog Filter: Erlang Factory: You Should&amp;#8217;ve Been There</title>
	<guid>http://steve.vinoski.net/blog/?p=572</guid>
	<link>http://steve.vinoski.net/blog/2010/03/28/erlang-factory-you-should-have-been-there/</link>
	<description>&lt;p&gt;The &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.erlang-factory.com/&quot;&gt;Erlang Factory&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.erlang-factory.com/conference/SFBay2010&quot;&gt;SF Bay Area 2010&lt;/a&gt; conference just wrapped up last Friday, and it was fantastic. The talks were of high quality and the conference organization was excellent. The slides for all the talks should be on the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.erlang-factory.com/conference/SFBay2010&quot;&gt;Erlang Factory site&lt;/a&gt; soon.&lt;/p&gt;
&lt;p&gt;If you missed this one, I strongly encourage you to attend the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.erlang-factory.com/conference/London2010&quot;&gt;London Erlang Factory coming up in June&lt;/a&gt; if you can.&lt;/p&gt;</description>
	<pubDate>Mon, 29 Mar 2010 02:19:26 +0000</pubDate>
</item>
<item>
	<title>Erlware: Erlang Factory: Martin Logan, Eric Merritt, Richard Carlson: Writing a Technical Book</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-4463901922852058490</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/OoA2Skyn3r4/erlang-factory-martin-logan-eric.html</link>
	<description>&amp;lt;!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } 	--&amp;gt; 	    
Where to start 
 Writing a technical book is at least as hard as you think it is, porbably even more. The main prerequisite is believing you have something important and worth saying. After that the next thing to do  is to choose a medium. In this case a publisher. They chose manning. 
 The first step is writing 
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/payO5MHHKCt478tjFEtLJqF17wE/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/payO5MHHKCt478tjFEtLJqF17wE/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/payO5MHHKCt478tjFEtLJqF17wE/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/payO5MHHKCt478tjFEtLJqF17wE/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/OoA2Skyn3r4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 26 Mar 2010 14:59:12 +0000</pubDate>
	<author>noreply@blogger.com (Jordan Wilberding)</author>
</item>
<item>
	<title>Process-one Blogs: OneTeam Media Server by ProcessOne</title>
	<guid>http://www.process-one.net/en/blogs/article/oneteam_media_server_by_processone/</guid>
	<link>http://www.process-one.net/en/blogs/article/oneteam_media_server_by_processone/</link>
	<description>&lt;p&gt;ProcessOne has just released OneTeam Media Server, a Flash server  written  in erlang.&lt;/p&gt; &lt;p&gt;OneTeam Media Server, or OMS for short, is a new Flash server  implementation, written in erlang, by ProcessOne. This will enable your  users to broadcast voice and/or video streams to multiple subscribers.&lt;/p&gt;
&lt;p&gt;OneTeam Media Server, although being at an early stage, behaves  already quite well, since it is more scalable than &lt;a href=&quot;http://www.red5.org/&quot;&gt;red5&lt;/a&gt;. It might not  be a fair comparison though, since it OMS is not as featurefull as  red5.&lt;/p&gt;
&lt;p&gt;Key features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support for streaming live/recorded content&lt;/li&gt;
&lt;li&gt;Support for recording live content&lt;/li&gt;
&lt;li&gt;Support for ActionScript3.0 Shared Objects&lt;/li&gt;
&lt;li&gt;Clustering support&lt;/li&gt;
&lt;li&gt;Ability to write application modules in Erlang/OTP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It still does not include RTMPT for HTTP tunneling. The license  chosen for OneTeam Media Server is the Erlang Public License version  1.1. OMS needs Erlang/OTP R11B-0 or higher.&lt;/p&gt;
&lt;p&gt;The source code is available here: &lt;a href=&quot;https://git.process-one.net/oms&quot;&gt;https://git.process-one.net/oms&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To pull the source code form git, please type:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre&gt;git clone git:&lt;span&gt;//git.process-one.net/oms/mainline.git&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The usual procedure is required (./configure, make, sudo make  install). To start OMS, just type:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre&gt;omsctl start&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Please check the documentation in:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre&gt;doc/doc.html&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
	<pubDate>Fri, 26 Mar 2010 14:00:35 +0000</pubDate>
</item>
<item>
	<title>Erlware: Erlang Factory: Michael Truog The Cloud as an Interface</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-1599234627614722913</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/zaeELzfwgKo/erlang-factory-michael-truog-cloud-as.html</link>
	<description>A Cloud as an Interface - http://cloudi.org/Cloudi - not for webapps or data cloud, but for processing. For managing processes and making sure they are fault tolerant.Cloudi is a flexible framework for private cloud computing. Its dynamically loud balanced and scheduled. Distributed execution of C/C++ work.Cloudi is an alternative to paying for a blackbox commercial cloud.Erlang coordinates all 
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/xEy9f4buCzUCqN9yNUKLxyleh28/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/xEy9f4buCzUCqN9yNUKLxyleh28/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/xEy9f4buCzUCqN9yNUKLxyleh28/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/xEy9f4buCzUCqN9yNUKLxyleh28/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/zaeELzfwgKo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 26 Mar 2010 12:35:07 +0000</pubDate>
	<author>noreply@blogger.com (Tristan Sloughter)</author>
</item>
<item>
	<title>Erlware: Riak Search</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-8085642642930994518</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/37VxNfJp40E/riak-search.html</link>
	<description>Riak SearchPresented by John Muellerteile from Basho.Fulltext and general indexing methods.Agenda* Intro* A search Tale* Riak search&quot;I used to make stuff&quot; (but now I'm a database hacker)Got sick of having to roll own indexes.Act 1: I love luceneLife is good, fast and predictable.Act 2: Cluster LuckA few shards, good performance.Act 3: SANFULots of shards. Operational nightmare. Diminishing 
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/YAbjFea6IirKCdTcDyNnymWYBZc/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/YAbjFea6IirKCdTcDyNnymWYBZc/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/YAbjFea6IirKCdTcDyNnymWYBZc/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/YAbjFea6IirKCdTcDyNnymWYBZc/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/37VxNfJp40E&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 26 Mar 2010 12:19:00 +0000</pubDate>
	<author>noreply@blogger.com (Tristan Sloughter)</author>
</item>
<item>
	<title>Erlware: Git Basics</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-7882830587987233894</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/IAcm2ko4nk8/git-basics.html</link>
	<description>Mastering Git BasicsGiven by @mojombo the cofounder and cto of github.Initial Config:git config --global user.name [NAME]git config --global user.email [EMAIL]git config --global color.ui trueLast one gives nice colors for diffs and such.Creating and CommittingMake a dir for your project:$ cd patch/to/repos$ mkdir hello$ cd hellogit init$ git init # converts empty directory into a git repo. 
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/p3UdLmKcH2Ac1AUMYsXRy1PQRIs/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/p3UdLmKcH2Ac1AUMYsXRy1PQRIs/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/p3UdLmKcH2Ac1AUMYsXRy1PQRIs/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/p3UdLmKcH2Ac1AUMYsXRy1PQRIs/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/IAcm2ko4nk8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 26 Mar 2010 12:18:46 +0000</pubDate>
	<author>noreply@blogger.com (Tristan Sloughter)</author>
</item>
<item>
	<title>Erlware: Erlang Factory: Jack Moffit: Erlang Is Our Superpower</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-600870772389937502</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/h4_7gQ-6_xc/erlang-factory-jack-moffit-erlang-is.html</link>
	<description>&amp;lt;!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } 	--&amp;gt; 	   Introduction to Erlang 
 Started as a game, chess park. Play chess online. Were python guys, so wrote it in python. Decided to use XMPP for all the wonderful features it has. Started using jabbberd. Weren't happy with it. Decided to look at ejabberd, which led them to Erlang.   
 New Product   
 Wanted to have a 
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/IZ_bZkooNXtKf1dRaEq5Zlz4CpM/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/IZ_bZkooNXtKf1dRaEq5Zlz4CpM/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/IZ_bZkooNXtKf1dRaEq5Zlz4CpM/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/IZ_bZkooNXtKf1dRaEq5Zlz4CpM/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/h4_7gQ-6_xc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 26 Mar 2010 12:09:25 +0000</pubDate>
	<author>noreply@blogger.com (Jordan Wilberding)</author>
</item>
<item>
	<title>Erlware: Erlang Factory:  Tony Garnock-Jones: What is messaging and why should we care?</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-2931525857181063876</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/V6lDzLed6TA/erlang-factory-rabbitmq.html</link>
	<description>&amp;lt;!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } 	--&amp;gt; 	    
Why messaging? 
 Scaling, load balancing Delayed jobs, task queues Multicast and broadcast Trusted store-and-forward Management monitoring Decoupling of components 
 What is messaging? 
 Messaging involves relaying, filtering, buffering, queueing, and transfer of responsibility. 
 Where is messaging? 
 See it in 
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/4bO0dYVykByOzjHbmXyPKv15GEI/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/4bO0dYVykByOzjHbmXyPKv15GEI/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/4bO0dYVykByOzjHbmXyPKv15GEI/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/4bO0dYVykByOzjHbmXyPKv15GEI/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/V6lDzLed6TA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 26 Mar 2010 10:51:24 +0000</pubDate>
	<author>noreply@blogger.com (Jordan Wilberding)</author>
</item>
<item>
	<title>Erlware: Erlang Factory: Yogish Baliga, Mark Zweifel: Deploying Erlang at Yahoo - A Case Study</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-5906086215163726265</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/4VipOXmDS_M/erlang-factory-yogish-baliga-mark.html</link>
	<description>We are going to do this collaboratively. We have worked together for over a year, we talk a lot together and thats what we are going to do here. When you try to bring in a new language to a new company you don't want to be tagged as someone who chose something to be clever. So we did something in three stages. We will give you the back ground as well as what we did. The critical thing here is to 
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/4cGG179F2jPLN3tcXPuenMz6h5o/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/4cGG179F2jPLN3tcXPuenMz6h5o/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/4cGG179F2jPLN3tcXPuenMz6h5o/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/4cGG179F2jPLN3tcXPuenMz6h5o/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/4VipOXmDS_M&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 26 Mar 2010 10:51:15 +0000</pubDate>
	<author>noreply@blogger.com (Eric)</author>
</item>
<item>
	<title>Erlware: Erlang Factory: Joe Armstrong: Keynote - What are the Important Ideas in Erlang?</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-2671636344331789507</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/6nvTaEtUH58/erlang-factory-joe-armstrong-keynote.html</link>
	<description>&amp;lt;!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } 	--&amp;gt; 	  
Plan 
 -History -3 things missing
-1 big mistake -2 good ideas -3 great ideas 
 Erlang crawled along starting from 1986. Picked up in 1996-1998,  then died out for a bit, and now is becoming popular once again. 
 1986-89 were productive years. 1989-96 was at war with the world. 1996-98 peace broke out. 1998-2000 
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/K0etM9LgspFm5BO6JF9mfUR8Qvg/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/K0etM9LgspFm5BO6JF9mfUR8Qvg/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/K0etM9LgspFm5BO6JF9mfUR8Qvg/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/K0etM9LgspFm5BO6JF9mfUR8Qvg/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/6nvTaEtUH58&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 26 Mar 2010 10:00:15 +0000</pubDate>
	<author>noreply@blogger.com (Jordan Wilberding)</author>
</item>
<item>
	<title>Erlware: Erlang Factory: Mats Cronqvist :The nine nines and how to get there</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-6442502787075573396</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/9aDWsPfcVWs/erlang-factory-mats-cronqvist-nine.html</link>
	<description>Rumination, a calm and lengthy intent consideration. Mats will rumnate on 9 9s of uptime. We will cover debugging the axd switch and generally on debugging Erlang itself.Mats is going to pick on Joe Armstrong because he does not care... all these internet sites talk about 9 9s of uptime.  It is based on an internal Ericsson slide that you can't find on the internet. This slide had to do with some
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/KPlq315EjkTuLjwPNVKTg8vqouw/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/KPlq315EjkTuLjwPNVKTg8vqouw/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/KPlq315EjkTuLjwPNVKTg8vqouw/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/KPlq315EjkTuLjwPNVKTg8vqouw/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/9aDWsPfcVWs&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 25 Mar 2010 17:28:04 +0000</pubDate>
	<author>martinjlogan@erlware.org (Martin J. Logan)</author>
</item>
<item>
	<title>Erlware: Erlang Factory: Kenji Rikitake: Erlang Secure RPC and the SSH module</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-8222017129227307340</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/EH8KONcNwYY/erlang-factory-kenji-rikitake-erlang.html</link>
	<description>My Erlang ActivitiesDiscovered erlang in 2008, via Joe's book. Patches accepted, TAI leap second, SSH aes123-cbc, backporting freebsd patches, there for quite a long time. First I am going to talk about the security weakness in erlang in general and then why ssh is needing and finally an ssh protocol review, four how erlang supports ssh, six prototype implementation and support. Lets talk about 
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/UvxbD19_v_JSQQe5OBpRqPEXhTA/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/UvxbD19_v_JSQQe5OBpRqPEXhTA/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/UvxbD19_v_JSQQe5OBpRqPEXhTA/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/UvxbD19_v_JSQQe5OBpRqPEXhTA/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/EH8KONcNwYY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 25 Mar 2010 17:24:46 +0000</pubDate>
	<author>noreply@blogger.com (Eric)</author>
</item>
<item>
	<title>Erlware: Erlang Factory: Todd Lipcon: Thrift Avro/Erlang bindings</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-5465016284949358388</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/vLpeqxUxLNw/erlang-factory-todd-lipcon-thrift.html</link>
	<description>Thrift and avro bindings with Erlang.  Previously Todd built many websites in the standard languages for doing such things.  He worked for Amie Street and Songza which is where he had the chance to work with Erlang. This talk is really not for those doing hobby websites. This talk is for those doing enterprize level websites. This is for websites with multi functional teams.  Popular Web 
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/lOD874S2WwKjVdTPrN5zRA2juW0/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/lOD874S2WwKjVdTPrN5zRA2juW0/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/lOD874S2WwKjVdTPrN5zRA2juW0/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/lOD874S2WwKjVdTPrN5zRA2juW0/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/vLpeqxUxLNw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 25 Mar 2010 16:44:19 +0000</pubDate>
	<author>martinjlogan@erlware.org (Martin J. Logan)</author>
</item>
<item>
	<title>Erlware: Erlang Factory: Kresten Thorup: Erjang</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-4800975373321836047</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/PcqtOp_Ge7M/erlang-factory-kresten-thorup-erjang.html</link>
	<description>This is my project to learn Erlang. There are a lot of questions in the community about wether this is possible at all. This ignited me, so I had to go prove that it is possible. I have a software company of around a 100 people and we are mostly doing java. We are the goto guys for java in denmark. We where a very early adapter of java. We have been very successful with that. Recently I have been
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/Y8QoaKA4ypxkGLULn7s0iHc_d1A/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/Y8QoaKA4ypxkGLULn7s0iHc_d1A/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/Y8QoaKA4ypxkGLULn7s0iHc_d1A/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/Y8QoaKA4ypxkGLULn7s0iHc_d1A/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/PcqtOp_Ge7M&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 25 Mar 2010 16:32:34 +0000</pubDate>
	<author>noreply@blogger.com (Eric)</author>
</item>
<item>
	<title>Erlware: Erlang Factory: Chad DePue: Lua Integration with Erlang</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-2126575159077835456</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/ygTz06EX7oc/erlang-factory-chad-depue-lua.html</link>
	<description>Problems we start having with it  is when you start running multiple servers (monit). A couple of cool things about monit and god, nice because its turing complete, monitor with distributed monitoring like with m/monit. Problem with it is that its running in ruby. Erlang, monitoring code is in erlang, configuration in lua. connected nodes share the same configuration. How does that interact with 
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/q7FPPUJ7cI4iGjspDQozpREM7Cw/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/q7FPPUJ7cI4iGjspDQozpREM7Cw/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/q7FPPUJ7cI4iGjspDQozpREM7Cw/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/q7FPPUJ7cI4iGjspDQozpREM7Cw/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/ygTz06EX7oc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 25 Mar 2010 16:17:05 +0000</pubDate>
	<author>noreply@blogger.com (Eric)</author>
</item>
<item>
	<title>Erlware: Erlang Factory: Patrick Nyblom: Erlang SMP Support - Behind the Scenes</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-1049973981972015316</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/gLnxwIeXqmo/erlang-factory-patrick-nyblom-erlang.html</link>
	<description>Erlang Multicore SupportIf you went to EUC this year, this is a good time to take a nap. This talk will be very similar to that one. The erlang multicore support has been in the product for a couple of releases. we started five or six years ago with the single cpu virtual machine. Its still there, if you start on a single core machine you get the single threaded virtual machine.  Now we have 
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/kc8lzdaM3ht5Rbf1KjMlSWHnQHA/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/kc8lzdaM3ht5Rbf1KjMlSWHnQHA/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/kc8lzdaM3ht5Rbf1KjMlSWHnQHA/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/kc8lzdaM3ht5Rbf1KjMlSWHnQHA/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/gLnxwIeXqmo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 25 Mar 2010 15:21:02 +0000</pubDate>
	<author>noreply@blogger.com (Eric)</author>
</item>
<item>
	<title>Erlware: Erlang Factory: Sean Cribbs: Achieving Parsing Sanity with Neotoma</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-6032476662219465705</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/QHkaX6vq8oA/erlang-factory-sean-cribbs-achieving.html</link>
	<description>CucumberSean worked on a testing framework for doing acceptance testing called cucumber.  Cucumber let you write agile stories that were executable.  Sean had a thought, why not write cucumber in Erlang?  Gherkin uses TreetopA simple language for expressing tests. Why not use leex and yecc to do the parser generation for handling Gherkin/Treetop.  The problem with using leex and yecc was that the
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/E80NzAQnE_uElnB393VSaNG0t5w/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/E80NzAQnE_uElnB393VSaNG0t5w/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/E80NzAQnE_uElnB393VSaNG0t5w/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/E80NzAQnE_uElnB393VSaNG0t5w/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/QHkaX6vq8oA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 25 Mar 2010 14:52:16 +0000</pubDate>
	<author>martinjlogan@erlware.org (Martin J. Logan)</author>
</item>
<item>
	<title>Erlware: Erlang Factory: Cliff Moon: Fast Enough</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-2223229818050471510</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/lmEx5ZNNOVU/erlang-factory-cliff-moon-fast-enough.html</link>
	<description>I had a bunch of slow erlang that I ported to C and now I have two problems. So we are going to talk about how to be fast enough.Performance Tuning, Profiling all the things you need to do before this point. Through put, Online transaction processing, 99.9% latency. These are the things that typically matter. How do we go about profiling.Identify bottle necks. Optimize algorithmsPort critical 
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/QsyZ906I-QF90eT_l2vg1_UzYkI/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/QsyZ906I-QF90eT_l2vg1_UzYkI/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/QsyZ906I-QF90eT_l2vg1_UzYkI/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/QsyZ906I-QF90eT_l2vg1_UzYkI/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/lmEx5ZNNOVU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 25 Mar 2010 13:24:04 +0000</pubDate>
	<author>noreply@blogger.com (Eric)</author>
</item>
<item>
	<title>Erlware: Erlang Factory: Andy Gross: Distributed Erlang Systems In Operation: Patterns and Pitfalls</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-1482995006483490907</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/yV6TQLb5aIc/erlang-factory-andy-gross-distributed.html</link>
	<description>Andy is the VP of engineering and social media liability at Basho Technologies.  He has been doing work on distributed systems ever since he worked at akami for 7 years.  He really wished he knew about Erlang back then. After moving to apple he wrote distributed systems in objective c and so on. After getting sick of that he went to work at mochi media and fell in love with Erlang. Now at basho 
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/BT27UrNVCMSoau5c-JbOVrIrHtI/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/BT27UrNVCMSoau5c-JbOVrIrHtI/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/BT27UrNVCMSoau5c-JbOVrIrHtI/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/BT27UrNVCMSoau5c-JbOVrIrHtI/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/yV6TQLb5aIc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 25 Mar 2010 12:56:56 +0000</pubDate>
	<author>martinjlogan@erlware.org (Martin J. Logan)</author>
</item>
<item>
	<title>Erlware: Erlang Factory: Bjarne Däcker:  discussion of basic vs. applied research in the software domain and the creation of Erlang</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-7995742344916642219</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/32qImXpCb2w/erlang-factory-bjarne-dacker-discussion.html</link>
	<description>CSLab and all that ...How many at Erlang factory in london last summer (few), not exactly the same talk as then.  (microphone issues). Reason for this talk is to explain the background to Erlang. It wasn't just something that fell out of the sky. There was a lot of thinking behind it. At a big company like Ericsson there are research activities that are structured into laboratories. We went to 
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/aam7hhBj0oEYvsZYqCTd51Jn7sY/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/aam7hhBj0oEYvsZYqCTd51Jn7sY/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/aam7hhBj0oEYvsZYqCTd51Jn7sY/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/aam7hhBj0oEYvsZYqCTd51Jn7sY/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/32qImXpCb2w&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 25 Mar 2010 11:13:46 +0000</pubDate>
	<author>noreply@blogger.com (Eric)</author>
</item>
<item>
	<title>Erlware: Erlang Factory: Welcome - Francesco Cesarini</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-4640421929856426287</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/Cw-vtJCMuso/erlang-factory-welcome-francesco.html</link>
	<description>Growth in the Erlang Comunity. His first consulting gig in the US was in 2002 in chicago. At that point not more then 10 companies using Erlang in the US. One of those companies was Cellpoint, which eventually brought Erlang to South Africa, where it has grown tremendously. Other non-Ericsson companies using Erlang Telia (sweden) Bluetail (sweden) Cellpoint (sweden, Uk, US) One 2 On (UK) IdealX (
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/hNEfxwGU1j5a1PqHTSnMyiaGEjk/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/hNEfxwGU1j5a1PqHTSnMyiaGEjk/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/hNEfxwGU1j5a1PqHTSnMyiaGEjk/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/hNEfxwGU1j5a1PqHTSnMyiaGEjk/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/Cw-vtJCMuso&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 25 Mar 2010 09:23:39 +0000</pubDate>
	<author>noreply@blogger.com (Eric)</author>
</item>
<item>
	<title>Erlware: Erlang Factory - San Francisco 2010 Live Blogging</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-2309167407922965168</guid>
	<link>http://feedproxy.google.com/~r/blogspot/NoyQp/~3/zJo2HlB9Y_o/erlang-factory-san-francisco-2009-live.html</link>
	<description>Your Erlware Devs are attending the Erlang Factory 2010 in San Francisco. Both Eric and Martin are Track Hosts and speakers for this event. We are going to do our best to live blog the various talks and events starting this morning.  We will have live updates of the talks on the Erlware blog.Update - that is 2010 not 2009 as the original title indicated - obviously
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/LvNvxKLi5bygV-hZdXL9l7TQlaI/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/LvNvxKLi5bygV-hZdXL9l7TQlaI/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/LvNvxKLi5bygV-hZdXL9l7TQlaI/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/LvNvxKLi5bygV-hZdXL9l7TQlaI/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/NoyQp/~4/zJo2HlB9Y_o&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 25 Mar 2010 09:18:37 +0000</pubDate>
	<author>noreply@blogger.com (Eric)</author>
</item>
<item>
	<title>Damien Katz: Replication</title>
	<guid>tag:damienkatz.net,2010://1.559</guid>
	<link>http://damienkatz.net/2010/03/replication.html</link>
	<description>&lt;p&gt;&lt;span class=&quot;mt-enclosure mt-enclosure-image&quot;&gt;&lt;img alt=&quot;bucksfurniturewarehouse40_400.gif&quot; src=&quot;http://damienkatz.net/pics/bucksfurniturewarehouse40_400.gif&quot; width=&quot;400&quot; height=&quot;306&quot; class=&quot;mt-image-none&quot; /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Some cool Apache CouchDB replication related links:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://blog.couch.io/post/468392274/whats-new-in-apache-couchdb-0-11-part-three&quot;&gt;What's new in Apache CouchDB 0.11 -- Part Three: Replication&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://japhr.blogspot.com/2010/03/extreme-couchdb-replication.html&quot;&gt;Extreme CouchDB Replication&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://books.couchdb.org/relax/reference/clustering&quot;&gt;CouchDB Clustering&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Tue, 23 Mar 2010 21:57:07 +0000</pubDate>
</item>
<item>
	<title>LShift on Erlang: The fine art of holding a file descriptor</title>
	<guid>http://www.lshift.net/blog/?p=482</guid>
	<link>http://www.lshift.net/blog/2010/03/23/the-fine-art-of-holding-a-file-descriptor</link>
	<description>&lt;p&gt;People tend to like certain software packages to be scalable. This can have a number of different meanings but mostly it means that as you throw more work at the program, it may require some more resources, in terms of memory or CPU, but it nevertheless just keeps on working. Strangely enough, it&amp;#8217;s fairly difficult to achieve this with finite resources. With things like memory, the classical hierarchy applies: as you use up more and more faster memory, you start to spill to slower memory &amp;#8212; i.e. spilling to disk. The assumption tends to be that one always has enough disk space.&lt;/p&gt;

&lt;p&gt;Other resources are even more limited, and are harder to manage. One of these is file descriptors.&lt;span id=&quot;more-482&quot;&gt;&lt;/span&gt; This is especially difficult to manage in a VM such as Erlang&amp;#8217;s where lots of other systems are potentially using file descriptors and you have no control over them. In the released versions of Rabbit, Rabbit&amp;#8217;s persister used only one or two file descriptors, and the queues themselves used none. This would be an obvious scalability issue in that it would restrict to a single process access to messages stored on disk, were it not for the fact that released versions of Rabbit hold all messages in memory all the time, thus negating that problem (at the expense of a larger scalability issue). However the upside is that as more queues appear, you don&amp;#8217;t need more file descriptors, so almost all file descriptors could be set aside for network sockets. If you need to allow more network connections to Rabbit than your OS provides, then just raise the ulimit (and often the default Erlang process limit too) and away you go.&lt;/p&gt;

&lt;p&gt;With the new persister, each queue requires at least two file descriptors each, and can use a number of file descriptors bounded only by the number of messages stored on disk. Whilst this has removed all sorts of bottlenecks, it has also made the probability of running out of file descriptors rather higher. Introducing a central file descriptor allocator would reintroduce a bottleneck that we have sought to avoid, and so we have developed an alternative scheme for managing file descriptors. This scheme &lt;strong&gt;can&lt;/strong&gt; go wrong: it is really only probabilistic that it works. But, given the way in which Rabbit works, it seems to be working very successfully.&lt;/p&gt;

&lt;p&gt;Firstly, there is a central process. However, this is never &lt;em&gt;asked&lt;/em&gt; for a file descriptor, instead all processes who open files asynchronously tell the central process that they&amp;#8217;ve opened a file. They also tell the central process when they close a file descriptor. With both of these messages, processes include another piece of information which is the time at which the &lt;em&gt;least recently used&lt;/em&gt; file descriptor that the process has open was used. Thus the processes maintain a mapping from file descriptor to the timestamp at which they were last used. The smallest value in this mapping is the value which is included with these messages to the central process. Whenever a process uses a file descriptor, it takes a new timestamp and updates this mapping. No communication is made to the central process on use of a file descriptor.&lt;/p&gt;

&lt;p&gt;The central process detects the ulimit imposed by the OS on the number of file descriptors that can be opened. It imposes an artificial limit, 100 less than the real limit. This gives both buffer space, and allows the rest of the Erlang VM some file descriptors beyond our own control. When we reach this artificial lower limit, the central process does the following calculation: for every process that has some open files, it finds the difference between the current timestamp and the most recently reported &lt;em&gt;least recently used&lt;/em&gt; file descriptor timestamp. It sums and averages these ages to give the average time since the &lt;em&gt;least recently used&lt;/em&gt; file descriptors were used. It then asynchronously sends messages to all the processes with open files, telling them to close any file descriptor that has not been used for more than this average time.&lt;/p&gt;

&lt;p&gt;The first time the processes receive this message, they may very well find that they don&amp;#8217;t have any file descriptors that have not been used for this long. This is because the central process is only informed or processes&amp;#8217; &lt;em&gt;least recently used&lt;/em&gt; file descriptor timestamps &lt;em&gt;when the process opens or closes a file descriptor&lt;/em&gt;. As such, if the process then uses the file descriptor then the central process will immediately have out of date information. Thus all processes, when they receive a request to close files descriptors older than the calculated average, they always inform the central process of the timestamp of their current &lt;em&gt;least recently used&lt;/em&gt; file descriptor. Thus at this point, the central process is brought up to date, and if it finds that it&amp;#8217;s still at or over the limit of open file descriptors, it recalculates the average age (which will now be less than before) and asks all the processes again to close file descriptors older than the new, smaller average age.&lt;/p&gt;

&lt;p&gt;What this means is that processes are never blocked from opening files, even when Rabbit&amp;#8217;s over the limit of file descriptors. However, immediately after opening a file, when it goes to receive its next message, a process may find a request from the central process, asking it to close the file it&amp;#8217;s just opened. Thus the limit is enforced softly, in a way which does as little as possible to impact performance. This is the reason why we have the lower artificial limit: to try and guard against the possibility of lots of processes opening files at the same time, pushing us over the limit before they or any other process receive the close request from the central process. However it can still go wrong: if a process is hell bent on opening as many files as possible then it can do so, and still hit the hard OS limit, crashing the VM. Cooperation from the processes is obviously vital: for example if a process can never open more than one file descriptor before checking its mailbox again, then you&amp;#8217;re very likely to be safe in this scheme.&lt;/p&gt;

&lt;p&gt;All of this is implemented in a module called &lt;a href=&quot;http://hg.rabbitmq.com/rabbitmq-server/file/bug21673/src/file_handle_cache.erl&quot;&gt;file_handle_cache.erl&lt;/a&gt; which is available in the new persister branch of RabbitMQ. This module also wraps many of the functions of Erlang&amp;#8217;s file module, providing many more optimisations (at the cost of, for example, only ever being able to append to files). These optimisations aim to reduce to an absolute minimum the number of OS calls. So, much better control of write buffers is provided, and seeks which would position the file handle at the same location as it currently is are optimised out. Further calls are provided, e.g. to throw away the write buffer contents without writing them out to disk.&lt;/p&gt;

&lt;p&gt;When the request to close a file comes in, the &lt;a href=&quot;http://hg.rabbitmq.com/rabbitmq-server/file/bug21673/src/file_handle_cache.erl&quot;&gt;file_handle_cache&lt;/a&gt; module works out which file descriptors to close. If it finds a file handle to close, it flushes any outstanding writes, closes the file, but keeps track of the last state that it was in. Thus the next time the process decides to use that file descriptor, the module can silently reopen the file and seek to the last location. As a result, when writing to this module, you never need to find out whether or not the central process has asked the module to close files and what, if anything, the result of that request was. The result is a system which dynamically closes old and unused file descriptors but without imposing arduous constraints on the client: the module manages all the state of the file descriptors.&lt;/p&gt;

&lt;p&gt;Finally, there are some file descriptors which we have decided, after careful consideration, not to arbitrarily close. These are network sockets to AMQP clients. For these, it is indeed right to have a central process controlling whether further sockets can be created. This is simply implemented as a pair of synchronous calls (acquire and release) to the central process which lowers and raises, respectively, the artificial limit on the number of allowed file descriptors.&lt;/p&gt;</description>
	<pubDate>Tue, 23 Mar 2010 17:26:56 +0000</pubDate>
</item>
<item>
	<title>Programming in the 21st Century: Living Inside Your Own Black Box</title>
	<guid>http://prog21.dadgum.com/66.html</guid>
	<link>http://prog21.dadgum.com/66.html</link>
	<description>Every so often I run across a lament that programmers no longer understand the systems they work on, that programming has turned into searches through massive quantities of documentation, that large applications are built by stacking together loosely defined libraries. Most recently it was Mike Taylor's &lt;a href=&quot;http://reprog.wordpress.com/2010/03/03/whatever-happened-to-programming/&quot;&gt;Whatever happened to programming?&lt;/a&gt;, and it's worth the time to read.
&lt;br /&gt;&lt;br /&gt;To me, it's not that the act of &lt;em&gt;programming&lt;/em&gt; has gotten more difficult. I'd even say that programming has gotten &lt;a href=&quot;http://prog21.dadgum.com/29.html&quot;&gt;much easier&lt;/a&gt;. Most of the Apple Pascal assignments I had in high school would be a fraction of the bulk if written in Ruby or Python. Arrays don't have fixed lengths. Strings are easy. &lt;a href=&quot;http://prog21.dadgum.com/53.html&quot;&gt;Dictionaries&lt;/a&gt; have subsumed other data structures. Generic sort routines are painless to use. Functions can be tested interactively. Times are good!
&lt;br /&gt;&lt;br /&gt;That's not to say all problems can be solved effortlessly. Far from it. But it's a tight feedback loop: think, experiment, write some code, reconsider, repeat. This works as long as you can live inside an isolated world, where the basic facilities of your programming language are the tools you have to work with. But at some point that doesn't work, and you have to deal with outside realities.
&lt;br /&gt;&lt;br /&gt;Here's the simplest example I can think of: Write a program to draw a line on the screen. Any line, any color, doesn't matter. No ASCII art.
&lt;br /&gt;&lt;br /&gt;In Python the first question is &quot;What UI toolkit?&quot; There are bindings for SDL, Cocoa, wxWindows, and others. Selecting one of those still doesn't mean that you can simply call a function and see your line. SDL requires some up front effort to learn how to create a window and choose the right resolution and color depth and so on. And then you &lt;em&gt;still&lt;/em&gt; can't draw a line unless you use OpenGL or get an add-on package like SDL_gfx. If you decide to take the Cocoa route, then you need to understand its whole messaging / windowing / drawing model, and you also need to understand how Python interfaces with it. Maybe there's a beautifully simple package out there that lets you draw lines, and then the question becomes &quot;Can I access that library from the language I'm using?&quot; An even more basic question: &quot;Is the library written using a paradigm that's a good match for my language?&quot; (Think of a library based on subclassing mutable objects and try to use it from Haskell.)
&lt;br /&gt;&lt;br /&gt;There's a clear separation between programming languages and the capabilities of modern operating systems. Any popular OS is obviously designed for creating windows and drawing and getting user input, but those are not fundamental features of modern languages. At one time regular expressions weren't standard in programming languages either, but they're part of Perl and Ruby, and they're a library that's part of the official Python distribution.
&lt;br /&gt;&lt;br /&gt;A handful of language designers have tried to make GUI programming as easy as traditional programming. The Tk library for TCL, which is still the foundation for Python's out-of-the-box IDE, allows basic UI creation with simple, declarative statements. REBOL is a more recent incarnation of the same idea, that sample code involving windows and user input and graphics should be a handful of lines, not multiple pages of wxWindows fussing. I wish more people were working on such things.
&lt;br /&gt;&lt;br /&gt;A completely different approach is to go back to the isolationist view of only using the natural capabilities of a programming language, but in a more extreme way. I can draw a line in Python with this tuple:
&lt;pre&gt;(&quot;line&quot;,0,0,639,479)
&lt;/pre&gt;or I can do the same thing in Erlang with two fewer characters:
&lt;pre&gt;{line,0,0,639,479}
&lt;/pre&gt;I &lt;em&gt;know&lt;/em&gt; it works, because I can see it right there. The line starts at coordinates 0,0 and ends at 639,479. It works on any computer with any video card, including systems I haven't used yet, like the &lt;a href=&quot;http://prog21.dadgum.com/59.html&quot;&gt;iPad&lt;/a&gt;. I can use the same technique to play sounds and build elaborate UIs.
&lt;br /&gt;&lt;br /&gt;That the results are entirely in my head is of no matter.
&lt;br /&gt;&lt;br /&gt;It may sound like I'm being facetious, but I'm not. In most applications, interactions between code and the outside world can be narrowed down to couple of critical moments. Even in something as complex as a game, you really just need a few bytes representing user input at the start of a frame, then much later you have a list of things to draw and a list of sounds to start, and those get handed off to a thin, external driver of sorts, the small part of the application that does the messy hardware interfacing.
&lt;br /&gt;&lt;br /&gt;The rest of the code can live in isolation, doing arbitrarily complex tasks like laying out web pages and mixing guitar tracks. It takes some practice to build applications this way, without scattering calls to external libraries throughout the rest of the code, but there are big wins to be had. Fewer dependencies on platform specifics. Fewer worries about getting overly reliant on library X. And most importantly, it's a way to declutter and get back to basics, to focus on writing the important code, and to delve into those thousands of pages of API documentation as little as possible.</description>
	<pubDate>Tue, 23 Mar 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>RedHotErlang: Mercurial, DVCS and Agile methods</title>
	<guid>http://www.redhoterlang.com/web/8c7f7e3fadddc7053e4ed84457f8356b</guid>
	<link>http://www.redhoterlang.com/web/plink?id=8c7f7e3fadddc7053e4ed84457f8356b</link>
	<description>I've been reading the Mercurial book recently and liked it a lot. Although I've been using git and github for quite a while, I couldn't help myself from being impressed by the clean and simple approach of Mercurial. 

A simple base set of commands wi...</description>
	<pubDate>Mon, 22 Mar 2010 19:39:45 +0000</pubDate>
</item>
<item>
	<title>Erlang Inside: Simple Chart Of Embeddable Scripting Options In Erlang</title>
	<guid>http://erlanginside.com/?p=157</guid>
	<link>http://erlanginside.com/simple-chart-of-embeddable-scripting-options-in-erlang-157</link>
	<description>In preparation for my upcoming talk this week at Erlang Factory San Francisco, focused on Lua integration in Erlang, I'm reviewing Lua, Javascript, and Reia, and I came up with this very simple decision tree. Thoughts on the PDF download would be welcome.</description>
	<pubDate>Mon, 22 Mar 2010 01:51:34 +0000</pubDate>
</item>
<item>
	<title>Programming in the 21st Century: A Short Story About Verbosity</title>
	<guid>http://prog21.dadgum.com/65.html</guid>
	<link>http://prog21.dadgum.com/65.html</link>
	<description>In the early 2000s I was writing a book. I don't mean in the vague sense of sitting in a coffeeshop with my laptop and pretending to be a writer; I had a contract with a tech book publisher.
&lt;br /&gt;&lt;br /&gt;I'm in full agreement with the musician's saying of &quot;never turn down a gig,&quot; so when the opportunity arose, I said yes. I did that even though there was one big, crazy caveat:
&lt;br /&gt;&lt;br /&gt;&quot;In order for a book to sell,&quot; said my publisher, &quot;it's got to be thick. 600 pages thick.&quot; &quot;In the worst case we could go as low as 500 pages, but 600+ should be your target.&quot;
&lt;br /&gt;&lt;br /&gt;Wow, 600 pages. If I wrote two pages a day, that's almost a full year of writing, and I had less than a year. But still, never turn down a gig, and so I took a serious attempt at it.
&lt;br /&gt;&lt;br /&gt;I can't prove or refute the claim that a 600 page tech book sells better than thinner ones, but it explains a lot of the bloated tomes out there. Mix sections of code with the text, then reprint the whole program at the end of the chapter. That can eat four or eight pages. Add a large appendix that reiterates a language's standard library, even though all that info is already in the help system and online. Add some fluff survey chapters that everyone is going to skip.
&lt;br /&gt;&lt;br /&gt;I try not to wax nostalgic about how the olden days of computing were better. While I might have some fond memories of designing games for 8-bit home computers, there has been a lot of incredibly useful &lt;a href=&quot;http://prog21.dadgum.com/52.html&quot;&gt;progress&lt;/a&gt; since then. But I do find myself wishing that the art of the 250 page technical book hadn't gone completely out of style.
&lt;br /&gt;&lt;br /&gt;Eventually I did give up on the 600 page monster I was writing. It was a combination of me not having enough time and my publisher taking weeks to give feedback about submitted chapters. In the end I think I had written the introduction and maybe eight full chapters. Do I wish I had finished it? Yes. Even with the 600 page requirement, there was still some clout that went along with writing a book at the time. These days it's much less so, and I think those padded-out-to 600 pages volumes had a lot to do with it.
&lt;br /&gt;&lt;br /&gt;(If you liked this, you might like &lt;a href=&quot;http://prog21.dadgum.com/9.html&quot;&gt;Two Stories of Simplicity&lt;/a&gt;.)</description>
	<pubDate>Wed, 17 Mar 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>Learn You Some Erlang: Functionally Solving Problems in Erlang</title>
	<guid>http://learnyousomeerlang.com/functionally-solving-problems</guid>
	<link>http://learnyousomeerlang.com/functionally-solving-problems</link>
	<description>A new chapter arrives. This one is about putting to practice what was seen in Learn You Some Erlang until now. The problems are borrowed from Learn You A Haskell and are about implementing a Reverse Polish Notation calculator with pattern matching and finding the shortest path from Heathrow to London. Hopefully this chapter will help those having trouble thinking in a functional manner to solve problems.</description>
	<pubDate>Tue, 16 Mar 2010 00:30:00 +0000</pubDate>
</item>
<item>
	<title>Caoyuan's Blog: How the Functional Ability of Scala Comparing to Haskell - an Example</title>
	<guid>http://blogtrader.net/blog/FunctionalAbilityScalaComparingHaskell</guid>
	<link>http://blogtrader.net/blog/FunctionalAbilityScalaComparingHaskell</link>
	<description>&lt;p&gt;
About one and half year ago, it was my first time to consider Scala seriously, I wrote a blog about the &lt;a href=&quot;http://blogtrader.net/blog/an_example_syntax_in_haskell&quot;&gt;syntax example of Scala, Erlang and Haskell &lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
With more experience of Scala, I'd like to know how about the functional ability of Scala comparing to Haskell. I picked up &lt;a class=&quot;ext-link&quot; href=&quot;http://mult.ifario.us/p/perpubplat-now-on-github&quot;&gt;&lt;span class=&quot;icon&quot;&gt; &lt;/span&gt;Paul R. Brown's perpubplat blog engine&lt;/a&gt; again, which is a Haskell implementation heavily in functional style. I tried to port more code from Haskell to Scala keeping in similar expressions. Here's the code example of Entry.scala in Scala comparing to Brown's original Entry.hs:
&lt;/p&gt;
&lt;h3 id=&quot;OriginalHaskellcodepiece&quot;&gt;Original Haskell code piece&lt;/h3&gt;
&lt;div class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c1&quot;&gt;-- | Data structures for an item (post or comment) and the&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;-- overall structure in terms of parents and children.&lt;/span&gt;
&lt;span class=&quot;kr&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Blog.Model.Entry&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;where&lt;/span&gt;
&lt;span class=&quot;kr&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;qualified&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Blog.FrontEnd.Urls&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; U
&lt;span class=&quot;kr&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Utilities&lt;/span&gt;
&lt;span class=&quot;kr&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;qualified&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Blog.Constants&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; C
&lt;span class=&quot;kr&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Maybe&lt;/span&gt;
&lt;span class=&quot;kr&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;List&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;sortBy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;isPrefixOf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;intersperse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;kr&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;qualified&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Data.Map&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; M
&lt;span class=&quot;kr&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Data.Map&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;kr&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ISO8601DatetimeString&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;
&lt;span class=&quot;kr&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;XhtmlString&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;-- | Overall data model for the runtime.  &lt;/span&gt;
&lt;span class=&quot;kr&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- | &lt;/span&gt;
                     by_permatitle &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Map&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                     by_int_id &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Map&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                     child_map &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Map&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                     all_items &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                     next_id &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;empty&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;empty&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;empty &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;empty &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;empty &lt;span class=&quot;kt&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;kr&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Kind&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Comment&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Trackback&lt;/span&gt;
            &lt;span class=&quot;kr&quot;&gt;deriving&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Show&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Eq&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;build_model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;build_model&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; empty
&lt;span class=&quot;nf&quot;&gt;build_model&lt;/span&gt; items &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;map_by permatitle sorted_items&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                    bid
                    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;build_child_map sorted_items&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;sorted_items&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;n&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;kr&quot;&gt;where&lt;/span&gt;
      sorted_items &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; sort_by_created_reverse items
      bid &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;map_by internal_id sorted_items&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      n &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; fst &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;findMax &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; bid
&lt;span class=&quot;nf&quot;&gt;build_child_map&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Map&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;build_child_map&lt;/span&gt; i &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; build_child_map_ &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;fromList &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;map &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;\&lt;/span&gt;x &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;internal_id x&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; i&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; i
&lt;span class=&quot;c1&quot;&gt;-- Constructed to take advantage of the input being in sorted order.&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;build_child_map_&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Map&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Map&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;build_child_map_&lt;/span&gt; m &lt;span class=&quot;kt&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; m
&lt;span class=&quot;nf&quot;&gt;build_child_map_&lt;/span&gt; m &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;kt&quot;&gt;:&lt;/span&gt;is&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;parent i &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Nothing&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;then&lt;/span&gt;
                                build_child_map_ m is
                            &lt;span class=&quot;kr&quot;&gt;else&lt;/span&gt;
                                build_child_map_ &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;insertWith &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;unwrap &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; parent i&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;internal_id i&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; m&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; is
&lt;span class=&quot;c1&quot;&gt;-- | Insert an item, presuming that all of its data other than&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;-- internal identifier have been correctly set.&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;insert&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;insert&lt;/span&gt; m i &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;i'&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; m &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; by_permatitle &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;insert &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;permatitle i'&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; i' &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; by_permatitle m
                    &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; by_int_id &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;insert n i' &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; by_int_id m
                    &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; child_map &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;insert &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;internal_id i'&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt;
                                  &lt;span class=&quot;kr&quot;&gt;case&lt;/span&gt; parent i &lt;span class=&quot;kr&quot;&gt;of&lt;/span&gt;
                                    &lt;span class=&quot;kt&quot;&gt;Nothing&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt;
                                        child_map m
                                    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Just&lt;/span&gt; p_id&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt;
                                        &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;insert p_id &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;insert_comment_ m &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;item_by_id m p_id&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; i'&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; child_map m
                    &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; all_items &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; insert_ after &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;all_items m&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; i'
                    &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; next_id &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; n &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;kr&quot;&gt;where&lt;/span&gt;
      n &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; next_id m
      i' &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; i &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; internal_id &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; n &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;insert_comment_&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;insert_comment_&lt;/span&gt; m p c &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; map internal_id &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;insert_ before &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;children m p&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; c&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;insert_&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Bool&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;insert_&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;[]&lt;/span&gt; y &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;y&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;insert_&lt;/span&gt; o s&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;kt&quot;&gt;:&lt;/span&gt;xs&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; y &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;x &lt;span class=&quot;p&quot;&gt;`&lt;/span&gt;o&lt;span class=&quot;p&quot;&gt;`&lt;/span&gt; y&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;then&lt;/span&gt;
                           &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;kt&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;insert_ o xs y&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
                       &lt;span class=&quot;kr&quot;&gt;else&lt;/span&gt;
                           &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;y&lt;span class=&quot;kt&quot;&gt;:&lt;/span&gt;s&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;after&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Bool&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;after&lt;/span&gt; a b &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;created a&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;created b&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;before&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Bool&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;before&lt;/span&gt; a b &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;created a&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;created b&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;-- | Apply a structure-preserving function, i.e., one that does not&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;-- change parent/child relationships or ids, to a specific item.&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;alter&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;IO&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;alter&lt;/span&gt; f m i &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; ts &lt;span class=&quot;ow&quot;&gt;&amp;lt;-&lt;/span&gt; now
                 &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;let&lt;/span&gt; i' &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;f i&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; updated &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; ts &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
                 &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; return &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; m &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; by_permatitle &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;insert &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;permatitle i'&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; i' &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; by_permatitle m
                              &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; by_int_id &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;insert &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;internal_id i'&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; i' &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; by_int_id m
                              &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; child_map &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;parent i &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Nothing&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;then&lt;/span&gt;
                                                child_map m
                                            &lt;span class=&quot;kr&quot;&gt;else&lt;/span&gt;
                                                &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;insert p_id resort_siblings &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; child_map m
                              &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; all_items &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; insert_ after all_but i' &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;kr&quot;&gt;where&lt;/span&gt;
      not_i &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;\&lt;/span&gt;item &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;internal_id item&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;internal_id i&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      all_but &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; filter not_i &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; all_items m
      p_id &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; unwrap &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; parent i
      p &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; item_by_id m p_id
      resort_siblings &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; map internal_id &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;insert_ before &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;filter not_i &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; children m p&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; i&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;cloak&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;IO&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;cloak&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; alter &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;\&lt;/span&gt;i &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; i &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; visible &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;False&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;uncloak&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;IO&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;uncloak&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; alter &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;\&lt;/span&gt;i &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; i &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; visible &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;True&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;permatitle_exists&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Bool&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;permatitle_exists&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;flip &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;member&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; by_permatitle
&lt;span class=&quot;nf&quot;&gt;max_id&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;max_id&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; fst &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;findMax &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; by_int_id
&lt;span class=&quot;nf&quot;&gt;post_by_permatitle&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;post_by_permatitle&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; by_permatitle
&lt;span class=&quot;nf&quot;&gt;maybe_post_by_permatitle&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Maybe&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;maybe_post_by_permatitle&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;flip &lt;span class=&quot;kt&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;lookup&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; by_permatitle
&lt;span class=&quot;nf&quot;&gt;item_by_id&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;item_by_id&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; by_int_id
&lt;span class=&quot;nf&quot;&gt;children&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;children&lt;/span&gt; m i &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; map &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;item_by_id m&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;child_map m&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;internal_id i&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;unwrap&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Maybe&lt;/span&gt; a &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; a
&lt;span class=&quot;nf&quot;&gt;unwrap&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Just&lt;/span&gt; x&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; x
&lt;span class=&quot;nf&quot;&gt;unwrap&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Nothing&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;ne&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Can't unwrap nothing!&quot;&lt;/span&gt;
&lt;span class=&quot;kr&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Author&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Author&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; name &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                       uri &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Maybe&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                       email &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Maybe&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                       show_email &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Bool&lt;/span&gt;
                     &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
              &lt;span class=&quot;kr&quot;&gt;deriving&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Show&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Eq&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;-- | General purpose runtime data structure for holding a post or&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;-- comment.  For a comment, a number of the fields will be ignored&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;-- (e.g., comments and tags) until/if the presentation and syndication&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;-- system gets fancier.&lt;/span&gt;
&lt;span class=&quot;kr&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- | an internal unique number for this post&lt;/span&gt;
                   internal_id &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- | the kind of item that this represents&lt;/span&gt;
                   kind &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Kind&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- | the title of the post, as it should be rendered on&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- the web or inserted in an Atom feed; this should be a&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- valid XHTML fragment.&lt;/span&gt;
                   title &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;XhtmlString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- | the summary of the post, as it should be rendered on&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- the web or intersted into an Atom feed; this should be&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- a valid XHTML fragment.&lt;/span&gt;
                   summary &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Maybe&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;XhtmlString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- | the body of the post as an XHTML fragment.  This&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- will be wrapped in an XHTML @&amp;lt;div&amp;gt;@ when rendered on&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- the web or in a feed.&lt;/span&gt;
                   body &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;XhtmlString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- | tags for the post, if any, expected to be in&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- alphabetical order and consisting of letters, digits,&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- dashes, and/or underscores.&lt;/span&gt;
                   tags &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- | a generated UID for the post; this is expected to be&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- suitable for use as an Atom GUID.  The expectation is&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- that it will be supplied by the implementation when&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- the post is ingested.&lt;/span&gt;
                   uid &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- | a permanent title for the item, consisting of only&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- lowercase letters, digits, and dashes.&lt;/span&gt;
                   permatitle &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- | the timestamp, as an ISO8601 datetime, when the post&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- came into being.  This is never blank and would be&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- supplied by the implementation when the post is&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- ingested.&lt;/span&gt;
                   created &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ISO8601DatetimeString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- | the timestamp, as an ISO8601 datetime, when the post&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- was updated.  Initially, this is equal to the value of&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- the 'created' field.&lt;/span&gt;
                   updated &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ISO8601DatetimeString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- | the author of the post, expected to be hardwired to&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- the author of the blog&lt;/span&gt;
                   author &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Author&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- | whether or not the item is to be displayed.&lt;/span&gt;
                   visible &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Bool&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                   &lt;span class=&quot;c1&quot;&gt;-- | this item's parent, if any.&lt;/span&gt;
                   parent &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Maybe&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt;
                 &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;kr&quot;&gt;deriving&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Show&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Eq&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;-- | Compute a permalink for the item relative to the supplied base URL.&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;permalink&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt;
          &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- ^ the item&lt;/span&gt;
          &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;permalink&lt;/span&gt; m i &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;post &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;relative_url m i&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;relative_url&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;relative_url&lt;/span&gt; m &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; _form_permalink &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;ancestors m&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;_form_permalink&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;_form_permalink&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;_form_permalink&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt;  &lt;span class=&quot;kr&quot;&gt;let&lt;/span&gt; s &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; permatitle i &lt;span class=&quot;kr&quot;&gt;in&lt;/span&gt;
                       &lt;span class=&quot;kr&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;kind i &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;then&lt;/span&gt;
                           &lt;span class=&quot;s&quot;&gt;&quot;/&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;++&lt;/span&gt; s
                       &lt;span class=&quot;kr&quot;&gt;else&lt;/span&gt;
                           &lt;span class=&quot;s&quot;&gt;&quot;#&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;++&lt;/span&gt; s
&lt;span class=&quot;nf&quot;&gt;_form_permalink&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;kt&quot;&gt;:&lt;/span&gt;is&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;kind i &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;then&lt;/span&gt;
                            &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;++&lt;/span&gt; permatitle i&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;_form_permalink is&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                        &lt;span class=&quot;kr&quot;&gt;else&lt;/span&gt;
                            &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;_form_permalink is&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;ancestor_path&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;ancestor_path&lt;/span&gt; m i &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; concat &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;intersperse &lt;span class=&quot;s&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;map permatitle&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; ancestors m i
&lt;span class=&quot;nf&quot;&gt;ancestors&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;ancestors&lt;/span&gt; m i &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; ancestors_ m &lt;span class=&quot;kt&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Just&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; internal_id i&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;ancestors_&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Maybe&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;ancestors_&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;_&lt;/span&gt; is &lt;span class=&quot;kt&quot;&gt;Nothing&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; is
&lt;span class=&quot;nf&quot;&gt;ancestors_&lt;/span&gt; m is &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Just&lt;/span&gt; i&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; ancestors_ m &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;i'&lt;span class=&quot;kt&quot;&gt;:&lt;/span&gt;is&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;parent i'&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;kr&quot;&gt;where&lt;/span&gt;
      i' &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; item_by_id m i
&lt;span class=&quot;nf&quot;&gt;lastUpdated&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ISO8601DatetimeString&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;lastUpdated&lt;/span&gt; ps &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; maximum &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;map updated ps&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;drop_invisible&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;drop_invisible&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; filter visible
&lt;span class=&quot;nf&quot;&gt;sort_by_created&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;sort_by_created&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; sortBy created_sort
&lt;span class=&quot;nf&quot;&gt;created_sort&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Ordering&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;created_sort&lt;/span&gt; a b &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; compare &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;created a&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;created b&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;sort_by_created_reverse&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;sort_by_created_reverse&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; sortBy created_sort_reverse
&lt;span class=&quot;nf&quot;&gt;created_sort_reverse&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Ordering&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;created_sort_reverse&lt;/span&gt; a b &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; compare &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;created b&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;created a&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;-- | Filter a list of items according to a date fragment&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;date_fragment_filter_&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ISO8601DatetimeString&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;date_fragment_filter_&lt;/span&gt; s &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; filter &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;s &lt;span class=&quot;p&quot;&gt;`&lt;/span&gt;isPrefixOf&lt;span class=&quot;p&quot;&gt;`)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; created&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;-- | Filter a list of posts for those made in a specific year.&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;year_filter&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- ^ year&lt;/span&gt;
            &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;year_filter&lt;/span&gt; y &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; date_fragment_filter_ &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; show y
&lt;span class=&quot;c1&quot;&gt;-- | Filter a list of posts for those made in a specific month.              &lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;month_filter&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- ^ year&lt;/span&gt;
             &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- ^ month&lt;/span&gt;
             &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;month_filter&lt;/span&gt; y m &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; m&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;m &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; date_fragment_filter_ &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;show y&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;pad_ m&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
                 &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; otherwise &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; const &lt;span class=&quot;kt&quot;&gt;[]&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;-- | Filter a list of posts for those made on a specific day&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;day_filter&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- ^ year&lt;/span&gt;
           &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- ^ month&lt;/span&gt;
           &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- ^ day&lt;/span&gt;
           &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;day_filter&lt;/span&gt; y m d &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; date_fragment_filter_ &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;show y&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;pad_ m&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;pad_ d&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;-- | Utility function to zero pad months and days in date expressions.&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;pad_&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;pad_&lt;/span&gt; i &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; i &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;-0&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;show i&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
       &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; otherwise &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sc&quot;&gt;'-'&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;show i&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;-- to do: make this faster using the sortedness.&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;tags_filter&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;tags_filter&lt;/span&gt; t p &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; foldl &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;flip &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; p &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;map tag_filter t&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;tag_filter&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;tag_filter&lt;/span&gt; t &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; filter &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;t &lt;span class=&quot;p&quot;&gt;`&lt;/span&gt;elem&lt;span class=&quot;p&quot;&gt;`)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; tags&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;plink_filterf&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Bool&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;plink_filterf&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; flip &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; permatitle
&lt;span class=&quot;nf&quot;&gt;plink_filter&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;plink_filter&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; filter &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; plink_filterf
&lt;span class=&quot;nf&quot;&gt;ymd_plink_finder&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;ymd_plink_finder&lt;/span&gt; y m d t &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;plink_filter t&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;day_filter y m d&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;all_posts&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;all_posts&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;filter &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;\&lt;/span&gt;x &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; kind x&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; all_items
&lt;span class=&quot;nf&quot;&gt;all_comments&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;all_comments&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;filter &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;\&lt;/span&gt;x &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Comment&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; kind x&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; all_items
&lt;span class=&quot;nf&quot;&gt;flatten&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;flatten&lt;/span&gt; m &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; flatten_ &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;children m&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;flatten_&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;a &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;a&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;a&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;a&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;flatten_&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;[]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;flatten_&lt;/span&gt; f &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;kt&quot;&gt;:&lt;/span&gt;is&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;kt&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;flatten_ f &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;f i&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;flatten_ f is&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;concat_comments&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;concat_comments&lt;/span&gt; m &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;foldr &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;map &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; children m&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;/&amp;gt;&lt;/span&gt; t &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; s &lt;span class=&quot;o&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sc&quot;&gt;'/'&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;:&lt;/span&gt;t&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;to_string&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;to_string&lt;/span&gt; i &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; concat &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;metadata i&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; body_block i&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; summary_block i&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;metadata&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;metadata&lt;/span&gt; i &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; unlines &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; apply i &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;internal_id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;show &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; internal_id&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                                 &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;parent&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; show &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; parent&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                                 &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;title&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                                 &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;tags&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;show_no_quotes &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; tags&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                                 &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;permatitle&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;permatitle&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                                 &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;kind&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;show &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; kind&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                                 &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;uid&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;uid&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                                 &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;created&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;created&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                                 &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;updated&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;updated&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                                 &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;author&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;show &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; author&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                                 &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;visible&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;show &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; visible&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;show_no_quotes&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;show_no_quotes&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; concat &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;intersperse &lt;span class=&quot;s&quot;&gt;&quot;, &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;apply&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;apply&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;[]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;apply&lt;/span&gt; i &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;kt&quot;&gt;:&lt;/span&gt;xs&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;concat &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;fst x&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;: &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;snd x&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; i&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;apply i xs&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;body_block&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;body_block&lt;/span&gt; i &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; concat &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;--- START BODY ---&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                       &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;body i&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                       &lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;--- END BODY ---&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;summary_block&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;summary_block&lt;/span&gt; i &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; summary i &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Nothing&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;
                &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; otherwise &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; concat &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;--- START SUMMARY ---&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                                      &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;unwrap &lt;span class=&quot;o&quot;&gt;$&lt;/span&gt; summary i&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                                      &lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;--- END SUMMARY ---&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;default_author&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Author&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;default_author&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Author&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;author_name &lt;span class=&quot;kt&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;author_uri &lt;span class=&quot;kt&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;author_email &lt;span class=&quot;kt&quot;&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;InScala:&quot;&gt;In Scala:&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;&lt;i&gt;Formatted and highlighted by &lt;a class=&quot;wiki&quot; href=&quot;http://blogtrader.net/wiki/NetBeans&quot;&gt;NetBeans&lt;/a&gt; Scala Plugin, exported via [File] -&amp;gt; [Print to HTML ...]&lt;/i&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;!--
pre {color: #000000; background-color: #ffffff; font-family: Monaco,Consolas,monospace; font-size: 12px}
table {color: #000000; background-color: #e9e8e2}
.ST2 {color: #7e0021; font-style: italic}
.ST0 {color: #7e0021; font-weight: bold; font-style: italic}
.LineComment {color: #969696}
.ST1 {color: #7e0021}
.ST3 {color: #7e0021; font-weight: bold}
.ST6 {color: #808000}
.number {color: #280099}
.ST4 {color: #cc0000; font-style: italic}
.StringLiteral {color: #ce7b00}
.ST5 {font-weight: bold}
.ST7 {color: #009b00}
.ST8 {color: #009b00; font-style: italic}
.Keyword {color: #0000e6}
.CharacterLiteral {color: #9999ff}
--&gt;

&lt;pre&gt;
&lt;span class=&quot;Keyword&quot;&gt;package&lt;/span&gt; org.aiotrade.blog.&lt;span class=&quot;ST0&quot;&gt;model&lt;/span&gt;
&lt;span class=&quot;Keyword&quot;&gt;import&lt;/span&gt; java.util.&lt;span class=&quot;ST1&quot;&gt;Calendar&lt;/span&gt;
&lt;span class=&quot;Keyword&quot;&gt;import&lt;/span&gt; org.aiotrade.blog.{&lt;span class=&quot;ST2&quot;&gt;Constants&lt;/span&gt; =&amp;gt; &lt;span class=&quot;ST2&quot;&gt;C&lt;/span&gt;}
&lt;span class=&quot;Keyword&quot;&gt;object&lt;/span&gt; &lt;span class=&quot;ST0&quot;&gt;Entry&lt;/span&gt; {
  &lt;span class=&quot;Keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;ST3&quot;&gt;XhtmlString&lt;/span&gt; = &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;
  &lt;span class=&quot;Keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;ST3&quot;&gt;Model&lt;/span&gt; (
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;by_permatitle&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Map&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;, &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;],
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;by_int_id&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Map&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;, &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;],
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;child_map&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Map&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;, &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;]],
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;ST4&quot;&gt;_items&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;],
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;next_id&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;
  ) {
    &lt;span class=&quot;LineComment&quot;&gt;// call by name&lt;/span&gt;
    &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;apply&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;block&lt;/span&gt;: =&amp;gt; &lt;span class=&quot;ST1&quot;&gt;Unit&lt;/span&gt;) = {&lt;span class=&quot;ST6&quot;&gt;block&lt;/span&gt;; &lt;span class=&quot;Keyword&quot;&gt;this&lt;/span&gt;}
  }
  &lt;span class=&quot;Keyword&quot;&gt;abstract&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;ST3&quot;&gt;Kind&lt;/span&gt; &lt;span class=&quot;LineComment&quot;&gt;//derivi&lt;/span&gt;&lt;span class=&quot;LineComment&quot;&gt;ng (Show, Read, Eq)&lt;/span&gt;
  &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;object&lt;/span&gt; &lt;span class=&quot;ST0&quot;&gt;Post&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;ST1&quot;&gt;Kind&lt;/span&gt;
  &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;object&lt;/span&gt; &lt;span class=&quot;ST0&quot;&gt;Comment&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;ST1&quot;&gt;Kind&lt;/span&gt;
  &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;object&lt;/span&gt; &lt;span class=&quot;ST0&quot;&gt;Trackback&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;ST1&quot;&gt;Kind&lt;/span&gt;
  &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;ST3&quot;&gt;Author&lt;/span&gt; (
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;name&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;,
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;uri&lt;/span&gt; : &lt;span class=&quot;ST1&quot;&gt;Option&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;] = &lt;span class=&quot;ST2&quot;&gt;None&lt;/span&gt;,
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;email&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Option&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;] = &lt;span class=&quot;ST2&quot;&gt;None&lt;/span&gt;,
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;show_email&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Boolean&lt;/span&gt; = &lt;span class=&quot;Keyword&quot;&gt;false&lt;/span&gt;
  )
  &lt;span class=&quot;LineComment&quot;&gt;/**&lt;/span&gt;&lt;span class=&quot;LineComment&quot;&gt; Genera&lt;/span&gt;&lt;span class=&quot;LineComment&quot;&gt;l purpose runtime data structure for holding a post or&lt;/span&gt;
&lt;span class=&quot;LineComment&quot;&gt;   * comment.  For a comment, a number of the fields will be ignored&lt;/span&gt;
&lt;span class=&quot;LineComment&quot;&gt;   * (e.g., comments and tags) until/if the presentation an&lt;/span&gt;&lt;span class=&quot;LineComment&quot;&gt;d syndication&lt;/span&gt;
&lt;span class=&quot;LineComment&quot;&gt;   * system gets fancier.&lt;/span&gt;
   &lt;span class=&quot;LineComment&quot;&gt;*/&lt;/span&gt;
  &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;ST3&quot;&gt;Item&lt;/span&gt; (
    &lt;span class=&quot;LineComment&quot;&gt;// an internal unique number for this post&lt;/span&gt;
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;internalId&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;,
    &lt;span class=&quot;LineComment&quot;&gt;// the kind of item that this represents&lt;/span&gt;
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;kind&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Kind&lt;/span&gt;,
    &lt;span class=&quot;LineComment&quot;&gt;// the title of the post, as it should be rendered on&lt;/span&gt;
    &lt;span class=&quot;LineComment&quot;&gt;// the web or inserted in an Atom feed; this s&lt;/span&gt;&lt;span class=&quot;LineComment&quot;&gt;hould be a&lt;/span&gt;
    &lt;span class=&quot;LineComment&quot;&gt;// valid XHTML fragment.&lt;/span&gt;
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;title&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;XhtmlString&lt;/span&gt;,
    &lt;span class=&quot;LineComment&quot;&gt;// the summary of the post, as it should be rendered on&lt;/span&gt;
    &lt;span class=&quot;LineComment&quot;&gt;// the &lt;/span&gt;&lt;span class=&quot;LineComment&quot;&gt;web or intersted into an Atom feed; this should be&lt;/span&gt;
    &lt;span class=&quot;LineComment&quot;&gt;// a valid XHTML fragment.&lt;/span&gt;
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;summary&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Option&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;XhtmlString&lt;/span&gt;],
    &lt;span class=&quot;LineComment&quot;&gt;// the body of the post as an XHTML fragment.  This&lt;/span&gt;
    &lt;span class=&quot;LineComment&quot;&gt;// will be wrapped in an XHTML @&amp;lt;div&amp;gt;@ when rendered on&lt;/span&gt;
    &lt;span class=&quot;LineComment&quot;&gt;// the web or in a feed.&lt;/span&gt;
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;body&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;XhtmlString&lt;/span&gt;,
    &lt;span class=&quot;LineComment&quot;&gt;// tags for the post, if any, expected to be in&lt;/span&gt;
    &lt;span class=&quot;LineComment&quot;&gt;// alphabetical &lt;/span&gt;&lt;span class=&quot;LineComment&quot;&gt;order and consisting of letters, digits,&lt;/span&gt;
    &lt;span class=&quot;LineComment&quot;&gt;// dashes, and/or underscores.&lt;/span&gt;
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;tags&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;],
    &lt;span class=&quot;LineComment&quot;&gt;// a generated UID for the post; this is expected to be&lt;/span&gt;
    &lt;span class=&quot;LineComment&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;LineComment&quot;&gt;/ suitable for use as an Atom GUID.  The expectation is&lt;/span&gt;
    &lt;span class=&quot;LineComment&quot;&gt;// that it will be supplied by the implementation when&lt;/span&gt;
    &lt;span class=&quot;LineComment&quot;&gt;// the post is ingested.&lt;/span&gt;
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;uid&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;,
    &lt;span class=&quot;LineComment&quot;&gt;// a permanent &lt;/span&gt;&lt;span class=&quot;LineComment&quot;&gt;title for the item, consisting of only&lt;/span&gt;
    &lt;span class=&quot;LineComment&quot;&gt;// lowercase letters, digits, and dashes.&lt;/span&gt;
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;permatitle&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;,
    &lt;span class=&quot;LineComment&quot;&gt;// the timestamp, as an ISO8601 datetime, when the&lt;/span&gt;&lt;span class=&quot;LineComment&quot;&gt; post&lt;/span&gt;
    &lt;span class=&quot;LineComment&quot;&gt;// came into being.  This is never blank and would be&lt;/span&gt;
    &lt;span class=&quot;LineComment&quot;&gt;// supplied by the implementation when the post is&lt;/span&gt;
    &lt;span class=&quot;LineComment&quot;&gt;// ingested&lt;/span&gt;&lt;span class=&quot;LineComment&quot;&gt;.&lt;/span&gt;
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;created&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Long&lt;/span&gt;,
    &lt;span class=&quot;LineComment&quot;&gt;// the timestamp, as an ISO8601 datetime, when the post&lt;/span&gt;
    &lt;span class=&quot;LineComment&quot;&gt;// was updated.  Initially, this is equal&lt;/span&gt;&lt;span class=&quot;LineComment&quot;&gt; to the value of&lt;/span&gt;
    &lt;span class=&quot;LineComment&quot;&gt;// the 'created' field.&lt;/span&gt;
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;updated&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Long&lt;/span&gt;,
    &lt;span class=&quot;LineComment&quot;&gt;//the author of the post, expected to be hardwired to&lt;/span&gt;
    &lt;span class=&quot;LineComment&quot;&gt;// the author o&lt;/span&gt;&lt;span class=&quot;LineComment&quot;&gt;f the blog&lt;/span&gt;
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;author&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Author&lt;/span&gt;,
    &lt;span class=&quot;LineComment&quot;&gt;//whether or not the item is to be displayed.&lt;/span&gt;
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;visible&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Boolean&lt;/span&gt;,
    &lt;span class=&quot;LineComment&quot;&gt;//this item's parent, if&lt;/span&gt;&lt;span class=&quot;LineComment&quot;&gt; any.&lt;/span&gt;
    &lt;span class=&quot;Keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;ST4&quot;&gt;parent&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Option&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;]
  ) {
    &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;apply&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;block&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt; =&amp;gt; &lt;span class=&quot;ST1&quot;&gt;Unit&lt;/span&gt;) = {&lt;span class=&quot;ST6&quot;&gt;block&lt;/span&gt;(&lt;span class=&quot;Keyword&quot;&gt;this&lt;/span&gt;); &lt;span class=&quot;Keyword&quot;&gt;this&lt;/span&gt;}
  }
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;empty&lt;/span&gt; = &lt;span class=&quot;Keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;(&lt;span class=&quot;ST2&quot;&gt;Map&lt;/span&gt;(), &lt;span class=&quot;ST2&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;ST2&quot;&gt;ap&lt;/span&gt;(), &lt;span class=&quot;ST2&quot;&gt;Map&lt;/span&gt;(), &lt;span class=&quot;ST2&quot;&gt;Nil&lt;/span&gt;, &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;)
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;build_model&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;]) =
    &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;match&lt;/span&gt; {
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;Nil&lt;/span&gt; =&amp;gt; empty
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; _ =&amp;gt;
        &lt;span class=&quot;Keyword&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;sortedIs&lt;/span&gt; = sort_by_created_reverse(&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;)
        &lt;span class=&quot;Keyword&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;bid&lt;/span&gt; = &lt;span class=&quot;ST2&quot;&gt;Map&lt;/span&gt;() ++ &lt;span class=&quot;ST7&quot;&gt;sortedIs&lt;/span&gt;.map{&lt;span class=&quot;ST6&quot;&gt;x&lt;/span&gt; =&amp;gt; (&lt;span class=&quot;ST6&quot;&gt;x&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;internalId&lt;/span&gt; -&amp;gt; &lt;span class=&quot;ST6&quot;&gt;x&lt;/span&gt;)}
        &lt;span class=&quot;Keyword&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;n&lt;/span&gt; = &lt;span class=&quot;ST7&quot;&gt;bid&lt;/span&gt;.keySet.max
        &lt;span class=&quot;Keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;(&lt;span class=&quot;ST2&quot;&gt;Map&lt;/span&gt;() ++ &lt;span class=&quot;ST7&quot;&gt;sor&lt;/span&gt;&lt;span class=&quot;ST7&quot;&gt;tedIs&lt;/span&gt;.map{&lt;span class=&quot;ST6&quot;&gt;x&lt;/span&gt; =&amp;gt; (&lt;span class=&quot;ST6&quot;&gt;x&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;permatitle&lt;/span&gt; -&amp;gt; &lt;span class=&quot;ST6&quot;&gt;x&lt;/span&gt;)},
                  &lt;span class=&quot;ST7&quot;&gt;bid&lt;/span&gt;,
                  buildChildMap(&lt;span class=&quot;ST7&quot;&gt;sortedIs&lt;/span&gt;),
                  &lt;span class=&quot;ST7&quot;&gt;sortedIs&lt;/span&gt;,
                  &lt;span class=&quot;ST7&quot;&gt;n&lt;/span&gt; + &lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;)
    }
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;buildChildMap&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;]) =
    buildChildMap_(&lt;span class=&quot;ST2&quot;&gt;Map&lt;/span&gt;() ++ &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;.map(_.&lt;span class=&quot;ST4&quot;&gt;internalId&lt;/span&gt; -&amp;gt; &lt;span class=&quot;ST2&quot;&gt;Nil&lt;/span&gt;), &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;)
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;buildChildMap_&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;map&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Map&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;, &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;]], &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;]) =
    &lt;span class=&quot;ST6&quot;&gt;map&lt;/span&gt; ++ {
      &lt;span class=&quot;Keyword&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt; &amp;lt;- &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;parent&lt;/span&gt;.isDefined) &lt;span class=&quot;Keyword&quot;&gt;yield&lt;/span&gt; {
        &lt;span class=&quot;LineComment&quot;&gt;// pid, cids definitions go into body // it's more efficient.&lt;/span&gt;
        &lt;span class=&quot;Keyword&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;pid&lt;/span&gt; = &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;parent&lt;/span&gt;.get
        &lt;span class=&quot;Keyword&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;cids&lt;/span&gt; = &lt;span class=&quot;ST6&quot;&gt;map&lt;/span&gt;.getOrElse(&lt;span class=&quot;ST7&quot;&gt;pid&lt;/span&gt;, &lt;span class=&quot;ST2&quot;&gt;Nil&lt;/span&gt;)
        &lt;span class=&quot;ST7&quot;&gt;pid&lt;/span&gt; -&amp;gt; (&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;internalId&lt;/span&gt; :: &lt;span class=&quot;ST7&quot;&gt;cids&lt;/span&gt;)
      }
    }
  &lt;span class=&quot;LineComment&quot;&gt;/**&lt;/span&gt;&lt;span class=&quot;LineComment&quot;&gt; Insert an item, presuming &lt;/span&gt;&lt;span class=&quot;LineComment&quot;&gt;that all of its data other than&lt;/span&gt;
&lt;span class=&quot;LineComment&quot;&gt;   internal identifier have been correctly set.&lt;/span&gt;
   &lt;span class=&quot;LineComment&quot;&gt;*/&lt;/span&gt;
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;insert&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;): (&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;, &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;) = {
    &lt;span class=&quot;Keyword&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;n&lt;/span&gt; = &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;next_id&lt;/span&gt;
    &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;internalId&lt;/span&gt; = &lt;span class=&quot;ST7&quot;&gt;n&lt;/span&gt;
    (&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt; {
        &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;by_permatitle&lt;/span&gt; += (&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;permatitle&lt;/span&gt; -&amp;gt; &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;)
        &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;by_int_id&lt;/span&gt; += (&lt;span class=&quot;ST7&quot;&gt;n&lt;/span&gt; -&amp;gt; &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;)
        &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;child_map&lt;/span&gt; = (&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;parent&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;matc&lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;h&lt;/span&gt; {
            &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;None&lt;/span&gt; =&amp;gt; &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;child_map&lt;/span&gt;
            &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;Some&lt;/span&gt;(&lt;span class=&quot;ST7&quot;&gt;p_id&lt;/span&gt;) =&amp;gt; &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;child_map&lt;/span&gt; + (&lt;span class=&quot;ST7&quot;&gt;p_id&lt;/span&gt; -&amp;gt; (insert_comment_(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;, item_by_id(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;)(&lt;span class=&quot;ST7&quot;&gt;p_i&lt;/span&gt;&lt;span class=&quot;ST7&quot;&gt;d&lt;/span&gt;), &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;)))
          })
        &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;all_items&lt;/span&gt; = insert_(after, &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;all_items&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;)
        &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;next_id&lt;/span&gt; = &lt;span class=&quot;ST7&quot;&gt;n&lt;/span&gt; + &lt;span class=&quot;number&quot;&gt;1&lt;/span&gt; }
    )
  }
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;insert_comment_&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;p&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;c&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;] =
    insert_(before, children(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;)(&lt;span class=&quot;ST6&quot;&gt;p&lt;/span&gt;), &lt;span class=&quot;ST6&quot;&gt;c&lt;/span&gt;) map (_.&lt;span class=&quot;ST4&quot;&gt;internalId&lt;/span&gt;)
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;insert_&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;o&lt;/span&gt;: (&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;, &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;) =&amp;gt; &lt;span class=&quot;ST1&quot;&gt;Boolean&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;], &lt;span class=&quot;ST6&quot;&gt;y&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;L&lt;/span&gt;&lt;span class=&quot;ST1&quot;&gt;ist&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;] =
    &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;match&lt;/span&gt; {
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;Nil&lt;/span&gt; =&amp;gt; &lt;span class=&quot;ST2&quot;&gt;List&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;y&lt;/span&gt;)
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;xs&lt;/span&gt; =&amp;gt; &lt;span class=&quot;Keyword&quot;&gt;if&lt;/span&gt; (&lt;span class=&quot;ST6&quot;&gt;o&lt;/span&gt;(&lt;span class=&quot;ST7&quot;&gt;x&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;y&lt;/span&gt;)) &lt;span class=&quot;ST7&quot;&gt;x&lt;/span&gt; :: insert_(&lt;span class=&quot;ST6&quot;&gt;o&lt;/span&gt;, &lt;span class=&quot;ST7&quot;&gt;xs&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;y&lt;/span&gt;) &lt;span class=&quot;Keyword&quot;&gt;else&lt;/span&gt; (&lt;span class=&quot;ST6&quot;&gt;y&lt;/span&gt; :: &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;)
    }
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;after&lt;/span&gt; (&lt;span class=&quot;ST6&quot;&gt;a&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;b&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;Boolean&lt;/span&gt; =
    &lt;span class=&quot;ST6&quot;&gt;a&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;created&lt;/span&gt; &amp;gt; &lt;span class=&quot;ST6&quot;&gt;b&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;created&lt;/span&gt;
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;before&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;a&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;b&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;Boolean&lt;/span&gt; =
    &lt;span class=&quot;ST6&quot;&gt;a&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;created&lt;/span&gt; &amp;lt; &lt;span class=&quot;ST6&quot;&gt;b&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;created&lt;/span&gt;
  &lt;span class=&quot;LineComment&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;LineComment&quot;&gt;   * Apply a structure-pre&lt;/span&gt;&lt;span class=&quot;LineComment&quot;&gt;serving function, i.e., one that does not&lt;/span&gt;
&lt;span class=&quot;LineComment&quot;&gt;   * change parent/child relationships or ids, to a specific item.&lt;/span&gt;
   &lt;span class=&quot;LineComment&quot;&gt;*/&lt;/span&gt;
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;alter&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;f&lt;/span&gt;: (&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt; =&amp;gt; &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;), &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;Mode&lt;/span&gt;&lt;span class=&quot;ST1&quot;&gt;l&lt;/span&gt; = {&lt;span class=&quot;LineComment&quot;&gt;// -&amp;gt; IO Model&lt;/span&gt;
    &lt;span class=&quot;Keyword&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;not_i&lt;/span&gt; = (&lt;span class=&quot;ST6&quot;&gt;item&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;) =&amp;gt; &lt;span class=&quot;ST6&quot;&gt;item&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;internalId&lt;/span&gt; != &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;internalId&lt;/span&gt;
    &lt;span class=&quot;Keyword&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;all_but&lt;/span&gt; = &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;all_items&lt;/span&gt; filter &lt;span class=&quot;ST7&quot;&gt;not_i&lt;/span&gt;
    &lt;span class=&quot;Keyword&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;p_id&lt;/span&gt; = unwrap (&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;parent&lt;/span&gt;)
    &lt;span class=&quot;Keyword&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;p&lt;/span&gt; = item_by_id(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;)(&lt;span class=&quot;ST7&quot;&gt;p_id&lt;/span&gt;)
    &lt;span class=&quot;Keyword&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;resort_siblings&lt;/span&gt; = insert_(before, children(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;)(&lt;span class=&quot;ST7&quot;&gt;p&lt;/span&gt;) filter &lt;span class=&quot;ST7&quot;&gt;not_i&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;) map (_.&lt;span class=&quot;ST4&quot;&gt;internalId&lt;/span&gt;)
    &lt;span class=&quot;Keyword&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;ts&lt;/span&gt; = &lt;span class=&quot;ST2&quot;&gt;System&lt;/span&gt;.currentTimeMillis
    &lt;span class=&quot;Keyword&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;i1&lt;/span&gt; = &lt;span class=&quot;ST6&quot;&gt;f&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;) {_.&lt;span class=&quot;ST4&quot;&gt;updated&lt;/span&gt; = &lt;span class=&quot;ST7&quot;&gt;ts&lt;/span&gt;}
    &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt; {
      &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;by_permatitle&lt;/span&gt; += (&lt;span class=&quot;ST7&quot;&gt;i1&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;permatitle&lt;/span&gt; -&amp;gt; &lt;span class=&quot;ST7&quot;&gt;i1&lt;/span&gt;)
      &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;by_int_id&lt;/span&gt; += (&lt;span class=&quot;ST7&quot;&gt;i1&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;internalId&lt;/span&gt; -&amp;gt; &lt;span class=&quot;ST7&quot;&gt;i1&lt;/span&gt;)
      &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;child_map&lt;/span&gt; = &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;parent&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;match&lt;/span&gt; {
        &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;None&lt;/span&gt; =&amp;gt; &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;child_map&lt;/span&gt;
        &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; _ =&amp;gt; &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;child_map&lt;/span&gt; + (&lt;span class=&quot;ST7&quot;&gt;p_id&lt;/span&gt; -&amp;gt; &lt;span class=&quot;ST7&quot;&gt;resort_siblings&lt;/span&gt;)
      }
      &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;all_items&lt;/span&gt; = insert_(after, &lt;span class=&quot;ST7&quot;&gt;all_but&lt;/span&gt;, &lt;span class=&quot;ST7&quot;&gt;i1&lt;/span&gt;)
    }
  }
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;cloak&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt; = &lt;span class=&quot;LineComment&quot;&gt;// -&amp;gt; IO Model&lt;/span&gt;
    alter (&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt; =&amp;gt; &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt; {_.&lt;span class=&quot;ST4&quot;&gt;visible&lt;/span&gt; = &lt;span class=&quot;Keyword&quot;&gt;false&lt;/span&gt;}, &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;)
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;uncloak&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt; = &lt;span class=&quot;LineComment&quot;&gt;// -&amp;gt; IO Model&lt;/span&gt;
    alter (&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt; =&amp;gt; &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt; {_.&lt;span class=&quot;ST4&quot;&gt;visible&lt;/span&gt; = &lt;span class=&quot;Keyword&quot;&gt;true&lt;/span&gt;}, &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;)
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;permatitle_exists&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;p&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;Boolean&lt;/span&gt; =
    &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;by_permatitle&lt;/span&gt;.contains(&lt;span class=&quot;ST6&quot;&gt;p&lt;/span&gt;)
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;max_id&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt; =
    &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;by_int_id&lt;/span&gt;.keySet.max
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;post_by_permatitle&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;p&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt; =
    &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;by_permatitle&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;p&lt;/span&gt;)
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;maybe_post_by_permatitle&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;p&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;Option&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;] =
    &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;by_permatitle&lt;/span&gt;.get(&lt;span class=&quot;ST6&quot;&gt;p&lt;/span&gt;)
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;ST5&quot;&gt;em_by_id&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;)(&lt;span class=&quot;ST6&quot;&gt;id&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt; =
    &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;by_int_id&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;id&lt;/span&gt;)
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;children&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;)(&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;] =
    &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;child_map&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;internalId&lt;/span&gt;) map (item_by_id(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;))
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;un&lt;/span&gt;&lt;span class=&quot;ST5&quot;&gt;wrap&lt;/span&gt;[&lt;span class=&quot;ST3&quot;&gt;T&lt;/span&gt;](&lt;span class=&quot;ST6&quot;&gt;a&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Option&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;T&lt;/span&gt;]): &lt;span class=&quot;ST1&quot;&gt;T&lt;/span&gt; =
    &lt;span class=&quot;ST6&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;match&lt;/span&gt; {
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;Some&lt;/span&gt;(&lt;span class=&quot;ST7&quot;&gt;x&lt;/span&gt;) =&amp;gt; &lt;span class=&quot;ST7&quot;&gt;x&lt;/span&gt;
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;None&lt;/span&gt; =&amp;gt; error(&lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;Can't unwrap none!&amp;quot;&lt;/span&gt;)
    }
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;relative_url&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt; =
    _form_permalink(ancestors(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;))
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;_form_permalink&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;]): &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt; =
    &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;match&lt;/span&gt; {
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;Nil&lt;/span&gt; =&amp;gt; &lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;Nil&lt;/span&gt; =&amp;gt;
        &lt;span class=&quot;Keyword&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;s&lt;/span&gt; = &lt;span class=&quot;ST7&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;permatitle&lt;/span&gt;
        &lt;span class=&quot;Keyword&quot;&gt;if&lt;/span&gt; (&lt;span class=&quot;ST7&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;kind&lt;/span&gt; == &lt;span class=&quot;ST2&quot;&gt;Post&lt;/span&gt;)
          &lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;/&amp;quot;&lt;/span&gt; + &lt;span class=&quot;ST7&quot;&gt;s&lt;/span&gt;
        &lt;span class=&quot;Keyword&quot;&gt;else&lt;/span&gt;
          &lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;#&amp;quot;&lt;/span&gt; + &lt;span class=&quot;ST7&quot;&gt;s&lt;/span&gt;
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;is&lt;/span&gt; =&amp;gt;
        &lt;span class=&quot;Keyword&quot;&gt;if&lt;/span&gt; (&lt;span class=&quot;ST7&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;kind&lt;/span&gt; == &lt;span class=&quot;ST2&quot;&gt;Post&lt;/span&gt;)
          (&lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;/&amp;quot;&lt;/span&gt; + &lt;span class=&quot;ST7&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;permatitle&lt;/span&gt;) + _form_permalink(&lt;span class=&quot;ST7&quot;&gt;is&lt;/span&gt;)
        &lt;span class=&quot;Keyword&quot;&gt;else&lt;/span&gt;
          _form_permalink(&lt;span class=&quot;ST7&quot;&gt;is&lt;/span&gt;)
    }
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;ancestors&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;] =
    ancestors_(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;, &lt;span class=&quot;ST2&quot;&gt;Nil&lt;/span&gt;, &lt;span class=&quot;ST2&quot;&gt;Some&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;internalId&lt;/span&gt;))
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;ancestors_&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;], &lt;span class=&quot;ST6&quot;&gt;i_?&lt;/span&gt; : &lt;span class=&quot;ST1&quot;&gt;Option&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;]): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;] =
    &lt;span class=&quot;ST6&quot;&gt;i_?&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;match&lt;/span&gt; {
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;None&lt;/span&gt; =&amp;gt; &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;Some&lt;/span&gt;(&lt;span class=&quot;ST7&quot;&gt;i&lt;/span&gt;) =&amp;gt;
        &lt;span class=&quot;Keyword&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;i1&lt;/span&gt; = item_by_id(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;)(&lt;span class=&quot;ST7&quot;&gt;i&lt;/span&gt;)
        ancestors_(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;, &lt;span class=&quot;ST7&quot;&gt;i1&lt;/span&gt; :: &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;, &lt;span class=&quot;ST7&quot;&gt;i1&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;parent&lt;/span&gt;)
    }
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;lastUpdated&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;ps&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;]): &lt;span class=&quot;ST1&quot;&gt;Long&lt;/span&gt; =
    &lt;span class=&quot;ST6&quot;&gt;ps&lt;/span&gt; map (_.&lt;span class=&quot;ST4&quot;&gt;updated&lt;/span&gt;) max
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;drop_invisible&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;]): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;] =
    &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt; filter (_.&lt;span class=&quot;ST4&quot;&gt;visible&lt;/span&gt;)
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;sort_by_created&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;]): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;] =
    &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt; sortWith created_sort _
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;created_sort&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;a&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;b&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;) =
    &lt;span class=&quot;ST6&quot;&gt;a&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;created&lt;/span&gt; &amp;lt; &lt;span class=&quot;ST6&quot;&gt;b&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;created&lt;/span&gt;
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;sort_by_created_reverse&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;]): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;] =
    &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt; sortWith created_sort_reverse _
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;created_sort_reverse&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;a&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;b&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;) =
    &lt;span class=&quot;ST6&quot;&gt;b&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;created&lt;/span&gt; &amp;lt; &lt;span class=&quot;ST6&quot;&gt;a&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;created&lt;/span&gt;
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;date_fra&lt;/span&gt;&lt;span class=&quot;ST5&quot;&gt;gment_filter_&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;], &lt;span class=&quot;ST6&quot;&gt;ts&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;*) = {
    &lt;span class=&quot;Keyword&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;cal&lt;/span&gt; = &lt;span class=&quot;ST2&quot;&gt;Calendar&lt;/span&gt;.getInstance
    &lt;span class=&quot;ST6&quot;&gt;ts&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;match&lt;/span&gt; {
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;Seq&lt;/span&gt;(&lt;span class=&quot;ST7&quot;&gt;y&lt;/span&gt;, &lt;span class=&quot;ST7&quot;&gt;m&lt;/span&gt;, &lt;span class=&quot;ST7&quot;&gt;d&lt;/span&gt;) =&amp;gt; &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt; filter {&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt; =&amp;gt; pad_(&lt;span class=&quot;ST7&quot;&gt;cal&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;created&lt;/span&gt;) &lt;span class=&quot;Keyword&quot;&gt;match&lt;/span&gt; {
            &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; (`y`, `m`, `d`) =&amp;gt; &lt;span class=&quot;Keyword&quot;&gt;true&lt;/span&gt;
            &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; _ =&amp;gt; &lt;span class=&quot;Keyword&quot;&gt;false&lt;/span&gt;
          }
        }
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;Seq&lt;/span&gt;(&lt;span class=&quot;ST7&quot;&gt;y&lt;/span&gt;, &lt;span class=&quot;ST7&quot;&gt;m&lt;/span&gt;) =&amp;gt; &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt; filter {&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt; =&amp;gt; pad_(&lt;span class=&quot;ST7&quot;&gt;cal&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;created&lt;/span&gt;) &lt;span class=&quot;Keyword&quot;&gt;match&lt;/span&gt; {
            &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; (`y`, `m`, _) =&amp;gt; &lt;span class=&quot;Keyword&quot;&gt;true&lt;/span&gt;
            &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; _ =&amp;gt; &lt;span class=&quot;Keyword&quot;&gt;false&lt;/span&gt;
          }
        }
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;Seq&lt;/span&gt;(&lt;span class=&quot;ST7&quot;&gt;y&lt;/span&gt;) =&amp;gt; &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt; filter {&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt; =&amp;gt; pad_(&lt;span class=&quot;ST7&quot;&gt;cal&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;created&lt;/span&gt;) &lt;span class=&quot;Keyword&quot;&gt;match&lt;/span&gt; {
            &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; (`y`, _, _) =&amp;gt; &lt;span class=&quot;Keyword&quot;&gt;true&lt;/span&gt;
            &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; _ =&amp;gt; &lt;span class=&quot;Keyword&quot;&gt;false&lt;/span&gt;
          }
        }
    }
  }
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;year_filter&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;y&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;)(&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;]): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;] =
    date_fragment_filter_(&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;y&lt;/span&gt;)
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;month_filter&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;y&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;)(&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;]): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;] =
    date_fragment_filter_(&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;y&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;)
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;day_filter&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;y&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;d&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;)(&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;]): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;] =
    date_fragment_filter_(&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;y&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;d&lt;/span&gt;)
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;pad_&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;cal&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Calendar&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;t&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Long&lt;/span&gt;): (&lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;, &lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;, &lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;) = {
    &lt;span class=&quot;ST6&quot;&gt;cal&lt;/span&gt;.setTimeInMillis(&lt;span class=&quot;ST6&quot;&gt;t&lt;/span&gt;)
    &lt;span class=&quot;Keyword&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;mport&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;Calendar&lt;/span&gt;._
    (&lt;span class=&quot;ST6&quot;&gt;cal&lt;/span&gt;.get(&lt;span class=&quot;ST2&quot;&gt;YEAR&lt;/span&gt;), &lt;span class=&quot;ST6&quot;&gt;cal&lt;/span&gt;.get(&lt;span class=&quot;ST2&quot;&gt;MONTH&lt;/span&gt;) + &lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;cal&lt;/span&gt;.get(&lt;span class=&quot;ST2&quot;&gt;DAY_OF_MONTH&lt;/span&gt;))
  }
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;tags_filter&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;ts&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;])(&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;]): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;It&lt;/span&gt;&lt;span class=&quot;ST1&quot;&gt;em&lt;/span&gt;] =
    &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt; filter (&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt; =&amp;gt; (&lt;span class=&quot;Keyword&quot;&gt;false&lt;/span&gt; /: &lt;span class=&quot;ST6&quot;&gt;ts&lt;/span&gt;) {_ || &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;tags&lt;/span&gt;.contains(_)})
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;tag_filter&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;t&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;)(&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;]): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;] =
    &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt; filter (_.&lt;span class=&quot;ST4&quot;&gt;tags&lt;/span&gt;.contains(&lt;span class=&quot;ST6&quot;&gt;t&lt;/span&gt;))
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;plink_filterf&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;p&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;)(&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;Boolean&lt;/span&gt; =
    &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;permatitle&lt;/span&gt; == &lt;span class=&quot;ST6&quot;&gt;p&lt;/span&gt;
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;plink_filter&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;p&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;)(&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;]): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;I&lt;/span&gt;&lt;span class=&quot;ST1&quot;&gt;tem&lt;/span&gt;] =
    &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt; filter plink_filterf(&lt;span class=&quot;ST6&quot;&gt;p&lt;/span&gt;)
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;ymd_plink_finder&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;y&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;d&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Int&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;p&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;)(&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;]): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;] =
    plink_filter(&lt;span class=&quot;ST6&quot;&gt;p&lt;/span&gt;) (day_filter(&lt;span class=&quot;ST6&quot;&gt;y&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;d&lt;/span&gt;) (&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;))
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;&amp;lt;/&amp;gt;&lt;/span&gt; (&lt;span class=&quot;ST6&quot;&gt;s&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;t&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt; =
    &lt;span class=&quot;ST6&quot;&gt;s&lt;/span&gt; + &lt;span class=&quot;CharacterLiteral&quot;&gt;'/'&lt;/span&gt; + &lt;span class=&quot;ST6&quot;&gt;t&lt;/span&gt;
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;all_posts&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;] =
    &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;all_items&lt;/span&gt; filter (_.&lt;span class=&quot;ST4&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;ST4&quot;&gt;ind&lt;/span&gt; == &lt;span class=&quot;ST2&quot;&gt;Post&lt;/span&gt;)
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;all_comments&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;] =
    &lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;all_items&lt;/span&gt; filter (_.&lt;span class=&quot;ST4&quot;&gt;kind&lt;/span&gt; == &lt;span class=&quot;ST2&quot;&gt;Comment&lt;/span&gt;)
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;flatten&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;]): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;] =
    flatten_(children(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;), &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;)
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;flatten_&lt;/span&gt;[&lt;span class=&quot;ST3&quot;&gt;T&lt;/span&gt;](&lt;span class=&quot;ST6&quot;&gt;f&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;T&lt;/span&gt; =&amp;gt; &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;T&lt;/span&gt;], &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;T&lt;/span&gt;]): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;T&lt;/span&gt;] =
    &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;match&lt;/span&gt; {
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;Nil&lt;/span&gt; =&amp;gt; &lt;span class=&quot;ST2&quot;&gt;Nil&lt;/span&gt;
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;is&lt;/span&gt; =&amp;gt; &lt;span class=&quot;ST7&quot;&gt;i&lt;/span&gt; :: flatten_(&lt;span class=&quot;ST6&quot;&gt;f&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;f&lt;/span&gt;(&lt;span class=&quot;ST7&quot;&gt;i&lt;/span&gt;)) ::: flatten_(&lt;span class=&quot;ST6&quot;&gt;f&lt;/span&gt;, &lt;span class=&quot;ST7&quot;&gt;is&lt;/span&gt;)
    }
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;concat_comments&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Model&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;]): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;] =
    ((&lt;span class=&quot;ST6&quot;&gt;is&lt;/span&gt; map children(&lt;span class=&quot;ST6&quot;&gt;m&lt;/span&gt;)) :\ &lt;span class=&quot;ST2&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;]())(_ ::: _)
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;metadata&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt; =
    apply(&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;, &lt;span class=&quot;ST2&quot;&gt;List&lt;/span&gt;((&lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;internal_id&amp;quot;&lt;/span&gt;, show(_.&lt;span class=&quot;ST4&quot;&gt;internalId&lt;/span&gt;)),
                  (&lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;parent&amp;quot;&lt;/span&gt;,      show(_.&lt;span class=&quot;ST4&quot;&gt;parent&lt;/span&gt;)),
                  (&lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;ti&lt;/span&gt;&lt;span class=&quot;StringLiteral&quot;&gt;tle&amp;quot;&lt;/span&gt;,       _.&lt;span class=&quot;ST4&quot;&gt;title&lt;/span&gt;),
                  (&lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;tags&amp;quot;&lt;/span&gt;,        show_no_quotes(_.&lt;span class=&quot;ST4&quot;&gt;tags&lt;/span&gt;)),
                  (&lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;permatitle&amp;quot;&lt;/span&gt;,  _.&lt;span class=&quot;ST4&quot;&gt;permatitle&lt;/span&gt;),
                  (&lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;StringLiteral&quot;&gt;kind&amp;quot;&lt;/span&gt;,        show(_.&lt;span class=&quot;ST4&quot;&gt;kind&lt;/span&gt;)),
                  (&lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;uid&amp;quot;&lt;/span&gt;,         _.&lt;span class=&quot;ST4&quot;&gt;uid&lt;/span&gt;),
                  (&lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;created&amp;quot;&lt;/span&gt;,     show(_.&lt;span class=&quot;ST4&quot;&gt;created&lt;/span&gt;)),
                  (&lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;updated&amp;quot;&lt;/span&gt;,     show(_.&lt;span class=&quot;ST4&quot;&gt;updated&lt;/span&gt;)),
                  (&lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;author&amp;quot;&lt;/span&gt;,      show(_.&lt;span class=&quot;ST4&quot;&gt;author&lt;/span&gt;)),
                  (&lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;visible&amp;quot;&lt;/span&gt;,     show(_.&lt;span class=&quot;ST4&quot;&gt;visible&lt;/span&gt;)))
    ) mkString &lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;LineComment&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;LineComment&quot;&gt; curring&lt;/span&gt;
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;show&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;f&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt; =&amp;gt; &lt;span class=&quot;ST1&quot;&gt;Any&lt;/span&gt;)(&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt; =
    &lt;span class=&quot;ST6&quot;&gt;f&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;) toString
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;show_no_quotes&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;f&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt; =&amp;gt; &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;])(&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt; =
    &lt;span class=&quot;ST6&quot;&gt;f&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;) mkString &lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;, &amp;quot;&lt;/span&gt;
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;apply&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;, &lt;span class=&quot;ST6&quot;&gt;xs&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[(&lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;, &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt; =&amp;gt; &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;)]): &lt;span class=&quot;ST1&quot;&gt;List&lt;/span&gt;[&lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt;] =
    &lt;span class=&quot;ST6&quot;&gt;xs&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;match&lt;/span&gt; {
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;Nil&lt;/span&gt; =&amp;gt; &lt;span class=&quot;ST2&quot;&gt;Nil&lt;/span&gt;
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;ST7&quot;&gt;xs&lt;/span&gt; =&amp;gt; (&lt;span class=&quot;ST7&quot;&gt;x&lt;/span&gt;.&lt;span class=&quot;ST8&quot;&gt;_1&lt;/span&gt; + &lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;: &amp;quot;&lt;/span&gt; + &lt;span class=&quot;ST7&quot;&gt;x&lt;/span&gt;.&lt;span class=&quot;ST8&quot;&gt;_2&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;)) :: apply(&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;, &lt;span class=&quot;ST7&quot;&gt;xs&lt;/span&gt;)
    }
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;body_block&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt; =
    &lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;--- START BODY ---&lt;/span&gt;&lt;span class=&quot;StringLiteral&quot;&gt;\n&amp;quot;&lt;/span&gt; + &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;body&lt;/span&gt; + &lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;\n--- END BODY ---\n&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;Keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;ST5&quot;&gt;summary_block&lt;/span&gt;(&lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;: &lt;span class=&quot;ST1&quot;&gt;Item&lt;/span&gt;): &lt;span class=&quot;ST1&quot;&gt;String&lt;/span&gt; =
    &lt;span class=&quot;ST6&quot;&gt;i&lt;/span&gt;.&lt;span class=&quot;ST4&quot;&gt;summary&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;match&lt;/span&gt; {
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;None&lt;/span&gt; =&amp;gt; &lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;
      &lt;span class=&quot;Keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;ST2&quot;&gt;Some&lt;/span&gt;(&lt;span class=&quot;ST7&quot;&gt;x&lt;/span&gt;) =&amp;gt; &lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;--- START SUMMARY ---&lt;/span&gt;&lt;span class=&quot;StringLiteral&quot;&gt;\n&amp;quot;&lt;/span&gt; + &lt;span class=&quot;ST7&quot;&gt;x&lt;/span&gt; + &lt;span class=&quot;StringLiteral&quot;&gt;&amp;quot;\n--- END SUMMARY ---\n&amp;quot;&lt;/span&gt;
    }
  &lt;span class=&quot;Keyword&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;ST8&quot;&gt;default_author&lt;/span&gt; = &lt;span class=&quot;ST2&quot;&gt;Author&lt;/span&gt;(&lt;span class=&quot;ST2&quot;&gt;C&lt;/span&gt;.&lt;span class=&quot;ST8&quot;&gt;author_name&lt;/span&gt;, &lt;span class=&quot;ST2&quot;&gt;C&lt;/span&gt;.&lt;span class=&quot;ST8&quot;&gt;author_uri&lt;/span&gt;, &lt;span class=&quot;ST2&quot;&gt;C&lt;/span&gt;.&lt;span class=&quot;ST8&quot;&gt;author_email&lt;/span&gt;, &lt;span class=&quot;Keyword&quot;&gt;true&lt;/span&gt;)
}
&lt;/pre&gt;</description>
	<pubDate>Mon, 15 Mar 2010 21:06:29 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: O'Reilly's CouchDB: The Definitive Guide for $9.99 Today Only!</title>
	<guid>tag:damienkatz.net,2010://1.558</guid>
	<link>http://damienkatz.net/2010/03/oreillys_couchdb_the_definitiv.html</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://oreilly.com/catalog/9780596155902/&quot;&gt;&lt;img src=&quot;http://covers.oreilly.com/images/9780596155902/cat.gif&quot; /&gt;&lt;br /&gt;
CouchDB: The Definitive Guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use this discount code: DDCDB&lt;/p&gt;</description>
	<pubDate>Mon, 15 Mar 2010 19:00:39 +0000</pubDate>
</item>
<item>
	<title>ejabberd@jabber.ru: ejabberd 2.1.3 - Third bugfix release</title>
	<guid>http://www.ejabberd.im/3893 at http://www.ejabberd.im</guid>
	<link>http://www.ejabberd.im/ejabberd-2.1.3</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.process-one.net/en/blogs/article/ann_ejabberd_2.1.3_bugfix_release/&quot;&gt;ejabberd 2.1.3&lt;/a&gt; has been released. It contains many bugfixes and some improvements.&lt;/p&gt;
&lt;p&gt;This is a short list of changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New ejabberd_c2s option: max_fsm_queue&lt;/li&gt;
&lt;li&gt;ejabberdctl: Support concurrent connections with bound connection names&lt;/li&gt;
&lt;li&gt;Cross-domain HTTP-Bind support (&lt;a href=&quot;https://support.process-one.net/browse/EJAB-1168&quot;&gt;EJAB-1168&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Hibernate http-bind process after handling a request&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;http://www.ejabberd.im/ejabberd-2.1.3&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 12 Mar 2010 16:28:03 +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>Damien Katz: Win a Nexus One from Couchio</title>
	<guid>tag:damienkatz.net,2010://1.557</guid>
	<link>http://damienkatz.net/2010/03/win_a_nexus_one_from_couchio.html</link>
	<description>&lt;p&gt;Port CouchDB to an Android app and get our phone! &lt;a href=&quot;http://blog.couch.io/post/440148422/win-this-nexus-one-phone&quot;&gt;Details.&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 11 Mar 2010 01:58:29 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: CouchDB Case Study: Assay Depot</title>
	<guid>tag:damienkatz.net,2010://1.556</guid>
	<link>http://damienkatz.net/2010/03/couchdb_case_study_assay_depot.html</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://blog.couch.io/post/430899411/assay-depot-cio-chris-petersen-discusses-couchdb&quot;&gt;Apache CouchDB Case Study: Assay Depot&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;div&gt;...replication give this ability that would have been much more difficult to accomplish in MySQL. We could have done this in a relational manner but it would have been very challenging, very custom. CouchDB give a lot of the benefits for free.
&lt;/div&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;div&gt;CouchDB has changed the way I think about developing web applications&lt;/div&gt;&lt;/blockquote&gt;</description>
	<pubDate>Sat, 06 Mar 2010 23:40:35 +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>Erlware: Erlware on R13B04</title>
	<guid>tag:blogger.com,1999:blog-4167999740082219489.post-3562133908906710729</guid>
	<link>http://erlware.blogspot.com/2010/03/erlware-on-r13b04.html</link>
	<description>Erlware tools are now running on R13B04 for Mac OSX Leopard  (Intel and PowerMac)Mac OSX Snow LeopardLinux i686Linux x86_64To install the 'erl' shell and start playing use 'faxien install-release erl'Note* escript still needs an update - contributions welcome.</description>
	<pubDate>Wed, 03 Mar 2010 18:15:13 +0000</pubDate>
	<author>martinjlogan@erlware.org (Martin J. Logan)</author>
</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>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>Let's say I want to create a file download link in my Nitrogen application. First I create a _src/pages/web_file.erl_ file, and fill it with some code:

    -module(web_file).
    -export([main/0, title/0, body/0, event/1]).
    -include_lib (&quot;nitrog...</description>
	<pubDate>Tue, 02 Mar 2010 19:41:01 +0000</pubDate>
</item>
<item>
	<title>Damien Katz: BBC and CouchDB</title>
	<guid>tag:damienkatz.net,2010://1.555</guid>
	<link>http://damienkatz.net/2010/03/bbc_and_couchdb.html</link>
	<description>&lt;blockquote&gt;&lt;div&gt;Vaguely interesting KV/#couchdb stat from the BBC - 3.3 billion requests handled since last summer, running at about 150-170 million per day&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;http://twitter.com/endafarrell/status/9820160677&quot;&gt;http://twitter.com/endafarrell/status/9820160677&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 01 Mar 2010 22:11:06 +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 sta