<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dave Abrahams: Home Page</title>
	<atom:link href="http://daveabrahams.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://daveabrahams.com</link>
	<description>Stuff I wrote, things I did, etc.</description>
	<lastBuildDate>Mon, 19 Mar 2012 19:21:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>C++Now! 2012: May 13-18, Aspen CO</title>
		<link>http://daveabrahams.com/2012/03/19/234/</link>
		<comments>http://daveabrahams.com/2012/03/19/234/#comments</comments>
		<pubDate>Mon, 19 Mar 2012 19:21:23 +0000</pubDate>
		<dc:creator>Dave Abrahams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://daveabrahams.techarcana.net/?p=234</guid>
		<description><![CDATA[C++Now! is set for May 13-18 2012 in Aspen, Colorado. With three keynotes and an expanded program in honor of the release of C++11, this is sure to be a landmark year for the conference. I look forward to seeing &#8230; <a href="http://daveabrahams.com/2012/03/19/234/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://cppnow.org">C++Now!</a> is set for May 13-18 2012 in Aspen, Colorado.  With <a href="http://cppnow.org/2012/03/12/keynotes/" title="C++Now 2012 Keynotes">three keynotes</a> and an <a href="http://cppnow.org/2012/03/16/program-highlights-c11/">expanded program</a> in honor of the release of C++11, this is sure to be a landmark year for the conference.  I look forward to seeing you there…</p>
]]></content:encoded>
			<wfw:commentRss>http://daveabrahams.com/2012/03/19/234/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BoostPro is Back</title>
		<link>http://daveabrahams.com/2011/05/02/boostpro-is-back/</link>
		<comments>http://daveabrahams.com/2011/05/02/boostpro-is-back/#comments</comments>
		<pubDate>Mon, 02 May 2011 20:04:54 +0000</pubDate>
		<dc:creator>Dave Abrahams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://daveabrahams.com/?p=213</guid>
		<description><![CDATA[Finally, boostpro.com is back online, and you can reach us at our regular email addresses. If you own a domain, try not to make the same mistake we did!]]></description>
			<content:encoded><![CDATA[<p>Finally, <a href="http://www.boostpro.com">boostpro.com</a> is back online, and you can reach us at our regular email addresses.  If you own a domain, try not to make the same <a href="http://techarcana.net/2011/05/02/1and1-nae-scottish/">mistake</a> we did!</p>
]]></content:encoded>
			<wfw:commentRss>http://daveabrahams.com/2011/05/02/boostpro-is-back/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What Happened to BoostPro.com?</title>
		<link>http://daveabrahams.com/2011/04/27/what-happened-to-boostpro-com/</link>
		<comments>http://daveabrahams.com/2011/04/27/what-happened-to-boostpro-com/#comments</comments>
		<pubDate>Wed, 27 Apr 2011 19:00:22 +0000</pubDate>
		<dc:creator>Dave Abrahams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://daveabrahams.com/?p=210</guid>
		<description><![CDATA[In case you noticed that boostpro.com (and my usual email address) are not responding, well, the domain registrar has the domain pointing at their own DNS servers, their DNS servers have no records for boostpro.com, and they are somehow unable &#8230; <a href="http://daveabrahams.com/2011/04/27/what-happened-to-boostpro-com/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In case you noticed that <a href="http://www.boost-consulting.com">boostpro.com</a> (and my usual email address) are not responding, well, the domain registrar has the domain pointing at their own DNS servers, their DNS servers have no records for boostpro.com, and they are somehow unable to change either of those facts.  I&#8217;ll post the full nightmare to <a href="http://techarcana.net">Techarcana</a> once we have safely arrived at a working domain registrar, which could be anytime in the next four days according to <a href="http://www.icann.org/">ICANN</a> rules.  <strong>In the meantime</strong>, you can reach us at <a href="http://boost-consulting.com">boost-consulting.com</a> and our @boost-consulting.com email addresses.</p>
]]></content:encoded>
			<wfw:commentRss>http://daveabrahams.com/2011/04/27/what-happened-to-boostpro-com/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>What&#8217;s so cool about Boost.MPI?</title>
		<link>http://daveabrahams.com/2010/09/03/whats-so-cool-about-boost-mpi/</link>
		<comments>http://daveabrahams.com/2010/09/03/whats-so-cool-about-boost-mpi/#comments</comments>
		<pubDate>Sat, 04 Sep 2010 05:44:43 +0000</pubDate>
		<dc:creator>Dave Abrahams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://daveabrahams.com/?p=169</guid>
		<description><![CDATA[At some point after a client brings us a project proposal, we usually have a conversation about separating the domain-specific part of the job from the infrastructure bits, so we can release the latter part as open source. While we &#8230; <a href="http://daveabrahams.com/2010/09/03/whats-so-cool-about-boost-mpi/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>At some point after a client brings us a project proposal, we usually
have a conversation about separating the domain-specific part of the job
from the infrastructure bits, so we can release the latter part as open
source.  While we at <a href="http://www.boostpro.com">BoostPro</a> enjoy getting
our work out there as FOSS, it can often be a huge <a href="http://www.boostpro.com/about/vision/open-outsourcing/">win for the
customer</a>,
reducing long-term maintenance cost and improving code quality, not to
mention being good PR.  Well, a few years back I got a call from Daniel
Egloff, a statistician doing high-performance financial simulations in a
Swiss bank—the results of which were of crucial importance to the bank&#8217;s
future.</p>

<p>Daniel was something of a renegade.  He had to be—the official policy
at his bank was that everyone was to use Windows and program in Java,
so putting together a Debian cluster and assembling a team that could
drive it with C++ required swimming against the corporate current, to
say the least.  But Daniel was also a visionary.  It isn&#8217;t every day
that a new client is so tuned-in to the
<a href="http://www.boostpro.com/about/vision/open-source/">value</a> and
<a href="http://www.boostpro.com/about/vision/open-outsourcing/">economy</a> of
open source libraries that they not only want to release <em>everything</em>
we do that way, but they will pay us to shepherd the library through
the
<a href="http://www.boost.org/community/reviews.html">Boost review process</a>.
As a result of our work with Daniel,
<a href="http://www.boostpro.com">BoostPro</a> produced three new Boost
libraries:
<a href="http://www.boost.org/libs/accumulators">Boost.Accumulators</a>,
<a href="http://boost-sandbox.sourceforge.net/libs/time_series/doc/html/index.html">Boost.Time_series</a>,
and <a href="http://www.boost.org/libs/MPI">Boost.MPI</a>.  What a year!</p>

<p>Today I want to write a little about Boost.MPI, because it is some very
cool technology and because lots of people don&#8217;t seem to understand
what&#8217;s so cool about it.</p>

<h3>What&#8217;s MPI?</h3>

<p><a href="http://www.open-mpi.org/">MPI</a> (which stands for <strong>M</strong>essage
<strong>P</strong>assing <strong>I</strong>nterface) is a C-like library API for synchronization
and communication between parallel processes, usually running on
separate networked computers, sometimes with heterogeneous
architectures.  If you need to compute something that requires more
juice than you can squeeze out of the most powerful single machine, MPI
can be a great technology around which to build your application.  The
library handles all kinds of basic issues, abstracting away details like</p>

<ul>
<li>the OS</li>
<li>the communication substrate (ethernet, infiniband, shared memory…)</li>
<li>the existence of multiple network interfaces</li>
<li>machine architecture (including endian-ness)</li>
</ul>

<p>Without having to deal with any of these low-level concerns, the MPI
user can write straightforward, portable code that orchestrates
large-scale parallel computations.  There&#8217;s <em>lots</em> more to MPI, but
those are the basics.</p>

<h3>So What&#8217;s Boost.MPI?</h3>

<p>Boost.MPI is a full-on C++ library wrapper over the MPI API
that—quoting from its web page—“better supports modern C++ development
styles… and the use of modern C++ library techniques to maintain
maximal efficiency.”  Which sounds nice-to-have-but-not-too-exciting
at first blush.  To really appreciate what&#8217;s so cool about it, you
have to care about making the most of your cluster hardware, and
you&#8217;ll need to delve into a few of the details about how that hardware
works.</p>

<h3>Into the Details</h3>

<p>Network cards have a fixed-size buffer; sending anything to another
process involves getting it into that buffer.<sup id="fnref:buffers"><a href="#fn:buffers" rel="footnote">1</a></sup> If the buffer
fills up, packets are waiting to go out, and you can&#8217;t send anything
further until that happens.</p>

<p>One mission of MPI (the non-boost variety) is to provide a portable
high-level API for sending out these messages.  Therefore, MPI deals
with the low-level stuff and has/needs direct access to the network
buffers, but code written on top of MPI does not.  Actually, some
clusters even have multiple network connections, such as connections
with tree structure in addition to a channel to six nearest neighbors
on a cube, and MPI picks the most appropriate avenue for your
communication pattern.  So not only don&#8217;t you need to, but you
actually never <em>want</em> to access the network buffer directly.</p>

<h3>MPI DataTypes and Type Maps</h3>

<p>Now let&#8217;s assume a heterogeneous cluster, where size, alignment, and
endian-ness may not match from machine to machine.  In that case, you
can&#8217;t just “blit the bytes;” somebody needs to figure out how to encode
data for transmission and decode it upon receipt so that it has the same
meaning on both ends.  Let&#8217;s further assume a system that transmits
in little-endian, so before sending from a big-endian machine one needs
to swap bytes (all the other possible schemes have the same
consequences&#8212;assuming this one just allows us to work with specific
examples).</p>

<p>The code doing the encoding and decoding has to know about the data structure, rather
than operating on the data as raw bytes only.  For example, if the data
structure is a sequence of 32-bit integers, you need to reverse each
group of 4 consecutive bytes.  If it&#8217;s a sequence of 16-bit integers,
you need to reverse pairs of bytes, and if it&#8217;s a sequence of chars, you
don&#8217;t need to do anything.</p>

<p>Now, suppose MPI only knew about byte sequences. MPI messages would be a
lot like files, and it would be our job, as users of MPI, to do the
encoding and decoding.  How could we approach that?  We&#8217;d probably use
something like
<a href="http://www.boost.org/doc/libs/release/libs/serialization/doc/index.html">Boost.Serialization</a>
to marshall our data.  We&#8217;d serialize our source data into a flat,
portable representation that could be passed to MPI, which would then
copy the bytes into the network buffer as needed.  That&#8217;s two copies of
every byte.  One copy to serialize, and another copy into the network
buffer.</p>

<p>Fortunately, MPI knows about way more than just bytes. MPI has
<strong>datatypes</strong>, which aren&#8217;t actually types at all, but <em>constants</em> that
identify C/C++ primitive types such as <code>int</code> and <code>long double</code> to the
library.  With a base address, a length, and the appropriate datatype,
we can tell the library to transmit an array across the network:</p>


<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// Use of raw, unimproved MPI interface.</span>
err <span style="color: #000080;">=</span> MPI_Send<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>vec<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span>, vec.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, MPI_DOUBLE, dest, tag, comm<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>



<p>Not all data is organized into contiguous arrays of primitives, though;
so MPI also provides <strong>type maps</strong>, which allow us to define the
sequence and offsets of fields in a <code>struct</code>:</p>


<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">struct</span> particle
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">char</span> spin<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">char</span> color<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">double</span> position<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">double</span> speed<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
particle particles<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1000</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// a bunch of particles to send</span>
&nbsp;
<span style="color: #0000ff;">namespace</span> particle_mpi <span style="color: #666666;">// define the MPI datatype for particles</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Constituent member types</span>
  MPI_Datatype types<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span>MPI_CHAR, MPI_DOUBLE<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span> 
&nbsp;
  <span style="color: #666666;">// repetition counts</span>
  <span style="color: #0000ff;">int</span> reps<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #0000dd;">2</span>, <span style="color: #0000dd;">6</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
  <span style="color: #666666;">// Prepare offsets</span>
  MPI_AInt offsets<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
  MPI_Address<span style="color: #008000;">&#40;</span> <span style="color: #000040;">&amp;</span>particles<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span>.<span style="color: #007788;">spin</span>, offsets <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  MPI_Address<span style="color: #008000;">&#40;</span> <span style="color: #000040;">&amp;</span>particles<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span>, offsets <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span> <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&gt;=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #000040;">--</span>i<span style="color: #008000;">&#41;</span> 
      offsets<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">-</span><span style="color: #000080;">=</span> offsets<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
  <span style="color: #666666;">// Finally, create the new datatype</span>
  MPI_Datatype datatype<span style="color: #008080;">;</span>
  MPI_Type_struct<span style="color: #008000;">&#40;</span> <span style="color: #0000dd;">2</span>, reps, offsets, types, <span style="color: #000040;">&amp;</span>datatype <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  MPI_Type_commit<span style="color: #008000;">&#40;</span> <span style="color: #000040;">&amp;</span>datatype <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>



<h3>Presto: Efficiency!</h3>

<p>MPI type maps are great for efficiency in three ways:</p>

<ol>
<li><p>First, if there&#8217;s padding in your data structure, the type map
captures that fact, and padding bytes aren&#8217;t sent.</p></li>
<li><p>Once we tell MPI about the “shape” of the data structure, it can put
a serialized representation <em>directly</em> into the network buffer.
That&#8217;s just <em>one</em> copy of every byte.</p></li>
<li><p>Using type maps saves memory.  If you&#8217;re in a resource-constrained
environment—and cluster nodes often do run very near their memory
capacity—you might not have space to spare for an additional
serialized representation of the data you&#8217;re sending.  In fact, that
was the case with Daniel&#8217;s simulation.</p></li>
</ol>

<p>These efficiency gains are multiplied when you have to send the same
data structure (with new values) multiple times.  In the worst case, MPI
type maps are on the order of the same size as the data structure they
describe, so creating one might be roughly the same cost as a copy.  So
using the same &#8220;shape&#8221; over and over again can be important.
Fortunately, that&#8217;s a natural pattern for many large-scale parallel
computations.</p>

<h3>So What&#8217;s The Catch?</h3>

<p>I don&#8217;t know whether you noticed from our example, but an MPI type map
is a pain to create!  It&#8217;s even more painful to maintain as data
structures evolve.  As a result, in a typical application, type maps get
created for a very few <code>struct</code>s, and more complex structures are
typically sent with a series of separate MPI calls (some of which use
type maps) or with the extra serialization step.  Fortunately, Michael
Gauckler (Daniel&#8217;s protégé) had a brilliant idea that we implemented in
Boost.MPI.</p>

<h3>Skeleton and Content</h3>

<p>The genius of Michael&#8217;s idea is in three realizations:</p>

<ol>
<li><p>You can represent all the values in an arbitrarily complex
non-contiguous data structure with a single type map.  It&#8217;s like a
<code>struct</code> that extends from the data&#8217;s minimum address to its maximum,
probably with <em>lots</em> of padding.</p></li>
<li><p>When you serialize a complex data structure with Boost.Serialization,
the
<a href="http://www.boost.org/doc/libs/release/libs/serialization/doc/tutorial.html#archives">Archive</a>
sees the type and address of every datum.</p></li>
<li><p>You can treat addresses as byte offsets (e.g. from address zero), and
build a type map that way.</p></li>
</ol>

<p>So Boost.MPI has a Boost.Serialization Archive type that creates an MPI
type map by treating addresses as offsets and translating fundamental
C++ types into MPI datatypes.  This step involves no actual data
copying; it&#8217;s just sending the “bones” of the data structure with no
real “meat.”  Then it uses the type map and asks the underlying MPI
library to send the &#8220;giant <code>struct</code> beginning at address zero,&#8221; thus
avoiding an expensive intermediate serialization phase before MPI
actually gets its paws on your data.  And as long as you don&#8217;t change
the layout of your data structure, you can send new “meat” without ever
repeating the “bones” step.  This approach became known as
the “<a href="http://www.boost.org/doc/libs/1_44_0/doc/html/mpi/tutorial.html#mpi.skeleton_and_content">skeleton and
content</a>” technique.  Michael and Daniel wrote a paper about it, which you can
read
<a href="http://daveabrahams.com/files/2010/09/meat_and_bones_of_mpi.pdf">here</a>.</p>

<h3>Conclusion</h3>

<p>When were able to make the efficient use of MPI as simple as making the
types in question serializable, that was a huge win.  There simply
wasn&#8217;t enough memory in the systems to do the most important
communications with an intermediate serialization step, and the
programmers didn&#8217;t have time to manually maintain MPI type maps, so this
library was a crucial part of the project&#8217;s technical success.</p>

<h3>Acknowledgements</h3>

<p>Thanks very much to Matthias Troyer for working on the Boost.MPI project
with us and for checking (and correcting) my facts.</p>

<div class="footnotes">
<hr />
<ol>

<li id="fn:buffers">
<p>There are typically multiple buffering levels, some of
which are in main memory (usually one for each target node, so you
if your communication with node A is blocked you can still send to
node B), but the basic facts remain the same: there is a limited
amount of buffering available.  Actually, the same applies to shared
memory, in case that&#8217;s how your processes communicate.&#160;<a href="#fnref:buffers" rev="footnote">&#8617;</a></p>
</li>

</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://daveabrahams.com/2010/09/03/whats-so-cool-about-boost-mpi/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Down And Dirty With C++0x</title>
		<link>http://daveabrahams.com/2010/07/02/down-and-dirty-with-c0x/</link>
		<comments>http://daveabrahams.com/2010/07/02/down-and-dirty-with-c0x/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 13:20:00 +0000</pubDate>
		<dc:creator>Dave Abrahams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Teaching]]></category>
		<category><![CDATA[Travel]]></category>

		<guid isPermaLink="false">http://daveabrahams.techarcana.net/?p=105</guid>
		<description><![CDATA[One thing I love about my job is that I get invited to talk in places I haven&#8217;t been before. In December, I went to Shanghai to give a keynote at the china-cpp conference. A couple of weeks ago I &#8230; <a href="http://daveabrahams.com/2010/07/02/down-and-dirty-with-c0x/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div id="attachment_128" class="wp-caption alignright" style="width: 255px"><a href="http://daveabrahams.com/2010/07/02/down-and-dirty-with-c0x/img_1213/"><img class="size-medium wp-image-128" title="Massive Orange Couch" src="http://daveabrahams.com/files/2010/07/IMG_1213-245x300.jpg" alt="Hans Odenthal, CEO of Sioux, on their massive orange couch" width="245" height="300" /></a><p class="wp-caption-text">Hans Odenthal, Sioux's “People Manager,” on their massive orange couch</p></div>

<p>One thing I love about my job is that I get invited to talk in places I haven&#8217;t been before.  In December, I went to Shanghai to give a keynote at the china-cpp conference.  A couple of weeks ago I was in the Netherlands giving a three day <a href="http://sioux.eu/en/premium-courses">hands-on course with C++0x</a> (well, part of C++0x, anyway—we used <a href="http://gcc.gnu.org/gcc-4.5/cxx0x_status.html">GCC 4.5</a>) and a big <a href="http://sioux.eu/en/hot-or-not/cplusplusoiks.html">evening session</a>, part of my host&#8217;s “<a href="http://sioux.eu/en/hot-or-not.html">Hot or Not</a>” series.</p>

<p>This trip was all about the <span style="color: orange;">orange</span>. <span id="more-105"></span>To start with, it is World Cup soccer season, and the Netherlands&#8217; national color?  <span style="color: orange;">Orange</span>.  So I saw people wearing <span style="color: orange;">orange</span> clothes everywhere. <sup><a name="ref-1"></a><a href="#footnote-1">1</a></sup>  To boot, my host company&#8217;s color is also <span style="color: orange;">orange</span>.  As you <a href="http://sioux.eu/en/hot-or-not/cplusplusoiks.html">can see</a>, they festooned me with <span style="color: orange;">orange</span> schwag at the end of my presentation (including a really cool kite I have yet to try out), which is a good thing because my son&#8217;s favorite color is, of course, <span style="color: orange;">orange</span>.</p>

<div id="attachment_145" class="wp-caption alignleft" style="width: 160px"><a href="http://daveabrahams.com/files/2010/07/tp.jpg"><img src="http://daveabrahams.com/files/2010/07/tp-150x150.jpg" alt="Patriotic Dutch TP" title="Patriotic Dutch TP" width="150" height="150" class="size-thumbnail wp-image-145" /></a><p class="wp-caption-text">Word Cup Fever—apparently I missed the Schipol airport restrooms</p></div>

<p>Having been sick for about ten days prior to this trip, I ended with a grueling schedule of last-minute preparations.  However, I was able to tear myself away from that for long enough to get a tour of my host company and to understand their <a href="http://sioux.eu/en/missie-en-visie.html">philosophy</a>.  I must say I was deeply impressed and inspired at their commitment to “doing well by doing good,” particularly in the area of education.  First, they invest heavily in the professional development of their employees, funding attendance at all of their premium courses.  Moreover, their hot-or-not series is a free, public lecture program that raises the operating standards of the entire local programming community.  Most companies—especially small ones—do professional development as an afterthought; that Sioux sees such a program as being a part of its core mission is just brilliant.</p>

<hr />

<div id="footnote-1"><a href="#ref-1">[1]</a> The Netherlands beat Denmark 2-0, and people grumbled because it wasn&#8217;t a very competitive game—Denmark scored one of those goals against itself.  I was told by some Dutch people that things could have been worse, though, because the instant their team plays badly everyone stops supporting them.</div>
]]></content:encoded>
			<wfw:commentRss>http://daveabrahams.com/2010/07/02/down-and-dirty-with-c0x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BusyBusyBusyBusy…</title>
		<link>http://daveabrahams.com/2010/06/08/busybusybusybusy/</link>
		<comments>http://daveabrahams.com/2010/06/08/busybusybusybusy/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 12:45:52 +0000</pubDate>
		<dc:creator>Dave Abrahams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[update]]></category>

		<guid isPermaLink="false">http://daveabrahams.techarcana.net/2010/06/08/busybusybusybusy/</guid>
		<description><![CDATA[In case anyone pays attention to what I write here anymore, I thought I should leave a quick update. we did BoostCon 2010, and it was great as usual. I&#8217;m hoping to have something to write myself on it soon, &#8230; <a href="http://daveabrahams.com/2010/06/08/busybusybusybusy/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In case anyone pays attention to what I write here anymore, I thought I should leave a quick update.</p>

<ul>
    <li>we did BoostCon 2010, and it was great as usual.  I&#8217;m hoping to have something to write myself on it soon, but in the meantime check out Dean Michael Berris&#8217; <a href="http://cplusplus-soup.com/2010/05/24/boostcon-2010-trip-update/">report</a> on C++ Soup.</li>
    <li>Right now I&#8217;m prepping to deliver a <a href="http://sioux.eu/en/premium-courses/c0x-boost.html">C++0x course</a> and <a href="http://sioux.eu/en/ses-news/401.html?task=view">evening talk</a> in the Netherlands.  C++0x is huge!  Even when you&#8217;re &#8220;on the inside of the development process,&#8221; there&#8217;s a lot to miss. So preparation is taking all my time which is why there&#8217;s not much activity on the Ryppl front.</li>
    <li>Yeah, <a href="http://ryppl.org">Ryppl</a>.  It&#8217;s the project I&#8217;m working on full-time when I&#8217;m not teaching, blogging, running BoostPro, recovering from Boostcon, blah, blah.  Yeah, did I mention I&#8217;m busy?  Anyway, in my opinion the future of <a href="http://boost.org">Boost</a> depends on having something like Ryppl in place, so I&#8217;m really looking forward to getting back to it.  I&#8217;m especially psyched because next month my colleague and friend <a href="http://video.google.com/videoplay?docid=3723782552647089226#">Eric Niebler</a> is moving to Cambridge (right around the corner from me) to work on ryppl.  It&#8217;s going to be great to collaborate face-to-face with someone on a regular basis again after living the virtual life for so long.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://daveabrahams.com/2010/06/08/busybusybusybusy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Shanghaied!</title>
		<link>http://daveabrahams.com/2009/12/10/shanghaied/</link>
		<comments>http://daveabrahams.com/2009/12/10/shanghaied/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 02:22:03 +0000</pubDate>
		<dc:creator>Dave Abrahams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Teaching]]></category>
		<category><![CDATA[Travel]]></category>

		<guid isPermaLink="false">http://daveabrahams.com/?p=79</guid>
		<description><![CDATA[About a month ago I was invited to give a keynote at the China C++ Conference, and after some hemming and hawing due to the short notice, I decided to accept.  It&#8217;s not every day that someone offers to pay &#8230; <a href="http://daveabrahams.com/2009/12/10/shanghaied/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>About a month ago I was invited to give a keynote at the <a title="Conference Home Page" href="http://china-cpp.org" target="_blank">China C++ Conference</a>, and after some hemming and hawing due to the short notice, I decided to accept.  It&#8217;s not every day that someone offers to pay your way to China; I might as well see it, I figured.</p>

<p>The place is happenin&#8217;, seriously. Shanghai is a huge, beautiful city. Some people have lots of money, and the city center glitters with light and impressive buildings. If anyone wonders why there&#8217;s talk about China being an economic powerhouse, here&#8217;s your answer: I drove past a Maserati dealership on the way to the hotel.  On the other hand, I saw guys in ragged clothes hauling loads of wood, or bricks, like oxen, and every category of bicycle and scooter with dump-truck-sized payloads. I ran past someone&#8217;s broken-down house with their chickens roaming the sidewalk outside.</p>
]]></content:encoded>
			<wfw:commentRss>http://daveabrahams.com/2009/12/10/shanghaied/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Where I&#8217;ve Been</title>
		<link>http://daveabrahams.com/2009/08/15/where-ive-been/</link>
		<comments>http://daveabrahams.com/2009/08/15/where-ive-been/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 03:39:15 +0000</pubDate>
		<dc:creator>Dave Abrahams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[update]]></category>

		<guid isPermaLink="false">http://daveabrahams.com/?p=76</guid>
		<description><![CDATA[While BoostCon &#8217;09 was awesome, at this point it&#8217;s pretty obvious that I won&#8217;t be able to report on each day in the detail I started out with. I will try to wrap it all up in one article, soon. &#8230; <a href="http://daveabrahams.com/2009/08/15/where-ive-been/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>While BoostCon &#8217;09 was awesome, at this point it&#8217;s pretty obvious that I won&#8217;t be able to report on each day in the detail I started out with. I will try to wrap it all up in one article, soon.  Until then, if you&#8217;re a programmer type, please have a look at <a title="C++Next" href="http://cpp-next.com">C++Next</a>, a new site I have started about advanced C++.</p>

<p>Cheers!</p>
]]></content:encoded>
			<wfw:commentRss>http://daveabrahams.com/2009/08/15/where-ive-been/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BoostCon 2009 Trip Report 3a</title>
		<link>http://daveabrahams.com/2009/06/30/boostcon-2009-trip-report-3a/</link>
		<comments>http://daveabrahams.com/2009/06/30/boostcon-2009-trip-report-3a/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 03:30:33 +0000</pubDate>
		<dc:creator>Dave Abrahams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://daveabrahams.com/?p=53</guid>
		<description><![CDATA[May 4, 2009 KickOff Hey, this is going to be fun! I sure hope people don’t grumble too much about the snow, and that they dressed for the changeable mountain weather. I hoof it on over to breakfast and get ready &#8230; <a href="http://daveabrahams.com/2009/06/30/boostcon-2009-trip-report-3a/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>May 4, 2009</p>

<h3>KickOff</h3>

<p style="text-align: left"></p>

<div id="attachment_61" class="wp-caption alignright" style="width: 310px"><a href="http://daveabrahams.com/files/2009/06/img_01982.jpg"><img class="size-medium wp-image-61" title="IMG_0198" src="http://daveabrahams.com/files/2009/06/img_01982-300x177.jpg" alt="" width="300" height="177" /></a><p class="wp-caption-text">Monday morning in Aspen</p></div>

<p>Hey, this is going to be fun!  I sure hope people don’t grumble too much about the snow, and that they dressed for the changeable mountain weather.</p>

<p style="text-align: left">I hoof it on over to breakfast and get ready for my day.  In light of the snow, I take the long way over to the Physics Center, along the road, not through the meadow.</p>

<p>Jeff Garland opens the conference in Flug (“floog”) Forum with his “Library In a Week” project for this year: <a href="http://www.boostcon.com/program/sessions#garland-boost-library-in-a-week-stdrdb-mon">building a relational database binding library</a>.</p>

<div id="attachment_57" class="wp-caption alignright" style="width: 310px"><img class="size-medium wp-image-57" title="IMG_0202" src="http://daveabrahams.com/files/2009/06/img_0202.jpg" alt="Despite appearances, Jeff actually is a corporeal being" width="300" height="225" /><p class="wp-caption-text">Despite appearances, Jeff actually is a corporeal being.</p></div>

<p>Jeff has done a different variation of this series every BoostCon, getting a group together for one hour every morning before the rest of the sessions start, to collaborate on developing a new library. As great as “Library in a Week” has been  for everyone over the years, it hits me like a ton of bricks that a working session is no way to start a conference.  [Note to self for next year: add a short formal welcome session]</p>

<div id="attachment_57" class="wp-caption alignright" style="width: 310px"><a href="http://daveabrahams.com/files/2009/06/img_0202.jpg"><img class="size-medium wp-image-57" title="IMG_0202" src="http://daveabrahams.com/files/2009/06/img_0202-300x225.jpg" alt="" width="300" height="225" /></a><p class="wp-caption-text">Despite appearances, Jeff actually is a corporeal being</p></div>

<p>I have some interest in this area, since I recently had to learn more than I ever wanted to about web development, so I had a brush with databases, specifically the <a href="http://docs.djangoproject.com/en/dev/topics/db/queries/">Django web framework&#8217;s binding library</a>.  I volunteered to give an overview the next day of that interface, but sadly became overwhelmed with other conference responsibilities and activities, and was never able to get back to Library in a Week.  Sorry, everybody!  If someone would like to write a comment about how the project turned out, I’d be happy to approve it here.</p>

<div id="attachment_64" class="wp-caption alignleft" style="width: 220px"><img class="size-medium wp-image-64  " title="IMG_0201" src="http://daveabrahams.com/files/2009/06/img_0201.jpg" alt="Flug again, featuring the infamous &quot;red chair&quot;" width="210" height="158" /><p class="wp-caption-text">The infamous Flug red chair</p></div>

<p>Next up, Christophe Henry’s talk on the <a href="http://www.boostpro.com/vault/index.php?directory=Msm">Meta State-Machine Library</a> in Bethe (“beta”) hall.  I’ve been looking forward to this one ever since I saw it on the program.  I first learned about Christophe’s work when he contacted me and Aleksey Gurtovoy (my co-author on <em><a href="http://www.boostpro.com/mplbook">C++ Template Metaprogramming</a></em>) about the library he had written based on a simple example in our book.  I get similar requests now and again to look at peoples’ code; I usually don’t have the time, and when I do I am usually not impressed, but this time I took a gander, and I was wowed.  He had maintained the declarativeness and efficiency of our work and had extended it to cover all the fancy-dancy features that people familiar with the UML state machine specification expect.</p>

<p>Years ago, when the review for the <a href="http://www.boost.org/doc/libs/1_39_0/libs/statechart/doc/index.html">Boost StateChart library</a> was underway, I had pointed to our example as a way of showing that one could write highly-efficient state machines with a declarative syntax, but at the time it was <a href="http://lists.boost.org/Archives/boost/2005/03/81853.php">claimed</a> that the advanced features supported by the UML standard (and the proposed library) made such an approach infeasible.  I <a href="http://lists.boost.org/Archives/boost/2005/03/82313.php">wasn’t happy</a>, but also didn’t have the time or domain expertise to build what I thought would have been an improvement.  Since the library would certainly be useful for some portion of the C++ community, it was accepted into Boost; I think I even voted for it.</p>

<div id="attachment_65" class="wp-caption alignright" style="width: 310px"><a href="http://snltranscripts.jt.org/91/91escottish.phtml"><img class="size-medium wp-image-65 " title="IMG_0204-2" src="http://daveabrahams.com/files/2009/06/img_0204-2.jpg" alt="Christophe" width="300" height="221" /></a><p class="wp-caption-text">Christophe explains why conventional design processes are not Scottish</p></div>

<p>But, Christophe had taken his knowledge of UML and template metaprogramming, and combined them to produce something much closer to my ideal.  Not only that, but it was well-documented and nicely presented.  Back to the past present, at BoostCon, I’m looking forward to seeing the details.</p>

<p>Christophe turns out to be an excellent presenter: knowledgeable, entertaining, and understandable without talking down to the audience.  He also has an impressive grasp of how crucial abstraction is to the software development process, and a way of explaining it in terms of Model-Driven Engineering from which I have lots to learn.</p>

<div id="attachment_67" class="wp-caption alignleft" style="width: 235px"><img class="size-medium wp-image-67 " title="IMG_0205" src="http://daveabrahams.com/files/2009/06/img_0205.jpg" alt="Michael Wong slings C++0x" width="225" height="300" /><p class="wp-caption-text">Michael Wong slings C++0x</p></div>

<p>Still trying to get pictures of everything at the conference, I duck over to Flug and check out Michael Wong talking about the features of the upcoming standard, C++0x.  It looks like Michael is doing a great job keeping people engaged, and I know most of this stuff, it seems, from my work on the C++ committee, so I go back to Bethe just in time for the first coffee break.</p>

<p>Next we have the dueling parallel patterns presentations (DPPP). In Flug, Stephan T. Lavavej is talking about Visual Studio 2010’s parallel patterns library.  In Bethe, Joel Falcou on an Embedded Domain Specific Language (EDSL) for parallel programming.  How do I choose?  I figure that pretty soon information about Visual Studio is going to be ubiquitous, but this is probably my one chance to hear about what Joel is working on.  So it’s off to Bethe.</p>

<p>Wow, this is getting long.  More on Monday to come tomorrow&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://daveabrahams.com/2009/06/30/boostcon-2009-trip-report-3a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BoostCon 2009 Trip Report 2</title>
		<link>http://daveabrahams.com/2009/06/19/boostcon-2009-trip-report-2/</link>
		<comments>http://daveabrahams.com/2009/06/19/boostcon-2009-trip-report-2/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 18:58:29 +0000</pubDate>
		<dc:creator>Dave Abrahams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://daveabrahams.com/?p=43</guid>
		<description><![CDATA[Sunday, May 3: Sunday, May 3: I wake to an overcast sky and look around, half-startled by my own relaxation. With Dave Jenkins handling facilities and Kim Scheibel handling registration, there&#8217;s so much less to worry about than in years &#8230; <a href="http://daveabrahams.com/2009/06/19/boostcon-2009-trip-report-2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>Sunday, May 3:</strong> Sunday, May 3: I wake to an overcast sky and look around, half-startled by my own relaxation.  With Dave Jenkins handling facilities and Kim Scheibel handling registration, there&#8217;s so much less to worry about than in years past! I did have to bring the nametags, so I&#8217;ll be taking them over to registration this afternoon. In the meantime, I&#8217;m looking forward to a day of hanging out, finishing a writeup for the rvalue references coding session I&#8217;ll be running on Monday afternoon.  This article has become much longer and more involved than I had ever expected it to.</p>

<p>At breakfast in the morning I meet Edouard Alligand, Christophe Henry, and Christophe&#8217;s wife Inna.  Edouard came in from Paris, and though Christophe and Inna are French and Russian, respectively, they live in Germany.  A very cosmopolitan group.</p>

<p>Naturally, Inna is wondering what she&#8217;s going to do with herself in this tiny resort town all week, in the off-season when so many businesses are closed, and I don&#8217;t have words to reassure her.  I like Aspen anytime, but I spent so many summers here because of my dad&#8217;s connection with the Physics Center that it&#8217;s like a second home. Trying to help, I offer to give them a little tour of the city.  It&#8217;s a nice walk into town and if your shoes are reasonably comfortable it&#8217;s pretty easy to make the loop on foot.  So off we go.</p>

<p>When we get up to Main street I&#8217;m relieved that I can no longer find the little cluster of victorian houses that I noticed last year advertising cosmetic surgery and dentistry.  Since I first came here as a child, Aspen has gone from being an old mining outpost with a ski area to a playground for the rich and famous, with rodeo drive boutiques pushing out many of the local businesses downtown.  One of my favorite establishments was a little fiberglass A-frame called &#8220;Donny&#8217;s Dog House,&#8221; where you could get the best onion rings and kosher dogs served only on a whole-wheat bun.  That place simply could not exist today.  I&#8217;ve learned to accept much of the recent development, but &#8220;cosmetic surgery row&#8221; made Aspen a parody of itself.</p>

<p>Downtown, I do my best to point out the decent restaurants, knowing many of them are closed for the off-season, and of those that aren&#8217;t, many won&#8217;t open &#8217;till dinnertime.  At some point the walk becomes a mission to find a restroom, a problem I solve brilliantly by suggesting we could simply ask some open business for permission to use theirs.  Apparently that isn&#8217;t done in Europe.</p>

<p>Next mission: lunch.  But now we&#8217;re in the wrong part of town to find anything.  Someone is craving steak, so we head past Rubey park&#8217;s empty rugby field to where I remember there being a steakhouse years ago.  Gone.  Across the street is an &#8220;Authentic Western Bistro&#8221; (closed), the idea of which made me a little embarrassed in front of my French companions.  In the end, after passing through Carl&#8217;s Pharmacy to buy provisions (contact lens solution for me, beer and wine for everyone else&#8212;you can get anything there), we end up stopping at Hickory House.</p>

<p>Hickory House is the last possible restaurant before you arrive back at the Meadows.  It&#8217;s a decent barbequeue joint, but&#8230; I kid you not&#8230; they brag that they import their ribs from Denmark!  I have nothing against Denmark, mind you, but ribs?  First, importing is just too highbrow for ribs, I&#8217;m sorry.  Taking trash meat and smoking and/or marinating it until it becomes tender and delicious is a foundation of barbequeue.  Second, isn&#8217;t this a classic American food and aren&#8217;t we in livestock country?  The carbon footprint implications of shipping ribs from Denmark to the middle of the U.S. boggle the mind.  But maybe it&#8217;s just the thin air and empty stomach.  I can&#8217;t remember much about lunch, but I didn&#8217;t order the ribs.</p>

<p>Heading back to the Hotel afterwards, we decided to pass by the Physics Center and walk through the meadow instead of taking the road we came out on.  After snapping a few pictures of magpies, Inna takes a picture of Edouard, Christophe (with bag o&#8217; beers), and me.  My look of satisfaction in this picture pretty much sums up my day.
<div id="attachment_44" class="wp-caption aligncenter" style="width: 510px"><img src="http://daveabrahams.com/files/2009/06/100_3007-1.jpg" alt="Edouard Alligand, Dave Abrahams, Christophe Henry in Aspen Meadow" title="Meadow Walk" width="500" height="375" class="size-full wp-image-44" /><p class="wp-caption-text">Edouard Alligand, Dave Abrahams, Christophe Henry in Aspen Meadow</p></div></p>
]]></content:encoded>
			<wfw:commentRss>http://daveabrahams.com/2009/06/19/boostcon-2009-trip-report-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

