<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Amir Chaudhry</title>
  <link href="http://amirchaudhry.com/" rel="self"/>
  <link href="http://amirchaudhry.com"/>
  <subtitle>thoughts, comments &amp; general ramblings</subtitle>
  <updated>2018-02-19T15:42:42+00:00</updated>
  <id>http://amirchaudhry.com</id>
  <author>
    <name>Amir Chaudhry</name>
  </author>
  
  <entry>
    <title>Unikernels and Modularity at GlueCon 2016</title>
    <link href="http://amirchaudhry.com/gluecon2016"/>
    <author>Amir Chaudhry</author>
    <updated>2016-05-25T00:01:00+00:00</updated>
    <id>http://amirchaudhry.com/gluecon2016</id>
    <content type="html">
&lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;63c5ac2b013444a2849629bcf588ae82&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Above are the slides from my talk at &lt;a href=&quot;http://gluecon.com&quot;&gt;GlueCon&lt;/a&gt; today.  Following the
overview, I spend a little more time describing the benefits of having an
ecosystem of libraries we can use for unikernels.  The demo I gave this time
was a little more involved and showed how we can build unikernels using your
normal development approaches but then re-target the same application to
different backends (i.e. for ARM and the Internet of Things).&lt;/p&gt;

&lt;p&gt;Below are some details of how you can step through the demo for yourselves and
you can find more information about unikernels over at &lt;strong&gt;&lt;a href=&quot;http://unikernel.org&quot;&gt;unikernel.org&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h4 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;/h4&gt;

&lt;p&gt;The following instructions use &lt;a href=&quot;https://blog.docker.com/2016/03/docker-for-mac-windows-beta/&quot;&gt;Docker for Mac&lt;/a&gt;, which is currently in
beta, but should work with any Docker installation. In order to deploy to a
Cubieboard2, you need to have a board set up and running Xen.
You can follow the &lt;a href=&quot;https://github.com/mirage/xen-arm-builder&quot;&gt;relevant instructions&lt;/a&gt; for details.&lt;/p&gt;

&lt;p&gt;The 2048 game I used here was originally put together as a tutorial for
teaching OCaml and using js_of_ocaml. If you’re interested, you can find more instructions and follow the tutorial yourself on over on the
&lt;a href=&quot;https://github.com/ocamllabs/2048-tutorial/blob/master/task.md&quot;&gt;original repo&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;building-the-2048-game-for-the-unix-backend&quot;&gt;Building the 2048 game for the Unix backend&lt;/h4&gt;

&lt;p&gt;I used &lt;a href=&quot;https://blog.docker.com/2016/03/docker-for-mac-windows-beta/&quot;&gt;Docker for Mac&lt;/a&gt;, together with pre-prepared Docker images to
speed things up. Bear in mind that things change across beta releases so if
the following doesn’t work, please &lt;a href=&quot;https://twitter.com/amirmc&quot;&gt;tweet me&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The first thing to show is how you can do development by targeting unix and
using the appropriate system libraries.  The Docker image already has a clone
of the repo so you can use that. To follow my steps from the demo:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# On your terminal&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;docker run &lt;span class=&quot;nt&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 80:8080 amirmc/gluecon2016-unix bash

&lt;span class=&quot;c&quot;&gt;# Inside the container&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;opam config env&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;gluecon2016
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;mirage configure &lt;span class=&quot;nt&quot;&gt;--unix&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--net&lt;/span&gt; socket
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;make
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo&lt;/span&gt; ./mir-www
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You’ll see that the tool runs some checks and tries to install any necessary
components for the target — in this case the unix-related libraries.&lt;/p&gt;

&lt;p&gt;Once you’ve completed the above steps, you can point your browser at
&lt;code class=&quot;highlighter-rouge&quot;&gt;localhost&lt;/code&gt; to see the site. Congratulations, you should see the unix-based
version of the 2048 game! Try not to get too distracted by playing. The next
step is to use the same code base to build an ARM-based unikernel that will
run on the Cubieboard2.&lt;/p&gt;

&lt;h4 id=&quot;building-2048-for-the-arm-backend&quot;&gt;Building 2048 for the ARM backend&lt;/h4&gt;

&lt;p&gt;You will again use Docker but this time with the ARM images, based on
&lt;code class=&quot;highlighter-rouge&quot;&gt;resin/armv7hf-debian&lt;/code&gt; (NB: This is &lt;em&gt;not&lt;/em&gt; a cross-compilation step).  You can
build the Xen image in the container using Docker but in order to
deploy, you’ll need the Cubieboard2 already set up.  This time, you can clone
the demo repo on your machine and mount it into the container.  The steps from
this part of the demo were:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Clone the repo and mount it in the ARM container&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git clone https://github.com/amirmc/gluecon16.git
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;gluecon16
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;docker run &lt;span class=&quot;nt&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;pwd&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;:/src amirmc/gluecon2016-arm bash

&lt;span class=&quot;c&quot;&gt;# Inside the container&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;opam config env&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /src
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;mirage configure &lt;span class=&quot;nt&quot;&gt;--xen&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--dhcp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--network&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0 &lt;span class=&quot;nt&quot;&gt;--no-opam&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;make
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;highlighter-rouge&quot;&gt;--no-opam&lt;/code&gt; flag is used because the container already has the necessary
packages and you can skip that check. The &lt;code class=&quot;highlighter-rouge&quot;&gt;--network=0&lt;/code&gt; is to override a
default in the &lt;code class=&quot;highlighter-rouge&quot;&gt;config.ml&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;You should now have a file on your Mac called &lt;code class=&quot;highlighter-rouge&quot;&gt;mir-www.xen&lt;/code&gt;. This is the
binary you need to copy over to the Cubieboard2.  You’ll notice an additional
file, &lt;code class=&quot;highlighter-rouge&quot;&gt;www.xl&lt;/code&gt;, which contains some configuration and will also need to be
copied over (you will need to update the path in that file). Once these files
are on the Cubieboard2, then it’s a simple case of
&lt;code class=&quot;highlighter-rouge&quot;&gt;sudo xl create -c www.xl&lt;/code&gt;.  The IP address of the unikernel will be displayed
and you can navigate to &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;IP address&amp;gt;:8080&lt;/code&gt; from your browser. You’re now
playing the 2048 game from a unikernel being served from the Cubieboard2!
During this re-targeting, none of the application code had to be changed, the
appropriate system libraries were pulled in at the right time.&lt;/p&gt;

&lt;p&gt;Although the above may seem quite involved, it does demonstrate how we can use
the existing tools to to develop and deploy applications that span both the
cloud and IoT.  Over time, the tooling for unikernels will improve and mature
so that all of the above will become much easier!&lt;/p&gt;

&lt;h4 id=&quot;other-resources&quot;&gt;Other resources&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;I mentioned Containers as a Service and you can find out more about &lt;a href=&quot;https://www.docker.com/products/overview&quot;&gt;Docker Products&lt;/a&gt;&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;The &lt;a href=&quot;https://blog.docker.com/2016/03/docker-for-mac-windows-beta/&quot;&gt;Docker Desktops beta&lt;/a&gt;&lt;/em&gt;, which uses a number of the MirageOS libraries.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;The MirageOS website&lt;/em&gt;, &lt;a href=&quot;https://mirage.io&quot;&gt;https://mirage.io&lt;/a&gt;.
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;The &lt;a href=&quot;https://github.com/mirage/mirage-skeleton&quot;&gt;mirage-skeleton repo&lt;/a&gt;, which has a number of examples&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To get involved in the development work, please do join the
&lt;a href=&quot;https://devel.unikernel.org&quot;&gt;unikernel forum&lt;/a&gt;, the &lt;a href=&quot;http://lists.xenproject.org/cgi-bin/mailman/listinfo/mirageos-devel&quot;&gt;MirageOS devel list&lt;/a&gt;,
and try out some of the examples for yourselves!&lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;Thanks to &lt;a href=&quot;https://twitter.com/mindypreston&quot;&gt;Mindy&lt;/a&gt; for reviewing an earlier draft.&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>Notes on my Craft Conf Talk</title>
    <link href="http://amirchaudhry.com/craftconf2016"/>
    <author>Amir Chaudhry</author>
    <updated>2016-04-28T03:00:00+00:00</updated>
    <id>http://amirchaudhry.com/craftconf2016</id>
    <content type="html">
&lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;55e7a8cdf3f94ccb8cfd74696ebce78d&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;These are the slides from my &lt;a href=&quot;http://beta.craft-conf.com/speaker/AmirChaudhry&quot;&gt;talk at Craft Conf&lt;/a&gt; today. If you’re
reading this at the conference now, please do follow the link at the end of my
talk to rate it and give me feedback!&lt;/p&gt;

&lt;p&gt;Some of the specific items I mention are below, with links to more detail.
You can find more information and resources about unikernels over at
&lt;strong&gt;&lt;a href=&quot;http://unikernel.org&quot;&gt;unikernel.org&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h4 id=&quot;build-the-mirageos-website-with-docker-for-mac&quot;&gt;Build the MirageOS website with Docker for Mac&lt;/h4&gt;

&lt;p&gt;I quickly showed people how to build and serve the MirageOS website from a
container on my Mac.  I used the &lt;a href=&quot;https://blog.docker.com/2016/03/docker-for-mac-windows-beta/&quot;&gt;Docker for Mac beta&lt;/a&gt; (beta 8) for
this, together with a prepared Docker image. Bear in mind that things change
across beta releases so if the following doesn’t work, please
&lt;a href=&quot;https://twitter.com/amirmc&quot;&gt;tweet me&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To follow my steps in the demo:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# On your terminal&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;docker run &lt;span class=&quot;nt&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 80:80 amirmc/demo-craft bash

&lt;span class=&quot;c&quot;&gt;# Inside the container&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;mirage-www/src
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;mirage configure &lt;span class=&quot;nt&quot;&gt;--unix&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--net&lt;/span&gt; socket
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;make
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo&lt;/span&gt; ./mir-www
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You should be able to see the site by pointing your browser to &lt;code class=&quot;highlighter-rouge&quot;&gt;localhost&lt;/code&gt;!
Congrats, you just built MirageOS! You can read the &lt;a href=&quot;https://mirage.io/wiki/hello-world&quot;&gt;hello world guide&lt;/a&gt; on the website to understand more about the configure flags we used.&lt;/p&gt;

&lt;p&gt;The above image (&lt;code class=&quot;highlighter-rouge&quot;&gt;amirmc/demo-craft&lt;/code&gt;) is one I made just for the conference,
so that I didn’t have to wait for additional downloads. To do it ‘properly’,
it’s better to use the &lt;a href=&quot;https://hub.docker.com/r/unikernel/mirage/&quot;&gt;unikernel/mirage images&lt;/a&gt;, since those
are maintained.  The &lt;code class=&quot;highlighter-rouge&quot;&gt;mirage&lt;/code&gt; tool within the container will then pull down
the required dependencies based on the &lt;code class=&quot;highlighter-rouge&quot;&gt;mirage configure&lt;/code&gt; step.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Clone the repo on your machine&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git clone https://github.com/mirage/mirage-www.git
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;mirage-www

&lt;span class=&quot;c&quot;&gt;# Pull and run the maintained image, mount&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# the local directory, and set up the ports&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;docker run &lt;span class=&quot;nt&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;pwd&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;:/src &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 80:80 unikernel/mirage bash

&lt;span class=&quot;c&quot;&gt;# Now that you're in the container&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;src
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;mirage configure &lt;span class=&quot;nt&quot;&gt;--unix&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--net&lt;/span&gt; socket &lt;span class=&quot;c&quot;&gt;# installs packages&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;make
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo&lt;/span&gt; ./mir-www
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then point your browser at &lt;code class=&quot;highlighter-rouge&quot;&gt;localhost&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Using Docker for Mac makes all of the above much easier, &lt;em&gt;especially&lt;/em&gt; if you
don’t have (or don’t want) a local OCaml environment set up.&lt;/p&gt;

&lt;h4 id=&quot;the-bitcoin-piñata&quot;&gt;The Bitcoin Piñata&lt;/h4&gt;

&lt;p&gt;This is a unikernel, built using the TLS stack, which holds the private key to
some bitcoin.  If you manage to break in then you can simply transfer the
bitcoin away.  The model itself is a novel way to run a bounty programme,
since a successful breach leads directly to the reward — though the main
benefit is to stress-test the whole stack in the wild.  In the talk, I
describe how the unikernel is about 4% the size of its equivalent in a
traditional OS and you can read the article for more detail about that
(and much more).&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Article on the TLS stack&lt;/em&gt;, &lt;a href=&quot;https://usenix15.nqsb.io&quot;&gt;“Not-quite-so-broken TLS”&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Some background to the Bitcoin Pinata&lt;/em&gt;, &lt;a href=&quot;http://amirchaudhry.com/bitcoin-pinata/&quot;&gt;“The Bitcoin Piñata!”&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;The Pinata itself&lt;/em&gt; &lt;a href=&quot;http://ownme.ipredator.se&quot;&gt;“You have reached the BTC Piñata”&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Looking over the attempts&lt;/em&gt; &lt;a href=&quot;https://mirage.io/blog/bitcoin-pinata-results&quot;&gt;“Reviewing the Bitcoin Piñata”&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;other-resources&quot;&gt;Other resources&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;I mentioned Containers as a Service and you can find out more about &lt;a href=&quot;https://www.docker.com/products/overview&quot;&gt;Docker Products&lt;/a&gt;&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;The &lt;a href=&quot;https://blog.docker.com/2016/03/docker-for-mac-windows-beta/&quot;&gt;Docker Desktops beta&lt;/a&gt;&lt;/em&gt;, which uses a number of the MirageOS libraries.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;The MirageOS website&lt;/em&gt;, &lt;a href=&quot;https://mirage.io&quot;&gt;https://mirage.io&lt;/a&gt;.
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;The &lt;a href=&quot;https://github.com/mirage/mirage-skeleton&quot;&gt;mirage-skeleton repo&lt;/a&gt;, which has a number of examples&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;em&gt;The Nymote site&lt;/em&gt;, &lt;a href=&quot;http://nymote.org&quot;&gt;http://nymote.org&lt;/a&gt;.
    &lt;ul&gt;
      &lt;li&gt;*The &lt;a href=&quot;http://nymote.org/blog/2013/introducing-nymote/&quot;&gt;Introductory post&lt;/a&gt; is a useful place to start.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To get involved in the development work, please do join the &lt;a href=&quot;https://devel.unikernel.org&quot;&gt;unikernel forum&lt;/a&gt;, the 
&lt;a href=&quot;http://lists.xenproject.org/cgi-bin/mailman/listinfo/mirageos-devel&quot;&gt;MirageOS devel list&lt;/a&gt;, and try out some of the examples for
yourselves!&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>A logo for unikernels!</title>
    <link href="http://amirchaudhry.com/logo-for-unikernels"/>
    <author>Amir Chaudhry</author>
    <updated>2016-01-06T18:00:00+00:00</updated>
    <id>http://amirchaudhry.com/logo-for-unikernels</id>
    <content type="html">
&lt;p&gt;I’ve been working towards a logo for unikernels and it’s time to gather
feedback from the unikernel community! There’s been a 99designs contest
running for a while — where designers have submitted just over 400
entries — and a short-list for community feedback is now at
&lt;a href=&quot;https://99designs.co.uk/logo-design/vote-99gjyi&quot;&gt;https://99designs.co.uk/logo-design/vote-99gjyi&lt;/a&gt; (link open until at least 15th Jan).&lt;/p&gt;

&lt;p&gt;At this stage, the aim is to gather wider feedback to inform the next step.
The final design will be selected &lt;em&gt;at a later date&lt;/em&gt; — after further iteration
with designers.  Once a logo is chosen, it will be used on &lt;a href=&quot;http://unikernel.org&quot;&gt;unikernel.org&lt;/a&gt;
and will help inform the design of the rest of the site (with input from a
professional firm).&lt;/p&gt;

&lt;p&gt;For more background you can read the &lt;a href=&quot;https://99designs.co.uk/logo-design/contests/make-fun-logo-open-source-unikernel-projects-562612/brief&quot;&gt;design brief&lt;/a&gt; and you can even look
through &lt;a href=&quot;https://99designs.co.uk/logo-design/contests/make-fun-logo-open-source-unikernel-projects-562612/entries&quot;&gt;all the entries&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;why-do-unikernels-need-a-logo&quot;&gt;Why do unikernels need a logo?&lt;/h3&gt;

&lt;p&gt;The unikernel approach as a &lt;em&gt;concept&lt;/em&gt; has been getting much more attention
recently and this will only increase throughout 2016.&lt;/p&gt;

&lt;p&gt;Since there are a number of different &lt;a href=&quot;http://unikernel.org/projects/&quot;&gt;projects&lt;/a&gt; — each approaching the
problem from a different perspective — it will become even more important to
ease the process of bringing in new users and contributors across all the
projects.&lt;/p&gt;

&lt;p&gt;The website at &lt;a href=&quot;http://unikernel.org&quot;&gt;unikernel.org&lt;/a&gt; is already helping with this but we will also
need a simple visual identity to go alongside it.  Building this kind of brand
will greatly improve the standing of unikernels as a whole and will be just as
important as the work going on in each of the implementations. Ultimately,
this will help to increase the rate of adoption.&lt;/p&gt;

&lt;h3 id=&quot;what-about-projects-existing-logos&quot;&gt;What about projects’ existing logos?&lt;/h3&gt;

&lt;p&gt;To avoid any confusion, I’ll say upfront that this logo is &lt;strong&gt;not&lt;/strong&gt; intended to
replace any project’s existing brand!  It’s meant to help us represent
unikernels &lt;em&gt;as a whole&lt;/em&gt; and each project will make it own choices, just as
they do currently.  The logo will mainly be used on &lt;a href=&quot;http://unikernel.org&quot;&gt;unikernel.org&lt;/a&gt; and
projects can make use of it if they wish.&lt;/p&gt;

&lt;p&gt;Projects have already &lt;a href=&quot;https://mirage.io/blog/unikernel-org&quot;&gt;benefited from shared code&lt;/a&gt; and the same
will be true from this shared brand.&lt;/p&gt;

&lt;h3 id=&quot;what-now&quot;&gt;What now?&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Give feedback on the short-list of designs via &lt;a href=&quot;https://99designs.co.uk/logo-design/vote-99gjyi&quot;&gt;https://99designs.co.uk/logo-design/vote-99gjyi&lt;/a&gt;!&lt;/li&gt;
  &lt;li&gt;Discuss this post on the new forum at &lt;a href=&quot;http://devel.unikernel.org/t/a-logo-for-unikernels/47&quot;&gt;devel.unikernel.org&lt;/a&gt;!&lt;/li&gt;
&lt;/ul&gt;

></content>
  </entry>
  
  <entry>
    <title>CodeMesh 2015</title>
    <link href="http://amirchaudhry.com/codemesh2015"/>
    <author>Amir Chaudhry</author>
    <updated>2015-11-03T11:15:00+00:00</updated>
    <id>http://amirchaudhry.com/codemesh2015</id>
    <content type="html">
&lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;3035d63437234495ad1cddc117321ff0&quot; data-ratio=&quot;1.33333333333333&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;These are the slides from my talk today at CodeMesh. This time around I was
earlier in the schedule so I get to enjoy the rest of the conference! If
you’re reading this at the conference now, please do follow the link in my
talk to rate it and give me feedback!&lt;/p&gt;

&lt;p&gt;The specific items I reference in the talk are below with links to more
information.&lt;/p&gt;

&lt;h4 id=&quot;security-and-the-bitcoin-piñata&quot;&gt;Security and the Bitcoin Piñata&lt;/h4&gt;

&lt;p&gt;This is a bounty where we have locked away some bitcoin in a unikernel that is
running our new TLS stack.  This was a new model of running a bounty and has
proven a great way to stress test the code in the wild.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Some background to the Bitcoin Pinata&lt;/em&gt;, &lt;a href=&quot;http://amirchaudhry.com/bitcoin-pinata/&quot;&gt;“The Bitcoin Piñata!”&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;The Pinata itself&lt;/em&gt; &lt;a href=&quot;http://ownme.ipredator.se&quot;&gt;“You have reached the BTC Piñata”&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Looking over the results of the attempts&lt;/em&gt; &lt;a href=&quot;https://mirage.io/blog/bitcoin-pinata-results&quot;&gt;“Reviewing the Bitcoin Piñata”&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can follow up with more of the background work on the TLS stack by looking
at the paper,
&lt;a href=&quot;https://nqsb.io/nqsbtls-usenix-security15.pdf&quot;&gt;“Not-quite-so-broken TLS: lessons in re-engineering a security protocol specification and implementation”&lt;/a&gt;
and find other users of the libraries via &lt;a href=&quot;https://nqsb.io&quot;&gt;https://nqsb.io&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;automated-deployment&quot;&gt;Automated deployment&lt;/h4&gt;

&lt;p&gt;I’ve previously written about how we do unikernel deployments for MirageOS.
Although the scripts themselves have evolved and become more sophisticated,
these are still a good introduction.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Initial post on building a unikernel&lt;/em&gt; &lt;a href=&quot;http://amirchaudhry.com/from-jekyll-to-unikernel-in-fifty-lines/&quot;&gt;“From Jekyll to Unikernel”&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;The deployment steps for one of our repos&lt;/em&gt; &lt;a href=&quot;http://amirchaudhry.com/heroku-for-unikernels-pt1&quot;&gt;“Heroku for Unikernels: Part 1 - Automated deployment”&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Some thoughts on what the future might look like&lt;/em&gt; &lt;a href=&quot;http://amirchaudhry.com/heroku-for-unikernels-pt2&quot;&gt;“Heroku for Unikernels: Part 2 - Self Scaling Systems”&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;summoning-on-demand&quot;&gt;Summoning on demand&lt;/h4&gt;

&lt;p&gt;The work on summoning unikernels was presented at Usenix this year and you can
read the paper, &lt;a href=&quot;http://anil.recoil.org/papers/2015-nsdi-jitsu.pdf&quot;&gt;“Jitsu: Just-In-Time Summoning of Unikernels”&lt;/a&gt;.
The example I showed in the talk can be found at &lt;a href=&quot;http://www.jitsu.v0.no&quot;&gt;http://www.jitsu.v0.no&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;other-resources&quot;&gt;Other resources&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;The MirageOS website&lt;/em&gt;, &lt;a href=&quot;https://mirage.io&quot;&gt;https://mirage.io&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;The &lt;a href=&quot;https://github.com/mirage/mirage-skeleton&quot;&gt;mirage-skeleton repo&lt;/a&gt;, which has a number of examples&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;em&gt;The Rump Kernels site&lt;/em&gt;, &lt;a href=&quot;http://rumpkernel.org&quot;&gt;http://rumpkernel.org&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;The Nymote site&lt;/em&gt;, &lt;a href=&quot;http://nymote.org&quot;&gt;http://nymote.org&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;*The &lt;a href=&quot;http://nymote.org/blog/2013/introducing-nymote/&quot;&gt;Introductory post&lt;/a&gt; is a useful place to start.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To get involved in the development work, please do join the
&lt;a href=&quot;http://lists.xenproject.org/cgi-bin/mailman/listinfo/mirageos-devel&quot;&gt;MirageOS devel list&lt;/a&gt; and try out some of the examples for
yourselves!&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>Governance of OCaml.org</title>
    <link href="http://amirchaudhry.com/governance-ocaml-org"/>
    <author>Amir Chaudhry</author>
    <updated>2015-09-18T14:00:00+00:00</updated>
    <id>http://amirchaudhry.com/governance-ocaml-org</id>
    <content type="html">
&lt;p&gt;&lt;a href=&quot;http://ocaml.org/governance.html&quot;&gt;&lt;img src=&quot;http://amirchaudhry.com/images/web/governance-page.png&quot; alt=&quot;Governance Screenshot&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For several months, I’ve been working with the maintainers of OCaml.org
projects to define and document the governance structure around the domain
name. I wrote about this &lt;a href=&quot;http://amirchaudhry.com/towards-governance-framework-for-ocamlorg/&quot;&gt;previously&lt;/a&gt; and I’m pleased to say that
the work for this phase has concluded, with the document now &lt;a href=&quot;http://ocaml.org/governance.html&quot;&gt;live&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;recurring-themes&quot;&gt;Recurring themes&lt;/h2&gt;

&lt;p&gt;There were some recurring themes that cropped up during my email discussions
with people and I thought it would be useful to present a summary of them,
along with my thoughts. Broadly, the discussions revolved around the
philosophy of the document, the extent of its scope, and the depth of coverage.
This discourse was very important for refining and improving the document.&lt;/p&gt;

&lt;h3 id=&quot;ideals-and-reality&quot;&gt;Ideals and Reality&lt;/h3&gt;

&lt;p&gt;Some of the comments I received were essentially that the document did not
represent how we &lt;em&gt;should&lt;/em&gt; be organising ourselves.  There was occasionally the
sense (to me at least) that the only appropriate form of governance is a fully
democratic and representational one.&lt;/p&gt;

&lt;p&gt;That would entail things like official committees, ensuring that various
communities/organisations were represented, and perhaps establishing some
form of electoral processes. Overall, something relatively formal and quite
carefully structured. Of course, instituting such an arrangement would
necessarily require somewhat involved procedures, documentation, and
systems — as well as the volunteer time to manage those processes.&lt;/p&gt;

&lt;p&gt;These may be noble aims — and I expect one day we’ll be closer to such ideals —
but one of the critical factors for the current approach was that we record
how things are &lt;em&gt;right now&lt;/em&gt;.  In my experience, anything else is purely
aspirational and therefore would have little bearing with how things currently
function.&lt;/p&gt;

&lt;p&gt;To put it another way, the current document must not describe the structure we
&lt;em&gt;desire&lt;/em&gt; to have, but the organisation we &lt;em&gt;actually&lt;/em&gt; have — warts and all. 
Yes, right now we have a &lt;a href=&quot;https://en.wikipedia.org/wiki/Benevolent_dictator_for_life&quot;&gt;BDFL&lt;/a&gt;*, who personally owns the domain and
therefore can do as he pleases with it.  Irrespective of this, the community
has been able to come together, coordinate themselves, and build very useful
things around the domain name.  This has happened independently of any formal
community processes and, in my view, has largely been driven by people
supporting each other’s works and generally trying to ‘do the right thing’.&lt;/p&gt;

&lt;p&gt;Another aspect to point out is that is that such documents and procedures are
not &lt;em&gt;necessary&lt;/em&gt; for success. This is obvious when you consider how far the
OCaml community has come in such a relatively short space of time. Given this,
one might argue why we need any kind of written governance at all.&lt;/p&gt;

&lt;p&gt;To answer that, I would say that once things grow beyond a certain scale, I
believe it helps to gather the implicit behaviours and document them clearly. 
This allows us to be more systematic in our approach and also enables
newcomers to understand how things work and become involved more quickly. In
addition, having a clear record of how things operate in the present is an
invaluable tool in helping to clarify what exactly we should work on changing
for the future.&lt;/p&gt;

&lt;h3 id=&quot;extent-of-scope&quot;&gt;Extent of scope&lt;/h3&gt;

&lt;p&gt;It’s a little confusing to consider that ‘OCaml.org’ is simultaneously a
collection of websites, infrastructural components, and projects.
Disambiguating these from the wider OCaml community was important, and
relatively straightforward, but there were a few questions about the
relationship between the domain name and the projects that use it.&lt;/p&gt;

&lt;p&gt;Although the governance covers the OCaml.org &lt;em&gt;domain name&lt;/em&gt;, it necessarily has
an impact on the projects which make use of it.  This matters because anything
under the OCaml.org domain will, understandably, be taken as authoritative by
users at large. In a way, OCaml.org becomes the sum of the projects under it,
hence it’s necessary to have some lightweight stipulations about what is
expected of those projects.&lt;/p&gt;

&lt;p&gt;Projects themselves are free to organise as they wish (BDFL/Democracy/etc) but
there are certain guiding principles for OCaml.org that those projects are
expected to be compatible with (e.g. openness, community-related, comms, etc).
These stipulations are already met by the current projects, so codifying them
is intended to clarify expectations for new projects.&lt;/p&gt;

&lt;h3 id=&quot;depth-of-coverage&quot;&gt;Depth of coverage&lt;/h3&gt;

&lt;p&gt;Another of the recurring points was how the current document didn’t capture
every eventuality.  Although I could have attempted this, the end result would
have been a lengthy document, full of legalese, that I expect very few people
would ever read.  The document would also have needed to cover eventualities
that have not occurred (yet) and/or may be very unlikely to occur.&lt;/p&gt;

&lt;p&gt;Of course, this is &lt;em&gt;not&lt;/em&gt; a legal document. No-one can be compelled to comply
with it and there are very few sanctions for anyone who chooses not to comply.
However, for those who’ve agreed to it, acceptance signals a clear intent to
take part in a &lt;a href=&quot;https://en.wikipedia.org/wiki/Social_contract&quot;&gt;social contract&lt;/a&gt; with the others involved in work
around the domain name.&lt;/p&gt;

&lt;p&gt;Overall, I opted for a lightweight approach that would cover how we typically
deal with issues and result in a more readable document.  Areas that are
‘unchartered’ for us should be dealt with as they have been so far — through
discussion and action — and can subsequently be incorporated when we have a
better understanding of the issues and solutions.&lt;/p&gt;

&lt;h2 id=&quot;a-solid-starting-position&quot;&gt;A solid starting position&lt;/h2&gt;

&lt;p&gt;The current version of the governance document is now live and it is very much
intended to be a living document, representing where we are now.  As the
community continues to grow and evolve, we should revisit this to ensure it is
accurate and is meeting our needs.&lt;/p&gt;

&lt;p&gt;I look forward to seeing where the community takes it!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;In case you’re interested, the set of links below covers the journey from
beginning to end of this process.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Background — &lt;a href=&quot;http://amirchaudhry.com/towards-governance-framework-for-ocamlorg/&quot;&gt;“Towards a governance framework for OCaml.org”&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Discussion phase — &lt;a href=&quot;http://lists.ocaml.org/pipermail/infrastructure/2015-August/000518.html&quot;&gt;“Adopting a Governance framework…”&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Tracking issue — &lt;a href=&quot;https://github.com/ocaml/ocaml.org/issues/700&quot;&gt;ocaml/ocaml.org#700&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Ratification — &lt;a href=&quot;http://lists.ocaml.org/pipermail/infrastructure/2015-September/000540.html&quot;&gt;“Governance document is now ratified…”&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Governance doc — &lt;a href=&quot;http://ocaml.org/governance.html&quot;&gt;“Governance of the OCaml.org domain”&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;footnote&quot;&gt;
    * Yeah, I made sure to add Xavier to the BDFL list before publishing
    this. :)
&lt;/p&gt;
&lt;p class=&quot;footnote&quot;&gt;
    Thanks to Ashish, Philippe and Anil for comments on an earlier draft.
&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Unikernels at PolyConf!</title>
    <link href="http://amirchaudhry.com/unikernels-polyconf-2015"/>
    <author>Amir Chaudhry</author>
    <updated>2015-07-04T13:00:00+00:00</updated>
    <id>http://amirchaudhry.com/unikernels-polyconf-2015</id>
    <content type="html">
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Updated: 14 July (see below)&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;1076a457408d42d7bb9da27dd88b68c8&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Above are my slides from a talk at PolyConf this year.  I was originally going
to talk about the &lt;a href=&quot;http://amirchaudhry.com/brewing-miso-to-serve-nymote/&quot;&gt;MISO&lt;/a&gt; tool stack and personal clouds (i.e. how we’ll
build &lt;a href=&quot;http://nymote.org/blog/2013/introducing-nymote/&quot;&gt;towards Nymote&lt;/a&gt;) but after some informal conversations with
other speakers and attendees, I thought it would be &lt;em&gt;way&lt;/em&gt; more useful to focus
the talk on unikernels themselves — specifically, the ‘M’ in MISO.  As a
result, I ended up completely rewriting all my slides!  Since I pushed this
post just before my talk, I hope that I’m able to stick to the 30min time slot
(I’ll find out very soon).&lt;/p&gt;

&lt;p&gt;In the slides I mention a number of things we’ve done with MirageOS so I
thought it would be useful to list them here.  If you’re reading this at the
conference now, please do give me feedback at the end of my talk!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Thomas’ Hello world and REST service&lt;/em&gt;, &lt;a href=&quot;http://roscidus.com/blog/blog/2014/07/28/my-first-unikernel/&quot;&gt;“My First Unikernel”&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Magnus on&lt;/em&gt; &lt;a href=&quot;http://www.skjegstad.com/blog/2015/03/25/mirageos-vm-per-url-experiment/&quot;&gt;“A unikernel experiment: A VM for every URL”&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Mindy on &lt;a href=&quot;http://www.somerandomidiot.com/blog/2014/08/19/i-am-unikernel/&quot;&gt;“I Am Unikernel (and So Can You!)”&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;The &lt;a href=&quot;https://github.com/mirage/mirage-skeleton&quot;&gt;mirage-skeleton repo&lt;/a&gt;, which has a number of examples&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;em&gt;My previous posts (referred to in the talk)&lt;/em&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;http://amirchaudhry.com/from-jekyll-to-unikernel-in-fifty-lines/&quot;&gt;“From Jekyll site to Unikernel in fifty lines of code.”&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;http://amirchaudhry.com/heroku-for-unikernels-pt1&quot;&gt;“Towards Heroku for Unikernels”&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;http://amirchaudhry.com/bitcoin-pinata/&quot;&gt;“The Bicoin Piñata!”&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;http://nymote.org/blog/2013/introducing-nymote/&quot;&gt;“Introducing Nymote”&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To get involved in the development work, please do join the
&lt;a href=&quot;http://lists.xenproject.org/cgi-bin/mailman/listinfo/mirageos-devel&quot;&gt;MirageOS devel list&lt;/a&gt; and try out some of the examples for
yourselves!&lt;/p&gt;

&lt;h3 id=&quot;update--14-july&quot;&gt;Update — 14 July&lt;/h3&gt;

&lt;p&gt;The video of the talk is now available and it’s embedded below. Overall, the
talk seemed to go well and there was enough time for questions.&lt;/p&gt;

&lt;p&gt;At the end of the talk, I asked people to give me feedback and shared a URL,
where I had a very short form. I had 21 responses with a rating of
&lt;strong&gt;4.52/5.00&lt;/strong&gt;.  I’m quite pleased with this and the feedback was also useful.
In a nutshell, the audience seemed to really appreciate the walkthrough (which
encourages me to make some screencasts).  There was one comment that I didn’t
do enough justice to the security benefits.  Specifically, I could have drawn
more reference to the OCaml TLS work, which prevents bugs like heartbleed.
Security is definitely one of the key benefits of MirageOS unikernels (see
&lt;a href=&quot;https://mirage.io/blog/why-ocaml-tls&quot;&gt;here&lt;/a&gt;), so I’ll do more to emphasise that next time.&lt;/p&gt;

&lt;p&gt;Here’s the video and I should mention that the slides seem to be a few
seconds ahead. You’ll notice that I’ve left the feedback link live, too. If
you’d like to tell me what you think of the talk, please do so! There are some
additional comments at the end of this post.&lt;/p&gt;

&lt;div class=&quot;flex-video&quot;&gt;
    &lt;iframe width=&quot;540&quot; height=&quot;304&quot; src=&quot;https://www.youtube.com/embed/nZLy19eRWLk&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;!-- I find it a little awkward watching myself give a talk, especially when I
recognise things I should have said (or obvious mistakes). 
 --&gt;
&lt;p&gt;Finally, here are few things I should clarify:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Security is one of the critical benefits, which is why we need new systems
for personal clouds (rather than legacy stacks).&lt;/li&gt;
  &lt;li&gt;We still get to use all the existing tools for storage (e.g. EBS), it
doesn’t have to be Irmin.&lt;/li&gt;
  &lt;li&gt;The &lt;a href=&quot;https://mirage.io/blog/introducing-irmin&quot;&gt;Introducing Irmin&lt;/a&gt; post is the one I was trying to point
an audience member at.&lt;/li&gt;
  &lt;li&gt;When I mention the DNS server, I said it was 200MB when I actually meant
200&lt;strong&gt;KB&lt;/strong&gt;. More info in the &lt;a href=&quot;http://nymote.org/docs/2013-asplos-mirage.pdf&quot;&gt;MirageOS ASPLOS paper&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;I referred to the &lt;a href=&quot;http://hubofallthings.com&quot;&gt;“HAT Project”&lt;/a&gt; and you should also check out the
&lt;a href=&quot;http://mor1.github.io/publications/pdf/aarhus15-databox.pdf&quot;&gt;“Databox paper”&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;A summary of other unikernel approaches is also &lt;a href=&quot;http://www.linux.com/news/enterprise/cloud-computing/819993-7-unikernel-projects-to-take-on-docker-in-2015/&quot;&gt;available&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

></content>
  </entry>
  
  <entry>
    <title>Towards Heroku for Unikernels: Part 2 - Self Scaling Systems</title>
    <link href="http://amirchaudhry.com/heroku-for-unikernels-pt2"/>
    <author>Amir Chaudhry</author>
    <updated>2015-04-03T15:30:00+00:00</updated>
    <id>http://amirchaudhry.com/heroku-for-unikernels-pt2</id>
    <content type="html">
&lt;p&gt;In the &lt;a href=&quot;http://amirchaudhry.com/heroku-for-unikernels-pt1/&quot;&gt;previous post&lt;/a&gt; I described the continuous end-to-end system
that we’ve set up for some of the MirageOS projects — automatically going from
a &lt;code class=&quot;highlighter-rouge&quot;&gt;git push&lt;/code&gt; all the way to live deployment, with everything under
version-control.&lt;/p&gt;

&lt;p&gt;Everything I described previously already exists and you can set up the
workflow for yourself, the same way many others have done with the Travis CI
scripts for testing/build.  However, there are a range of exciting
possibilities to consider if we’re willing to extrapolate &lt;em&gt;just a little&lt;/em&gt; from
the tools we have right now.  The rest of this post explores these ideas and
considers how we might extend our system.&lt;/p&gt;

&lt;p&gt;Previously, we had finished the backbone of the workflow and I discussed a few
ideas about how we should flesh it out — namely more testing and some form of
logging/reporting.  There’s substantially more we could do when we consider
how lean and nimble unikernels are, especially if we speculate about the
systems we could create as our &lt;a href=&quot;http://amirchaudhry.com/brewing-miso-to-serve-nymote/&quot;&gt;toolstack&lt;/a&gt; matures.  A couple of
things immediately come to mind.&lt;/p&gt;

&lt;p&gt;The first is the ability to boot a unikernel only when it is required, which
opens up the possibility of highly-elastic infrastructure.  The second is the
ease with which we can push, pull or otherwise distribute unikernels
throughout a system, allowing new forms of deployment to both cloud and
embedded systems. We’ll consider these in turn and see where they take us,
comparing with the current ‘mirage-decks’ deployment I described in
&lt;a href=&quot;http://amirchaudhry.com/heroku-for-unikernels-pt1/&quot;&gt;Part 1&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;demand-driven-clouds&quot;&gt;Demand-driven clouds&lt;/h2&gt;

&lt;p&gt;The way cloud services are currently provisioned means that you may have
services operating and consuming resources (CPU, memory, etc), even when there
is no demand for them. It would be significantly more efficient if we could
just &lt;em&gt;activate&lt;/em&gt; a service when required and then shut it down again when the
demand has passed.  In our case, this would mean that when a unikernel is
‘deployed to production’, it doesn’t actually have to be &lt;em&gt;live&lt;/em&gt; — it merely
needs to be ready to boot when demand arises.  With tools like
&lt;a href=&quot;https://github.com/MagnusS/jitsu&quot;&gt;Jitsu&lt;/a&gt; (Just-In-Time Summoning of Unikernels), we can work
towards this kind of architecture.&lt;/p&gt;

&lt;h3 id=&quot;summon-when-required&quot;&gt;Summon when required&lt;/h3&gt;

&lt;p&gt;Jitsu allows us to have unikernels sitting in storage then ‘summon’ them into
existence.  This can occur in response to an incoming request and with &lt;em&gt;no
discernible latency&lt;/em&gt; for the requester. While unikernels are inactive, they
consume only the actual physical storage required and thus do not take up any
CPU cycles, nor RAM, etc. This means that more can be achieved with fewer
resources and it would significantly improve things like utilization rates of
hardware and power efficiency.&lt;/p&gt;

&lt;p&gt;In the case of the &lt;a href=&quot;http://decks.openmirage.org&quot;&gt;decks.openmirage.org&lt;/a&gt; unikernel that I
discussed last time, it would mean that the site would only come online if
someone had requested it and would shut down again afterwards.&lt;/p&gt;

&lt;p&gt;In fact, we’ve already been working on this kind of system and
&lt;a href=&quot;https://www.usenix.org/conference/nsdi15/technical-sessions/presentation/madhavapeddy&quot;&gt;Jitsu will be presented at NSDI&lt;/a&gt; in Oakland, California this May.
In the spirit of looking ahead, there’s more we could do.
&lt;!-- ([PDF][jitsu-paper]) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;hyper-elastic-scaling&quot;&gt;Hyper-elastic scaling&lt;/h3&gt;

&lt;p&gt;At the moment, Jitsu lets you set up a system where unikernels will boot in
response to incoming requests.  This is already pretty cool but we could take
this a step further.  If we can boot unikernels on demand, then we could use
that to build a system which can automate the &lt;em&gt;scale-out&lt;/em&gt; of those services to
match demand.  We could even have that system work across multiple machines,
not just one host.  So how would all this look in practice for ‘mirage-decks’?&lt;/p&gt;

&lt;h4 id=&quot;auto-scaling-and-dispersing-our-slide-decks&quot;&gt;Auto-scaling and dispersing our slide decks&lt;/h4&gt;

&lt;p&gt;Our previous toolchain automatically boots the new unikernel as soon as it is
pulled from the git repo.  Using Jitsu, our deployment machine would pull the
unikernel but leave it in the repo — it would only be activated when someone
requests access to it.  Most of the time, it may receive no traffic and
therefore would remain ‘turned off’ (let’s ignore webcrawlers for now). When
someone requests to see a slide deck, the unikernel would be booted and
respond to the request.  In time it can be turned off again, thus freeing
resources.  So far, so good.&lt;/p&gt;

&lt;p&gt;Now let’s say that a certain slide deck becomes &lt;em&gt;really&lt;/em&gt; popular (e.g. posted
to HackerNews or Reddit).  Suddenly, there are &lt;em&gt;many&lt;/em&gt; incoming requests and we
want to be able to serve them all.  We can use the one unikernel, on one
machine, until it is unable to handle the load efficiently.  At this point,
the system can create new copies of that unikernel and automatically balance
across them. These unikernels don’t need to be on the same host and we should
be able to spin them up on different machines.&lt;/p&gt;

&lt;p&gt;To stretch this further, we can imagine coordinating the creation of those new
unikernels nearer the &lt;em&gt;source&lt;/em&gt; of that demand, for example starting off on a
European cloud, then spinning up on the East coast US and finally over to the
West coast of the US.  All this could happen seamlessly and the process can
continue until the demand passes or we reach a predefined limit — after all,
given that we pay for the machines, we don’t really want to turn a Denial of
&lt;em&gt;Service&lt;/em&gt; into a Denial of &lt;em&gt;Credit&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;After the peak, the system can automatically scale back down to being largely
dormant — ready to react when the next wave of interest occurs.&lt;/p&gt;

&lt;h4 id=&quot;can-we-actually-do-this&quot;&gt;Can we actually do this?&lt;/h4&gt;

&lt;p&gt;If you think this is somewhat fanciful, that’s perfectly understandable — as I
mentioned previously, this post is very much about &lt;em&gt;extrapolating&lt;/em&gt; from where
the tools are right now.  However, unikernels actually make it very easy to
run quick experiments which indicate that we could iterate towards what I’ve
described.&lt;/p&gt;

&lt;p&gt;A recent and somewhat extreme experiment ran a
&lt;a href=&quot;http://www.skjegstad.com/blog/2015/03/25/mirageos-vm-per-url-experiment/&quot;&gt;unikernel VM for &lt;em&gt;each URL&lt;/em&gt;&lt;/a&gt;.  Every URL on a small static
site was served from its own, self-contained unikernel, complete with it’s own
web server (even the ‘rss.png’ icon was served separately).  You can read the
post to see how this was done and it also led to an interesting
&lt;a href=&quot;http://lists.xenproject.org/archives/html/mirageos-devel/2015-03/msg00110.html&quot;&gt;discussion&lt;/a&gt; on the mailing list (e.g. if you’re only serving a
single item, why use a web server at all?).  Of course, this was just an
&lt;em&gt;experiment&lt;/em&gt; but it demonstrates what is possible now and how we can iterate,
uncover new problems, and move forward.  One such question is how to
automatically handle networking during a scale-out, and this is an area were
tools like &lt;a href=&quot;http://amirchaudhry.com/brewing-miso-to-serve-nymote/#signpost&quot;&gt;Signpost&lt;/a&gt; can be of use.&lt;/p&gt;

&lt;p&gt;Overall, the model I’ve described is quite different to the way we currently
use the cloud, where the overhead of a classic OS is constantly consuming
resources.  Although it’s tempting to stick with the same frame of reference
we have today we should recognise that the current model is inextricably
intertwined with the traditional software stacks themselves.  Unikernels allow
completely new ways of creating, distributing and managing software and it
takes some thought in order to fully exploit their benefits.&lt;/p&gt;

&lt;p&gt;For example, having a demand-driven system means we can deliver more services
from just the one set of physical hardware — because not all those services
would be consuming resources at the same time.  There would also be a dramatic
impact on the economics, as billing cycles are currently measured in hours,
whereas unikernels may only be active for seconds at a time.  In addition to
these benefits, there are interesting possibilities in how such scale-outs can
be coordinated across &lt;em&gt;different&lt;/em&gt; devices.&lt;/p&gt;

&lt;h2 id=&quot;hybrid-deployments&quot;&gt;Hybrid deployments&lt;/h2&gt;

&lt;p&gt;As we move to a world with more connected devices, the software and services
we create will have to operate across both the cloud and embedded systems.
There have been many names for this kind of distributed system, ranging from
ubiquitous computing to dust clouds and the ‘Internet of Things’ but they all
share the same idea of running software at the edges of the network (rather
than just cloud deployments).&lt;/p&gt;

&lt;p&gt;When we consider the toolchain we already have, it’s not much of a stretch to
imagine that we could also build and store a unikernel for ARM-based
deployments.  Those unikernels can be deployed onto embedded devices and
currently we target the &lt;a href=&quot;http://openmirage.org/wiki/xen-on-cubieboard2&quot;&gt;Cubieboard2&lt;/a&gt;.&lt;/p&gt;

&lt;!-- For the example of our static websites, it would be straightforward to serve them from cubieboards that reside from our homes, thus further minimising the costs to run such infrastructure.  However, they could be configured such that if demands begins to peak, then an automated scale-out can occur from the Cubieboard onto the public cloud instead.   --&gt;

&lt;!-- You could even set up such a system to push the well-tested unikernels out onto embedded devices elsewhere (think IoT). In this way you only need a Minimal cloud infrastructure for your IoT service, in order to push new code out to end points, where the work is actually done (within a user's home). Think of the Goodnight Lamp, This can drastically reduce cost and any loss of the central service means end devices can keep working. (requires Signpost?).  Have a central location where devices can pick up updates from. Doesn't need to do any more than coordinating stuff and devices can work P2P. V cheap to run and make money from selling devices. --&gt;

&lt;p&gt;We could make such a system smarter. Instead of having the edge devices
constantly polling for updates, our deployment process could directly &lt;em&gt;push&lt;/em&gt;
the new unikernels out to them. Since these devices are likely to be behind
NATs and firewalls, tools like &lt;a href=&quot;http://amirchaudhry.com/brewing-miso-to-serve-nymote/#signpost&quot;&gt;Signpost&lt;/a&gt; could deal with the issue
of secure connectivity. In this way, the centralized deployment process
remains as a coordination point, whereas most of the workload is dealt with by
the devices the unikernels are running on.  If a central machine happens to be
unavailable for any reason, the edge-devices would continue to function as
normal.  This kind of arrangement would be ideal for Internet-of-Things style
deployments, where it could reduce the burden on centralised infrastructure
while still enabling continuous deployment.&lt;/p&gt;

&lt;p&gt;In this scenario, we could serve the traffic for ‘mirage-decks’ from a
unikernel on a Cubieboard2, which could further minimise the cost of running
such infrastructure.  It could be configured such that if demand begins to
peak, then an automated scale-out can occur from the Cubieboard2 directly out
onto the public cloud and/or &lt;em&gt;other Cubieboards&lt;/em&gt;. Thus, we can still make use
of third-party resources but only when needed and of the kind we desire.  Of
course, running a highly distributed system leads to other needs.&lt;/p&gt;

&lt;h2 id=&quot;remember-all-the-things&quot;&gt;Remember all the things&lt;/h2&gt;

&lt;p&gt;When running services at scale it becomes important to track the activity and
understand what is taking place in the system. In practice, this means logging
the activity of the unikernels, such as when and where they were created and
how they perform.  This becomes even more complex for a distributed system.&lt;/p&gt;

&lt;p&gt;If we also consider the logging needs of a highly-elastic system, then another
problem emerges.  Although scaling up a system is straightforward to
conceptualise, scaling it back &lt;em&gt;down&lt;/em&gt; again presents new challenges.  Consider
all the additional logs and data that have been created during a scale-out — 
all of that history needs to be merged back together as the system contracts.
To do that properly, we need tools designed to manage distributed data
structures, with a consistent notion of merges.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://amirchaudhry.com/brewing-miso-to-serve-nymote/#irmin&quot;&gt;Irmin&lt;/a&gt; addresses these kinds of needs and it enables a style of
programming very similar to the Git workflow, where distributed nodes fork,
fetch, merge and push data between each other.  Building an end-to-end logging
system with Irmin would enable data to be managed and merged across different
nodes and keep track of activity, especially in the case of a scale down. The
ability to capture such information also means the opportunity to provide
analytics to the creators of those unikernels around performance and usage
characteristics.&lt;/p&gt;

&lt;p&gt;The use of Irmin wouldn’t be limited to logging as the unikernels themselves
could use it for managing data in lieu of other file systems.  I’ll refrain
from extrapolating too far about this particular tool as it’s still under
rapid development and we’ll write more as it matures.&lt;/p&gt;

&lt;!-- With something like [Irmin][irmin-post], you may even be able to receive notifications about the type of incoming traffic and raise the limit if you so wish.  May be able to configure your embedded devices to scale up to the hosted provider if there's sufficient demand. --&gt;

&lt;h2 id=&quot;on-immutable-infrastructure&quot;&gt;On immutable infrastructure&lt;/h2&gt;

&lt;p&gt;You may have noticed that one of the benefits of the unikernel approach arises
because the artefacts themselves are not altered once they’re created. 
This is in line with the recent resurgence of ideas around ‘immutable
infrastructure’.  Although there isn’t a precise definition of this, the
approach is that machines are treated as replaceable and can be regularly re
provisioned with a known state.  Various tools help the existing systems to
achieve this but in the case of unikernels, everything is already under
version control, which makes managing a deployment much easier.&lt;/p&gt;

&lt;p&gt;As our approach is already compatible with such ideas, we can take it a step
further.  Immutable infrastructure essentially means the artefact produced
&lt;em&gt;doesn’t matter&lt;/em&gt;. It’s disposable because we have the means to easily recreate
it.  In our current example, we still ship the unikernel around.  In order to
make this ‘fully immutable’, we’d have to know the state of all the packages
and code used when &lt;em&gt;building&lt;/em&gt; the unikernel. That would give us a complete
manifest of which package versions were pulled in and from which sources. 
Complete information like this would allow us to recreate any given unikernel
in a highly systematic way.  If we can achieve this, then it’s the manifest
which generates everything else that follows.&lt;/p&gt;

&lt;p&gt;In this world-view, the unikernel itself becomes something akin to caching.
You use it because you don’t want to rebuild it from source — even though
unikernels are quicker to build than a whole OS/App stack.  For more security
critical applications, you may want to be assured of the code that is pulled
in, so you examine the manifest file before rebuilding for yourself. This also
allows you to pin to specific versions of libraries so that you can explicitly
adjust the dependencies as you wish.  So how do we encode the manifest?  This
is another area where Irmin can help as it can keep track of the state of
package history and can recreate the environment that existed for any given
build run.  That build run can then be recreated elsewhere without having to
manually specify package versions.&lt;/p&gt;

&lt;p&gt;There’s a lot more to consider here as this kind of approach opens up new
avenues to explore. For the time being, we can recognise that the unikernel
approach lends itself to the achieving immutable infrastructure.&lt;/p&gt;

&lt;h2 id=&quot;what-happens-next&quot;&gt;What happens next?&lt;/h2&gt;

&lt;p&gt;As I mentioned at the beginning of this post, most of what I’ve described is
speculative. I’ve deliberately extrapolated from where the tools are now so as
to provoke more thoughts and discussion about how this new model can be used
in the wild.  Some of the things we’re already working towards but there are
many other uses that may surprise us — we won’t know until we get there and
experimenting is half the fun.&lt;/p&gt;

&lt;p&gt;We’ll keep marching on with more libraries, better tooling and improving
quality.  What happens with unikernels in the rest of 2015 is largely up to
the wider ecosystem.&lt;/p&gt;

&lt;p&gt;That means you.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Edit: discuss this post on &lt;a href=&quot;http://devel.unikernel.org/t/towards-heroku-for-unikernels/27/1&quot;&gt;devel.unikernel.org&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p class=&quot;footnote&quot;&gt;
Thanks to Thomas Gazagnaire and Richard Mortier for comments on an earlier draft.
&lt;/p&gt;

&lt;!-- TODO- xref with Nymote somehow.  The above infra is needed for those apps to provide a resilient service. etc --&gt;

></content>
  </entry>
  
  <entry>
    <title>Towards Heroku for Unikernels: Part 1 - Automated deployment</title>
    <link href="http://amirchaudhry.com/heroku-for-unikernels-pt1"/>
    <author>Amir Chaudhry</author>
    <updated>2015-03-31T14:30:00+00:00</updated>
    <id>http://amirchaudhry.com/heroku-for-unikernels-pt1</id>
    <content type="html">
&lt;p&gt;In my &lt;a href=&quot;http://amirchaudhry.com/from-jekyll-to-unikernel-in-fifty-lines/&quot;&gt;Jekyll to Unikernel post&lt;/a&gt;, I described an automated
workflow that would take your static website, turn it into a MirageOS
unikernel, and then store that unikernel in a git repo for later deployment. 
Although it was written from the perspective of a static website, the process
was applicable to any MirageOS project.
This post covers how things have progressed since then and the kind of
automated, end-to-end deployments that we can achieve with unikernels.&lt;/p&gt;

&lt;p&gt;If you’re already familiar with the above-linked post then it should be clear
that this will involve writing a few more scripts and ensuring
they’re in the right place.  The rest of this post will go through a real
world example of such an automated system, which we’ve set up for building and
deploying the unikernel that serves our slide decks — &lt;a href=&quot;https://github.com/mirage/mirage-decks&quot;&gt;mirage-decks&lt;/a&gt;.  Once
you’ve gone though this post, you should be able to recreate such a workflow
for your own needs. In Part 2 of this series I’ll build on this post and
consider what the possibilities could be if we extended the system using
some of our &lt;a href=&quot;http://amirchaudhry.com/brewing-miso-to-serve-nymote/&quot;&gt;other tools&lt;/a&gt; — thus arriving at something very much
like our own Heroku for Unikernels.&lt;/p&gt;

&lt;h3 id=&quot;standardised-build-scripts&quot;&gt;Standardised build scripts&lt;/h3&gt;

&lt;p&gt;Almost all of our OCaml projects now use Travis CI for build and testing (and
deployment). In fact, there are so many libraries now that we recently put
together an &lt;a href=&quot;https://github.com/ocaml/ocaml-travisci-skeleton&quot;&gt;OCaml Travis Skeleton&lt;/a&gt;, which means we don’t
have to manually keep the scripts in sync across all our repos — and fewer
copy/paste/edits means fewer mistakes.&lt;/p&gt;

&lt;p&gt;If you’re familiar with the build scripts from &lt;a href=&quot;http://amirchaudhry.com/from-jekyll-to-unikernel-in-fifty-lines#setting-up-travis-ci&quot;&gt;last time&lt;/a&gt;, then
you can browse the new scripts and you’ll see that they’re broadly similar. 
In many cases you may well be able to depend on one or other of the scripts
directly and for a handful of scenarios, you can fork and patch them to
suit you (i.e. for MirageOS unikernels).  We can do this because we’ve made it
quick to set up an OCaml environment using an &lt;a href=&quot;https://launchpad.net/~avsm&quot;&gt;Ubuntu PPA&lt;/a&gt;. The rest
of the work is done by the &lt;code class=&quot;highlighter-rouge&quot;&gt;mirage&lt;/code&gt; tool itself so once that’s installed, the
build process becomes fairly straightforward. The complexity around secure
keys was also &lt;a href=&quot;http://amirchaudhry.com/from-jekyll-to-unikernel-in-fifty-lines/#sending-travis-a-private-ssh-key&quot;&gt;covered last time&lt;/a&gt;, which allowed us to commit the
final unikernel to a deployment repo.  That means the remaining step is
to automate the deployment itself.&lt;/p&gt;

&lt;h3 id=&quot;automated-deployment-of-unikernels&quot;&gt;Automated deployment of unikernels&lt;/h3&gt;

&lt;p&gt;Committing the unikernel to a deployment repo is where the previous post ended
and a &lt;a href=&quot;http://amirchaudhry.com/unikernels-for-everyone/&quot;&gt;number of people&lt;/a&gt; forged ahead and wrote about their
experiences deploying onto AWS and Linode.  Many of these deployments
(understandably) involve a number of quite manual steps. It would be
particularly useful to construct a set of scripts that can be fully automated,
such that a &lt;code class=&quot;highlighter-rouge&quot;&gt;git push&lt;/code&gt; to a repo will automatically run through the cycle of
building, testing, storing and &lt;em&gt;activating&lt;/em&gt; a new unikernel.  We’ve done
exactly this with some of our repos and this post will talk through those
scripts.&lt;/p&gt;

&lt;h4 id=&quot;the-deployment-options--xen-or-nix&quot;&gt;The deployment options — Xen or *nix&lt;/h4&gt;

&lt;p&gt;MirageOS unikernels can currently be built for Xen and Unix backends.  This is
a straightforward step and typically the build matrix is already set up to
test that both of them build as expected. For this post, I’ve only considered
the Xen backend as that’s our chosen deployment method but it would be equally
feasible to deploy the unix-based unikernels onto a *nix machine in much the
same way. 
In this sense, you get to choose whether you want to deploy the unikernels
onto a &lt;a href=&quot;http://en.wikipedia.org/wiki/Hypervisor#Classification&quot;&gt;Hypervisor&lt;/a&gt; (for isolation and security) or whether running
them as unix-processes better suits your needs. 
&lt;!-- If you step back and think about what this means, it's *almost*
like considering the
[difference between a Type-1 and Type-2 hypervisor][hyp-class] and selecting
between them. --&gt;
The unikernel approach means that &lt;em&gt;both&lt;/em&gt; options are open to
you, with little more than a command-line flag between them.&lt;/p&gt;

&lt;p&gt;In terms of the deployment machines there are several options to consider. The
most obvious is to set up a dedicated host, where you have full access to the
machine and can &lt;a href=&quot;http://wiki.xenproject.org/wiki/Xen_Project_Beginners_Guide&quot;&gt;install Xen&lt;/a&gt;.  Another is to have a machine
running on EC2 and &lt;a href=&quot;http://somerandomidiot.com/blog/2014/08/19/i-am-unikernel/&quot;&gt;create scripts&lt;/a&gt; to deal with unikernels. You
could also build and deploy onto &lt;a href=&quot;http://openmirage.org/wiki/xen-on-cubieboard2&quot;&gt;Xen on the Cubieboard2&lt;/a&gt;. If you’d
rather test out the complete system first, you could set up an appropriate
&lt;a href=&quot;http://www.skjegstad.com/blog/2015/01/19/mirageos-xen-virtualbox/&quot;&gt;machine in Virtualbox&lt;/a&gt; to work with.&lt;/p&gt;

&lt;p&gt;For our workflow, we use Xen unikernels which we deploy to a dedicated host. 
For the sake of brevity, I won’t go into the details of how to set up
the machine but you can follow the instructions linked above.&lt;/p&gt;

&lt;h4 id=&quot;the-scripts-for-decksopenmirageorg&quot;&gt;The scripts for decks.openmirage.org&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/mirage/mirage-decks&quot;&gt;Decks&lt;/a&gt; is the source repo that holds many of our slides, which
we’ve presented at conferences and events over the years (I admit that I have
yet to &lt;a href=&quot;https://github.com/mirage/mirage-decks/issues/49&quot;&gt;add mine&lt;/a&gt;).  The repo compiles to a unikernel that can
then serve those slides, as you see at &lt;a href=&quot;http://decks.openmirage.org&quot;&gt;decks.openmirage.org&lt;/a&gt;. For
maximum fun-factor, we usually run that unikernel from a Cubieboard2 when
giving talks.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://amirchaudhry.com/images/singles/mirage-cubieboard.jpg&quot; alt=&quot;mirage-decks-on-cubieboard&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The toolchain for this unikernel includes build, store and deploy.  We’ll
recap the first two steps before going through the final one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build&lt;/strong&gt; — In the root of the decks source repo, you’ll notice the
&lt;code class=&quot;highlighter-rouge&quot;&gt;.travis.yml&lt;/code&gt; file, which fetches the standard build script mentioned earlier.
Building the unikernel proceeds according to the options in the build matrix.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;na&quot;&gt;language&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;c&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;wget https://raw.githubusercontent.com/ocaml/ocaml-travisci-skeleton/master/.travis-mirage.sh&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bash -ex .travis-mirage.sh&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;OCAML_VERSION=4.02 MIRAGE_BACKEND=unix MIRAGE_NET=socket&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;OCAML_VERSION=4.02 MIRAGE_BACKEND=unix MIRAGE_NET=direct&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;OCAML_VERSION=4.02 MIRAGE_BACKEND=xen&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;MIRAGE_ADDR=&quot;46.43.42.134&quot; MIRAGE_MASK=&quot;255.255.255.128&quot; MIRAGE_GWS=&quot;46.43.42.129&quot;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;DEPLOY=1&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;global&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;secure&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;....&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;encrypted&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;....&quot;&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;secure&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;....&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;encrypted&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;....&quot;&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;secure&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;....&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;encrypted&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;....&quot;&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;In this case, two builds occur for Unix and one for Xen with different
parameters being used for each.  If you look at the
&lt;a href=&quot;https://github.com/mirage/mirage-decks/blob/master/.travis.yml&quot;&gt;actual travis file&lt;/a&gt;, you’ll notice there are 26 lines of
encrypted data.  This is how we pass the deployment key to Travis CI, so that
it has push access to the &lt;em&gt;separate&lt;/em&gt; &lt;a href=&quot;https://github.com/mirage/mirage-decks-deployment&quot;&gt;mirage-decks-deployment&lt;/a&gt;
repo.  You can read the section in the previous post to see how we
&lt;a href=&quot;https://github.com/mirage/mirage-decks-deployment&quot;&gt;send Travis a private key&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Store&lt;/strong&gt; — One of the combinations in the build matrix (configured for Xen),
is intended for deployment.  When that unikernel is completed, an additional
part of the script is triggered that pushes it into the deployment repo.&lt;/p&gt;

&lt;h4 id=&quot;deployment-scripts&quot;&gt;Deployment scripts&lt;/h4&gt;

&lt;p&gt;After the ‘build’ and ‘store’ steps above, we have a
&lt;a href=&quot;https://github.com/mirage/mirage-decks-deployment&quot;&gt;deployment repository&lt;/a&gt; with a collection of Xen unikernels. For
this stage, we have a new set of scripts that live in this repo alongside those
unikernels. Specifically, you’ll notice a folder called &lt;code class=&quot;highlighter-rouge&quot;&gt;scripts&lt;/code&gt; that
contains four files.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
├── Makefile
├── README.md
├── scripts
│   ├── crontab
│   ├── deploy.sh
│   ├── install-hooks.sh
│   └── post-merge.hook
...&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;A quick summary of the setup is that we clone the repo onto our deployment
machine and install some hooks there.  Then a simple cronjob will perform
&lt;code class=&quot;highlighter-rouge&quot;&gt;git pull&lt;/code&gt; at regular intervals.  If a merge event occurs, then it means the
repo has been updated and another script is triggered. That script removes the
currently running unikernel and boots the latest version from the repo.  It’s
fairly straightforward and I’ll explain what each of the files does below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Makefile&lt;/strong&gt; - After cloning the repo, run &lt;code class=&quot;highlighter-rouge&quot;&gt;make install&lt;/code&gt;.  This will trigger
&lt;code class=&quot;highlighter-rouge&quot;&gt;install-hooks.sh&lt;/code&gt; to set things up appropriately. It’s worth remembering that
from this point on, the git repo on the deployment machine will not be
identical to the deployment repo on GitHub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;install-hooks.sh&lt;/strong&gt; —  The first two lines ensure that the commands
will be run from the root of the git repo.  The third line symlinks the
&lt;code class=&quot;highlighter-rouge&quot;&gt;post-merge.hook&lt;/code&gt; file into the appropriate place within the &lt;code class=&quot;highlighter-rouge&quot;&gt;.git&lt;/code&gt; directory.
This is the folder where customized &lt;a href=&quot;http://www.git-scm.com/book/en/v2/Customizing-Git-Git-Hooks&quot;&gt;git hooks&lt;/a&gt; need to be placed in
order to work.  The final line adds the file &lt;code class=&quot;highlighter-rouge&quot;&gt;scripts/crontab&lt;/code&gt; to the
deployment machine’s list of cron jobs.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;ROOT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;git rev-parse &lt;span class=&quot;nt&quot;&gt;--show-toplevel&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c&quot;&gt;# obtain path to root of repo&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$ROOT&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# symlink the post-merge.sh file into the .git/hooks folder&lt;/span&gt;
ln &lt;span class=&quot;nt&quot;&gt;-sf&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$ROOT&lt;/span&gt;/scripts/post-merge.hook &lt;span class=&quot;nv&quot;&gt;$ROOT&lt;/span&gt;/.git/hooks/post-merge
crontab scripts/crontab                &lt;span class=&quot;c&quot;&gt;# add to list of cron jobs&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;crontab&lt;/strong&gt; — This file is a cronjob that sets up the deployment machine to
perform a &lt;code class=&quot;highlighter-rouge&quot;&gt;git pull&lt;/code&gt; on the deployment repo at regular intervals. Changing the
file in the repo will ultimately cause it to be updated on the deployment
machine (cf. &lt;code class=&quot;highlighter-rouge&quot;&gt;deploy.sh&lt;/code&gt;). At the moment, it’s set to run every 11 minutes.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;/11 &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/mirage-decks-deployment &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; git pull&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;post-merge.hook&lt;/strong&gt; — Since we’ve already run the Makefile, this file is
symlinked from the appropriate place on the deployment machine’s copy of the
repo.  When a &lt;code class=&quot;highlighter-rouge&quot;&gt;git pull&lt;/code&gt; results in new commits being downloaded and merged,
then this script is triggered immediately afterwards.  In this case, it just
executes the &lt;code class=&quot;highlighter-rouge&quot;&gt;deploy.sh&lt;/code&gt; script.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;ROOT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;git rev-parse &lt;span class=&quot;nt&quot;&gt;--show-toplevel&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c&quot;&gt;# obtain path to root of repo&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$ROOT&lt;/span&gt;/scripts/deploy.sh           &lt;span class=&quot;c&quot;&gt;# execute the deploy script&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;deploy.sh&lt;/strong&gt; — This is where the work actually happens and you’ll notice that
there really isn’t much to do!  I’ve commented in the code below to explain
what’s going on.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;VM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;mir-decks
&lt;span class=&quot;nv&quot;&gt;XM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;xm

&lt;span class=&quot;nv&quot;&gt;ROOT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;git rev-parse &lt;span class=&quot;nt&quot;&gt;--show-toplevel&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$ROOT&lt;/span&gt;

crontab scripts/crontab     &lt;span class=&quot;c&quot;&gt;# Update cron scripts&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Identify the latest build in the repo and then use&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# the generic Xen config script to construct a&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# specific file for this unikernel. Essentially,&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 'sed' just does a find/replace on two elements and&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# the result is written to a new file.&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;KERNEL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$ROOT&lt;/span&gt;/xen/&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat &lt;/span&gt;xen/latest&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
sed &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;s,@VM@,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$VM&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;,g; s,@KERNEL@,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$KERNEL&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$VM&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.xen,g&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &amp;lt; &lt;span class=&quot;nv&quot;&gt;$XM&lt;/span&gt;.conf.in &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;| &lt;span class=&quot;nv&quot;&gt;$KERNEL&lt;/span&gt;/&lt;span class=&quot;nv&quot;&gt;$XM&lt;/span&gt;.conf

&lt;span class=&quot;c&quot;&gt;# Move into the folder with the latest unikernel.&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Remove any uncompressed Xen images found there&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# (since we may be starting a rebuilt unikernel).&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Unzip the compressed unikernel.&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$KERNEL&lt;/span&gt;
rm &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$VM&lt;/span&gt;.xen
bunzip2 &lt;span class=&quot;nt&quot;&gt;-k&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$VM&lt;/span&gt;.xen.bz2

&lt;span class=&quot;c&quot;&gt;# Instruct Xen to remove the currently running&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# unikernel and then start up the new one we&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# just unzipped.&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$XM&lt;/span&gt; destroy &lt;span class=&quot;nv&quot;&gt;$VM&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;true
sudo&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$XM&lt;/span&gt; create &lt;span class=&quot;nv&quot;&gt;$XM&lt;/span&gt;.conf&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;At this point, we now have a complete system!
Of course, this arrangement isn’t perfect and
there are number of things we could improve.  For example, it depends on a
cron job, which means it may take a while before a new unikernel is live.
Replacing this with something triggered on a webhook could be an improvement,
but it does mean exposing an end-point to the internet.  The scripts will also
redeploy the &lt;em&gt;current&lt;/em&gt; unikernel, even if the only change is to the crontab
schedule.  Some extra work in the deploy script, using some git tools, might
work around this.&lt;/p&gt;

&lt;p&gt;Despite these minor issues, we do have a completely end-to-end workflow that
takes us all the way from pushing some new changes to deploying a new
unikernel!  An additional feature is that &lt;em&gt;everything&lt;/em&gt; is checked into version
control. Right from the scripts to completed artefacts (including a method of
transmitting secure keys/data, over public systems).&lt;/p&gt;

&lt;p&gt;There is minimal work done outside the code you’ve already seen, though there
is obviously some effort involved in setting up the deployment machine. 
However, as mentioned earlier, you could either use the unix-based unikernels
or experiment with &lt;a href=&quot;http://www.skjegstad.com/blog/2015/01/19/mirageos-xen-virtualbox/&quot;&gt;Virtualbox VM with Xen&lt;/a&gt; just to test out this
entire toolchain.&lt;/p&gt;

&lt;p&gt;Overall, we’ve only added around 20 lines of code to the initial 50 or so that
we use for the Travis CI build.  So for &lt;em&gt;less than 100 lines of code&lt;/em&gt;, we have
a &lt;em&gt;complete&lt;/em&gt; end-to-end system that can take a MirageOS project from a
&lt;code class=&quot;highlighter-rouge&quot;&gt;git push&lt;/code&gt;, all the way through to a live deployment.&lt;/p&gt;

&lt;h3 id=&quot;fleshing-out-the-backbone&quot;&gt;Fleshing out the backbone&lt;/h3&gt;

&lt;p&gt;In our current system, if the unikernel &lt;em&gt;builds&lt;/em&gt; appropriately then we just
assume it’s ok to deploy to production. Fire and forget! What could
possibly go wrong!  Of course, this is a somewhat naive approach and for any
critical system it would be better to hook in some additional things.&lt;/p&gt;

&lt;h4 id=&quot;testing-frameworks&quot;&gt;Testing frameworks&lt;/h4&gt;

&lt;p&gt;One obvious improvement would be to introduce a more thorough testing regimen,
which would include running unit tests as part of the build. Indeed, various
libraries in the MirageOS project are already moving towards this model
(e.g see the &lt;a href=&quot;http://openmirage.org/wiki/weekly-2015-03-11#Qualityandtest&quot;&gt;notes&lt;/a&gt; for links).&lt;/p&gt;

&lt;p&gt;It’s even possible to go beyond unit tests and introduce more
functional/systems/stress testing on the complete unikernel before permitting
deployment.  This would help to surface any wider issues as services interact
and we could even simulate network conditions — achieving something like
‘staging on steroids’.&lt;/p&gt;

&lt;h4 id=&quot;logging-and-notifications&quot;&gt;Logging and notifications&lt;/h4&gt;

&lt;p&gt;The scenario we have above also assumes that things work smoothly and nobody
needs to know anything.  It would be useful to hook in some form of logging
and reporting, such that when a new unikernel is deployed a notification can
be sent/stored somewhere. In the short term, there are likely existing tools
and ways of doing this so it would be a matter of putting them together.&lt;/p&gt;

&lt;h4 id=&quot;looking-ahead&quot;&gt;Looking ahead&lt;/h4&gt;

&lt;p&gt;Overall, with the above model, we can easily set up a system where we go from
writing code, to testing it via CI, to deploying it to a staging server for
functional tests, and finally pushing it out into live deployment.  All of
this can be done with a few additional scripts and minimal interaction from
the developer.  We can achieve this because we don’t have to concern ourselves
with large blobs of code, multiple different systems and keeping environments
in sync. Once we’ve built the unikernel, the rest almost becomes trivial.&lt;/p&gt;

&lt;p&gt;This is close enough for me to declare it as a ‘Heroku for unikernels’ but
obviously, there’s much more we can (and should) do with such a system. If we
extrapolate &lt;em&gt;just a little&lt;/em&gt; from where we are now, there are a range of
exciting possibilities to consider in terms of automation, scalability and
distributed systems.  Especially if we incorporate other aspects of the
&lt;a href=&quot;http://amirchaudhry.com/brewing-miso-to-serve-nymote/&quot;&gt;toolstack we’re working towards&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://amirchaudhry.com/heroku-for-unikernels-pt2/&quot;&gt;Part 2&lt;/a&gt; of this series is where I’ll consider these possibilities, which will
be more speculative and less constrained.  It will cover the kinds of systems
we can create once the tools are more mature and will touch on ideas around
hyper-elastic clouds, embedded systems and what this means for the concept of
immutable infrastructure.&lt;/p&gt;

&lt;p&gt;Since we already have the ‘backbone’ of the toolchain in place, it’s easier to
see where it can be extended and how.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Edit: The second part of this series is now up -
“&lt;a href=&quot;http://amirchaudhry.com/heroku-for-unikernels-pt2/&quot;&gt;Self Scaling Systems&lt;/a&gt;”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Edit2: discuss this post on &lt;a href=&quot;http://devel.unikernel.org/t/towards-heroku-for-unikernels/27/1&quot;&gt;devel.unikernel.org&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p class=&quot;footnote&quot;&gt;
Thanks to Anil Madhavapeddy and Thomas Leonard for comments on an earlier
draft and Richard Mortier for his work on the deployment toolchain.
&lt;/p&gt;
&lt;!--
[jitsu-repo]: https://github.com/MagnusS/jitsu
[jitsu-x]: http://www.skjegstad.com/blog/2015/03/25/mirageos-vm-per-url-experiment
[sp-post]: http://amirchaudhry.com/brewing-miso-to-serve-nymote/#signpost
[cron-conf]: http://en.wikipedia.org/wiki/Cron#Configuration_file
--&gt;
></content>
  </entry>
  
  <entry>
    <title>The Bitcoin Piñata!</title>
    <link href="http://amirchaudhry.com/bitcoin-pinata"/>
    <author>Amir Chaudhry</author>
    <updated>2015-02-10T15:25:00+00:00</updated>
    <id>http://amirchaudhry.com/bitcoin-pinata</id>
    <content type="html">
&lt;p&gt;Last summer we announced the beta release of a clean-slate implementation of
TLS in pure OCaml, alongside a &lt;a href=&quot;http://openmirage.org/blog/introducing-ocaml-tls&quot;&gt;series of blog posts&lt;/a&gt; that described
the libraries and the thinking behind them.  It took two hackers six months
— starting on &lt;a href=&quot;https://goo.gl/maps/GpcQs&quot;&gt;the beach&lt;/a&gt; —  to get the stack to that point and
their &lt;a href=&quot;https://tls.openmirage.org&quot;&gt;demo server&lt;/a&gt; is still going strong. Since then, the team has
continued working and recently &lt;a href=&quot;http://media.ccc.de/browse/congress/2014/31c3_-_6443_-_en_-_saal_2_-_201412271245_-_trustworthy_secure_modular_operating_system_engineering_-_hannes_-_david_kaloper.html#video&quot;&gt;presented&lt;/a&gt; at the 31st Chaos
Communication Congress.&lt;/p&gt;

&lt;p&gt;The latest example goes quite a bit further than a server that just displays
the handshake. This time, the team have constructed a Xen unikernel that’s
holding a private key to a bitcoin address and are asking people to try and
&lt;em&gt;break in&lt;/em&gt;. Hence, they’ve called it the &lt;strong&gt;&lt;a href=&quot;http://ownme.ipredator.se&quot;&gt;Bitcoin Piñata&lt;/a&gt;&lt;/strong&gt;!*&lt;/p&gt;

&lt;h2 id=&quot;what-the-bitcoin-piñata-does&quot;&gt;What the Bitcoin Piñata does&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://ownme.ipredator.se&quot;&gt;&lt;img src=&quot;http://amirchaudhry.com/images/btc-pinata/btc-pinata.png&quot; alt=&quot;Bitcoin Pinata&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Piñata unikernel will transmit its private bitcoin key if you can
successfully set up a TLS connection &lt;strong&gt;but&lt;/strong&gt; it’s rigged so that it will &lt;em&gt;only&lt;/em&gt;
create that connection if you can present the certificate it’s expecting to
see — which has been &lt;em&gt;signed appropriately&lt;/em&gt;.  Of course, you’re not being given
the secret key with which to do that signing and that means there should be
&lt;em&gt;no way&lt;/em&gt; for anyone to form a TLS connection with the Piñata.
In order to get the private key to the bitcoin address, you’ll have to smash
your way in.&lt;/p&gt;

&lt;p&gt;Helpfully (perhaps), things are set up so that you &lt;em&gt;can&lt;/em&gt; make the Piñata talk
to itself, allowing you to &lt;a href=&quot;http://en.wikipedia.org/wiki/Man-in-the-middle_attack&quot;&gt;eavesdrop&lt;/a&gt; on a successful connection and
see the encrypted traffic. In addition, all the &lt;a href=&quot;https://github.com/mirleft/btc-pinata&quot;&gt;code and libraries&lt;/a&gt; are
open-source so you can look through any of the codebase.  There isn’t anything
that anyone will have to reverse engineer, which should make this a little
more enjoyable.&lt;/p&gt;

&lt;p&gt;This contest is set to run until mid-March or whenever the coins are taken.
If someone does manage to get in, please do let us know how!&lt;/p&gt;

&lt;h3 id=&quot;the-rubber-hose-approach&quot;&gt;The Rubber-hose approach&lt;/h3&gt;

&lt;p&gt;Of course there are many other ways to get at the private key and as many
people like to comment, the human element is sometimes the weakest link — 
after all, a safe is only as secure as the person with the combination.&lt;/p&gt;

&lt;p&gt;In this case, there is obviously a secret key or certificate &lt;em&gt;somewhere&lt;/em&gt;
that could be presented so it may be tempting to go hunting for that. Perhaps
phishing attempts on the authors may yield a way forward, or maybe just
straight-forward &lt;a href=&quot;http://en.wikipedia.org/wiki/Rubber-hose_cryptanalysis&quot;&gt;Rubber-hose cryptanalysis&lt;/a&gt;!  Sure, these
options might provide a result&lt;sup&gt;†&lt;/sup&gt; but this is meant to be fun.
The authors haven’t specified any rules but please be nice and focus on the
technical things around the Piñata&lt;sup&gt;‡&lt;/sup&gt;. Don’t be this guy.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://amirchaudhry.com/images/btc-pinata/pinata-kid-bat.gif&quot; alt=&quot;Pinata-kid-bat&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;whats-the-point-of-this-contest&quot;&gt;What’s the point of this contest?&lt;/h2&gt;

&lt;p&gt;Even though the Bitcoin Piñata is clearly a contest, nobody is deluding
themselves into thinking that if the coins are still there in March, that
somehow the stack can be declared ‘undefeated’ — while pleasing, that
result wouldn’t necessarily &lt;em&gt;prove&lt;/em&gt; anything. Contests have their place but as
Bruce Schneier &lt;a href=&quot;https://www.schneier.com/crypto-gram/archives/1998/1215.html#contests&quot;&gt;already pointed out&lt;/a&gt;, they are not useful mechanisms
to judge security.&lt;/p&gt;

&lt;p&gt;However, it does give us the chance to engage in some shameless self-promotion
and try to draw vast amounts of attention to the work. That, and the chance to
stress-test the stack in the wild. Ultimately, we &lt;em&gt;want&lt;/em&gt; to use this code in
production but must take a lot of care to get there and want to be sure that
it can bear up. This is just one more way of learning what happens when
putting something ‘real’ out there.&lt;/p&gt;

&lt;p&gt;If the Bitcoins &lt;em&gt;do&lt;/em&gt; end up being taken, then there’s &lt;em&gt;definitely&lt;/em&gt; something
valuable that the team can learn from that. Regardless of the Piñata, if we
have more people exploring the &lt;a href=&quot;https://github.com/mirleft/&quot;&gt;TLS codebase&lt;/a&gt; or trying it out for
themselves, it will undoubtedly be A Good Thing.&lt;/p&gt;

&lt;h5 id=&quot;responsible-sidenote&quot;&gt;Responsible sidenote&lt;/h5&gt;

&lt;p&gt;&lt;em&gt;For clarity and to avoid any doubt, please be aware that the TLS codebase is
missing external code audits and is not yet intended for use in any security
critical applications.  All development is done in the open, including the
tracking of &lt;a href=&quot;https://github.com/mirleft/ocaml-tls/issues?q=label%3A%22security+concern%22+&quot;&gt;security-related issues&lt;/a&gt;, so please do consider
auditing the code, testing it in your services and reporting issues.&lt;/em&gt;&lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;* If you've never come across a piñata before, hopefully 
    the gif in the post gives you an idea.  If not, the
    &lt;a href=&quot;https://en.wikipedia.org/wiki/Pinata&quot;&gt;wiki page&lt;/a&gt;
    will surely help, where I learned that the origin may be Chinese rather
    than Spanish!
&lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;&lt;sup&gt;&amp;dagger;&lt;/sup&gt; Of course, I'm not suggesting that
    anyone would actually go this far. I'm simply acknowledging that there is
    a human factor and asking that we put it aside.
&lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;&lt;sup&gt;&amp;Dagger;&lt;/sup&gt; Edit to add: After seeing
    &lt;a href=&quot;https://twitter.com/andreasdotorg/status/565193815183876096&quot;&gt;
    Andrea's tweet&lt;/a&gt; I should point out that &lt;strong&gt;any part of
    MirageOS&lt;/strong&gt;, including the networking stack, OCaml runtime etc is a
    legitimate vector.  It's why there's a
    &lt;a href=&quot;https://raw.githubusercontent.com/mirleft/btc-pinata/master/opam-full.txt&quot;&gt;
    manifest of the libraries&lt;/a&gt; that have been used to build the Piñata!
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Edit: discuss this post on &lt;a href=&quot;http://devel.unikernel.org/t/the-bitcoin-pinata/26/1&quot;&gt;devel.unikernel.org&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>Unikernel demo at FOSDEM</title>
    <link href="http://amirchaudhry.com/unikernel-arm-demo-fosdem"/>
    <author>Amir Chaudhry</author>
    <updated>2015-02-06T17:50:00+00:00</updated>
    <id>http://amirchaudhry.com/unikernel-arm-demo-fosdem</id>
    <content type="html">
&lt;p&gt;Last weekend was spent at one of the world’s biggest open source conferences,
FOSDEM.  You can check out &lt;a href=&quot;http://nymote.org/blog/2014/fosdem-summary/&quot;&gt;last year’s review&lt;/a&gt; to get an idea of
the scale of the event. Since there’s no registration process, it’s difficult
to estimate how many people attend but given how many rooms there are, and how
full they are, it’s easily several thousand. I was impressed last year at how
smoothly things went and the same was true this year.&lt;/p&gt;

&lt;p&gt;The main reason to attend this time was to run a demo of MirageOS from an ARM
board — one of the main advances since the previous conference. I looked over
all the things we’d achieved since last year and put together a demo that
showcases some of the capabilities as well as being fun.&lt;/p&gt;

&lt;h3 id=&quot;2048-from-a-unikernel-on-an-arm-board&quot;&gt;2048 from a Unikernel on an ARM board&lt;/h3&gt;

&lt;p&gt;The demo was to serve the 2048 game from a Unikernel running on a Cubieboard2
with its own access point.  When people join the wifi network, they get
served a static page and can begin playing the game immediately.&lt;/p&gt;

&lt;p&gt;The components I needed for the demo were:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Code for the 2048 game — I was able to lift code from a
&lt;a href=&quot;https://github.com/ocamllabs/2048-tutorial/&quot;&gt;tutorial last year&lt;/a&gt;, which &lt;a href=&quot;http://erratique.ch&quot;&gt;Daniel&lt;/a&gt;, &lt;a href=&quot;http://www.lpw25.net&quot;&gt;Leo&lt;/a&gt;, &lt;a href=&quot;https://github.com/yallop&quot;&gt;Jeremy&lt;/a&gt; and
&lt;a href=&quot;http://gazagnaire.org&quot;&gt;Thomas&lt;/a&gt; all contributed to. It was first run at &lt;a href=&quot;http://cufp.org/2014/t7-leo-white-introduction-to-ocaml.html&quot;&gt;CUFP 2014&lt;/a&gt; then
adapted and presented at &lt;a href=&quot;http://booking.agilefaqs.com/functional-conf-2014#workshop-52-info&quot;&gt;Functional Conf&lt;/a&gt; in India (see the
&lt;a href=&quot;http://gazagnaire.org/fuconf14/&quot;&gt;IOCaml notebook&lt;/a&gt;).  Attendees wrote the code in OCaml, which was
then compiled into pure JavaScript (via &lt;a href=&quot;http://ocsigen.org/js_of_ocaml/&quot;&gt;js_of_ocaml&lt;/a&gt;). The result can be run
completely in the browser and only involves serving two files.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Code for making a static website — Since the game is completely
self-contained (one html file and one js file). I only need to convert a static
website into a unikernel.  That’s trivial and
&lt;a href=&quot;http://amirchaudhry.com/unikernels-for-everyone/&quot;&gt;many people have done it before&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;A Cubieboard with a wifi access point — There are pre-built images on the
&lt;a href=&quot;http://blobs.openmirage.org&quot;&gt;MirageOS website&lt;/a&gt;, which make part of this easy. However, getting the
wifi access point up involves a few more steps.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first two pieces should be straightforward and indeed, I had a working
unikernel serving the 2048 game within minutes (unix version on my laptop). 
The additional factors around the ARM deployment is where things were a little
more involved. Although this was technically straightforward to set up, it
still took a while to get all the pieces together.  A more detailed
description of the steps is in my &lt;a href=&quot;https://github.com/amirmc/fosdemo&quot;&gt;fosdemo repository&lt;/a&gt; and in
essence, it revolves around configuring the wifi access point and setting up a
bridge (thanks to &lt;a href=&quot;http://somerandomidiot.com&quot;&gt;Mindy&lt;/a&gt;, &lt;a href=&quot;http://www.skjegstad.com&quot;&gt;Magnus&lt;/a&gt; and &lt;a href=&quot;https://github.com/pqwy&quot;&gt;David&lt;/a&gt; for getting this
working).&lt;/p&gt;

&lt;p&gt;Once this was all up and running, it was a simple matter to configure the
board to boot the unikernel on startup, so that no manual intervention would
be required to set things up at the booth.&lt;/p&gt;

&lt;h4 id=&quot;running-the-demo&quot;&gt;Running the demo&lt;/h4&gt;

&lt;p&gt;I gave the demo at the Xen booth and it went very well.  There was a small
crowd throughout my time at the booth I’m convinced that the draw of a board
with glowing LEDs should not be underestimated.  Many people we’re happy to
connect to the access point and download the game to their browser but there
were two main things I learnt.&lt;/p&gt;

&lt;p&gt;Firstly, demos involving games will work if people actually &lt;em&gt;know&lt;/em&gt; the game.
This is obvious, but I’d assumed that most people had already played 2048 —
especially the crowd I’d expect to meet at FOSDEM.  It turned out that around
a third of people had no idea what to do when the game loaded onto their
browser. They stared blankly at it and then blankly at me.  Of course, it was
trivial to get them started and they were soon absorbed by it — but it still
felt like some of the ‘cool-factor’ had been lost.&lt;/p&gt;

&lt;p&gt;The second thing was that I tried to explain too much to people in much too
short a time.  This particular demo involved Xen unikernels, js_of_ocaml and a
Cubieboard2 with a wifi access point.
There’s a surprisingly large amount of technology there, which
is difficult explain to a complete newcomer within one or two minutes.  When
it was obvious someone hadn’t heard of unikernels, I focused on the approach
of library operating systems and the benefits that Mirage brings. If a visitor
was already familiar with the concept of unikernels, I could describe the rest
of the demo in more detail.&lt;/p&gt;

&lt;p&gt;Everything else did go well and next time I’d like to have a demo like this
running with &lt;a href=&quot;https://github.com/MagnusS/jitsu&quot;&gt;Jitsu&lt;/a&gt;.  That way, I could configure it so that a unikernel
would spin up, serve the static page and then spin down again. If we can
figure out the timing, then providing stats in the page about the lifetime of
that unikernel would also be great, but that’s for another time.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/amirmc/status/561525704161243137&quot;&gt;&lt;img src=&quot;http://amirchaudhry.com/images/web/fosdem15-tweet.png&quot; alt=&quot;Tweet at FOSDEM 2015&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5 id=&quot;sidenote-the-beginnings-of-a-personal-cloud&quot;&gt;Sidenote: The beginnings of a ‘personal cloud’&lt;/h5&gt;

&lt;p&gt;One of the things we’re keen to work towards is the idea of
&lt;a href=&quot;http://nymote.org&quot;&gt;personal clouds&lt;/a&gt;. It’s not a stretch to imagine that a Cubieboard2,
running the appropriate software, could act as one particular node in a
network of your own devices. In this instance it’s just hosting a fun and
simple game but more complex applications are also possible.&lt;/p&gt;

&lt;h3 id=&quot;huge-range-of-sessions-and-talks&quot;&gt;Huge range of sessions and talks&lt;/h3&gt;

&lt;p&gt;Of course, there was lots more going on than just my demo and I had a great
time attending the talks. Some in particular that stood out to me were those
in the &lt;a href=&quot;https://fosdem.org/2015/schedule/track/open_source_design/&quot;&gt;open source design&lt;/a&gt; room, which was a new addition this year. It
was great to learn that there are design people out there who would like to
contribute to open source (&lt;a href=&quot;https://twitter.com/amirmc&quot;&gt;get in touch&lt;/a&gt;, if that’s you!). I also had a
chance to meet (and thank!) Mike McQuaid in his &lt;a href=&quot;https://fosdem.org/2015/schedule/event/homebrew_the_good,_bad_and_ugly_of_osx_packaging/&quot;&gt;Homebrew talk&lt;/a&gt;.
FOSDEM is one of those great events where you can meet in person all those
folks you’ve only interacted with online.&lt;/p&gt;

&lt;p&gt;Overall, it was a great trip and I thoroughly recommend it if you’ve never
been before!&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>Brewing MISO to serve Nymote</title>
    <link href="http://amirchaudhry.com/brewing-miso-to-serve-nymote"/>
    <author>Amir Chaudhry</author>
    <updated>2015-01-20T14:00:00+00:00</updated>
    <id>http://amirchaudhry.com/brewing-miso-to-serve-nymote</id>
    <content type="html">
&lt;p&gt;The &lt;a href=&quot;http://nymote.org/blog/2013/introducing-nymote/&quot;&gt;mission of Nymote&lt;/a&gt; is to enable the creation of resilient
decentralised systems that incorporate privacy from the ground up, so that
users retain control of their networks and data.  To achieve this, we
reconsider all the old assumptions about how software is created in light of
the problems of the modern, networked environment.  Problems that will become
even more pronounced as more devices and sensors find their way into our lives.&lt;/p&gt;

&lt;p&gt;We want to make it simple for anyone to be able to run a piece of the cloud
for their own purposes and the first three applications Nymote targets are
Mail, Contacts and Calendars, but to get there, we first have to create solid
foundations.&lt;/p&gt;

&lt;h3 id=&quot;defining-the-bedrock&quot;&gt;Defining the bedrock&lt;/h3&gt;

&lt;p&gt;In order to create applications that work for the user, we first have to
create a robust and reliable software stack that takes care of fundamental
problems for us. In other words, to be able to assemble the applications we
desire, we must first construct the correct building blocks.&lt;/p&gt;

&lt;p&gt;We’ve taken a clean-slate approach so that we can build long-lasting solutions
with all the benefits of hindsight but none of the baggage. As
mentioned in earlier posts, there are three main components of the stack,
which are: &lt;a href=&quot;http://nymote.org/software/mirage/&quot;&gt;Mirage&lt;/a&gt; (OS for the Cloud/IoT), &lt;a href=&quot;http://nymote.org/software/irmin/&quot;&gt;Irmin&lt;/a&gt; (distributed datastore)
and &lt;a href=&quot;http://nymote.org/software/signpost/&quot;&gt;Signpost&lt;/a&gt; (identity and connectivity) - all built using the &lt;a href=&quot;http://ocaml.org&quot;&gt;OCaml&lt;/a&gt;
programming language.&lt;/p&gt;

&lt;h4 id=&quot;using-the-miso-stack-to-build-nymote&quot;&gt;Using the MISO stack to build Nymote&lt;/h4&gt;

&lt;p&gt;As you’ve already noticed, there’s a useful acronym for the above tools —
&lt;strong&gt;MISO&lt;/strong&gt;. Each of the projects mentioned is a serious undertaking in its own
right and each is likely to be impactful as a stand-alone concept.  However,
when used together we have the opportunity to create applications and services
with high levels of security, scalability and stability, which are not easy to
achieve using other means.&lt;/p&gt;

&lt;p&gt;In other words, MISO is the &lt;em&gt;toolstack&lt;/em&gt; that we’re using to build Nymote —
Nymote is the &lt;em&gt;decentralised system&lt;/em&gt; that works for its users.&lt;/p&gt;

&lt;p&gt;Each of the projects is at a different phase but they have all have made great
strides over the last year.&lt;/p&gt;

&lt;h4 id=&quot;mirage&quot;&gt;Mirage&lt;/h4&gt;

&lt;p&gt;Mirage — a library operating system that constructs unikernels — is the most
mature part of the stack. I previously wrote about the
&lt;a href=&quot;http://nymote.org/blog/2014/announcing-first-mirage-release/&quot;&gt;Mirage 1.0 release&lt;/a&gt; and only six months later we had an
&lt;a href=&quot;http://openmirage.org/blog/announcing-mirage-20-release&quot;&gt;impressive 2.0 release&lt;/a&gt;, with continuing advances throughout the year.
We achieved major milestones such as the ability to deploy unikernels to
ARM-based devices, as well as a clean-slate implementation of the transport
layer security (TLS) protocol.&lt;/p&gt;

&lt;p&gt;In addition to the development efforts, there have also been many
presentations to audiences, ranging from &lt;a href=&quot;http://amirchaudhry.com/describing-miso-entrepreneur-first-2014/&quot;&gt;small groups of startups&lt;/a&gt;
all the way to &lt;a href=&quot;http://media.ccc.de/browse/congress/2014/31c3_-_6443_-_en_-_saal_2_-_201412271245_-_trustworthy_secure_modular_operating_system_engineering_-_hannes_-_david_kaloper.html#video&quot;&gt;prestigious keynotes&lt;/a&gt; with 1000+ attendees.  Ever
since we’ve had ARM support, the talks themselves have been delivered from
unikernels running on Cubieboards and you can see the growing collection of
slides at &lt;a href=&quot;http://decks.openmirage.org&quot;&gt;decks.openmirage.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All of these activities have led to a tremendous increase in public awareness
of unikernels and the value they can bring to developing robust, modern
software as well as the promise of &lt;a href=&quot;https://medium.com/@darrenrush/after-docker-unikernels-and-immutable-infrastructure-93d5a91c849e&quot;&gt;immutable infrastructure&lt;/a&gt;.
As more people look to get involved and contribute to the codebase, we’ve also
begun curating a set of &lt;a href=&quot;https://github.com/mirage/mirage-www/wiki/Pioneer-Projects&quot;&gt;Pioneer Projects&lt;/a&gt;, which are suitable for a
range of skill-levels.&lt;/p&gt;

&lt;p&gt;You can find much more information on all the activities of 2014 in the
comprehensive &lt;a href=&quot;http://openmirage.org/blog/2014-in-review&quot;&gt;Mirage review post&lt;/a&gt;. As it’s the most mature
component of the MISO stack, anyone interested in the &lt;em&gt;development of code&lt;/em&gt;
towards Nymote should join the &lt;a href=&quot;http://lists.xenproject.org/cgi-bin/mailman/listinfo/mirageos-devel&quot;&gt;Mirage mailing list&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Source code&lt;/em&gt; - &lt;a href=&quot;https://github.com/mirage&quot;&gt;Mirage org on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;irmin&quot;&gt;Irmin&lt;/h4&gt;

&lt;p&gt;Irmin — a library to persist and synchronize distributed data structures —
made significant progress last year. It’s based on the principles of Git, the
distributed version control system, and allows developers to choose the
appropriate combination of consistency, availability and partition tolerance
for their needs.&lt;/p&gt;

&lt;p&gt;Early last year Irmin was released as an alpha with the ability to speak
‘fluent Git’ and by the summer, it was supporting user-defined merge
operations and fast in-memory views.  A couple of summer projects improved the
&lt;a href=&quot;http://gazagnaire.org/pub/FGM15.pdf&quot;&gt;merge strategies&lt;/a&gt; and synchronisation strategies, while an
external project — Xenstore — used Irmin to &lt;a href=&quot;http://openmirage.org/blog/introducing-irmin-in-xenstore&quot;&gt;add fault-tolerance&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;More recent work has involved a big clean-up in the user-facing API (with nice
&lt;a href=&quot;http://samoht.github.io/irmin/&quot;&gt;developer documentation&lt;/a&gt;) and a cleaner high-level REST API.
Upcoming work includes proper documentation of the REST API, which means Irmin
can more easily be used in non-OCaml projects, and full integration with
Mirage projects.&lt;/p&gt;

&lt;p&gt;Irmin is already being used to create
&lt;a href=&quot;https://opam.ocaml.org/packages/imaplet-lwt/imaplet-lwt.0.1.3/&quot;&gt;a version controlled IMAP server&lt;/a&gt; and
&lt;a href=&quot;https://github.com/samoht/dog&quot;&gt;a version controlled distributed log system&lt;/a&gt;. It’s no surprise
that the first major release is coming &lt;a href=&quot;https://github.com/mirage/irmin/issues?q=is%3Aopen+is%3Aissue+milestone%3A1.0.0&quot;&gt;very soon&lt;/a&gt;!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Source code&lt;/em&gt; - &lt;a href=&quot;https://github.com/mirage/irmin&quot;&gt;Irmin on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;signpost&quot;&gt;Signpost&lt;/h4&gt;

&lt;p&gt;Signpost will be a collection of libraries that aims to provide identity and
connectivity between devices.  Forming efficient connections between
end-points is becoming ever more important as the number of devices we own
increases. These devices need to be able to recognise and reach each-other,
regardless of their location on the network or the obstacles in between.&lt;/p&gt;

&lt;p&gt;This is very much a nascent project and it involves a lot of work on
underlying libraries to ensure that security aspects are properly considered.
As such, we must take great care in how we implement things and be clear about
any trade-offs we make. Our thoughts are beginning to converge on a design we
think will work and that we would entrust with our own data, but we’re
treating this as a case of ‘Here Be Dragons’.  This is a critical piece of the
stack and we’ll share what we learn as we chart our way towards it.&lt;/p&gt;

&lt;p&gt;Even though we’re at the design stage of Signpost, we did substantial work
last year to create the libraries we might use for implementation.  A
particularly exciting one is &lt;a href=&quot;https://github.com/MagnusS/jitsu&quot;&gt;Jitsu&lt;/a&gt; — which stands for Just In Time
Summoning of Unikernels. This is a DNS server that spawns unikernels in
response to DNS requests and boots them in real-time with no perceptible lag
to the end user.  In other words, it makes much more efficient use of
resources and significantly reduces latency of services for end-users —
services are only run &lt;em&gt;when&lt;/em&gt; they need to be, in the &lt;em&gt;places&lt;/em&gt; they need to be.&lt;/p&gt;

&lt;p&gt;There’s also been lots of efforts on other libraries that will help us
&lt;em&gt;iterate towards&lt;/em&gt; a complete solution. Initially, we will use pre-existing
implementations but in time we can take what we’ve learned and create more
robust alternatives. Some of the libraries are listed below (but note the
friendly disclaimers!).&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Source code&lt;/em&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dsheets/ocaml-sodium&quot;&gt;Bindings to libsodium&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dsheets/ocaml-dnscurve&quot;&gt;Implementation of DNSCurve&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dsheets/ocaml-libmacaroons&quot;&gt;Bindings to libmacaroons&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;ocaml&quot;&gt;OCaml&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;http://ocaml.org&quot;&gt;OCaml&lt;/a&gt; is a mature, powerful and highly pragmatic language.  It’s
proven ideal for creating robust systems applications and
&lt;a href=&quot;http://ocaml.org/learn/companies.html&quot;&gt;many others&lt;/a&gt; also recognise this.  We’re using it to create all the
tools you’ve read about so far and we’re also helping to improve the ecosystem
around it.&lt;/p&gt;

&lt;p&gt;One of the major things we’ve been involved with is the coordination of the
OCaml Platform, which combines the OCaml compiler with a coherent set of tools
and workflows to be more productive in the language and speed up development
time.  We presented the first major release of these efforts at OCaml 2014 and
you can &lt;a href=&quot;http://ocaml.org/meetings/ocaml/2014/ocaml2014_7.pdf&quot;&gt;read the abstract&lt;/a&gt; or &lt;a href=&quot;https://www.youtube.com/watch?v=jxhtpQ5nJHg&amp;amp;list=UUP9g4dLR7xt6KzCYntNqYcw&quot;&gt;watch the video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There’s more to come, as we continue to improve the tooling and also support
the community in &lt;a href=&quot;http://amirchaudhry.com/towards-governance-framework-for-ocamlorg&quot;&gt;other ways&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;early-steps-towards-applications&quot;&gt;Early steps towards applications&lt;/h3&gt;

&lt;p&gt;Building blocks are important but we also need to push towards working
applications.  There are different approaches we’ve taken to this, which
include building prototypes, wireframing use-cases and implementing features
with other toolstacks.  Some of this work is also part of a larger
&lt;a href=&quot;http://usercentricnetworking.eu&quot;&gt;EU funded project&lt;/a&gt;* and below are brief summaries of the things we’ve
done so far. We’ll expand on them as we do more over time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mail&lt;/strong&gt; - As mentioned above, a prototype IMAP server exists (&lt;a href=&quot;https://opam.ocaml.org/packages/imaplet-lwt/imaplet-lwt.0.1.3/&quot;&gt;IMAPlet&lt;/a&gt;)
which uses Irmin to store data. This is already able to connect to a client to
serve mail. The important feature is that it’s an IMAP server which is version
controlled in the backend and can expose a REST API from the mailstore quite
easily.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contacts&lt;/strong&gt; - We first made wireframe mockups of the features we might like
in a contacts app (to follow in later post) and then built a
&lt;a href=&quot;https://github.com/yansh/contacts-app&quot;&gt;draft implementation&lt;/a&gt;. To get here, code was first written in OCaml
and then put through the &lt;a href=&quot;http://ocsigen.org/js_of_ocaml/&quot;&gt;js_of_ocaml&lt;/a&gt; compiler. This is valuable as it
takes us closer to a point where we can build networks using our address books
and have the system take care of sharing details in a privacy-conscious manner
and with minimal maintenance. The &lt;a href=&quot;http://yansnotes.blogspot.co.uk/2015/01/work-summary-ocaml-labs.html&quot;&gt;summary post&lt;/a&gt; has more detail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Calendar&lt;/strong&gt; - This use-case was approached in a completely different way as
part of a hackathon last year. A rough but functional prototype was built over
one weekend, with a team formed at the event.  It was centralised but it
tested the idea that a service which integrates intimately with your life (to
the point of being very invasive) can provide disproportionate benefits.  The
&lt;a href=&quot;http://seedcamp.com/seedhack-5-0/&quot;&gt;experience report&lt;/a&gt; describes the weekend and our app — Clarity —
won first place. This was &lt;em&gt;great&lt;/em&gt; validation that the features are desirable
so we need to work towards a decentralised, privacy-conscious version.&lt;/p&gt;

&lt;h3 id=&quot;time-to-get-involved&quot;&gt;Time to get involved!&lt;/h3&gt;

&lt;p&gt;The coming year represents the best time to be working on the MISO stack and
using it to make Nymote a reality.  All source code is publicly available and
the projects are varied enough that there is something for everyone.  Browse
through issues, consider the &lt;a href=&quot;https://github.com/mirage/mirage-www/wiki/Pioneer-Projects&quot;&gt;projects&lt;/a&gt; or simply write online and
share with us the things you’d like to see.
This promises to be an exciting year!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sign up to the &lt;a href=&quot;http://nymote.us5.list-manage.com/subscribe?u=8a83b2d5453bba2ee5838b4ad&amp;amp;id=a41245094c&quot;&gt;Nymote mailing list&lt;/a&gt; to keep up to date!&lt;/em&gt;&lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;* The research leading to these results has received
funding from the European Union's Seventh Framework Programme FP7/2007-2013
under the UCN project, grant agreement no 611001.
&lt;/p&gt;

&lt;!-- ========================================================= --&gt;

></content>
  </entry>
  
  <entry>
    <title>Unikernels for everyone!</title>
    <link href="http://amirchaudhry.com/unikernels-for-everyone"/>
    <author>Amir Chaudhry</author>
    <updated>2015-01-19T13:00:00+00:00</updated>
    <id>http://amirchaudhry.com/unikernels-for-everyone</id>
    <content type="html">
&lt;p&gt;Many people have now set up unikernels for blogs, documenting their
experiences for others to follow.  Even more important is that people are
going beyond static sites to build unikernels that provide more complicated
services and solve real-world problems.&lt;/p&gt;

&lt;p&gt;To help newcomers get started, there are now even more posts that that use
different tools and target different deployment methods.  Below are summaries
of some of the posts I found interesting and that will make it easier for you
try out different ways of creating and deploying your unikernels.&lt;/p&gt;

&lt;h3 id=&quot;unikernel-blogs-with-mirageos&quot;&gt;Unikernel blogs with MirageOS&lt;/h3&gt;

&lt;p&gt;Mindy picked up where the &lt;a href=&quot;http://amirchaudhry.com/from-jekyll-to-unikernel-in-fifty-lines/&quot;&gt;first set of instructions&lt;/a&gt;
finished and described her work to get an Octopress blog running on Amazon EC2.
As one of the first people outside the core team to work on this, she had a
lot of interesting experiences — which included getting into the Mirage
networking stack to debug an issue and submit a bugfix!  More recently, she
also wrote a couple of excellent posts on &lt;em&gt;why&lt;/em&gt; she uses a unikernel for her
blog.  These posts cover the security concerns (and responsibility) of running
networked services on today’s Internet and the importance of owning your
content — both ideas are at the heart of the work behind &lt;a href=&quot;http://nymote.org/&quot;&gt;Nymote&lt;/a&gt; and are
well worth reading.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Mindy’s posts&lt;/em&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;Overview&lt;/em&gt; - &lt;a href=&quot;http://www.somerandomidiot.com/blog/2014/08/19/i-am-unikernel/&quot;&gt;“I Am Unikernel (and So Can You!)”&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;em&gt;First in her Mirage series&lt;/em&gt; - &lt;a href=&quot;http://www.somerandomidiot.com/blog/2014/03/14/its-a-mirage/&quot;&gt;“It’s a Mirage! (or, How to Shave a Yak.)”&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;http://www.somerandomidiot.com/blog/2014/08/11/attack-surface-area/&quot;&gt;“Attack Surface: Why I Unikernel, Part 1”&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;http://www.somerandomidiot.com/blog/2014/08/14/my-content-is-mine/&quot;&gt;“My Content Is Mine: Why I Unikernel, Part 2”&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ian took a different path to AWS deployment by using Vagrant and Test Kitchen
to to get his static site together and build his unikernel, and then Packer to
create the images for deployment to EC2.  All succinctly explained with code
available on GitHub for others to try out!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Ian on&lt;/em&gt; &lt;a href=&quot;https://github.com/iw/mirage-jekyll&quot;&gt;“Mirage with Jekyll on Amazon EC2”&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Toby wanted to put together a blog that was a little more complicated than a
traditional static site, with specific features like subdomains based on tags
and the ability to set future dates for posts. He also pulled in some other
libraries so he can use Mustache for sever-side rendering, where his blog
posts and metadata are stored as JSON and rendered on request.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Toby on&lt;/em&gt; &lt;a href=&quot;http://ocaml.is-awesome.net/2014/11/building-a-blog-with-mirage-os&quot;&gt;“Building a Blog with MirageOS”&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chris saw others working to get unikernel blogs on EC2 and decide he’d try
getting his up and running on Linode instead.  He is the first person to
deploy his unikernel to Linode and he provided a great walkthough with helpful
screenshots, as well as brief notes about the handful of differences compared
with EC2.  Chris also wrote about the issue he had with clean urls (i.e
serving &lt;code class=&quot;highlighter-rouge&quot;&gt;/about/index.html&lt;/code&gt; when a user visits &lt;code class=&quot;highlighter-rouge&quot;&gt;/about/&lt;/code&gt;) — he describes the
things he tried out until he was finally able to fix it.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Chris’ posts&lt;/em&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;Setting up a unikernel&lt;/em&gt; - &lt;a href=&quot;http://christopherbothwell.com/ocaml/mirage/2014/12/03/about-not-found.html&quot;&gt;“About Not Found”&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;em&gt;Deploying to Linode&lt;/em&gt; - &lt;a href=&quot;http://christopherbothwell.com/ocaml/mirage/linode/2014/12/08/hello-linode.html&quot;&gt;“Hello Linode”&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Phil focused on getting unikernels running on a cubieboards, which are ARM
based development boards — similar to the Raspberry Pi. He starts by taking
Mirage’s pre-built &lt;a href=&quot;http://blobs.openmirage.org&quot;&gt;Cubieboard images&lt;/a&gt; — which makes it easy to
get Xen and an OCaml environment set up on the board — and getting this
installed on the Cubieboard.  He also noted the issues he came across along
with the simple tweaks he made to fix them and finally serves a Mirage hello
world page.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Phil on&lt;/em&gt; &lt;a href=&quot;http://philtomson.github.io/blog/2014/09/10/some-notes-on-building-and-running-mirage-unikernels-on-cubieboard2/&quot;&gt;“Some Notes on Building and Running Mirage Unikernels on Cubieboard2”&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;more-than-just-static-sites&quot;&gt;More than just static sites&lt;/h3&gt;

&lt;p&gt;Static sites have become the new ‘hello world’ app. They’re simple to manage,
low-risk and provide lots of opportunities to experience something new.  These
aspects make them ideal for discovering the benefits (and trade offs) of the
unikernel approach and I look forward to seeing what variations people come up
with — For instance, there aren’t any public instructions for deploying to
Rackspace so it would be great to read about someone’s experiences there.
However, there are also many other applications that also fit the above
criteria of simplicity, low risk and plentiful learning opportunities.&lt;/p&gt;

&lt;p&gt;Thomas Leonard decided to create a unikernel for a simple REST service for
queuing package uploads for 0install.  His post takes you from the very
beginning, with a simple hello world program running on Xen, all the way
through to creating his REST service. Along the way there a lots of code
snippets and explanations of the libraries being used and what they’re doing.
This is a great use-case for unikernels and there are a lot of interesting
things to take from this post, for example the ease with which Thomas was able
to find and fix bugs using regular tools. There’s also lots of information on
performance testing and optimising of the unikernel, which he covers in a
follow-up post, and he even built tools to visualise the traces.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Thomas’ posts&lt;/em&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;Hello world and REST service&lt;/em&gt; - &lt;a href=&quot;http://roscidus.com/blog/blog/2014/07/28/my-first-unikernel/&quot;&gt;“My First Unikernel”&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;em&gt;Profiling and optimisations&lt;/em&gt; - &lt;a href=&quot;http://roscidus.com/blog/blog/2014/08/15/optimising-the-unikernel/&quot;&gt;“Optimising the Unikernel”&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;em&gt;Tool to visualise traces&lt;/em&gt; - &lt;a href=&quot;http://roscidus.com/blog/blog/2014/10/27/visualising-an-asynchronous-monad&quot;&gt;“Visualising an Asynchronous Monad”&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of course, there’s much more activity out there than described in this post as
people continually propose ideas on the &lt;a href=&quot;http://lists.xenproject.org/cgi-bin/mailman/listinfo/mirageos-devel&quot;&gt;Mirage mailing list&lt;/a&gt; — both
for things they would like to try out and issues they came up against. In my
&lt;a href=&quot;http://nymote.org/blog/2014/from-jekyll-site-to-unikernel/&quot;&gt;last post&lt;/a&gt;, I pointed out that the workflow is applicable to any
type of unikernel and as Thomas showed, with bit of effort it’s already
possible to create useful, real-world services using the many libraries that
already exist. There’s also a lot of scaffolding in the &lt;a href=&quot;https://github.com/mirage/mirage-skeleton&quot;&gt;mirage-skeleton&lt;/a&gt;
repo that you can build on which makes it even easier to get involved.  If you
want to dive deeper into the libraries and perhaps learn OCaml, there are lots
of &lt;a href=&quot;http://ocaml.org/learn/books.html&quot;&gt;resources online&lt;/a&gt; and &lt;a href=&quot;https://github.com/mirage/mirage-www/wiki/Pioneer-Projects&quot;&gt;projects&lt;/a&gt; to get involved with too.&lt;/p&gt;

&lt;p&gt;Now is a great time to try building a unikernel for yourself and as you can
see from the posts above, shared experiences help other people progress
further and branch out into new areas. When you’ve had a chance to try
something out please do share your experiences online!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Edit: discuss this post on &lt;a href=&quot;http://devel.unikernel.org/t/unikernels-for-everyone/28/1&quot;&gt;devel.unikernel.org&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;This post also appears on the &lt;a href=&quot;http://nymote.org/blog/2015/unikernels-for-everyone/&quot;&gt;Nymote blog&lt;/a&gt;.&lt;/p&gt;

&lt;!-- ===== LINKS ===== --&gt;

></content>
  </entry>
  
  <entry>
    <title>Towards a governance framework for OCaml.org</title>
    <link href="http://amirchaudhry.com/towards-governance-framework-for-ocamlorg"/>
    <author>Amir Chaudhry</author>
    <updated>2015-01-08T18:15:00+00:00</updated>
    <id>http://amirchaudhry.com/towards-governance-framework-for-ocamlorg</id>
    <content type="html">
&lt;p&gt;The projects around the OCaml.org domain name are becoming more established
and it’s time to think about how they’re organised. 2014 saw a &lt;em&gt;lot&lt;/em&gt; of
activity, which built on the &lt;a href=&quot;http://www.cl.cam.ac.uk/projects/ocamllabs/news/index.html#OnlineatOCamlorg&quot;&gt;successes from 2013&lt;/a&gt;.
Some of the main things that stand out to me are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;More &lt;a href=&quot;http://ocaml.org/contributors.html&quot;&gt;volunteers&lt;/a&gt; contributing to the public website with
translations, bug fixes and content updates, as well as many new visitors —
for example, the new page on &lt;a href=&quot;http://ocaml.org/learn/teaching-ocaml.html&quot;&gt;teaching OCaml&lt;/a&gt; received over 5k
visits alone. The increasing contributions are a result of the earlier work on
&lt;a href=&quot;http://amirchaudhry.com/announcing-new-ocamlorg/&quot;&gt;re-engineering the site&lt;/a&gt; and there are many ways to get involved
so please do &lt;a href=&quot;https://github.com/ocaml/ocaml.org/labels/contribute%21&quot;&gt;contribute&lt;/a&gt;!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;http://opam.ocaml.org/&quot;&gt;&lt;img style=&quot;float: right; margin-left: 10px&quot; src=&quot;http://amirchaudhry.com/images/web/opampkg-2015-01-08.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The relentless improvements and growth of OPAM, both in terms of the
repository — with over 1000 additional packages and several
&lt;a href=&quot;http://lists.ocaml.org/pipermail/opam-devel/2014-October/000781.html&quot;&gt;new repo maintainers&lt;/a&gt; — and also improved workflows (e.g the new
&lt;a href=&quot;http://opam.ocaml.org/blog/opam-1-2-pin/&quot;&gt;pin functionality&lt;/a&gt;). 
The OPAM site and package list also moved to the ocaml.org domain, becoming
the substrate for the OCaml Platform efforts. This began with the work towards
&lt;a href=&quot;http://opam.ocaml.org/blog/opam-1-2-0-beta4/&quot;&gt;OPAM 1.2&lt;/a&gt; and there is much more to come (including closer
integration in terms of styling). Join the &lt;a href=&quot;http://lists.ocaml.org/listinfo/platform&quot;&gt;Platform list&lt;/a&gt; to
keep up to date.&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
  &lt;li&gt;Much more activity on the &lt;a href=&quot;http://lists.ocaml.org&quot;&gt;mailing lists&lt;/a&gt; in general and user groups
requesting to have lists made (e.g the &lt;a href=&quot;http://lists.ocaml.org/listinfo/teaching&quot;&gt;teaching list&lt;/a&gt;). If anyone
has a need for a new list, just ask on the
&lt;a href=&quot;http://lists.ocaml.org/listinfo/infrastructure&quot;&gt;infrastructure list&lt;/a&gt;!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is other work besides those I’ve mentioned and I think by any measure,
all the projects have been quite successful. As the community continues to
develop, it’s important to clarify how things currently work to improve the
level of transparency and make it easier for newcomers to get involved.&lt;/p&gt;

&lt;h3 id=&quot;factors-for-a-governance-framework&quot;&gt;Factors for a governance framework&lt;/h3&gt;

&lt;p&gt;For the last couple of months, I’ve been looking over how larger projects
manage themselves and the governance documents that are available. My aim has
been to put such a document together for the OCaml.org domain without
introducing burdensome processes.  There are number of things that stood out
to me during this process, which have guided the approach I’m taking.&lt;/p&gt;

&lt;p&gt;My considerations for an OCaml.org governance document:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;A governance document is not &lt;em&gt;necessary&lt;/em&gt; for success but it’s valuable to
demonstrate a commitment to a &lt;strong&gt;stable decision-making process&lt;/strong&gt;.  There are
many projects that progress perfectly well without any documented processes
and indeed the work around OCaml.org so far is a good example of this (as well
as OCaml itself).  However, for projects to achieve a scale greater than the
initial teams, it’s a significant benefit to encode in writing how things work
(NB: please note that I didn’t define the &lt;em&gt;type&lt;/em&gt; of decision-making process -
merely that it’s a stable one).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;It must &lt;strong&gt;clarify its scope&lt;/strong&gt; so that there is no confusion about what the
document covers. In the case of OCaml.org, it needs to be clear that the
governance covers the domain itself, rather than referring to the website.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;It should &lt;strong&gt;document the reality&lt;/strong&gt;, rather than represent an aspirational
goal or what people &lt;em&gt;believe&lt;/em&gt; a governance structure should look like.  It’s
very tempting to think of an idealised structure without recognising that
behaviours and norms have &lt;em&gt;already&lt;/em&gt; been established. Sometimes this will be
vague and poorly defined but that might simply indicate areas that the
community hasn’t encountered yet (e.g it’s uncommon for any new project to
seriously think about dispute resolution processes until they have to).  In
this sense, the initial version of a governance document should simply be a
written description of how things currently stand, rather than a means to
adjust that behaviour.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;It should be &lt;strong&gt;simple and self-contained&lt;/strong&gt;, so that anyone can understand
the intent quickly without recourse to other documents.  It may be tempting to
consider every edge-case or try to resolve every likely ambiguity but this
just leads to large, legal documents.  This approach may well be necessary
once projects have reached a certain scale but to implement it sooner would be
a case of premature optimisation — not to mention that very few people would 
read and remember such a document.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;It’s a &lt;strong&gt;living document&lt;/strong&gt;. If the community decides that it would prefer a
new arrangement, then the document conveniently provides a stable starting
point from which to iterate. Indeed, it &lt;em&gt;should&lt;/em&gt; adapt along with the project
that it governs.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With the above points in mind, I’ve been putting together a draft governance
framework to cover how the OCaml.org domain name is managed.  It’s been a
quiet work-in-progress for some time and I’ll be getting in touch with
maintainers of specific projects soon.  Once I’ve had a round of reviews, I’ll
be sharing it more widely and posting it here!&lt;/p&gt;

&lt;!-- [![FIGURE 06.1 Governance versus anarchy on Flickr](http://amirchaudhry.com/images/web/governance-alpha.png)](https://www.flickr.com/photos/jurgenappelo/5201270923/) --&gt;
></content>
  </entry>
  
  <entry>
    <title>Describing the MISO stack at Entrepreneur First</title>
    <link href="http://amirchaudhry.com/describing-miso-entrepreneur-first-2014"/>
    <author>Amir Chaudhry</author>
    <updated>2014-07-25T11:30:00+00:00</updated>
    <id>http://amirchaudhry.com/describing-miso-entrepreneur-first-2014</id>
    <content type="html">
&lt;!-- 




&lt;div class=&quot;gallery&quot;&gt;
  &lt;noscript&gt;&lt;small&gt;&lt;em&gt;Note: The gallery needs JavaScript but I've tried to make it degrade gracefully. -Amir&lt;/em&gt;&lt;/small&gt;&lt;/noscript&gt;
  &lt;ul class=&quot;inline-list&quot;&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;ef-2014-1&quot;&gt;&lt;img src=&quot;/images/ef-2014/ef-2014-thumb-1.png&quot; alt=&quot;ef-2014-thumb-1&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;ef-2014-2&quot;&gt;&lt;img src=&quot;/images/ef-2014/ef-2014-thumb-2.png&quot; alt=&quot;ef-2014-thumb-2&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;ef-2014-3&quot;&gt;&lt;img src=&quot;/images/ef-2014/ef-2014-thumb-3.png&quot; alt=&quot;ef-2014-thumb-3&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;ef-2014-4&quot;&gt;&lt;img src=&quot;/images/ef-2014/ef-2014-thumb-4.png&quot; alt=&quot;ef-2014-thumb-4&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;ef-2014-5&quot;&gt;&lt;img src=&quot;/images/ef-2014/ef-2014-thumb-5.png&quot; alt=&quot;ef-2014-thumb-5&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;ef-2014-6&quot;&gt;&lt;img src=&quot;/images/ef-2014/ef-2014-thumb-6.png&quot; alt=&quot;ef-2014-thumb-6&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
  &lt;ul data-orbit data-options=&quot;next_on_click:true; timer_speed:3000; pause_on_hover:false; bullets:false;&quot;&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;ef-2014-1&quot;&gt;&lt;img src=&quot;/images/ef-2014/ef-2014-1.jpg&quot; alt=&quot;ef-2014-1&quot;&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;ef-2014-2&quot;&gt;&lt;img src=&quot;/images/ef-2014/ef-2014-2.jpg&quot; alt=&quot;ef-2014-2&quot;&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;ef-2014-3&quot;&gt;&lt;img src=&quot;/images/ef-2014/ef-2014-3.jpg&quot; alt=&quot;ef-2014-3&quot;&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;ef-2014-4&quot;&gt;&lt;img src=&quot;/images/ef-2014/ef-2014-4.jpg&quot; alt=&quot;ef-2014-4&quot;&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;ef-2014-5&quot;&gt;&lt;img src=&quot;/images/ef-2014/ef-2014-5.jpg&quot; alt=&quot;ef-2014-5&quot;&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;ef-2014-6&quot;&gt;&lt;img src=&quot;/images/ef-2014/ef-2014-6.jpg&quot; alt=&quot;ef-2014-6&quot;&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;




 --&gt;

&lt;p&gt;I’m speaking to the &lt;a href=&quot;http://joinef.com&quot;&gt;Entrepreneur First&lt;/a&gt; cohort this morning about the future of resilient, distributed systems and what I’m working on to get us there.  Firstly, I’m describing the kinds of solutions we have today, the great things they offer developers as well as the issues they create. This leads into the new toolstack we’re creating, called the MISO stack, and the benefits and trade-offs.&lt;/p&gt;

&lt;p&gt;I’m spending more time talking about &lt;a href=&quot;http://openmirage.org&quot;&gt;Mirage OS&lt;/a&gt; – the ‘M’ in the MISO stack – because the workflow we’ve developed here underpins how we build, deploy and maintain such applications at scale. As an example of how things can work, I point at my earlier post on how to go from &lt;a href=&quot;http://amirchaudhry.com/from-jekyll-to-unikernel-in-fifty-lines&quot;&gt;jekyll to unikernel&lt;/a&gt;.  This uses TravisCI to do all the hard work and all the relevant artefacts, including the final VM, can be version-controlled through Git. I actually deployed this post while the audience was watching, so that I could point at &lt;a href=&quot;http://travisci.org/amirmc/amirmc.github.com&quot;&gt;the build logs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One of the use cases for our toolstack is to make it possible for individuals to create and maintain their own piece of the cloud, a project called &lt;a href=&quot;http://nymote.org&quot;&gt;Nymote&lt;/a&gt;, which will also make it possible to run the &lt;a href=&quot;http://amirchaudhry.com/working-on-the-internet-of-my-things/&quot;&gt;Internet of &lt;em&gt;my&lt;/em&gt; Things&lt;/a&gt; – which itself is related to another things I’m working on, such the &lt;a href=&quot;http://hubofallthings.com&quot;&gt;Hub of All Things - HAT&lt;/a&gt; and the &lt;a href=&quot;http://usercentricnetworking.eu&quot;&gt;User Centric Networking&lt;/a&gt; projects.&lt;/p&gt;

&lt;p&gt;This is an exciting summer for all the tools we’re putting together, since we’ve recently &lt;a href=&quot;http://openmirage.org/blog/announcing-mirage-20-release&quot;&gt;announced Mirage OS v2.0&lt;/a&gt;, which now works on ARM, are going full steam ahead with &lt;a href=&quot;http://openmirage.org/blog/introducing-irmin&quot;&gt;Irmin&lt;/a&gt; and working hard on improvements to the &lt;a href=&quot;http://www.cl.cam.ac.uk/projects/ocamllabs/tasks/platform.html&quot;&gt;OCaml ecosystem&lt;/a&gt;. It’s a great time to explore these projects, learn a new language and build awesome stuff.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/amirmc/status/492202830774927361&quot;&gt;&lt;img src=&quot;http://amirchaudhry.com/images/singles/mirage-cubieboard.jpg&quot; alt=&quot;Mirage on ARM&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;
&lt;p class=&quot;footnote&quot;&gt;Some of the research leading to these results has received 
    funding from the European Union's Seventh Framework Programme
    FP7/2007-2013 under the UCN project, grant agreement no 611001.
&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>Winning Seedhack 5.0</title>
    <link href="http://amirchaudhry.com/winning-seedhack-5-2014"/>
    <author>Amir Chaudhry</author>
    <updated>2014-07-23T12:00:00+00:00</updated>
    <id>http://amirchaudhry.com/winning-seedhack-5-2014</id>
    <content type="html">
&lt;p class=&quot;footnote&quot;&gt;[This story was also a
    &lt;a href=&quot;http://seedcamp.com/seedhack-5-0/&quot;&gt;guest post&lt;/a&gt;
    on the &lt;a href=&quot;http://seedcamp.com&quot;&gt;Seedcamp&lt;/a&gt; blog.]&lt;/p&gt;

&lt;p&gt;A couple of weeks ago, I took part in &lt;a href=&quot;http://seedhack.com&quot;&gt;Seedhack 5.0&lt;/a&gt;, on the theme
of life-logging. My team were overall winners with Clarity, our calendar
assistant app. This post captures my experiences of what happened over the
weekend, the process of how we built the app and the main things I learned.
You’ll find out what Clarity is at the end – just like we did.&lt;/p&gt;

&lt;h3 id=&quot;meeting-people-and-pitches-on-friday&quot;&gt;Meeting people and pitches on Friday&lt;/h3&gt;

&lt;p&gt;The weekend began with some information on the APIs available to us, which
was followed by pizza and mingling with everyone. I spoke to a few people
about what they were working on and the technologies they were used to. It
was good to find a mixture of experience and I was specifically looking for
folks with an interest in functional programming – that’s how I first met
Vlad over Twitter.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/vla_ve/statuses/485083697172185088&quot;&gt;&lt;img src=&quot;http://amirchaudhry.com/images/seedhack2014/seedhack2014-1.jpg&quot; alt=&quot;Tweets with Vlad&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After pizza, those people with ideas, even if not fully formed, were invited
to share them with the room. I came in to Seedhack with specific thoughts on
the kind of things I wanted to work on so I spoke about one of those.&lt;/p&gt;

&lt;h3 id=&quot;pitching-personal-clouds&quot;&gt;Pitching Personal Clouds&lt;/h3&gt;

&lt;p&gt;I described the problem of silos, poor interoperability and how all the
life-logging data should really be owned by the user. That would allow third
parties to request access and provide way more value to users, while
maintaining privacy and security. Building a centralised service makes a lot
of sense in the first instance but what’s more disruptive than eschewing the
current model of yet-another-silo and putting the user in control? If that
sounds familiar, it’s because I’m trying to solve these problems already.&lt;/p&gt;

&lt;p&gt;I’m working on a open source toolstack for building distributed systems that
I call the MISO stack, which is analogous to the LAMP stack of old but
is based on &lt;a href=&quot;http://openmirage.org&quot;&gt;Mirage OS&lt;/a&gt;.  With this stack, I’m putting together a
system to help people create and run their own little piece of the cloud
– &lt;a href=&quot;http://nymote.org&quot;&gt;Nymote&lt;/a&gt;. The &lt;a href=&quot;http://nymote.org/blog/2013/introducing-nymote/&quot;&gt;introductory post&lt;/a&gt; and my post on
‘&lt;a href=&quot;http://amirchaudhry.com/working-on-the-internet-of-my-things/&quot;&gt;The Internet of &lt;em&gt;my&lt;/em&gt; Things&lt;/a&gt;’ has more detail on why I’m working
on this.&lt;/p&gt;

&lt;p&gt;For systems like this to be viable, we must be willing to trust them with
the core applications of Email, Contacts and Calendar. Without advanced and
robust options for running these, it’s unlikely that anyone (including me)
would want to switch away from the current providers. Of these three
applications, I decided to talk about the contact management solution, since
I happen to have wireframes and thought it might be simpler to implement
something over the weekend.&lt;/p&gt;

&lt;!--
Some readers may not be convinced but I like to recall a 1977 quote by Ken
Olsen, Cofounder and CEO of Digital Equipment Corp., who said *&quot;[There is no
reason for any individual to have a computer in his home][olsen].&quot;* We now
carry computers in our pockets (see footnote), so it's perfectly reasonable
to me that we'll all have our own clouds one day.
--&gt;

&lt;p&gt;There was quite a bit of interest in the overall concept but what really
piqued my curiosity was that someone else presented some thoughts around
Calendars and analytics. After a brief chat, we decided to join forces and
tackle the problems of Calendar management. The team had a great mix of
experience from product to design and several of them had worked together
before.&lt;/p&gt;

&lt;h3 id=&quot;the-clarity-team&quot;&gt;The Clarity Team&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;http://amirchaudhry.com&quot;&gt;Amir&lt;/a&gt; - &lt;em&gt;Product&lt;/em&gt; - Worked in several startups, product &amp;amp; programme management experience, currently a Post Doc at Cambridge University Computer Science dept.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://twitter.com/rivertam57&quot;&gt;River&lt;/a&gt; - &lt;em&gt;Product&lt;/em&gt; - Programme Manager at Dotforge Accelerator and lead organiser of StartupBus UK 2014.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://msingh.co&quot;&gt;Mani&lt;/a&gt; - &lt;em&gt;Developer&lt;/em&gt; - Freelance web dev (CMS and APIs), winner of multiple hackathons, currently studying at Sheffield University.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://vladvelici.github.io&quot;&gt;Vlad&lt;/a&gt; - &lt;em&gt;Developer&lt;/em&gt; - Started programming long ago and attended many competitions and hackathons. Currently studying Computer Science at the University of Southampton.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://linkedin.com/in/joaoaparicio&quot;&gt;João&lt;/a&gt; - &lt;em&gt;Developer&lt;/em&gt; - PhD in Theoretical Physics, Python enthusiast and moving into data science, currently doing data analysis at Potential.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://jchui.me&quot;&gt;Jeremy&lt;/a&gt; - &lt;em&gt;Designer&lt;/em&gt; - Freelance UI/UX Designer, hackathon enthusiast, currently studying medicine at Sheffield University.&lt;/p&gt;

&lt;h3 id=&quot;thick-fog-and-ambiguity-on-friday-evening&quot;&gt;Thick fog and ambiguity on Friday evening&lt;/h3&gt;

&lt;p&gt;We had all decided to work together and we knew it would be on the problem
of calendar management and analytics. We were fired up but it quickly became
obvious that was &lt;em&gt;all&lt;/em&gt; we knew.&lt;/p&gt;

&lt;p&gt;The next four to five &lt;em&gt;hours&lt;/em&gt; were spent discussing the rough shape of what
we were going to build, what specific problem we thought we were solving and
whether there were enough people with such a problem to care.&lt;/p&gt;

&lt;p&gt;We had a look at each other’s calendars and talked about how we each use
them and the things we like and dislike about them. For example, I have
around nine calendars and I curate them carefully, adding contextual
information and sometimes even correcting old events to reflect what
happened. We even bounced around the idea of the contact management app
several times as well as a few other ideas that came up during the
discussions.&lt;/p&gt;

&lt;p&gt;These conversations took a while and it seemed like we were going around in
circles. Despite this, it didn’t feel particularly frustrating. I realised
that the same sticking point was coming up repeatedly because we were
forcing ourselves to imagine a prototypical customer and the problems &lt;em&gt;they&lt;/em&gt;
might have. This was never going to work since we wouldn’t have time to go
and find such people and do basic customer development. Far better to
constrain the problem to something &lt;em&gt;we&lt;/em&gt; experience so that we can look to
ourselves for initial customer feedback.  Once we did this, things seemed to
go a little faster and taking breaks for food helped us keep our energy up.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/inthecompanyof/status/485463322020839424&quot;&gt;&lt;img src=&quot;http://amirchaudhry.com/images/seedhack2014/seedhack2014-2.jpg&quot; alt=&quot;Mani grabbing falafel for dinner&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There were a few occasions where I looked around the room and saw other
teams with their heads down, headphones in, and bashing away at keyboards
– we hadn’t even figured out what we were doing yet.
Despite this, it was a great exercise because it allowed all of us to get a
feel for what aspects each of us cared about most and it helped us form some
kind of shared language for the product.&lt;/p&gt;

&lt;p&gt;The only outcome from this first evening was an outline but it was an
important one. It distilled what we what we were going to work on and the
components of it. We did this so we’d have a clear starting point the next
morning and could get going quickly.  Here’s a paraphrased version of what
we sent ourselves.&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Smart Calendar App.

We are collecting data from mobile and from desktop. 
- Mobile includes:
  - Call logs
  - Location (if we can)
  - Messages
  - What application is being used and when
- Desktop includes:
  - What application is active and timestamps of it
  - Location?
  - Git Logs ... ?
  - Taking logs of their existing calendars.

Working out what people are doing.
- Extrapolating info from active application (e.g browser page)

Present info back via calendar UI
- Need to turn all this information into webcal events

Useful info we want
- Time spent travelling (how much?)
- Time in meetings 
- Time on phone
- Who the meetings/calls were with
- Relevant docs/emails these are linked with
- Use labels
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then it was time for some late night snacks.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/nicolagreco/status/485201493633826818&quot;&gt;&lt;img src=&quot;http://amirchaudhry.com/images/seedhack2014/seedhack2014-3.jpg&quot; alt=&quot;Midnight snacks&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With one challenge out of the way, the next one was finding somewhere to
sleep for a few hours (Campus was closing from 01:30). I had nothing planned
but luckily for me, a couple of team members had booked a hotel room for the
night. The minor complication was that we had to first find the hotel and
then somehow get six people into a room meant for two – without the night
manager kicking us out. That’s a whole other story, but it suffices to say
that James Bond has nothing to worry about.&lt;/p&gt;

&lt;h3 id=&quot;rays-of-light-and-clearing-haze-on-saturday&quot;&gt;Rays of light and clearing haze on Saturday&lt;/h3&gt;

&lt;p&gt;After some card games and a few hours of sleep, we headed back to Campus and
during this walk, we came up with ‘Clarity’ as the name of the application.&lt;/p&gt;

&lt;p&gt;Once we arrived, development began. River volunteered his digital
assets to the cause (i.e. his whole Google life). Mani worked on the Android
app, Vlad on a Chrome extension with Joao pulling in the Google Apps data as
well as combining it with data from the various platform apps. Jeremy worked
on the front-end of the site, while River and I began wireframing the UI and
user flow through the site.&lt;/p&gt;

&lt;p&gt;Once the development was well underway, I realised how superfluous ‘the
business guys’ can be. It would have been easy to simply sit there and let
everyone get on with it but there were other things River and I did while
developers were writing code.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Wireframing&lt;/em&gt; - We spent time thinking about what a user would actually see
and engage with once they visited the Clarity site. We made a lot of
sketches on paper and this was helpful because communication with the team
was smoother with something to guide the discussion. It also helped to
inform the design work and gave River and I something to show to potential
users.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Talk to people&lt;/em&gt; - aka early customer development. We already knew that we
were our own customers but it was useful to talk to other people for two
reasons. Firstly, to get an idea of how they use their calendars and whether
they have similar problems to us and secondly, to see what thoughts we
prompt when we describe our solution (or show our wireframes). This led to
useful information on how we should refine the product and and position
ourselves against perceived competition.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Refine the product&lt;/em&gt; - Going through the wireframing and talking to people
helped us come up with several new ideas for how to display the data back to
users. Some of these seemed great at the time, but after showing some paper
sketches to other people, we realised customers didn’t care about certain
things, so we discarded them. Even though Jeremy had already done the work of
putting together the UI for them (sorry, Jeremy!).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Examine the competition&lt;/em&gt; - After we described what we were working on. A
few people mentioned potential competitors and asked how we were different.
Initially, we didn’t know much about these companies but it was something we
could explore while development was underway and consider our positioning.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Remind people to regroup&lt;/em&gt; - Every few hours, we would make sure everyone
caught up with each other.  We would check that things were going well, share
what we’d learned from talking to people and discuss any technical problems
and possible workarounds – including changing the scope of the product. The
discussions we’d had on Friday meant that we spent less time debating when
these questions came up during the weekend.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Work on the pitch&lt;/em&gt; - River and I began working on the pitch from just after
Saturday lunchtime and kept building on it until Sunday afternoon. This,
combined with showing our sketches to people, made it much easier to think
about the story we wanted to tell the audience. In turn, that made it easier
to think about the product development that &lt;em&gt;had&lt;/em&gt; to be completed by Sunday.
Especially in terms of a kick-ass demo.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/mindeedly/status/485502064437780480&quot;&gt;&lt;img src=&quot;http://amirchaudhry.com/images/seedhack2014/seedhack2014-4.jpg&quot; alt=&quot;Popcorn and candyfloss&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;bright-sunshine-and-achieving-clarity-on-sunday-afternoon&quot;&gt;Bright sunshine and achieving Clarity on Sunday afternoon&lt;/h3&gt;

&lt;p&gt;Development carried on through the night and we took a break to watch some
sports via River’s laptop – at this point Clarity was actually logging this
and other events.
The next morning, we reiterated what we needed to
get done for the demo and I was pretty ruthless about practising the pitch.
River and I practised endlessly while everyone else made sure the the
technical pieces were working smoothly. We had a lot of moving parts and
making sure they were glued together seamlessly was important.
At this point, we knew what Clarity was and how to tell its story.&lt;/p&gt;

&lt;h3 id=&quot;introducing-clarity&quot;&gt;Introducing Clarity&lt;/h3&gt;

&lt;p&gt;We all have calendars and we put a lot of time and effort into managing them
but get very little back. A simple glance at your calendar for the past
month will show you a sea of information with no idea where your time was
actually spent. We believe your calendar should be working harder for you.
Your calendar should give you clarity.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://amirchaudhry.com/images/seedhack2014/seedhack2014-5.jpg&quot; alt=&quot;Calendar&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Over the course of the weekend, we built tools that can go through your
calendar and understand the events you’re involved in and tie them back to
the relevant emails, documents and people.  With a suite of software that
spans across your GDrive, Chrome and Android, we’re able to combine your
calendars with rich, contextual information so you can really understand
what your time is being spent on.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://clarityapp.me&quot;&gt;&lt;img src=&quot;http://amirchaudhry.com/images/seedhack2014/seedhack2014-6.jpg&quot; alt=&quot;Clarity summary view&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We built this system and plugged it into River’s digital life.
If we take a look at River’s summary for the last month, we see that he’s
spent around 32 hours in meetings in London last month, despite living in
Sheffield. We can also see that he’s spent an hour on the phone with someone
called Lee, but that all of them were short calls. The next person also
totalled an hour on the phone but only across 3 calls.  Already, River has
learned something about the the people he interacts with most and how. We
can also drill down further and see all this activity presented in a
calendar view, except this now represents where his time &lt;em&gt;did&lt;/em&gt; go, rather
than where he thought it went. For example, he’s most active via text
message between 4pm and 5pm during the week, and we can see that he spent
a few hours watching sports last night.&lt;/p&gt;

&lt;p&gt;Clarity can do much more than provide an accurate retrospective view of your
time. Since it interacts with all the important components of your life,
like your phone and laptop, it can even perform helpful actions for you.
For example, say I have a meeting set up with River but I want to reschedule
it. I simply send a text to him as I normally would, suggesting that we move
it to another day. Clarity can pick up that message and is smart enough to
understand its intent, find the relevant calendar event and &lt;em&gt;reschedule
it automatically&lt;/em&gt;. River doesn’t have to lift a finger and his diary is
always up to date. It’s easy to imagine a future where we might never have
to add or edit events ourselves.&lt;/p&gt;

&lt;p&gt;Clarity is a smart calendar assistant that understands the context around
you, provides you with insight into your life and helps you seamlessly
organise your future. You can find out more at
&lt;a href=&quot;http://clarityapp.me&quot;&gt;http://clarityapp.me&lt;/a&gt;&lt;/p&gt;

&lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;c88770b0ef1801315b3b2e79871312e8&quot; data-ratio=&quot;1.41436464088398&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;

&lt;h3 id=&quot;judging-and-announcements&quot;&gt;Judging and announcements&lt;/h3&gt;

&lt;p&gt;After the pitches, we met a lot of people who had the same problems as we
did with calendar management. Several offered to be beta testers. After
waiting for the judges, prizes were announced and Clarity was declared the
overall winner of Seedhack 5.0!&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
  &lt;noscript&gt;&lt;small&gt;&lt;em&gt;Note: The gallery needs JavaScript but I've tried to make it degrade gracefully. -Amir&lt;/em&gt;&lt;/small&gt;&lt;/noscript&gt;
  &lt;ul class=&quot;inline-list&quot;&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;seedhack2014-win-1&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-thumb-1.png&quot; alt=&quot;seedhack2014-win-thumb-1&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;seedhack2014-win-2&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-thumb-2.png&quot; alt=&quot;seedhack2014-win-thumb-2&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;seedhack2014-win-3&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-thumb-3.png&quot; alt=&quot;seedhack2014-win-thumb-3&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;seedhack2014-win-4&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-thumb-4.png&quot; alt=&quot;seedhack2014-win-thumb-4&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;seedhack2014-win-5&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-thumb-5.png&quot; alt=&quot;seedhack2014-win-thumb-5&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;seedhack2014-win-6&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-thumb-6.png&quot; alt=&quot;seedhack2014-win-thumb-6&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;seedhack2014-win-7&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-thumb-7.png&quot; alt=&quot;seedhack2014-win-thumb-7&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;seedhack2014-win-8&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-thumb-8.png&quot; alt=&quot;seedhack2014-win-thumb-8&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;seedhack2014-win-9&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-thumb-9.png&quot; alt=&quot;seedhack2014-win-thumb-9&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;seedhack2014-win-10&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-thumb-10.png&quot; alt=&quot;seedhack2014-win-thumb-10&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;seedhack2014-win-11&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-thumb-11.png&quot; alt=&quot;seedhack2014-win-thumb-11&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
  &lt;ul data-orbit=&quot;&quot; data-options=&quot;next_on_click:true; timer_speed:3000; pause_on_hover:false; bullets:false;&quot;&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;seedhack2014-win-1&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-1.jpg&quot; alt=&quot;seedhack2014-win-1&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;seedhack2014-win-2&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-2.jpg&quot; alt=&quot;seedhack2014-win-2&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;seedhack2014-win-3&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-3.jpg&quot; alt=&quot;seedhack2014-win-3&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;seedhack2014-win-4&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-4.jpg&quot; alt=&quot;seedhack2014-win-4&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;seedhack2014-win-5&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-5.jpg&quot; alt=&quot;seedhack2014-win-5&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;seedhack2014-win-6&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-6.jpg&quot; alt=&quot;seedhack2014-win-6&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;seedhack2014-win-7&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-7.jpg&quot; alt=&quot;seedhack2014-win-7&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;seedhack2014-win-8&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-8.jpg&quot; alt=&quot;seedhack2014-win-8&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;seedhack2014-win-9&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-9.jpg&quot; alt=&quot;seedhack2014-win-9&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;seedhack2014-win-10&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-10.jpg&quot; alt=&quot;seedhack2014-win-10&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;seedhack2014-win-11&quot;&gt;&lt;img src=&quot;/images/seedhack2014-win/seedhack2014-win-11.jpg&quot; alt=&quot;seedhack2014-win-11&quot; /&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;

&lt;h3 id=&quot;things-i-learned&quot;&gt;Things I learned&lt;/h3&gt;

&lt;p&gt;Looking back, there were a lot of things we did which I think
helped us get to the winning slot, so I thought I’d summarise them here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Think first&lt;/strong&gt; - We spent time up front to &lt;em&gt;define&lt;/em&gt; what we were
going to work on. I thought this step was crucial as it meant we all
understood the shape of the problem but also the areas that each of us were
interested in.  That helped later in the weekend as we could refer back to
things we discussed on Friday.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Move fast&lt;/strong&gt; - Once we did figure out what we were doing, then it was a
matter of building the software to gather and crunch the data. A lot of this
was done in parallel as Jeremy worked on the front-end UI while Mani, Joao
and Vlad took care of the data aggregation, analytics and platform products.
Don’t be afraid to throw away ideas if you find that they don’t work for
people and remember it’s a &lt;em&gt;hackathon&lt;/em&gt; (i.e gruesome hacks are the norm).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remember the demo&lt;/strong&gt; - At some point you’re going to be forced to stand up
and talk about what you’ve done. We started thinking about this from
Saturday lunchtime and sketched out the slides and the elements of the app
we wanted to show. This helped inform the UI and technology that we were
building and the pitch never felt like it was rushed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practice, practice, practice&lt;/strong&gt; - we were told we’d have 3 minutes to
pitch/demo and maybe a few additional questions. I made sure River and I
practised &lt;em&gt;repeatedly&lt;/em&gt; to get our time down to 3mins and ensure we getting
across everything we wanted to.  The important thing with such a
short amount of time, is that we were forced to &lt;em&gt;cut&lt;/em&gt; things out as well as
ensure we emphasised the main points. It was a ruthless exercise in saying
‘no’. During the actual pitches, we realised everyone was taking longer
(without repercussions), so I added an extra 30 seconds to cover the
potential market sizes and business models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Leave artefacts&lt;/strong&gt; - After the pitches, we knew that we had to take the
site down. It was built at high speed and in a way that ended up exposing
someone’s data to the internet at large (thanks, River!). It might have
been somewhat easier to build something using faked data that we could
happily share the URL to and leave online.  On the other hand, our demo
would not have been half as compelling if we weren’t running it real-time
on live data.&lt;/p&gt;

&lt;h3 id=&quot;looking-to-the-future&quot;&gt;Looking to the future&lt;/h3&gt;

&lt;p&gt;This is a product we all want to use and the team is interested in taking
this forward. There are a lot of things to think about and many
things we would build differently so we’re discussing the next steps. For
example, there are likely ways to empower the end-users to control their
data and give them more flexibility, even though the work at the hackathon
was already quite impressive. Given how well Seedhack went, you might even
see us at &lt;a href=&quot;http://seedcamp.com/events/seedcamp-week-london/&quot;&gt;Seedcamp Week&lt;/a&gt; later in the year. If you think this is
something you’d like to work on with us,
&lt;a href=&quot;mailto:amirmc+clarity@gmail.com&quot;&gt;do get in touch&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;To wrap things up, here’s a victory selfie!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/RiverTam57/status/485821694037458944&quot;&gt;&lt;img src=&quot;http://amirchaudhry.com/images/seedhack2014/seedhack2014-7.jpg&quot; alt=&quot;Victory Selfie&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;!-- 
****

&lt;p class=&quot;footnote&quot;&gt;**Footnote: It's worth reading the
&lt;a href=&quot;http://www.snopes.com/quotes/kenolsen.asp&quot;&gt;linked article&lt;/a&gt; as
the quote is usually taken out of context -- did you notice that I'm guilty
of that too? :). Ken actually &lt;strong&gt;did&lt;/strong&gt; understand the value of
PCs and having them at home. What he was disputing was that we would have
computers everywhere that would be running our lives. There's delicious
irony here because that is &lt;strong&gt;exactly&lt;/strong&gt; the promise of the
Internet of Things and 'Big Data'. Systems that know us better than we know
ourselves.&lt;/p&gt;
--&gt;
></content>
  </entry>
  
  <entry>
    <title>Writing Planet in pure OCaml</title>
    <link href="http://amirchaudhry.com/writing-planet-in-pure-ocaml"/>
    <author>Amir Chaudhry</author>
    <updated>2014-04-29T09:30:00+00:00</updated>
    <id>http://amirchaudhry.com/writing-planet-in-pure-ocaml</id>
    <content type="html">
&lt;p&gt;I’ve been learning OCaml for some time now but not really had a problem that
I wanted to solve. As such, my progress has been rather slow and sporadic
and I only make time for exercises when I’m travelling. In order to focus my
learning, I have to identify and tackle something specific. That’s usually
the best way to advance and I recently found something I can work on.&lt;/p&gt;

&lt;p&gt;As I’ve been trying to write more blog posts, I want to be able to keep as
much content on my own site as possible and syndicate my posts out to other
sites I run. Put simply, I want to be able to take multiple feeds from
different sources and merge them into one feed, which will be served from
some other site. In addition, I also want to render that feed as HTML on a
webpage. All of this has to remain within the OCaml toolchain so it can be
used as part of &lt;a href=&quot;http://openmirage.org/&quot;&gt;Mirage&lt;/a&gt; (i.e. I can use it when
&lt;a href=&quot;http://amirchaudhry.com/from-jekyll-to-unikernel-in-fifty-lines&quot;&gt;building unikernels&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;What I’m describing might sound familiar and there’s a well-known tool that
does this called &lt;a href=&quot;http://en.wikipedia.org/wiki/Planet_(software)&quot;&gt;Planet&lt;/a&gt;. It’s a ‘river of news’ feed reader, which
aggregates feeds and can display posts on webpages and you can find the
&lt;a href=&quot;http://www.planetplanet.org&quot;&gt;original Planet&lt;/a&gt; and it’s successor &lt;a href=&quot;http://intertwingly.net/code/venus/docs/index.html&quot;&gt;Venus&lt;/a&gt;, both written in Python.
However, Venus seems to be unmaintained as there are a number of
&lt;a href=&quot;https://github.com/rubys/venus/issues&quot;&gt;unresolved issues and pull requests&lt;/a&gt;, which have been
languishing for quite some time with no discussion. There does appear to be
a more active Ruby implementation called &lt;a href=&quot;http://feedreader.github.io/&quot;&gt;Pluto&lt;/a&gt;, with recent commits and
no reported issues.&lt;/p&gt;

&lt;!-- 
    \[Rant: Frankly, the naming of these versions leaves a lot to be desired.
    When you know exactly what you're supposed to Google for you're fine, but
    until then you're just on a random-walk through space websites. I'm
    lucky I managed to get to the Wikipedia page.\] 
--&gt;

&lt;h3 id=&quot;benefits-of-a-planet-in-pure-ocaml&quot;&gt;Benefits of a Planet in pure OCaml&lt;/h3&gt;

&lt;p&gt;Although I could use the one of the above options, it would be much more
useful to keep everything within the OCaml ecosystem.  This way I can make
the best use of the &lt;a href=&quot;https://queue.acm.org/detail.cfm?id=2566628&quot;&gt;unikernel approach&lt;/a&gt; with Mirage (i.e lean,
single-purpose appliances). Obviously, the existing options don’t lend
themselves to this approach and there are &lt;a href=&quot;https://forge.ocamlcore.org/tracker/index.php?func=detail&amp;amp;aid=1349&amp;amp;group_id=1&amp;amp;atid=101&quot;&gt;known bugs&lt;/a&gt; as a lot has
changed on the web since Planet Venus (e.g the adoption of HTML5).
Having said that, I can learn a lot from the existing implementations and
I’m glad I’m not embarking into completely uncharted territory.&lt;/p&gt;

&lt;p&gt;In addition, the OCaml version doesn’t need to (and &lt;em&gt;shouldn’t&lt;/em&gt;) be written
as one monolithic library.  Instead, pulling together a collection of
smaller, reusable libraries that present clear interfaces to each other
would make things much more maintainable. This would bring substantially
greater benefits to everyone and &lt;a href=&quot;https://opam.ocaml.org/&quot;&gt;OPAM&lt;/a&gt; can manage the dependencies.&lt;/p&gt;

&lt;!--
    OPAM makes managing dependencies easy so having a number of single-
    purpose libraries is A Good Thing and costs almost nothing.  This 
    approach has already worked well with examples like an [IP address 
    library][ipaddr] and the [OCaml markdown library][OMD], which can be 
    used by multiple projects.
--&gt;

&lt;h3 id=&quot;breaking-down-the-problem&quot;&gt;Breaking down the problem&lt;/h3&gt;

&lt;p&gt;The first cut is somewhat straightforward as we have a piece that deals with
the consumption and manipulation of feeds and another that takes the result
and emits HTML. This is also how the original Planet is put together, with a
library called &lt;a href=&quot;https://pypi.python.org/pypi/feedparser/&quot;&gt;feedparser&lt;/a&gt; and another for templating pages.&lt;/p&gt;

&lt;p&gt;For the feed-parsing aspect, I can break it down further by considering Atom
and RSS feeds separately and then even further by thinking about how to (1)
consume such feeds and (2) output them. Then there is the HTML component,
where it may be necessary to consider existing representations of HTML. These
are not new ideas and since I’m claiming that individual pieces might be
useful then it’s worth finding out which ones are already available.&lt;/p&gt;

&lt;h4 id=&quot;existing-components&quot;&gt;Existing components&lt;/h4&gt;

&lt;p&gt;The easiest way to find existing libraries is via the
&lt;a href=&quot;http://opam.ocaml.org/packages&quot;&gt;OPAM package list&lt;/a&gt;. Some quick searches for &lt;code class=&quot;highlighter-rouge&quot;&gt;RSS&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;XML&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;HTML&lt;/code&gt;
and &lt;code class=&quot;highlighter-rouge&quot;&gt;net&lt;/code&gt; bring up a lot of packages. The most relevant of these seem to be
&lt;a href=&quot;https://opam.ocaml.org/packages/xmlm/xmlm.1.2.0/&quot;&gt;xmlm&lt;/a&gt;, &lt;a href=&quot;https://opam.ocaml.org/packages/ocamlrss/ocamlrss.2.2.2/&quot;&gt;ocamlrss&lt;/a&gt;, &lt;a href=&quot;https://opam.ocaml.org/packages/cow/cow.0.9.1/&quot;&gt;cow&lt;/a&gt; and maybe &lt;a href=&quot;http://opam.ocaml.org/packages/xmldiff/xmldiff.0.1/&quot;&gt;xmldiff&lt;/a&gt;. I noticed that
nothing appears, when searching for &lt;code class=&quot;highlighter-rouge&quot;&gt;Atom&lt;/code&gt;, but I do know that &lt;code class=&quot;highlighter-rouge&quot;&gt;cow&lt;/code&gt; has an
Atom module for creating feeds. In terms of turning feeds into pages and
HTML, I’m aware of &lt;a href=&quot;https://github.com/ocaml/ocaml.org/blob/master/script/rss2html.ml&quot;&gt;rss2html&lt;/a&gt; used on the &lt;a href=&quot;http://ocaml.org&quot;&gt;OCaml&lt;/a&gt; website and parts of
&lt;a href=&quot;http://opam.ocaml.org/packages/ocamlnet/ocamlnet.3.7.3/&quot;&gt;ocamlnet&lt;/a&gt; that may be relevant (e.g &lt;code class=&quot;highlighter-rouge&quot;&gt;nethtml&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;netstring&lt;/code&gt;) as well as
&lt;code class=&quot;highlighter-rouge&quot;&gt;cow&lt;/code&gt;.  There is likely to be other code I’m missing but this is useful as a
first pass.&lt;/p&gt;

&lt;p&gt;Overall, a number of components are already out there but it’s not obvious
if they’re compatible (e.g html) and there are still gaps (e.g atom). Since
I also want to minimise dependencies, I’ll try and use whatever works but
may ultimately have to roll my own. Either way, I can learn from what
already exists. Perhaps I’m being overconfident but if I can break things
down sensibly and keep the scope constrained then this should be an
achievable project.&lt;/p&gt;

&lt;h3 id=&quot;the-first-baby-steps---an-atom-parser&quot;&gt;The first (baby) steps - an Atom parser&lt;/h3&gt;

&lt;p&gt;As this is an exercise for me to learn OCaml by solving a problem, I need to
break it down into bite-size pieces and take each one at a time. Practically
speaking, this means limiting the scope to be as narrow as possible while
still producing a useful result &lt;em&gt;for me&lt;/em&gt;.  That last part is important as I
have specific needs and it’s likely that the first thing I make won’t be
particularly interesting for many others.&lt;/p&gt;

&lt;p&gt;For my specific use-case, I’m only interested in dealing with Atom feeds as
that’s what I use on my site and others I’m involved with. Initial feedback
is that creating an Atom parser will be the bulk of the work and I should
start by defining the types. To keep this manageable, I’m only going to deal
with my own feeds instead of attempting a fully compliant parser (in other
words, I’ll only consider the subset of &lt;a href=&quot;https://tools.ietf.org/html/rfc4287&quot;&gt;RFC4287&lt;/a&gt; that’s relevant to me).
Once I can parse, merge and write such feeds I should be able to iterate
from there.&lt;/p&gt;

&lt;p&gt;To make my requirements more concrete:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Only consider &lt;em&gt;my own&lt;/em&gt; Atom feeds for now&lt;/li&gt;
  &lt;li&gt;Initially, be able to parse and emit just one Atom feed&lt;/li&gt;
  &lt;li&gt;Then be able to merge 2+ feeds, specifically:
    &lt;ul&gt;
      &lt;li&gt;Use tag-based feeds from my personal site as starting points&lt;/li&gt;
      &lt;li&gt;Be able to de-dupe content&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;No database or storage (construct it afresh every time)&lt;/li&gt;
  &lt;li&gt;Minimise library dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- 
    Perhaps these requirements are already too much and I may decide to dial
    it down even further (e.g just figure out how to consume *one* feed),
    but I won't really know until I get started. For example, I can imagine
    that I'll need one bunch of code to deal with Atom feeds and then
    perhaps I can make another (feedparser), that depends on it and others
    to deal with general feeds.
--&gt;

&lt;h4 id=&quot;timeframes-and-workflow&quot;&gt;Timeframes and workflow&lt;/h4&gt;

&lt;p&gt;I’ve honestly no idea how long this might take and I’m treating it as a
side-project. I know there are many people out there who could produce a
working version of everything in a week or two but I’m not one of them (yet).
There are also &lt;em&gt;a lot&lt;/em&gt; of ancillary things I need to learn on the way, like
packaging, improving my knowledge of Git and dealing with build systems. If
I had to put a vague time frame on this, I’d be thinking in months rather
than weeks.  It might even be the case that others start work on parts of
this and ship things sooner but that’s great as I’ll probably be able to use
whatever they create and move further along the chain.&lt;/p&gt;

&lt;p&gt;In terms of workflow, everything will be done in the open, warts and all, and
I expect to make embarrassing mistakes as I go. You can follow along on my
freshly created &lt;a href=&quot;https://github.com/amirmc/ocamlatom&quot;&gt;OCaml Atom&lt;/a&gt; repo, and I’ll be using the issue tracker as
the main way of dealing with bugs and features. Let the fun begin.&lt;/p&gt;

&lt;!-- acknowledgements --&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;Acknowledgements:&lt;/em&gt; Thanks to &lt;a href=&quot;http://erratique.ch&quot;&gt;Daniel&lt;/a&gt;, &lt;a href=&quot;http://ashishagarwal.org&quot;&gt;Ashish&lt;/a&gt;, &lt;a href=&quot;https://github.com/Chris00&quot;&gt;Christophe&lt;/a&gt;,
&lt;a href=&quot;http://philippewang.info/&quot;&gt;Philippe&lt;/a&gt; and &lt;a href=&quot;http://gazagnaire.org&quot;&gt;Thomas&lt;/a&gt; for discussions on an earlier draft of this post
and providing feedback on my approach.&lt;/p&gt;

&lt;!-- links --&gt;

></content>
  </entry>
  
  <entry>
    <title>IoT - Brave New World or Simply evolved M2M?</title>
    <link href="http://amirchaudhry.com/iot-brave-new-world-or-evolved-m2m"/>
    <author>Amir Chaudhry</author>
    <updated>2014-03-13T21:00:00+00:00</updated>
    <id>http://amirchaudhry.com/iot-brave-new-world-or-evolved-m2m</id>
    <content type="html">
&lt;p&gt;I was at an &lt;a href=&quot;http://www.cambridgewireless.co.uk/events/article/default.aspx?objid=43697&quot;&gt;event&lt;/a&gt; run by Cambridge Wireless today on the Internet of
Things.  These are my notes. Although I’ve named people, I’m paraphrasing a
lot so best not to treat anything you read here as a direct quote.&lt;/p&gt;

&lt;p&gt;There were a few audience polls conducted using little keypads they handed
out. There were only 30-ish keypads so it’s not necessarily indicative of
how the whole room felt.  I took some hasty pics of a few of the slides
(mainly the poll results) so apologies for the poor quality.&lt;/p&gt;

&lt;h3 id=&quot;the-enterprise-and-the-internet-of-things---evolution-or-revolution&quot;&gt;“The Enterprise and the Internet of Things - Evolution or Revolution?”&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;John Hicklin, Principal Consultant | Commercial Enterprise Markets, CGI UK&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nowadays, you can walk into the C-suite and start a discussion about the IoT.
They may not know what they’re talking about but someone’s told them they
need to be thinking about it.  But what is IoT?&lt;/p&gt;

&lt;p&gt;One of the problems in industry you go to your Director and you explain this
new tech and all the awesome things you can do with it and he asks the
dreaded question, “So what?”  Example of the Connected Toothbrush. With a
connected toothbrush you can automatically have a remote relationship with
your dentist.  But he already drives a BMW and it’s not clear how he
benefits from that.  He wants you in the office where, every time you open
your mouth, he sees new business development opportunities.  For the moment,
he neither needs nor wants a remote relationship with you. Leads to the
question about who’s going to sign up for the business case.&lt;/p&gt;

&lt;p&gt;Number of key areas that need to be addressed (paraphrased):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Crack open the Data&lt;/strong&gt;: We are awash with data but don’t know how to use
it. Problem with clients is that they really buy into the vision but they
have a lot of legacy systems (green screens!) which already run things.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Identifying value&lt;/strong&gt;(?): Volume is not a sign of success.  Need to know
where the value is, which means understanding it. e.g is Enron. Thousands of
documents, accountants all over the place with tons of data. It took a small
team of a few researchers doing a case study that discovered no tax had ever
been paid.  They got to the right data and asked the right questions.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Connectivity&lt;/strong&gt;(?): M2M has grown in a silo’d manner where a device takes
data and sends it to one place.  This needs to open up more and give access
to other areas of business.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Business operations&lt;/strong&gt;: People matter too. Process changes, systems that
allow real-time decisions, empowering individuals.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, IoT is an enabler for a number of wider trends. IoT can improve
operational efficiency &lt;strong&gt;and&lt;/strong&gt; enhance customer experience.  Normally these
are in conflict with each-other. However, if we just get into a tech-fest,
then we might just end up with a large number of failures as we’ve seen with
‘Big Data’&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Poll - Which (categories of) business-related infrastructure categories
are most urgently needed for building the Internet of Things.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://amirchaudhry.com/images/cw-iot-new-world/cw-iot-new-world-1.jpg&quot; alt=&quot;Poll results&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;overcoming-the-internet-of-things-connectivity-challenge&quot;&gt;“Overcoming the Internet of Things Connectivity Challenge”&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;David Dunn, Software Engineer, Electric Imp&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Electric Imp aims to help people in Product Development in the IoT space,
namely with the connectivity problem.  The name ‘IMP’ came from ‘Internet
Messaging Processor’. Name is also from Terry Pratchett who’s stories had
devices that contained an imp which did the work :)&lt;/p&gt;

&lt;p&gt;Building connected devices is difficult. Have to be secure, easy to set up.
There are many choices for connectivity, problems with managing the code on
the devices.  Electric Imp picked wifi and decided to do it well.  This
satisfies a lot of markets but not all.&lt;/p&gt;

&lt;p&gt;Side story of the &lt;a href=&quot;http://www.proofpoint.com/threatinsight/posts/your-fridge-is-full-of-spam-part-ll-details.php&quot;&gt;hacked fridge sending spam emails&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Things run through Electric Imp system and they manage the security. It’s
security as a service.  Electric Imp manages deployment of your code too so
developers can just push code and it will end up on all their devices.&lt;/p&gt;

&lt;!-- http://www.bbc.co.uk/news/technology-25780908
http://www.economist.com/news/science-and-technology/21594955-when-internet-things-misbehaves-spam-fridge
http://www.proofpoint.com/about-us/press-releases/01162014.php
http://www.proofpoint.com/threatinsight/posts/your-fridge-is-full-of-spam-proof-of-a-Iot-driven-attack.php
http://www.proofpoint.com/threatinsight/posts/your-fridge-is-full-of-spam-part-ll-details.php --&gt;

&lt;p&gt;Simplicity comes from one-step setup.  It’s optical and uses a smartphone
and flashes the screen, which sends the wifi SSID and credentials to the
device (via a sensor). Customer code runs within a VM on top of with custom
OS (impOS) taking care of I/O (TLS-encrypted wifi connection to service).&lt;/p&gt;

&lt;p&gt;Difficult to debug devices in the field so cloud based- service helps with
that. They do embedded stuff on the device and cloud stuff in the cloud.
There’s another VM in the cloud that’s paired with the VM on the device.
Heavy lifting can happens elsewhere so no need to parse JSON on the device
itself.&lt;/p&gt;

&lt;p&gt;Q - How do you deal with identity of units?&lt;br /&gt;
A - Imps have unique serials and the devices they’re plugged into are also unique (missed how).&lt;/p&gt;

&lt;h3 id=&quot;real-life-experiences-from-rolling-out-m2m-networks-and-how-we-can-learn-from-these-in-the-shift-to-iot&quot;&gt;“Real-life experiences from rolling out M2M networks and how we can learn from these in the shift to IoT”&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Jon Lewis, Chief Innovation Officer, Plextek Consulting&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Plextek was working in this field when it was called ‘telemetry’.  One of
the earliest things they worked on was ‘Lojack’ (car tracking). Things then
shifted to ‘smart cities’ and now people talk about ‘IoT’ and want consumer
devices with consumer volumes.&lt;/p&gt;

&lt;p&gt;2014 has got to be year of IoT. However, still some way from business cases
as it’s too expensive to simply track your cat (approx £100 set up fee and
then around £30 pcm).&lt;/p&gt;

&lt;p&gt;Deployment often costs more than then the sensor devices. c.f street
lighting systems.  Choice of radio system is critical.  Projects in
UK/Europe are about incremental cost savings with pay-back in less than 5yrs.
In industrialising countries, there is new build which is easier then
retrofit.  Urbanisation creates strain and demand. Local issues relate to
the Spectrum issues and local regulations (e.g mandate to use govt
encryption streams).  Data privacy is also concern as we don’t know who
holds the monkey. That’s made even more difficult when you go abroad.  Local
politics also matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Big opportunity in B2C: but need consolidation in B2B markets to get
necessary economies of scale&lt;/li&gt;
  &lt;li&gt;Big B2B opportunity in developing countries: but is tough and needs local
partners&lt;/li&gt;
  &lt;li&gt;Application developers need common platforms: to lower R&amp;amp;D costs and
enable access to global markets&lt;/li&gt;
  &lt;li&gt;Whole value chain needs to work: building an ecosystem that connects
application developers to markets is key to achieving scale&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;the-role-of-lte-in-m2m&quot;&gt;“The role of LTE in M2M”&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Georg Steimel, Head of M2M Solutions, Huawei&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;About Huawei&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Three businesses: Carrier network, Consumer business, Enterprise business&lt;/li&gt;
  &lt;li&gt;Revenues of $39Bn, No2. Telecom solution provider, 150k+ employees
worldwide&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Georg is in Consumer branch for Europe.  Huawei wants to be top M2M module
vendor in the coming years.  They’re operator and system integrator agnostic.&lt;/p&gt;

&lt;p&gt;Tech evolution brings new opportunities. Mobile data traffic needs, Network
upgrading etc. Ave user expected to generated 1G data traffic per month
(currently 63MB today) and there are predicted to be 50Bn+ devices.
Examples of users are highly varied including monitoring of pregnant cows.&lt;/p&gt;

&lt;p&gt;Challenges for mass rollout are a scattered market requiring complex
solutions.  Alignment of all parties in one adequate business model is quite
tricky, esp when it comes to customer ownership. Should consider the value
chain.&lt;/p&gt;

&lt;p&gt;Complex business model:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;From sales to service&lt;/li&gt;
  &lt;li&gt;Many stakeholders
    &lt;ul&gt;
      &lt;li&gt;Who pays, how much, to whom, for what service, for what benefits?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Individual benefit must exceed cost
    &lt;ul&gt;
      &lt;li&gt;Realistic pricing&lt;/li&gt;
      &lt;li&gt;Appropriate effort&lt;/li&gt;
      &lt;li&gt;Total benefit, direct vs indirect TCO&lt;/li&gt;
      &lt;li&gt;Sustainability&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Amount of data generated is also going to be huge.  Smart meters in German
households could send over 4TB per day, which is a huge strain for mobile
networks.&lt;/p&gt;

&lt;p&gt;LTE advantage for M2M is obviously bandwidth but that’s only relevant to a
few verticals (signage, routers, and in-car entertainment). Low latency is
more important for industrial alarms and medical devices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Poll - What business models?&lt;/strong&gt;
&lt;img src=&quot;http://amirchaudhry.com/images/cw-iot-new-world/cw-iot-new-world-2.jpg&quot; alt=&quot;Poll results&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Break down of poll results.&lt;br /&gt;
&lt;img src=&quot;http://amirchaudhry.com/images/cw-iot-new-world/cw-iot-new-world-3.jpg&quot; alt=&quot;Poll results&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;using-networked-visualisation-for-better-decision-making&quot;&gt;“Using networked visualisation for better decision making”&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Fredrik Sjostedt, Vice President | Corporate Marketing, Barco Ltd&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Barco does a lot of visualising information. Displays for radiographers,
stuff in cinema screens, screens in flight simulators and a lot more.&lt;/p&gt;

&lt;p&gt;Need to take in data from sensors, display relevant information and allow
operators to make SMART decisions.  e.g number of CCTV cameras in London -
who’s looking at them? Real ‘Big Data’ step is at the operator level.&lt;/p&gt;

&lt;p&gt;Important to use standards, rather than proprietary systems.&lt;/p&gt;

&lt;p&gt;Q - In transport visualisation do you have low enough latency to get
real-time info?&lt;br /&gt;
A- Yes, e.g on a route in Brazil near Sao Palo it’s closed dues to fog.
Real-time info important for understanding the whole route.&lt;/p&gt;

&lt;h3 id=&quot;regulatory-backdrop-on-ip-and-standards-issues-for-the-m2m-eco-system&quot;&gt;“Regulatory backdrop on IP and standards issues for the M2M eco-system”&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Justin Hill, Co-Head of the Patent Prosecution Group and Purvi Parekh, Co-Head of International Telecoms, Olswang&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Purvi&lt;/strong&gt; on the Regulatory environment&lt;br /&gt;
No tailor made regulation v high regulatory focus. Regulatory focus from
leading bodies and many of them said that existing regulation can be amended
to facilitate M2M/IoT.  Made more complicated by lack of globally agreed
definition of IoT (which make it difficult for lawyers).  There’s generally
promotion of Open Standards.  EU does believe that this is v important.
People should read the RAND report (Nov 2013), commissioned by the EU to
examine if there should be standards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Justin&lt;/strong&gt; on IP issues&lt;br /&gt;
With any standardisation process, you’re hoping to increase adoption with
the trade-off of Right of IPR owners.  &lt;a href=&quot;http://en.wikipedia.org/wiki/Reasonable_and_non-discriminatory_licensing&quot;&gt;FRAND&lt;/a&gt; (fair, reasonable, and
non-discriminatory terms) are also important but that’s also debatable.
When considering how to protect IPR, it’s worth comparing whole-system
claims with protecting at different layers of the tech/value stack and build
a portfolio.&lt;/p&gt;

&lt;h3 id=&quot;the-impact-of-autonomous-systems-on-surface-transport&quot;&gt;“The impact of autonomous systems on surface transport”&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Paul Copping, Corporate Development Director, TRL&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;TRL is the Transport Research Laboratory.  Did some work to consider the
impact of autonomous transport on the overall value chain.  Some of things
we’re trying now with autonomous driving have been successfully done in the
past by other means (e.g car tracking a lane with magnets).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://amirchaudhry.com/images/cw-iot-new-world/cw-iot-new-world-4.jpg&quot; alt=&quot;Transport Value Chain&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;connected-products---designing-for-scale&quot;&gt;“Connected Products - Designing for Scale”&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Pilgrim Beart, Founder Director, 1248-io&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What is IoT?  Humans don’t scale.  Population is predicted to tail off at
around 9Bn.  Connected devices are growing and the rate of change is
exponential (and increasing).  In the 90s we used to be our own sysadmin
with maybe one device.  Now we have several and some cloud services.  In the
future there will be many more and they’ll have to manage themselves. There
are different problem you face as you go from 1 to 10 to 100 to 10000 to
1MM+ deployed devices.  Issues ranging from device updates al the way to
regulation and externalities that affect your business.&lt;/p&gt;

&lt;p&gt;In 10 years time, when all is said and done, we won’t be calling it the
Internet of Things. It’ll just be called the Internet.&lt;/p&gt;

&lt;p&gt;Q from an application developers perspective wht would you different earlier
in your development if you were to go back and start again&lt;br /&gt;
A - AlertMe started a bit too early so there were a lot things were not
off-the-shelf. Had to build. Right now can see a lot people reinventing the
wheel but shouldn’t need to do this.&lt;/p&gt;

&lt;h3 id=&quot;a-new-standard-to-connect-the-internet-of-everything&quot;&gt;“A new standard to connect the Internet of Everything”&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Antony Rix, Senior Consultant, TTP&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One of the things TTP works on are wireless standards.&lt;/p&gt;

&lt;p&gt;The size of the grey blobs are in an indication of market size.&lt;br /&gt;
&lt;img src=&quot;http://amirchaudhry.com/images/cw-iot-new-world/cw-iot-new-world-5.jpg&quot; alt=&quot;IoT Market Segments&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Users will expect things to cost pretty much the same as they did before.
Cost will be critical and as we buy things we generally still expect them to
last for years.&lt;/p&gt;

&lt;p&gt;TTP Matrix is a proprietary standard specifically for use by low-cost
wireless connected devices.  It’s optimised for efficient use of radio
spectrum, long range, low cost and power efficient.  Use-case example
(DisplayData) are the pricing labels on supermarket.  50k products running
through only 3 gateways (other standards would find this difficult). Low
power consumption means a battery can last 10 years.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Poll - Which (categories of) technical / architecture building blocks are
most urgently needed for building the Internet of Things.&lt;/strong&gt;
&lt;img src=&quot;http://amirchaudhry.com/images/cw-iot-new-world/cw-iot-new-world-6.jpg&quot; alt=&quot;Poll results&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;debate&quot;&gt;Debate&lt;/h3&gt;

&lt;p&gt;Interesting discussion of Humans role in IoT.  For home consumer devices
people may not want to have to make any decisions (completely automated) but
corporates my want all information in order to integrate and decide.&lt;/p&gt;

&lt;p&gt;How quickly will this happen? It’s difficult to say when you’re in the
middle of it. We’ll know it’s happened after the event. It takes about a
decade for things to get things in to mature in the market. On the other
hand, it’s happening.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Poll - Big and small data - Which statement do you agree with most/least&lt;/strong&gt;  &lt;br /&gt;
I only got a pic of the latter but it’s the inverse of the former
(unsurprisingly).&lt;br /&gt;
&lt;img src=&quot;http://amirchaudhry.com/images/cw-iot-new-world/cw-iot-new-world-7.jpg&quot; alt=&quot;Poll results&quot; /&gt;&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>From Jekyll site to Unikernel in fifty lines of code.</title>
    <link href="http://amirchaudhry.com/from-jekyll-to-unikernel-in-fifty-lines"/>
    <author>Amir Chaudhry</author>
    <updated>2014-03-10T18:30:00+00:00</updated>
    <id>http://amirchaudhry.com/from-jekyll-to-unikernel-in-fifty-lines</id>
    <content type="html">
&lt;p&gt;&lt;a href=&quot;http://openmirage.org&quot;&gt;Mirage&lt;/a&gt; has reached a point where it’s possible to easily set up
end-to-end toolchains to build &lt;a href=&quot;http://queue.acm.org/detail.cfm?id=2566628&quot;&gt;unikernels&lt;/a&gt;! &lt;!--\[If you're not sure what that is, read the post [What is a unikernel?][amc-unikernel]\]--&gt;
My first use-case is to be able to generate a unikernel which can serve my
personal static site but to do it with as much automation as possible. It
turns out this is possible with less than 50 lines of code.&lt;/p&gt;

&lt;p&gt;I use Jekyll and GitHub Pages at the moment so I wanted a workflow that’s as
easy to use, though I’m happy to spend some time up front to set up and
configure things.
The tools for achieving what I want are in good shape so
this post takes the example of a Jekyll site (i.e this one) and goes through
the steps to produce a unikernel on
&lt;a href=&quot;https://travis-ci.org&quot;&gt;Travis CI&lt;/a&gt; (a continuous integration service) which can later be
deployed.  Many of these instructions already exist in various forms but
they’re collated here to aid this use-case.&lt;/p&gt;

&lt;p&gt;I will take you, dear reader, through the process and when we’re finished,
the workflow will be as follows:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;You’ll write your posts on your local machine as normal&lt;/li&gt;
  &lt;li&gt;A push to GitHub will trigger a unikernel build for each commit&lt;/li&gt;
  &lt;li&gt;The Xen unikernel will be pushed to a repo for deployment&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To achieve this, we’ll first check that we can build a unikernel VM locally,
then we’ll set up a continuous integration service to automatically build
them for us and finally we’ll adapt the CI service to also deploy the built
VM.  Although the amount of code required is small, each of these steps is
covered below in some detail.
For simplicity, I’ll assume you already have OCaml and Opam
installed – if not, you can find out how via the
&lt;a href=&quot;http://realworldocaml.org/install&quot;&gt;Real Word OCaml install instructions&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;building-locally&quot;&gt;Building locally&lt;/h2&gt;

&lt;p&gt;To ensure that the build actually works, you should run things locally at
least once before pushing to Travis.  It’s worth noting that the
&lt;a href=&quot;https://github.com/mirage/mirage-skeleton&quot;&gt;mirage-skeleton&lt;/a&gt; repo contains a lot of useful, public domain examples
and helpfully, the specific code we need is in
&lt;a href=&quot;https://github.com/mirage/mirage-skeleton/tree/master/static_website&quot;&gt;mirage-skeleton/static_website&lt;/a&gt;.  Copy both the &lt;code class=&quot;highlighter-rouge&quot;&gt;config.ml&lt;/code&gt;
and &lt;code class=&quot;highlighter-rouge&quot;&gt;dispatch.ml&lt;/code&gt; files from that folder into a new &lt;code class=&quot;highlighter-rouge&quot;&gt;_mirage&lt;/code&gt; folder in your
jekyll repository.&lt;/p&gt;

&lt;p&gt;Edit &lt;code class=&quot;highlighter-rouge&quot;&gt;config.ml&lt;/code&gt; so that the two mentions of &lt;code class=&quot;highlighter-rouge&quot;&gt;./htdocs&lt;/code&gt; are replaced with
&lt;code class=&quot;highlighter-rouge&quot;&gt;../_site&lt;/code&gt;.  This is the only change you’ll need to make and you should now
be able to build the unikernel with the unix backend.  Make sure you have
the mirage package installed by running &lt;code class=&quot;highlighter-rouge&quot;&gt;$ opam install mirage&lt;/code&gt; and then run:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(edit: If you already have &lt;code class=&quot;highlighter-rouge&quot;&gt;mirage&lt;/code&gt;, remember to &lt;code class=&quot;highlighter-rouge&quot;&gt;opam update&lt;/code&gt; to make sure you’ve got the latest packages.)&lt;/em&gt;&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;_mirage
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;mirage configure &lt;span class=&quot;nt&quot;&gt;--unix&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;make depend         &lt;span class=&quot;c&quot;&gt;# needed as of mirage 1.2 onward&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;mirage build
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; ..&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;That’s all it takes!  In a few minutes there will be a unikernel built on
your system (symlinked as &lt;code class=&quot;highlighter-rouge&quot;&gt;_mirage/mir-www&lt;/code&gt;).  If there are any errors, make
sure that Opam is up to date and that you have the latest version of the
static_website files from &lt;a href=&quot;https://github.com/mirage/mirage-skeleton&quot;&gt;mirage-skeleton&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;serving-the-site-locally&quot;&gt;Serving the site locally&lt;/h3&gt;

&lt;p&gt;If you’d like to see this site locally, you can do so from within the
&lt;code class=&quot;highlighter-rouge&quot;&gt;_mirage&lt;/code&gt; folder by running unikernel you just built.  There’s more
information about the details of this on the &lt;a href=&quot;http://openmirage.org/wiki/mirage-www&quot;&gt;Mirage docs site&lt;/a&gt;
but the quick instructions are:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;_mirage
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;mirage run

&lt;span class=&quot;c&quot;&gt;# in another terminal window&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;ifconfig tap0 10.0.0.1 255.255.255.0&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;You can now point your browser at http://10.0.0.2/ and see your site!
Once you’re finished browsing, &lt;code class=&quot;highlighter-rouge&quot;&gt;$ mirage clean&lt;/code&gt; will clear up all the
generated files.&lt;/p&gt;

&lt;p&gt;Since the build is working locally, we can set up a continuous integration
system to perform the builds for us.&lt;/p&gt;

&lt;h2 id=&quot;setting-up-travis-ci&quot;&gt;Setting up Travis CI&lt;/h2&gt;
&lt;p&gt;&lt;img style=&quot;float: right; margin-left: 10px&quot; src=&quot;http://amirchaudhry.com/images/jekyll-unikernel/travis.png&quot; /&gt;&amp;lt;/img&amp;gt;&lt;/p&gt;

&lt;p&gt;We’ll be using the &lt;a href=&quot;https://travis-ci.org&quot;&gt;Travis CI&lt;/a&gt; service, which is free for open-source
projects (so this assumes you’re using a public repo).  The benefit of using
Travis is that you can build a unikernel &lt;em&gt;without&lt;/em&gt; needing a local OCaml
environment, but it’s always quicker to debug things locally.&lt;/p&gt;

&lt;p&gt;Log in to Travis using your GitHub ID which will then trigger a scan of your
repositories.  When this is complete, go to your Travis accounts page and
find the repo you’ll be building the unikernel from.  Switch it ‘on’ and
Travis will automatically set your GitHub post-commit hook and token for you.
That’s all you need to do on the website.&lt;/p&gt;

&lt;p&gt;When you next make a push to your repository, GitHub will inform Travis,
which will then look for a YAML file in the root of the repo called
&lt;code class=&quot;highlighter-rouge&quot;&gt;.travis.yml&lt;/code&gt;.  That file describes what Travis should do and what the build
matrix is.  Since OCaml is not one of the supported languages, we’ll be
writing our build script manually (this is actually easier than it sounds).
First, let’s set up the YAML file and then we’ll examine the build script.&lt;/p&gt;

&lt;h3 id=&quot;the-travis-yaml-file---travisyml&quot;&gt;The Travis YAML file - .travis.yml&lt;/h3&gt;

&lt;p&gt;The &lt;a href=&quot;http://docs.travis-ci.com/user/ci-environment/#CI-environment-OS&quot;&gt;Travis CI environment&lt;/a&gt; is based on Ubuntu 12.04, with a
number of things pre-installed (e.g Git, networking tools etc).  Travis
doesn’t support OCaml (yet) so we’ll use the &lt;code class=&quot;highlighter-rouge&quot;&gt;c&lt;/code&gt; environment to get the
packages we need, specifically, the OCaml compiler, Opam and Mirage. Once
those are set up, our build should run pretty much the same as it did locally.&lt;/p&gt;

&lt;p&gt;For now, let’s keep things simple and only focus on the latest releases
(OCaml 4.01.0 and Opam 1.1.1), which means our build matrix is very simple.
The build instructions will be in the file &lt;code class=&quot;highlighter-rouge&quot;&gt;_mirage/travis.sh&lt;/code&gt;, which we
will move to and trigger from the &lt;code class=&quot;highlighter-rouge&quot;&gt;.travis.yml&lt;/code&gt; file.  This means our YAML
file should look like:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;na&quot;&gt;language&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;c&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;before_script&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;cd _mirage&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bash -ex travis.sh&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;MIRAGE_BACKEND=xen DEPLOY=0&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;MIRAGE_BACKEND=unix&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;The matrix enables us to have parallel builds for different environments and
this one is very simple as it’s only building two unikernels. One worker
will build for the Xen backend and another worker will build for the Unix
backend. The &lt;code class=&quot;highlighter-rouge&quot;&gt;_mirage/travis.sh&lt;/code&gt; script will clarify what each of these
environments translates to.  We’ll come back to the &lt;code class=&quot;highlighter-rouge&quot;&gt;DEPLOY&lt;/code&gt; flag later on
(it’s not necessary yet).  Now that this file is set up, we can work on the
build script itself.&lt;/p&gt;

&lt;h3 id=&quot;the-build-script---travissh&quot;&gt;The build script - travis.sh&lt;/h3&gt;

&lt;p&gt;To save time, we’ll be using an Ubuntu PPA to quickly get
&lt;a href=&quot;https://launchpad.net/~avsm&quot;&gt;pre-packaged versions of the OCaml compiler and Opam&lt;/a&gt;, so the
first thing to do is define which PPAs each line of the build matrix
corresponds to.  Since we’re keeping things simple, we only need one PPA
that has the most recent releases of OCaml and Opam.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;ppa&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;avsm/ocaml41+opam11
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;yes&quot;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;add-apt-repository ppa:&lt;span class=&quot;nv&quot;&gt;$ppa&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-get update &lt;span class=&quot;nt&quot;&gt;-qq&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-get install &lt;span class=&quot;nt&quot;&gt;-qq&lt;/span&gt; ocaml ocaml-native-compilers camlp4-extra opam&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;[NB: There are many &lt;a href=&quot;https://launchpad.net/~avsm&quot;&gt;other PPAs&lt;/a&gt; for different combinations of
OCaml/Opam which are useful for testing].  Once the appropriate PPAs have
been set up it’s time to initialise Opam and install Mirage.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;OPAMYES&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1
opam init
opam install mirage
&lt;span class=&quot;nb&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;opam config env&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;We set &lt;code class=&quot;highlighter-rouge&quot;&gt;OPAMYES=1&lt;/code&gt; to get non-interactive use of Opam (it defaults to ‘yes’
for any user input) and if we want full build logs, we could also set
&lt;code class=&quot;highlighter-rouge&quot;&gt;OPAMVERBOSE=1&lt;/code&gt; (I haven’t in this example).
The rest should be straight-forward and you’ll end up with an
Ubuntu machine with OCaml, Opam and the Mirage package installed.  It’s now
trivial to do the next step of actually building the unikernel!&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;mirage configure &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$MIRAGE_BACKEND&lt;/span&gt;
mirage build&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;You can see how we’ve used the environment variable from the Travis file and
this is where our two parallel builds begin to diverge.  When you’ve saved
this file, you’ll need to change permissions to make it executable by doing
&lt;code class=&quot;highlighter-rouge&quot;&gt;$ chmod +x _mirage/travis.sh&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That’s all you need to build the unikernel on Travis!  You should now commit
both the YAML file and the build script to the repo and push the changes to
GitHub.  Travis should automatically start your first build and you can
watch the console output online to check that both the Xen and Unix backends
complete properly.  If you notice any errors, you should go back over your
build script and fix it before the next step.&lt;/p&gt;

&lt;h2 id=&quot;deploying-your-unikernel&quot;&gt;Deploying your unikernel&lt;/h2&gt;
&lt;p&gt;&lt;img style=&quot;float: right; margin-left: 10px&quot; src=&quot;http://amirchaudhry.com/images/jekyll-unikernel/octocat.png&quot; /&gt;&amp;lt;/img&amp;gt;&lt;/p&gt;

&lt;p&gt;When Travis has finished its builds it will simply destroy the worker and
all its contents, including the unikernels we just built.  This is perfectly
fine for testing but if we want to also &lt;em&gt;deploy&lt;/em&gt; a unikernel, we need to get
it out of the Travis worker after it’s built. In this case, we want to
extract the Xen-based unikernel so that we can later start it on a Xen-based
machine (e.g Amazon, Rackspace or - in our case - a machine on &lt;a href=&quot;http://www.bytemark.co.uk&quot;&gt;Bytemark&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Since the unikernel VMs are small (only tens of MB), our method for
exporting will be to commit the Xen unikernel into a repository on GitHub.
It can be retrieved and started later on and keeping the VMs in version
control gives us very effective snapshots (we can roll back the site without
having to rebuild).  This is something that would be much more challenging
if we were using the ‘standard’ web toolstack.&lt;/p&gt;

&lt;p&gt;The deployment step is a little more complex as we have to send the
Travis worker a private SSH key, which will give it push access to a GitHub
repository.  Of course, we don’t want to expose that key by simply adding it
to the Travis file so we have to encrypt it somehow.&lt;/p&gt;

&lt;h3 id=&quot;sending-travis-a-private-ssh-key&quot;&gt;Sending Travis a private SSH key&lt;/h3&gt;

&lt;p&gt;Travis supports &lt;a href=&quot;http://docs.travis-ci.com/user/encryption-keys/&quot;&gt;encrypted environment variables&lt;/a&gt;. Each
repository has its own public key and the &lt;a href=&quot;http://rubygems.org/gems/travis&quot;&gt;Travis gem&lt;/a&gt; uses
this public key to encrypt data, which you then add to your &lt;code class=&quot;highlighter-rouge&quot;&gt;.travis.yml&lt;/code&gt;
file for decryption by the worker.  This is meant for sending things like
private API tokens and other small amounts of data. Trying to encrypt an SSH
key isn’t going to work as it’s too large.  Instead we’ll use
&lt;a href=&quot;https://github.com/avsm/travis-senv&quot;&gt;travis-senv&lt;/a&gt;, which encodes, encrypts and chunks up the key into smaller
pieces and then reassembles those pieces on the Travis worker.  We still use
the Travis gem to encrypt the pieces to add them to the &lt;code class=&quot;highlighter-rouge&quot;&gt;.travis.yml&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;While you could give Travis a key that accesses your whole GitHub account, my
preference is to create a &lt;em&gt;new&lt;/em&gt; deploy key, which will only be used for
&lt;a href=&quot;https://help.github.com/articles/managing-deploy-keys#deploy-keys&quot;&gt;deployment to one repository&lt;/a&gt;.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# make a key pair on your local machine&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; ~/.ssh/
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;ssh-keygen &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; dsa &lt;span class=&quot;nt&quot;&gt;-C&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;travis.deploy&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; travis-deploy_dsa
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; -&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Note that this is a 1024 bit key so if you decide to use a 2048 bit key,
then be aware that Travis &lt;a href=&quot;https://github.com/avsm/travis-senv/issues/1&quot;&gt;sometimes has issues&lt;/a&gt;. Now that we have
a key, we can encrypt it and add it to the Travis file.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# on your local machine&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# install the necessary components&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;gem install travis
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;opam install travis-senv

&lt;span class=&quot;c&quot;&gt;# chunk the key, add to yml file and rm the intermediate&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;travis-senv encrypt ~/.ssh/travis-deploy_dsa _travis_env
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat &lt;/span&gt;_travis_env | travis encrypt &lt;span class=&quot;nt&quot;&gt;-ps&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--add&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;rm _travis_env&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;travis-senv&lt;/code&gt; encrypts and chunks the key locally on your machine, placing
its output in a file you decide (&lt;code class=&quot;highlighter-rouge&quot;&gt;_travis_env&lt;/code&gt;).  We then take that output
file and pipe it to the &lt;code class=&quot;highlighter-rouge&quot;&gt;travis&lt;/code&gt; ruby gem, asking it to encrypt the input,
treating each line as separate and to be appended (&lt;code class=&quot;highlighter-rouge&quot;&gt;-ps&lt;/code&gt;) and then actually
adding that to the Travis file (&lt;code class=&quot;highlighter-rouge&quot;&gt;--add&lt;/code&gt;).  You can run &lt;code class=&quot;highlighter-rouge&quot;&gt;$ travis encrypt -h&lt;/code&gt;
to understand these options.  Once you’ve run the above commands,
&lt;code class=&quot;highlighter-rouge&quot;&gt;.travis.yml&lt;/code&gt; will look as follows.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;na&quot;&gt;language&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;c&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;before_script&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;cd _mirage&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bash -ex travis.sh&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;MIRAGE_BACKEND=xen DEPLOY=0&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;MIRAGE_BACKEND=unix&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;global&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;secure&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;....&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;encrypted&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;....&quot;&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;secure&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;....&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;encrypted&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;....&quot;&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;secure&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;....&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;encrypted&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;....&quot;&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;The number of secure variables added depends on the type and size of the key
you had to chunk, so it could vary from 8 up to 29. We’ll commit
these additions later on, alongside additions to the build script.&lt;/p&gt;

&lt;p&gt;At this point, we also need to make a repository on GitHub
and add the public deploy key so
that Travis can push to it.  Once you’ve created your repo and added a
README, follow GitHub’s instructions on &lt;a href=&quot;https://help.github.com/articles/managing-deploy-keys#deploy-keys&quot;&gt;adding deploy keys&lt;/a&gt;
and paste in the public key (i.e. the content of &lt;code class=&quot;highlighter-rouge&quot;&gt;travis-deploy_dsa.pub&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Now that we can securely pass a private SSH key to the worker
and have a repo that the worker can push to, we need to
make additions to the build script.&lt;/p&gt;

&lt;h3 id=&quot;committing-the-unikernel-to-a-repository&quot;&gt;Committing the unikernel to a repository&lt;/h3&gt;

&lt;p&gt;Since we can set &lt;code class=&quot;highlighter-rouge&quot;&gt;DEPLOY=1&lt;/code&gt; in the YAML file we only need to make
additions to the build script.  Specifically, we want to assure that: only
the Xen backend is deployed; only &lt;em&gt;pushes&lt;/em&gt; to the repo result in
deployments, not pull requests (we do still want &lt;em&gt;builds&lt;/em&gt; for pull requests).&lt;/p&gt;

&lt;p&gt;In the build script (&lt;code class=&quot;highlighter-rouge&quot;&gt;_mirage/travis.sh&lt;/code&gt;), which is being run by the worker,
we’ll have to reconstruct the SSH key and configure Git.  In addition,
Travis gives us a set of useful &lt;a href=&quot;http://docs.travis-ci.com/user/ci-environment/#Environment-variables&quot;&gt;environment variables&lt;/a&gt; so we’ll
use the latest commit hash (&lt;code class=&quot;highlighter-rouge&quot;&gt;$TRAVIS_COMMIT&lt;/code&gt;) to name the the VM (which also
helps us trace which commit it was built from).&lt;/p&gt;

&lt;p&gt;It’s easier to consider this section of code at once so I’ve explained the
details in the comments. This section is what you need to add at the end of
your existing build script (i.e straight after &lt;code class=&quot;highlighter-rouge&quot;&gt;mirage build&lt;/code&gt;).&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Only deploy if the following conditions are met.&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$MIRAGE_BACKEND&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;xen&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$DEPLOY&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;1&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$TRAVIS_PULL_REQUEST&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;false&quot;&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;k&quot;&gt;then&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;# The Travis worker will already have access to the chunks&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;# passed in via the yaml file. Now we need to reconstruct &lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;# the GitHub SSH key from those and set up the config file.&lt;/span&gt;
    opam install travis-senv
    mkdir &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; ~/.ssh
    travis-senv decrypt &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; ~/.ssh/id_dsa &lt;span class=&quot;c&quot;&gt;# This doesn't expose it&lt;/span&gt;
    chmod 600 ~/.ssh/id_dsa             &lt;span class=&quot;c&quot;&gt;# Owner can read and write&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Host some_user github.com&quot;&lt;/span&gt;   &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.ssh/config
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;  Hostname github.com&quot;&lt;/span&gt;          &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.ssh/config
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;  StrictHostKeyChecking no&quot;&lt;/span&gt;     &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.ssh/config
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;  CheckHostIP no&quot;&lt;/span&gt;               &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.ssh/config
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;  UserKnownHostsFile=/dev/null&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.ssh/config

    &lt;span class=&quot;c&quot;&gt;# Configure the worker's git details&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;# otherwise git actions will fail.&lt;/span&gt;
    git config &lt;span class=&quot;nt&quot;&gt;--global&lt;/span&gt; user.email &lt;span class=&quot;s2&quot;&gt;&quot;user@example.com&quot;&lt;/span&gt;
    git config &lt;span class=&quot;nt&quot;&gt;--global&lt;/span&gt; user.name &lt;span class=&quot;s2&quot;&gt;&quot;Travis Build Bot&quot;&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;# Do the actual work for deployment.&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;# Clone the deployment repo. Notice the user,&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;# which is the same as in the ~/.ssh/config file.&lt;/span&gt;
    git clone git@some_user:amirmc/www-test-deploy
    &lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;www-test-deploy

    &lt;span class=&quot;c&quot;&gt;# Make a folder named for the commit. &lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;# If we're rebuiling a VM from a previous&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;# commit, then we need to clear the old one.&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;# Then copy in both the config file and VM.&lt;/span&gt;
    rm &lt;span class=&quot;nt&quot;&gt;-rf&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$TRAVIS_COMMIT&lt;/span&gt;
    mkdir &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$TRAVIS_COMMIT&lt;/span&gt;
    cp ../mir-www.xen ../config.ml &lt;span class=&quot;nv&quot;&gt;$TRAVIS_COMMIT&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;# Compress the VM and add a text file to note&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;# the commit of the most recently built VM.&lt;/span&gt;
    bzip2 &lt;span class=&quot;nt&quot;&gt;-9&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$TRAVIS_COMMIT&lt;/span&gt;/mir-www.xen
    git pull &lt;span class=&quot;nt&quot;&gt;--rebase&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$TRAVIS_COMMIT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; latest    &lt;span class=&quot;c&quot;&gt;# update ref to most recent&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;# Add, commit and push the changes!&lt;/span&gt;
    git add &lt;span class=&quot;nv&quot;&gt;$TRAVIS_COMMIT&lt;/span&gt; latest
    git commit &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;adding &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$TRAVIS_COMMIT&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; built for &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$MIRAGE_BACKEND&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
    git push origin master
    &lt;span class=&quot;c&quot;&gt;# Go out and enjoy the Sun!&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;At this point you should commit the changes to &lt;code class=&quot;highlighter-rouge&quot;&gt;./travis.yml&lt;/code&gt; (don’t forget
the deploy flag) and &lt;code class=&quot;highlighter-rouge&quot;&gt;_mirage/travis.sh&lt;/code&gt; and push the changes to GitHub.
Everything else will take place automatically and in a few minutes you will
have a unikernel ready to deploy on top of Xen!&lt;/p&gt;

&lt;p&gt;You can see both the complete YAML file and build script in use on my
&lt;a href=&quot;https://github.com/amirmc/www-test&quot;&gt;test repo&lt;/a&gt;, as well as the &lt;a href=&quot;https://travis-ci.org/amirmc/www-test&quot;&gt;build logs&lt;/a&gt; for that repo
and the &lt;a href=&quot;https://github.com/amirmc/www-test-deploy&quot;&gt;deploy repo&lt;/a&gt; with a VM.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;[Pro-tip: If you add *&lt;code class=&quot;highlighter-rouge&quot;&gt;[skip ci]&lt;/code&gt;&lt;/em&gt; anywhere in your
commit message, Travis will skip the build for that commit.
This is very useful if you’re making minor changes, like updating a
README.]*&lt;/p&gt;

&lt;h2 id=&quot;finishing-up&quot;&gt;Finishing up&lt;/h2&gt;

&lt;p&gt;Since I’m still using Jekyll for my website, I made a short script in my
jekyll repository (&lt;code class=&quot;highlighter-rouge&quot;&gt;_deploy-unikernel.sh&lt;/code&gt;) that builds the site, commits the
contents of &lt;code class=&quot;highlighter-rouge&quot;&gt;_site&lt;/code&gt; and pushes to GitHub. I simply run this after I’ve
committed a new blog post and the rest takes care of itself.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;
jekyll build
git add _site
git commit &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'update _site'&lt;/span&gt;
git push origin master&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Congratulations! You now have an end-to-end workflow that will produce a
unikernel VM from your Jekyll-based site and push it to a repo.  If you
strip out all the comments, you’ll see that we’ve written less than 50 lines
of code! Admittedly, I’m not counting the 80 or so lines that came for free
in the &lt;code class=&quot;highlighter-rouge&quot;&gt;*.ml&lt;/code&gt; files but that’s still pretty impressive.&lt;/p&gt;

&lt;p&gt;Of course, we still need a machine to take that VM and run it but that’s a
topic for another post.  For the time-being, I’m still using GitHub Pages
but once the VM is hosted somewhere, I will:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Turn off GitHub Pages and serve from the VM – but still using Jekyll in
the workflow.&lt;/li&gt;
  &lt;li&gt;Replace Jekyll with OCaml-based static-site generation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Although all the tools already exist to switch now, I’m taking my time so
that I can easily maintain the code I end up using.&lt;/p&gt;

&lt;h2 id=&quot;expanding-the-script-for-testing&quot;&gt;Expanding the script for testing&lt;/h2&gt;

&lt;p&gt;You may have noticed that the examples here are not very flexible or
extensible but that was a deliberate choice to keep them readable.  It’s
possible to do much more with the build matrix and script, as you can see
from the Travis files on my &lt;a href=&quot;https://github.com/amirmc/amirmc.github.com/tree/master/_mirage&quot;&gt;website repo&lt;/a&gt;, which were based on
those of the &lt;a href=&quot;https://github.com/mirage/mirage-www&quot;&gt;Mirage site&lt;/a&gt; and &lt;a href=&quot;https://github.com/mor1/mort-www&quot;&gt;Mort’s site&lt;/a&gt;.
Specifically, you can note the use of more environment variables and case
statements to decide which PPAs to grab.  Once you’ve got your builds
working, it’s worth improving your scripts to make them more maintainable
and cover the test cases you feel are important.&lt;/p&gt;

&lt;h3 id=&quot;not-just-for-static-sites-surprise&quot;&gt;Not just for static sites (surprise!)&lt;/h3&gt;

&lt;p&gt;You might have noticed that in very few places in the toolchain above have I
mentioned anything specific to static sites per se.  The workflow is simply
(1) do some stuff locally, (2) push to a continuous integration service
which then (3) builds and deploys a Xen-based unikernel.  Apart from the
convenient folder structure, the specific work to treat this as a static
site lives in the &lt;code class=&quot;highlighter-rouge&quot;&gt;*.ml&lt;/code&gt; files, which I’ve skipped over for this post.&lt;/p&gt;

&lt;p&gt;As such, the GitHub+Travis workflow we’ve developed here is quite general
and will apply to almost &lt;em&gt;any&lt;/em&gt; unikernels that we may want to construct.
I encourage you to explore the examples in the &lt;a href=&quot;https://github.com/mirage/mirage-skeleton&quot;&gt;mirage-skeleton&lt;/a&gt; repo and
keep your build script maintainable.  We’ll be using it again the next time
we build unikernel devices.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;Acknowledgements:&lt;/em&gt; There were lots of things I read over while writing this
post but there were a few particularly useful things that you should look up.
Anil’s posts on &lt;a href=&quot;http://anil.recoil.org/2013/09/30/travis-and-ocaml.html&quot;&gt;Testing with Travis&lt;/a&gt; and
&lt;a href=&quot;http://anil.recoil.org/2013/10/06/travis-secure-ssh-integration.html&quot;&gt;Travis for secure deployments&lt;/a&gt; are quite succinct (and
were themselves prompted by &lt;a href=&quot;http://blog.mlin.net/2013/02/testing-ocaml-projects-on-travis-ci.html&quot;&gt;Mike Lin’s Travis post&lt;/a&gt; several
months earlier). Looking over Mort’s &lt;a href=&quot;https://github.com/mor1/mort-www/blob/master/.travis-build.sh&quot;&gt;build script&lt;/a&gt; and that of
&lt;a href=&quot;https://github.com/mirage/mirage-www/blob/master/.travis-ci.sh&quot;&gt;mirage-www&lt;/a&gt; helped me figure out the deployment steps as well as improve
my own script. Special thanks also to &lt;a href=&quot;http://erratique.ch&quot;&gt;Daniel&lt;/a&gt;, &lt;a href=&quot;http://www.lpw25.net&quot;&gt;Leo&lt;/a&gt; and &lt;a href=&quot;http://anil.recoil.org&quot;&gt;Anil&lt;/a&gt; for
commenting on an earlier draft of this post.&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>Scientific evidence for health supplements</title>
    <link href="http://amirchaudhry.com/scientific-evidence-for-health-supplements-2014"/>
    <author>Amir Chaudhry</author>
    <updated>2014-01-30T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/scientific-evidence-for-health-supplements-2014</id>
    <content type="html">
&lt;p&gt;This is an update to an &lt;a href=&quot;http://amirchaudhry.com/scientific-evidence-for-health-supplements/&quot;&gt;earlier version&lt;/a&gt; of this infographic, which I 
came across two years ago.  It was interesting at the time since it did a 
good job at displaying the myriad supplements in a way that indicated both 
their likely efficacy, according to research papers, and how popular the 
search term was.  For example, the previous image showed ‘strong’ evidence 
for licorice root as an aid for coughs, but it had a much smaller search 
volume than the equivalently effective fish-oil for blood pressure.  I also 
really liked the concept of the ‘Worth it Line’.&lt;/p&gt;

&lt;p&gt;The graphic has been updated a couple of times now, with the most recent 
change a few weeks ago.  There are quite a few differences as garlic didn’t 
feature so prominently on the previous image and it looks like a number of 
things may have been removed (e.g licorice root).&lt;/p&gt;

&lt;p&gt;Vitamin D, as beneficial to general health, is still way up there.  I 
decided to try Vitamin D3 supplements over the winter, under the theory that 
I’m not getting enough sun so a supplement may be useful.  I was quite 
surprised at how much better I felt after a day or so of taking it, to the 
point where I tried looking up work on Vitamin D and mood*.  Scanning the 
research seemed to indicate that there may be links between Vitamin D, 
serotonin levels and depression but the extent isn’t clear and conclusions 
were mixed.  Of course, that mostly supports what the infographic is saying 
and it puts it above the ‘Worth it Line’ (for depression specifically but 
not general ‘mood’ per se).&lt;/p&gt;

&lt;p&gt;I encourage you to go visit the site as there’s an 
&lt;a href=&quot;http://www.informationisbeautiful.net/play/snake-oil-supplements/&quot;&gt;interactive version&lt;/a&gt;, where you can highlight a bubble to get more 
info and be transported to the main study it references.  If you like, you 
can also dig into the &lt;a href=&quot;http://bit.ly/snakeoilsupps&quot;&gt;spreadsheet itself&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.informationisbeautiful.net/visualizations/snake-oil-supplements/&quot;&gt;&lt;img src=&quot;http://amirchaudhry.com/images/web/snakeoil-supplements-2014-01-08.png&quot; alt=&quot;Scientific evidence for health supplements&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;via &lt;a href=&quot;http://www.informationisbeautiful.net/visualizations/snake-oil-supplements/&quot;&gt;informationisbeautiful.net&lt;/a&gt;&lt;/p&gt;

&lt;!-- footnotes --&gt;
&lt;p class=&quot;footnote&quot;&gt;* I'm well aware that I may be experiencing nothing more than a placebo effect :)&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>Switching from Bootstrap to Zurb Foundation</title>
    <link href="http://amirchaudhry.com/switching-from-bootstrap-to-zurb-foundation"/>
    <author>Amir Chaudhry</author>
    <updated>2013-11-26T21:05:00+00:00</updated>
    <id>http://amirchaudhry.com/switching-from-bootstrap-to-zurb-foundation</id>
    <content type="html">
&lt;p&gt;I’ve just updated my site’s HTML/CSS and moved from Twitter Bootstrap to 
&lt;a href=&quot;http://foundation.zurb.com/learn/features.html&quot;&gt;Zurb Foundation&lt;/a&gt;.  This post captures my subjective notes on the 
migration.&lt;/p&gt;

&lt;h4 id=&quot;my-use-of-bootstrap&quot;&gt;My use of Bootstrap&lt;/h4&gt;

&lt;p&gt;When I originally set this site up, I didn’t know what frameworks existed or 
anything more than the basics of dealing with HTML (and barely any CSS).  I 
came across Twitter Bootstrap and immediately decided it would Solve All My 
Problems.  It really did.  Since then, I’ve gone through one ‘upgrade’ with 
Bootstrap (from 1.x to 2.x), after which I dutifully ignored all the fixes 
and improvements (note that Bootstrap was up to v2.3.2 while I was still 
using v2.0.2).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://amirchaudhry.com/images/switch-to-foundation/responsive-design.png&quot; alt=&quot;Responsive Design&quot; /&gt;&lt;/p&gt;

&lt;p&gt;For the most part, this was fine with me but for a while now, I’ve been 
meaning to make this site ‘responsive’ (read: not look like crap from a 
mobile).  Bootstrap v3 purports to be mobile-first so upgrading would likely 
give me what I’m after but v3 is &lt;a href=&quot;http://getbootstrap.com/getting-started/&quot;&gt;not backwards compatible&lt;/a&gt;, 
meaning I’d have to rewrite parts of the HTML.  Since this step was 
unavoidable, it led me to have another look at front-end frameworks, just to 
see if I was missing anything.  This was especially relevant since we’d 
&lt;a href=&quot;http://amirchaudhry.com/announcing-new-ocamlorg/&quot;&gt;just released&lt;/a&gt; the new &lt;a href=&quot;http://ocaml.org&quot;&gt;OCaml.org&lt;/a&gt; 
website, itself built with Bootstrap v2.3.1 (we’d done the design/templating 
work long before v3 was released).  It would be useful to know what else is 
out there for any future work.&lt;/p&gt;

&lt;p&gt;Around this time I discovered Zurb Foundation and also the numerous 
comparisons between them (note: Foundation seems to come out ahead in most 
of those).  A few days ago, the folks at Zurb released 
&lt;a href=&quot;http://zurb.com/article/1280/foundation-5-blasts-off--2&quot;&gt;version 5&lt;/a&gt;, so I decided that now is the time to kick the 
tires.  For the last few days, I’ve been playing with the framework and in 
the end I decided to migrate my site over completely.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://foundation.zurb.com/learn/features.html&quot;&gt;&lt;img src=&quot;http://amirchaudhry.com/images/switch-to-foundation/zurb-yeti.png&quot; alt=&quot;Foundation's Yeti&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;swapping-out-one-framework-for-another&quot;&gt;Swapping out one framework for another&lt;/h4&gt;

&lt;p&gt;Over time, I’ve become moderately experienced with HTML/CSS and I can 
usually wrangle things to look the way I want, but my solutions aren’t 
necessarily elegant. I was initially concerned that I’d already munged 
things so much that changing anything would be a pain.  When I first put the 
styles for this site together, I had to spend quite a bit of time 
overwriting Bootstrap’s defaults so I was prepared for the same when using 
Foundation.  Turns out that I was fine.  I currently use &lt;a href=&quot;http://jekyllrb.com&quot;&gt;Jekyll&lt;/a&gt; (and 
&lt;a href=&quot;http://jekyllbootstrap.com&quot;&gt;Jekyll Bootstrap&lt;/a&gt;) so I only had three template files and a couple of 
HTML pages to edit and because I’d kept most of my custom CSS in a separate 
file, it was literally a case of swapping out one framework for another and 
bug-fixing from there onwards.  There’s definitely a lesson here in using 
automation as much as possible.&lt;/p&gt;

&lt;p&gt;Customising the styles was another area of concern but I was pleasantly 
surprised to find I needed &lt;em&gt;less&lt;/em&gt; customisation than with Bootstrap.  This 
is likely because I didn’t have to override as many defaults (and probably 
because I’ve learned more about CSS since then).  The one thing I seemed to 
be missing was a way to deal with code sections, so I just took what 
Bootstrap had and copied it in.  At some point I should revisit this.&lt;/p&gt;

&lt;p&gt;It did take me a while to get my head around Foundation’s grid but it was 
worth it in the end.  The idea is that you should design for small screens 
first and then adjust things for larger screens as necessary. There are 
several different default sizes which inherit their properties from the size 
below, unless you explicitly override them.  I initially screwed this up by 
explicitly defining the grid using the &lt;code class=&quot;highlighter-rouge&quot;&gt;small-#&lt;/code&gt; classes, which obviously 
looks ridiculous on small screens.  I fixed it by swapping out &lt;code class=&quot;highlighter-rouge&quot;&gt;small-#&lt;/code&gt; for 
&lt;code class=&quot;highlighter-rouge&quot;&gt;medium-#&lt;/code&gt; everywhere in the HTML, after which everything looked reasonable. 
Items flowed sensibly into a default column for the small screens and looked 
acceptable for larger screens and perfectly fine on desktops.  I could do 
more styling of the mobile view but I’d already achieved most of what I was 
after.&lt;/p&gt;

&lt;h4 id=&quot;fixing-image-galleries-and-embedded-content&quot;&gt;Fixing image galleries and embedded content&lt;/h4&gt;

&lt;p&gt;The only additional thing I used from Bootstrap was the &lt;a href=&quot;http://getbootstrap.com/javascript/#carousel&quot;&gt;Carousel&lt;/a&gt;. I’d 
written some custom helper scripts that would take some images and 
thumbnails from a specified folder and produce clickable thumbnails with a 
slider underneath.  Foundation provides &lt;a href=&quot;http://foundation.zurb.com/docs/components/orbit.html&quot;&gt;Orbit&lt;/a&gt;, so I had to spend time 
rewriting my script to produce the necessary HTML.  This actually resulted 
in cleaner HTML and one of the features I wanted (the ability to link to a 
specific image) was available by default in Orbit.  At this point I also 
tried to make the output look better for the case where JavaScript is 
disabled (in essence, each image is just displayed as a list).  Below is an 
example of an image gallery, taken from a previous post, when I 
&lt;a href=&quot;http://amirchaudhry.com/joined-the-computer-lab/&quot;&gt;joined the computer lab&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
  &lt;noscript&gt;&lt;small&gt;&lt;em&gt;Note: The gallery needs JavaScript but I've tried to make it degrade gracefully. -Amir&lt;/em&gt;&lt;/small&gt;&lt;/noscript&gt;
  &lt;ul class=&quot;inline-list&quot;&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;join-comp-lab-1&quot;&gt;&lt;img src=&quot;/images/join-comp-lab/join-comp-lab-thumb-1.png&quot; alt=&quot;join-comp-lab-thumb-1&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;join-comp-lab-2&quot;&gt;&lt;img src=&quot;/images/join-comp-lab/join-comp-lab-thumb-2.png&quot; alt=&quot;join-comp-lab-thumb-2&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;join-comp-lab-3&quot;&gt;&lt;img src=&quot;/images/join-comp-lab/join-comp-lab-thumb-3.png&quot; alt=&quot;join-comp-lab-thumb-3&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
  &lt;ul data-orbit=&quot;&quot; data-options=&quot;next_on_click:true; timer_speed:3000; pause_on_hover:false; bullets:false;&quot;&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;join-comp-lab-1&quot;&gt;&lt;img src=&quot;/images/join-comp-lab/join-comp-lab-1.jpg&quot; alt=&quot;join-comp-lab-1&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;join-comp-lab-2&quot;&gt;&lt;img src=&quot;/images/join-comp-lab/join-comp-lab-2.jpg&quot; alt=&quot;join-comp-lab-2&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;join-comp-lab-3&quot;&gt;&lt;img src=&quot;/images/join-comp-lab/join-comp-lab-3.jpg&quot; alt=&quot;join-comp-lab-3&quot; /&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;Foundation also provides a component called &lt;a href=&quot;http://foundation.zurb.com/docs/components/flex_video.html&quot;&gt;Flex Video&lt;/a&gt;, which allows the 
browser to scale videos to the appropriate size.  This fix was as simple as 
going back through old posts and wrapping anything that was &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt; in a 
&lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;div class=&quot;flex-video&quot;&amp;gt;&lt;/code&gt;.  It really was that simple and all the Vimeo and 
YouTube items scaled perfectly.  Here’s an example of a video from an 
earlier post, where I gave a &lt;a href=&quot;http://amirchaudhry.com/wireframe-demos-for-ocamlorg/&quot;&gt;walkthrough of the ocaml.org site&lt;/a&gt;. 
Try changing the width of your browser window to see it scale.&lt;/p&gt;

&lt;div class=&quot;flex-video widescreen vimeo&quot;&gt;
  &lt;iframe src=&quot;http://player.vimeo.com/video/61768157?byline=0&amp;amp;portrait=0&amp;amp;color=de9e6a&quot; width=&quot;540&quot; height=&quot;303&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;Video demo&lt;/iframe&gt;
&lt;/div&gt;

&lt;h4 id=&quot;framework-differences&quot;&gt;Framework differences&lt;/h4&gt;

&lt;p&gt;Another of the main difference between the two frameworks is that Bootstrap 
uses &lt;a href=&quot;http://lesscss.org&quot;&gt;LESS&lt;/a&gt; to manage its CSS whereas Foundation uses &lt;a href=&quot;http://sass-lang.com&quot;&gt;SASS&lt;/a&gt;.  Frankly, 
I’ve no experience with either of them so it makes little difference to me. 
It’s worth bearing in mind for anyone who’s workflow does involve 
pre-processing.  Also, Bootstrap is available under the 
&lt;a href=&quot;http://getbootstrap.com/getting-started/#license-faqs&quot;&gt;Apache 2 License&lt;/a&gt;, while Foundation is released under 
the &lt;a href=&quot;http://foundation.zurb.com/learn/faq.html#question-3&quot;&gt;MIT license&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;summary&quot;&gt;Summary&lt;/h4&gt;

&lt;p&gt;Overall, the transition was pretty painless and most of the time was spent 
getting familiar with the grid, hunting for docs/examples and trying to make 
the image gallery work the way I wanted.  I do think Bootstrap’s docs are 
better but Foundation’s aren’t bad.&lt;/p&gt;

&lt;p&gt;Although this isn’t meant to be a comparison, I much prefer Foundation to 
Bootstrap.  If you’re not sure which to use then I think the secret is in 
the names of the frameworks.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Bootstrap (for me) was a &lt;em&gt;great&lt;/em&gt; way to ‘&lt;em&gt;bootstrap&lt;/em&gt;’ a site quickly with 
lots of acceptable defaults – it was quick to get started but took some 
work to alter.&lt;/li&gt;
  &lt;li&gt;Foundation seems to provide a great ‘&lt;em&gt;foundation&lt;/em&gt;’ on which to create more 
customised sites – it’s more flexible but needs more upfront thought.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s pretty much how I’d recommend them to people now.&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>Announcing the new OCaml.org</title>
    <link href="http://amirchaudhry.com/announcing-new-ocamlorg"/>
    <author>Amir Chaudhry</author>
    <updated>2013-11-20T23:00:00+00:00</updated>
    <id>http://amirchaudhry.com/announcing-new-ocamlorg</id>
    <content type="html">
&lt;p&gt;As some of you may have noticed, the new OCaml.org site is now live!&lt;/p&gt;

&lt;p&gt;The DNS may still be propagating so if &lt;a href=&quot;http://ocaml.org&quot;&gt;http://ocaml.org&lt;/a&gt; hasn’t updated for you then try http://166.78.252.20.  This post is in two parts: the first is the announcement and the second is a call for content.&lt;/p&gt;

&lt;h3 id=&quot;new-ocamlorg-website-design&quot;&gt;New OCaml.org website design!&lt;/h3&gt;

&lt;p&gt;The new site represents a major milestone in the continuing growth of the OCaml ecosystem. It’s the culmination of a lot of volunteer work over the last several months and I’d specifically like to thank &lt;a href=&quot;https://github.com/Chris00&quot;&gt;Christophe&lt;/a&gt;, &lt;a href=&quot;http://ashishagarwal.org&quot;&gt;Ashish&lt;/a&gt; and &lt;a href=&quot;http://philippewang.info/CL/&quot;&gt;Philippe&lt;/a&gt; for their dedication (the &lt;a href=&quot;https://github.com/ocaml/ocaml.org/commits/master&quot;&gt;commit logs&lt;/a&gt; speak volumes).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://amirchaudhry.com/wireframe-demos-for-ocamlorg/&quot;&gt;&lt;img src=&quot;http://amirchaudhry.com/images/ann-new-ocamlorg/ocaml-home-wire.png&quot; alt=&quot;OCaml.org Wireframes&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We began this journey just over 8 months ago with paper, pencils and a lot of ideas. This led to a comprehensive set of &lt;a href=&quot;http://amirchaudhry.com/wireframe-demos-for-ocamlorg/&quot;&gt;wireframes and walk-throughs&lt;/a&gt; of the site, which then developed into a collection of &lt;a href=&quot;https://github.com/ocaml/ocaml.org/wiki/Site-Redesign&quot;&gt;Photoshop mockups&lt;/a&gt;. In turn, these formed the basis for the html templates and style sheets, which we’ve adapted to fit our needs across the site.&lt;/p&gt;

&lt;p&gt;Alongside the design process, we also considered the kind of structure and &lt;a href=&quot;http://lists.ocaml.org/pipermail/infrastructure/2013-July/000211.html&quot;&gt;workflow we aspired to&lt;/a&gt;, both as maintainers and contributors.  This led us to develop completely new tools for &lt;a href=&quot;http://pw374.github.io/posts/2013-09-05-22-31-26-about-omd.html&quot;&gt;Markdown&lt;/a&gt; and &lt;a href=&quot;http://pw374.github.io/posts/2013-10-03-20-35-12-using-mpp-two-different-ways.html&quot;&gt;templating&lt;/a&gt; in OCaml, which are now available in OPAM for the benefit all.&lt;/p&gt;

&lt;p&gt;Working on all these things in parallel definitely had it challenges (which I’ll write about separately) but the result has been worth the effort.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://ocaml.org&quot;&gt;&lt;img src=&quot;http://amirchaudhry.com/images/ann-new-ocamlorg/ocaml-home-mockup.png&quot; alt=&quot;OCaml.org&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The journey is ongoing and we still have many more improvements we hope to make. The site you see today primarily improves upon the design, structure and workflows but in time, we also intend to incorporate more information on packages and documentation. With the new tooling, moving the website forward will become much easier and I hope that more members of the community become involved in the generation and curation of content.  This brings me to the second part of this post.&lt;/p&gt;

&lt;h3 id=&quot;call-for-content&quot;&gt;Call for content&lt;/h3&gt;

&lt;p&gt;We have lots of great content on the website but there are parts that could do with a refresh and gaps that could be filled.  As a community driven site, we need ongoing contributions to ensure that the site best reflects its members.&lt;/p&gt;

&lt;p&gt;For example, if you do commercial work on OCaml then maybe you’d like to add yourself to the &lt;a href=&quot;http://ocaml.org/community/support.html&quot;&gt;support page&lt;/a&gt;? Perhaps there are tutorials you can help to complete, like &lt;a href=&quot;http://ocaml.org/learn/tutorials/99problems.html&quot;&gt;99 problems&lt;/a&gt;?  If you’re not sure where to begin, there are already a number of &lt;a href=&quot;https://github.com/ocaml/ocaml.org/issues?labels=content&quot;&gt;content issues&lt;/a&gt; you could contribute to.&lt;/p&gt;

&lt;p&gt;Although we’ve gone through a bug-hunt already, feedback on the site is still very welcome.  You can either &lt;a href=&quot;https://github.com/ocaml/ocaml.org/issues&quot;&gt;create an issue&lt;/a&gt; on the tracker (preferred), or email the infrastructure list.&lt;/p&gt;

&lt;p&gt;It’s fantastic how far we’ve come and I look forward to the next phase!&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>Migration plan for the OCaml.org redesign</title>
    <link href="http://amirchaudhry.com/migration-plan-ocaml-org"/>
    <author>Amir Chaudhry</author>
    <updated>2013-11-06T11:00:00+00:00</updated>
    <id>http://amirchaudhry.com/migration-plan-ocaml-org</id>
    <content type="html">
&lt;p&gt;We’re close to releasing the new design of ocaml.org but need help from the 
OCaml community to identify and fix bugs before we switch next week.&lt;/p&gt;

&lt;p&gt;Ashish, Christophe, Philippe and I have been discussing how we should go 
about this and below is the plan for migration.  If anyone would like to 
discuss any of this, then the &lt;a href=&quot;http://lists.ocaml.org/listinfo/infrastructure&quot;&gt;infrastructure list&lt;/a&gt; is the best 
place to do so.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;We’ve made a &lt;strong&gt;&lt;a href=&quot;https://github.com/ocaml/ocaml.org/tree/redesign&quot;&gt;new branch&lt;/a&gt;&lt;/strong&gt; on the main ocaml.org repository with 
the redesign.  This branch is a fork of the master and we’ve simply cleaned 
up and replayed our git commits there.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We’ve built a live version of the new site, which is visible at 
&lt;strong&gt;&lt;a href=&quot;http://preview.ocaml.org&quot;&gt;http://preview.ocaml.org&lt;/a&gt;&lt;/strong&gt; - this is rebuilt every few minutes 
from the branch mentioned above.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Over the course of one week, we ask the community to review the new site 
and &lt;strong&gt;&lt;a href=&quot;https://github.com/ocaml/ocaml.org/issues&quot;&gt;report any bugs or problems&lt;/a&gt;&lt;/strong&gt; on the issue tracker. We &lt;em&gt;triage&lt;/em&gt; 
those bugs to identify any blockers and work on those first.  This is the 
phase we’ll be in from &lt;em&gt;today&lt;/em&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;After one week (7 days), and after blocking bugs have been fixed, we 
&lt;strong&gt;merge the redesign branch&lt;/strong&gt; into the master branch.  This would 
effectively present the new site to the world.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;During the above, we would not be able to accept any new pull requests on 
the master branch but would be happy to accept them on the new, redesign 
branch.  Hence, restricting the time frame to one week.&lt;/p&gt;

&lt;p&gt;Please note that the above is only intended to merge the &lt;em&gt;design&lt;/em&gt; and 
&lt;em&gt;toolchain&lt;/em&gt; for the new site.  Specifically, we’ve created new landing 
pages, have new style sheets and have restructured the site’s contents as 
well as made some new libraries (&lt;a href=&quot;http://pw374.github.io/posts/2013-09-05-22-31-26-about-omd.html&quot;&gt;OMD&lt;/a&gt; and &lt;a href=&quot;http://pw374.github.io/posts/2013-10-03-20-39-07-OPAMaging-MPP.html&quot;&gt;MPP&lt;/a&gt;). The new toolchain 
means people can write files in markdown, which makes contributing content a 
lot easier.&lt;/p&gt;

&lt;p&gt;Since the files are on GitHub, people don’t even need to clone the site 
locally to make simple edits (or even add new pages). Just click the ‘Edit 
this page’ link in the footer to be taken to the right file in the 
repository and GitHub’s editing and pull request features will allow you to 
make changes and submit updates, all from within your browser (see the 
&lt;a href=&quot;https://help.github.com/articles/creating-and-editing-files-in-your-repository&quot;&gt;GitHub Article&lt;/a&gt; for details).&lt;/p&gt;

&lt;p&gt;There is still work to be done on adding new features but the above changes 
are already a great improvement to the site and are ready to be reviewed by 
the OCaml community and merged.&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>Review of the OCaml FPDays tutorial</title>
    <link href="http://amirchaudhry.com/fpdays-review"/>
    <author>Amir Chaudhry</author>
    <updated>2013-10-28T12:30:00+00:00</updated>
    <id>http://amirchaudhry.com/fpdays-review</id>
    <content type="html">
&lt;p&gt;&lt;a href=&quot;http://fpdays.net/2013/sessions/index.php?session=24&quot;&gt;&lt;img style=&quot;float: right; margin-top: 10px; margin-left: 10px&quot; src=&quot;/images/web/fpdays-logo.png&quot; /&gt;&lt;/a&gt;
Last Thursday a bunch of us from the OCaml Labs team gave an OCaml tutorial 
at the &lt;a href=&quot;http://fpdays.net/2013/sessions/index.php?session=24&quot;&gt;FPDays&lt;/a&gt; conference (an event for people interested in Functional 
Programming).  &lt;a href=&quot;https://github.com/yallop&quot;&gt;Jeremy&lt;/a&gt; and I led the session with &lt;a href=&quot;http://www.lpw25.net&quot;&gt;Leo&lt;/a&gt;, &lt;a href=&quot;https://github.com/dsheets&quot;&gt;David&lt;/a&gt; and 
&lt;a href=&quot;http://philippewang.info/CL/&quot;&gt;Philippe&lt;/a&gt; helping everyone progress and dealing with questions.&lt;/p&gt;

&lt;p&gt;&lt;img style=&quot;float: left; margin-right: 10px&quot; src=&quot;/images/fpdays2013/fpdays2013-01.jpg&quot; /&gt;
It turned out to be by far the &lt;em&gt;most popular session&lt;/em&gt; at the conference with 
over 20 people all wanting to get to grips with OCaml!  An excellent turnout 
and a great indicator of the interest that’s out there, especially when you 
offer a hands-on session to people.  This shouldn’t be a surprise as we’ve 
had good attendance for the general &lt;a href=&quot;http://www.meetup.com/Cambridge-NonDysFunctional-Programmers/&quot;&gt;OCaml meetups&lt;/a&gt; I’ve run 
and also the &lt;a href=&quot;http://ocamllabs.github.io/compiler-hacking/2013/09/17/compiler-hacking-july-2013.html&quot;&gt;compiler hacking sessions&lt;/a&gt;, which Jeremy and 
Leo have been building up (do sign up if you’re interested in either of 
those!).  We had a nice surprise for attendees, which were 
&lt;a href=&quot;http://en.wikipedia.org/wiki/Galley_proof&quot;&gt;uncorrected proof&lt;/a&gt; copies of Real World OCaml and luckily, we had just 
enough to go around.&lt;/p&gt;

&lt;p&gt;For the tutorial itself, Jeremy put together a nice sequence of exercises 
and a &lt;a href=&quot;https://github.com/ocamllabs/fpdays-skeleton&quot;&gt;skeleton repo&lt;/a&gt; (with helpful comments in the code) so that people 
could dive in quickly.  The event was set up to be really informal and the 
rough plan was as following:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Installation/Intro&lt;/em&gt; - We checked that people had been able to follow the 
&lt;a href=&quot;http://amirchaudhry.com/fpdays-ocaml-session/&quot;&gt;installation instructions&lt;/a&gt;, which we’d sent them in advance. 
We also handed out copies of the book and made sure folks were comfortable 
with &lt;a href=&quot;http://opam.ocaml.org&quot;&gt;OPAM&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Hello world&lt;/em&gt; - A light intro to get people familiar with the OCaml 
syntax and installing packages with OPAM. This would also help people to get 
familiar with the toolchain, workflow and compilation.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Monty Hall browser game&lt;/em&gt; - Using &lt;a href=&quot;http://ocsigen.org/js_of_ocaml/&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;js_of_ocaml&lt;/code&gt;&lt;/a&gt;, we wanted 
people to create and run the &lt;a href=&quot;http://en.wikipedia.org/wiki/Monty_Hall_problem&quot;&gt;Monty Hall problem&lt;/a&gt; in their 
browser.  This would give people a taste of some real world interaction by 
having to deal with the DOM and interfaces.  If folks did well, they could 
add code to keep logs of the game results.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Client-server game&lt;/em&gt; - The previous game was all in the browser (so could 
be examined by players) so here the task was to split it into a client and 
server, ensuring the two stay in sync.  This would demonstrate the 
re-usability of the OCaml code already written and give people a feel for 
client server interactions. If people wanted to do more, they could use 
&lt;a href=&quot;http://opam.ocaml.org/pkg/ctypes/0.1.1/&quot;&gt;ctypes&lt;/a&gt; and get better random numbers.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We did manage to stick to the overall scheme as above and we think this is a 
great base from which to improve future tutorials.  It has the really nice 
benefit of having visual, interactive elements and the ability to run things 
both in the browser as well as on the server is a great way to show the 
versatility of OCaml.  &lt;code class=&quot;highlighter-rouge&quot;&gt;js_of_ocaml&lt;/code&gt; is quite a mature tool and so it’s 
no surprise that it’s also used by companies such as Facebook (see the recent 
&lt;a href=&quot;http://www.youtube.com/watch?v=gKWNjFagR9k&quot;&gt;CUFP talk by Julien Verlaguet&lt;/a&gt; - skip to &lt;a href=&quot;http://www.youtube.com/watch?feature=player_detailpage&amp;amp;v=gKWNjFagR9k#t=1149&quot;&gt;19:00&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;We learned a lot from running this session so we’ve captured the good, the 
bad and the ugly below.  This is useful for anyone who’d like to run an 
OCaml tutorial in the future and also for us to be aware of the next 
time we do this.  I’ve incorporated the feedback from the attendees as well 
as our own thoughts.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/fpdays2013/fpdays2013-03.jpg&quot; alt=&quot;Heads down and hands on&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;things-we-learnt&quot;&gt;Things we learnt&lt;/h3&gt;

&lt;h4 id=&quot;the-good&quot;&gt;The Good&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Most people really did follow the install instructions beforehand. This 
made things so much easier on the day as we didn’t have to worry about 
compile times and people getting bored.  A few people had even got in touch 
with me the night before to sort out installation problems.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Many folks from OCaml Labs also came over to help people, which meant 
no-one was waiting longer than around 10 seconds before getting help.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We had a good plan of the things we wanted to cover but we were happy to 
be flexible and made it clear the aim was to get right into it.  Several 
folks told us that they really appreciated this loose (as opposed to rigid) 
structure.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We didn’t spend any time lecturing the room but instead got people right 
into the code.  Having enough of a skeleton to get something interesting 
working was a big plus in this regard. People did progress from the early 
examples to the later ones fairly well.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We had a VM with the correct set up that we could log people into if they 
were having trouble locally.  Two people made use of this.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Of course, It was great to have early proofs of the book and these were 
well-received.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/images/fpdays2013/fpdays2013-02.jpg&quot; alt=&quot;RWO books galore!&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;the-bad&quot;&gt;The Bad&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;In our excitement to get right into the exercises, we didn’t really give 
an overview of OCaml and its benefits.  A few minutes at the beginning would 
be enough and it’s important so that people can leave with a few sound-bites.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Not everyone received my email about installation, and certainly not the 
late arrivals.  This meant some pain getting things downloaded and running 
especially due to the wifi (see ‘Ugly’ below).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;A few of the people who &lt;em&gt;had&lt;/em&gt; installed, didn’t complete the instructions 
fully but didn’t realise this until the morning of the session.  There was a good 
suggestion about having some kind of test to run that would check 
everything, so you’d know if there was something missing.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We really should have had a cut-off where we told people to use VMs 
instead of fixing installation issues and 10-15 minutes would have been 
enough.  This would have been especially useful for the late-comers.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We didn’t really keep a record of the problems folks were having so we 
can’t now go back and fix underlying issues.  To be fair, this would have 
been a little awkward to do ad-hoc but in hindsight, it’s a good thing to 
plan for.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;the-ugly&quot;&gt;The Ugly&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;The only ugly part was the wifi.  It turned out that the room itself was a 
bit of a dead-spot and that wasn’t helped by 30ish devices trying to connect 
to one access point!  Having everyone grab packages at the same time in the 
morning probably didn’t help.  It was especially tricky as all our 
mitigation plans seemed to revolve around at least having local connectivity.
In any case, this problem only lasted for the morning session and was a 
little better by the afternoon.  I’d definitely recommend a backup plan in 
the case of complete wifi failure next time!  One such plan that Leo got 
started on was to put the repository and other information onto a flash 
drive that could be shared with people.  We didn’t need this in the end but 
it’ll be useful to have something like this prepared for next time.  If 
anyone fancies donating a bunch of flash drives, I’ll happily receive them!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, it was a great session and everyone left happy, having completed 
most of the tutorial (and with a book!).  A few even continued at home 
afterwards and &lt;a href=&quot;https://twitter.com/richardclegg/status/393458073052139520&quot;&gt;got in touch&lt;/a&gt; to let us know that they got 
everything working.
It was a great session and thanks to &lt;a href=&quot;https://twitter.com/MarkDalgarno&quot;&gt;Mark&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/JacquiDDavidson&quot;&gt;Jacqui&lt;/a&gt; and the rest of 
the FPDays crew for a great conference!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/fpdays2013/fpdays2013-04.jpg&quot; alt=&quot;RWO Book giveaway&quot; /&gt;&lt;/p&gt;

&lt;p&gt;(Thanks to Jeremy, Leo, David and Philippe for contributions to this post)&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>FP Days OCaml Session</title>
    <link href="http://amirchaudhry.com/fpdays-ocaml-session"/>
    <author>Amir Chaudhry</author>
    <updated>2013-10-22T21:00:00+00:00</updated>
    <id>http://amirchaudhry.com/fpdays-ocaml-session</id>
    <content type="html">
&lt;p&gt;On Thursday, along with &lt;a href=&quot;https://github.com/yallop&quot;&gt;Jeremy&lt;/a&gt; and 
&lt;a href=&quot;http://www.lpw25.net&quot;&gt;Leo&lt;/a&gt;, I’ll be running an OCaml Hands-on Session at 
the &lt;a href=&quot;http://fpdays.net/2013/&quot;&gt;FPDays conference&lt;/a&gt;. Below are some prep 
instructions for attendees.&lt;/p&gt;

&lt;h3 id=&quot;preparation-for-the-session&quot;&gt;Preparation for the session&lt;/h3&gt;

&lt;p&gt;If you’re starting from scratch, installation can take some time so it’s 
best to get as much done in advance as possible.  You’ll need OPAM (the 
package manager), OCaml 4.01 (available through OPAM) and a few libraries 
before Thursday.  If you have any issues, please contact Amir.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;OPAM&lt;/strong&gt;: Follow the instructions for your platform at &lt;a href=&quot;http://opam.ocaml.org/doc/Quick_Install.html&quot;&gt;http://opam.ocaml.org/doc/Quick_Install.html&lt;/a&gt;. 
OPAM requires OCaml so hopefully the relevant dependencies will kick in and 
you’ll get OCaml too (most likely version 3.12).  You can get a cup of 
coffee while you wait. After installation, run &lt;code class=&quot;highlighter-rouge&quot;&gt;opam init&lt;/code&gt; to initialise OPAM.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;OCaml 4.01&lt;/strong&gt;: We actually need the latest version of OCaml but OPAM 
makes this easy.  Just run the following (and get more coffee):&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;opam update
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;opam switch 4.01.0
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;opam config env&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Libraries&lt;/strong&gt;: For the workshop you will need to check that you have the 
following installed: &lt;code class=&quot;highlighter-rouge&quot;&gt;libffi&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;pcre&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;pkg-config&lt;/code&gt;.  This will depend on 
your platform so on a Mac with homebrew I would do 
&lt;code class=&quot;highlighter-rouge&quot;&gt;brew install libffi pcre pkg-config&lt;/code&gt; or on Debian or Ubuntu 
&lt;code class=&quot;highlighter-rouge&quot;&gt;apt-get install libffi-dev&lt;/code&gt;.  After this, two OCaml packages it’s worth 
installing in advance are &lt;code class=&quot;highlighter-rouge&quot;&gt;core&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;js_of_ocaml&lt;/code&gt; so simply run:&lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;opam install core js_of_ocaml&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;OPAM will take care of the dependencies and the rest we can get on the day!&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>The real problem of humanity</title>
    <link href="http://amirchaudhry.com/the-real-problem-of-humanity"/>
    <author>Amir Chaudhry</author>
    <updated>2013-10-01T18:45:00+00:00</updated>
    <id>http://amirchaudhry.com/the-real-problem-of-humanity</id>
    <content type="html">
&lt;p&gt;I heard this today.  It made me stop and think so I decided to look it up.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;“The real problem of humanity is the following:
we have paleolithic emotions; medieval institutions; 
and god-like technology. 
And it is terrifically dangerous,
and it is now approaching a point of crisis overall.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;footnote&quot;&gt;By &lt;a href=&quot;http://en.wikipedia.org/wiki/Edward_Osborne_Wilson&quot;&gt;Edward O Wilson&lt;/a&gt; and taken from &lt;a href=&quot;http://harvardmagazine.com/breaking-news/james-watson-edward-o-wilson-intellectual-entente&quot;&gt;Harvard Magazine, 2009&lt;/a&gt;&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Feedback requested on the OCaml.org redesign</title>
    <link href="http://amirchaudhry.com/ocamlorg-request-for-feedback"/>
    <author>Amir Chaudhry</author>
    <updated>2013-09-24T14:00:00+00:00</updated>
    <id>http://amirchaudhry.com/ocamlorg-request-for-feedback</id>
    <content type="html">
&lt;p&gt;There is a work-in-progress site at 
&lt;a href=&quot;http://ocaml-redesign.github.io&quot;&gt;ocaml-redesign.github.io&lt;/a&gt;, where we’ve 
been developing both the tools and design for the new ocaml.org pages.  This 
allows us to test our tools and fix issues before we consider merging 
changes upstream.&lt;/p&gt;

&lt;p&gt;There is a more detailed post coming about all the design work to date and 
the workflow we’re using, but in the meantime, feedback on the following 
areas would be most welcome.  Please leave feedback in the form of issues on 
the &lt;a href=&quot;https://github.com/ocamllabs/sandbox-ocaml.org/issues&quot;&gt;ocaml.org sandbox repo&lt;/a&gt;.  You can also raise points on the 
&lt;a href=&quot;http://lists.ocaml.org/listinfo/infrastructure&quot;&gt;infrastructure mailing list&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;OCaml Logo&lt;/strong&gt; - There was some feedback on the last iteration of the 
logo, especially regarding the font, so there are now several options to 
consider.  Please look at the images on the 
&lt;a href=&quot;https://github.com/ocaml/ocaml.org/wiki/Draft-OCaml-Logos&quot;&gt;ocaml.org GitHub wiki&lt;/a&gt; and then leave your feedback on 
&lt;a href=&quot;https://github.com/ocamllabs/sandbox-ocaml.org/issues/16&quot;&gt;issue #16 on the sandbox repo&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Site design&lt;/strong&gt; - Please do give feedback on the design and any glitches 
you notice. Text on each of the new landing pages is still an initial draft 
so comments and improvements there are also welcome (specifically: Home 
Page, Learn, Documentation, Platform, Community). There are already a few 
&lt;a href=&quot;https://github.com/ocamllabs/sandbox-ocaml.org/issues&quot;&gt;known issues&lt;/a&gt;, so do 
add your comments to those threads first.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

></content>
  </entry>
  
  <entry>
    <title>I'm working on The Internet of *my* Things</title>
    <link href="http://amirchaudhry.com/working-on-the-internet-of-my-things"/>
    <author>Amir Chaudhry</author>
    <updated>2013-09-02T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/working-on-the-internet-of-my-things</id>
    <content type="html">
&lt;p&gt;For a long time I’ve been interested what the future holds in terms of how 
we will interact with each other and our environments.  Back in the day, 
these areas used to be called ubiquitous computing and home automation but 
have since been subsumed by the (only slightly) catchier moniker of Internet 
of Things (IoT).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/mjwiacek/3718366706/&quot;&gt;&lt;img style=&quot;float: right; margin-left: 10px&quot; src=&quot;/images/web/pizza-oven.jpg&quot; /&gt;&lt;/a&gt;
A couple of my ideas involved controlling devices at home via SMS messages 
(this was way before smart phones and ‘apps’ came along).  For example, 
being able to set my VCR to record a show while I’m out* or pre-heat the 
oven when I’m heading home with a frozen pizza&lt;sup&gt;†&lt;/sup&gt;.  Of 
course, if I were to implement these now I’d take a completely different 
approach.  With all the advances we’ve made, the Internet of Things has huge 
potential to change our lives the way the Internet itself did.&lt;/p&gt;

&lt;p&gt;However, if we take the last decade of the Internet and Web as an example of 
how the IoT may play out it’s actually not a pretty picture.  We’re in the 
age of the Internet behemoths, with huge centralised data silos containing 
lots of our personal data.  We trust such services to secure our data but 
&lt;a href=&quot;http://venturebeat.com/2012/08/01/dropbox-has-become-problem-child-of-cloud-security/&quot;&gt;repeated breaches&lt;/a&gt; undermine that trust. Sure, there is 
some choice among providers but it’s fast becoming a case of “choose your 
dictator”.  Our information is trapped, interoperating is 
&lt;a href=&quot;https://www.eff.org/deeplinks/2013/05/google-abandons-open-standards-instant-messaging&quot;&gt;becoming difficult&lt;/a&gt; and to top it off, these giants are 
busy fighting &lt;a href=&quot;http://www.groklaw.net/article.php?story=20130523150909464&quot;&gt;legal battles&lt;/a&gt; with each other instead of 
out-competing.  Users just get caught in the cross-fire.&lt;/p&gt;

&lt;p&gt;If we extrapolate this to the Internet of Things then, ultimately, it’ll 
become a winner-take-all-my-data arrangement, with lock-ins to restrict me 
from migrating.  Remember, we’re talking about connecting more devices to 
the Internet and giving almost ubiquitous access to our daily lives and 
habits.  Trading more of our personal lives, from within our homes, with 
increasingly faceless companies and for not very much in return, isn’t 
particularly appealing.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/59937401@N07/5857192377/&quot;&gt;&lt;img style=&quot;float:left; margin-right: 15px;&quot; src=&quot;/images/web/monopoly-house-die-dollar.jpg&quot; /&gt;&lt;/a&gt;
If the IoT plays out this way, then we will effectively &lt;em&gt;increase&lt;/em&gt; the 
Privacy Tax that we’ve &lt;em&gt;already&lt;/em&gt; had to pay for our social networking tools. 
In order to benefit from the world of connected devices, we have to adjust 
(again) the notion of ownership.  I want this to be the Internet of &lt;strong&gt;my&lt;/strong&gt; 
Things, so how do we make that happen?&lt;/p&gt;

&lt;p&gt;To really achieve that, we need to have software infrastructure that 
incorporates &lt;a href=&quot;http://en.wikipedia.org/wiki/Privacy_by_Design&quot;&gt;Privacy by Design&lt;/a&gt;, so that an individual can regain the 
ability to control their data and decide for themselves whom to share it 
with. These infrastructure tools must also work in a distributed fashion, so 
there’s no requirement to ally yourself to any particular centralised 
service. Of course, the tools themselves also have to be open-source, so 
that developers can be reassured that the ground they’re building their 
products on won’t be taken away from them.&lt;/p&gt;

&lt;p&gt;In the last year and a half, I’ve been exploring these ideas at the 
&lt;a href=&quot;http://www.cl.cam.ac.uk&quot;&gt;Cambridge Computer Laboratory&lt;/a&gt;.  A lot of cutting edge work is being done 
on the problems of &lt;a href=&quot;http://nymote.org/connected-devices-and-signpost&quot;&gt;Identity and connectivity&lt;/a&gt; as well as the 
operating systems for the future.  Infrastructure and tools are being shaped 
that together form a new toolstack to make the creation and management of 
decentralised networks easier&lt;sup&gt;‡&lt;/sup&gt;.  There’s a larger picture 
emerging from this work and it’s time to start talking more about it and 
describing the pieces.  We’re calling this open-source toolstack 
&lt;strong&gt;&lt;a href=&quot;http://nymote.org&quot;&gt;Nymote&lt;/a&gt;&lt;/strong&gt; and there’s a new site where you can read more about it and 
keep up with news and releases.  The &lt;a href=&quot;http://nymote.org/blog/2013/introducing-nymote/&quot;&gt;introductory post&lt;/a&gt; 
there describes more about the background and what we’re working on.&lt;/p&gt;

&lt;p&gt;I’ll be writing about this work both here and on the &lt;a href=&quot;http://nymote.org/blog&quot;&gt;Nymote Blog&lt;/a&gt; and I’d 
love to hear from others who are interested in this area – please do 
&lt;a href=&quot;/about&quot;&gt;get in touch with me&lt;/a&gt; or leave a comment.  If you’d like to sign up 
for updates by email, you can &lt;a href=&quot;http://eepurl.com/mXYb1&quot;&gt;join the Nymote list here&lt;/a&gt;.&lt;/p&gt;

&lt;!-- footnotes --&gt;
&lt;p class=&quot;footnote&quot;&gt;* Sky+ came out with this feature a few months after I started discussing it with people.&lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;&lt;sup&gt;&amp;dagger;&lt;/sup&gt; Yes, people told me this was insane and I'd burn my house down.  Luckily for my housemates, I never actually got around to implementing anything.&lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;&lt;sup&gt;&amp;Dagger;&lt;/sup&gt; This is somewhat ironic as decentralisation was one of the founding tenets of the Internet. We're just helping people get back to that.&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Wireframe demos for OCaml.org</title>
    <link href="http://amirchaudhry.com/wireframe-demos-for-ocamlorg"/>
    <author>Amir Chaudhry</author>
    <updated>2013-03-14T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/wireframe-demos-for-ocamlorg</id>
    <content type="html">
&lt;h3 id=&quot;making-mockups&quot;&gt;Making mockups&lt;/h3&gt;

&lt;p&gt;Over the last few months, I’ve been working on various aspects of the &lt;a href=&quot;http://ocaml.org&quot;&gt;OCaml.org&lt;/a&gt; design project.  This covers things like the design, information architecture and how to incorporate new functionality.  One of the methods for thinking through these was to put together a bunch of wireframes using &lt;a href=&quot;http://www.balsamiq.com&quot;&gt;Balsamiq&lt;/a&gt; and use these to express (and generate) ideas as well as get feedback quickly.&lt;/p&gt;

&lt;p&gt;If you haven’t used wireframes before, think of them as a slightly more advanced form of sketching things out on a whiteboard.  The best aspect is that it’s far quicker, easier and &lt;em&gt;cheaper&lt;/em&gt; to iterate using wireframes than on an actual website.  As you’ll see below, you can also convey a lot of information about how a site might work by showing people a clickable demo.&lt;/p&gt;

&lt;p&gt;I want to make this work public and I thought the best way would be to show you some screencasts of how the upcoming &lt;a href=&quot;http://ocaml.org&quot;&gt;OCaml.org&lt;/a&gt; website might work and also make the demo available to all of you.  The three videos below cover three aspects of the site and I’d encourage you to go through them in order (about 16 minutes in total).  Apologies if my screen isn’t particularly clear in the videos but you can visit the demo for yourself and see things in more detail (link and info on feedback at the end of this post).&lt;/p&gt;

&lt;h3 id=&quot;video-walkthroughs&quot;&gt;Video walkthroughs&lt;/h3&gt;

&lt;p&gt;For those who’d like to watch the videos back-to-back and scaled to fit your browser window, you can &lt;a href=&quot;http://vimeo.com/couchmode/album/2301640&quot;&gt;view the Vimeo album in ‘couchmode’&lt;/a&gt;. Otherwise, individual videos are embedded below (total time 16m17s).&lt;/p&gt;

&lt;div class=&quot;flex-video widescreen vimeo&quot;&gt;
    &lt;iframe src=&quot;http://player.vimeo.com/video/61768157?byline=0&amp;amp;portrait=0&amp;amp;color=de9e6a&quot; width=&quot;540&quot; height=&quot;303&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;Video Part 1 - Overview - http://player.vimeo.com/video/61768157&lt;/iframe&gt;
&lt;/div&gt;

&lt;div class=&quot;flex-video widescreen vimeo&quot;&gt;
    &lt;iframe src=&quot;http://player.vimeo.com/video/61768235?byline=0&amp;amp;portrait=0&amp;amp;color=de9e6a&quot; width=&quot;540&quot; height=&quot;304&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;Video Part 2 - Documentation - http://player.vimeo.com/video/61768235&lt;/iframe&gt;
&lt;/div&gt;

&lt;div class=&quot;flex-video widescreen vimeo&quot;&gt;
    &lt;iframe src=&quot;http://player.vimeo.com/video/61768273?byline=0&amp;amp;portrait=0&amp;amp;color=de9e6a&quot; width=&quot;540&quot; height=&quot;304&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;Video Part 3 - Continuous Integration - http://player.vimeo.com/video/61768273&lt;/iframe&gt;
&lt;/div&gt;

&lt;h3 id=&quot;public-wireframe-demo&quot;&gt;Public wireframe demo&lt;/h3&gt;

&lt;p&gt;A demo you can interact with can be found at &lt;a href=&quot;https://ocaml.mybalsamiq.com/projects/public-demo/naked/0_home?key=b897ea86d8a8199c6e46b3295ddf630dfa33e5e1&quot;&gt;OCaml.org wireframe demo&lt;/a&gt; and image files for each page are available on the &lt;a href=&quot;https://github.com/ocaml/ocaml.org/wiki/Wireframes&quot;&gt;github ocaml.org wiki&lt;/a&gt;.  Please bear in mind the following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Not everything that looks like it might be clickable actually is (and vice versa). There’ll be a toggle on the bottom right of the browser window that will highlight what can be clicked.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;There are parts of the site which are ‘work in progress’ and are marked as such.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The designs you see aren’t necessarily final. Your feedback will help shape our decisions and the best way to provide it is via the &lt;a href=&quot;http://lists.ocaml.org/listinfo/infrastructure&quot;&gt;infrastructure mailing list&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

></content>
  </entry>
  
  <entry>
    <title>OCaml - Installation and hello world</title>
    <link href="http://amirchaudhry.com/ocaml-installation-and-hello-world"/>
    <author>Amir Chaudhry</author>
    <updated>2012-10-04T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/ocaml-installation-and-hello-world</id>
    <content type="html">
&lt;p class=&quot;footnote&quot;&gt;This post is part of a series where I'm trying to teach myself OCaml.&lt;br /&gt;
You might want to &lt;a href=&quot;http://amirchaudhry.com/thirty-days-of-ocaml/&quot;&gt;start at the beginning&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It’s been a few days into my OCaml experience so this is a write-up of what I’ve come across so far.  I’ve spent more time reading background rather than getting stuck in so I’ve copied in some of the links that I’ve found interesting/useful at the end.&lt;/p&gt;

&lt;h2 id=&quot;installation&quot;&gt;Installation&lt;/h2&gt;

&lt;p&gt;There are number of ways you can get OCaml on your machine.  The most obvious  would be to get the source via the &lt;a href=&quot;http://caml.inria.fr/ocaml/release.en.html&quot;&gt;release page&lt;/a&gt;, but you could also use something called &lt;a href=&quot;http://godi.camlcity.org/godi/index.html&quot;&gt;GODI&lt;/a&gt;, which apparently bundles a bunch of other stuff alongside the language.&lt;/p&gt;

&lt;p&gt;I don’t really want to install from source ‘by hand’ and I definitely don’t need all the stuff that comes with GODI.  I happen to use &lt;a href=&quot;http://mxcl.github.com/homebrew/&quot;&gt;Homebrew&lt;/a&gt; on my machine, so I checked to see if I can install that way.  Turns out I can, so that’s what I ended up doing.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;brew install objective-caml&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;The current version of OCaml is 4.00.0 and you can check the version you have installed by typing &lt;code class=&quot;highlighter-rouge&quot;&gt;ocaml -version&lt;/code&gt; in your terminal.&lt;/p&gt;

&lt;h4 id=&quot;notes&quot;&gt;&lt;em&gt;notes&lt;/em&gt;&lt;/h4&gt;

&lt;p&gt;Be aware that Homebrew has it’s own installation process and depends on Ruby.  To get Ruby, someone recommended that I install via &lt;a href=&quot;https://rvm.io/&quot;&gt;Ruby Version Manager&lt;/a&gt;.  To be able to do the above, you’ll need to have the OSX developer tools installed, which means having &lt;a href=&quot;https://developer.apple.com/xcode/&quot;&gt;Xcode&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;hello-world&quot;&gt;Hello World!&lt;/h2&gt;

&lt;p&gt;The first thing to do is get a &lt;a href=&quot;http://en.wikipedia.org/wiki/Hello_world_program&quot;&gt;hello world&lt;/a&gt; programme working.  Since OCaml is a compiled language, that means writing the necessary source code into a file, compiling it and then executing it.  In this case I only need one line that prints ‘hello world’ to the screen and I’m taking it from INRIA’s site (&lt;a href=&quot;http://caml.inria.fr/pub/docs/u3-ocaml/ocaml-steps.html&quot;&gt;link&lt;/a&gt;).&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ocaml&quot; data-lang=&quot;ocaml&quot;&gt;&lt;span class=&quot;n&quot;&gt;print_string&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Hello, world!&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Take the one line above and save it in a file called &lt;code class=&quot;highlighter-rouge&quot;&gt;hello.ml&lt;/code&gt;.  Now we need to compile that file using the OCaml compiler.  At the command prompt, type the following:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;ocamlc &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; hello hello.ml
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;./hello&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Since I don’t really understand the first line I should break it down. &lt;code class=&quot;highlighter-rouge&quot;&gt;ocamlc&lt;/code&gt; is the command to invoke the compiler, the option &lt;code class=&quot;highlighter-rouge&quot;&gt;-o hello&lt;/code&gt; means you want to name the output executable to be (in this case) ‘hello’ and the final argument is the source code file.  It’s useful to look at the man page for &lt;code class=&quot;highlighter-rouge&quot;&gt;ocamlc&lt;/code&gt; to see what other options are available.  The second line executes the programme, which prints hello world to the screen with a line-break.&lt;/p&gt;

&lt;p&gt;I also notice that I now have two other files in addition to the source, &lt;code class=&quot;highlighter-rouge&quot;&gt;hello.cmi&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;hello.cmo&lt;/code&gt;.  According to the man page, these are the ‘compiled interface’ and ‘compiled object code file’ respectively.  I have no idea what that means but removing the files doesn’t affect the executable.&lt;/p&gt;

&lt;h3 id=&quot;ocaml-toplevel&quot;&gt;OCaml ‘toplevel’&lt;/h3&gt;

&lt;p&gt;Even though OCaml is a compiled language, there’s something called ‘toplevel’ that allows interactive use (more on &lt;a href=&quot;http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual023.html&quot;&gt;toplevel&lt;/a&gt;).  To enter this mode, you simply have to type &lt;code class=&quot;highlighter-rouge&quot;&gt;ocaml&lt;/code&gt; at the prompt so let’s try running the above hello world program using toplevel.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;$ ocaml
        OCaml version 4.00.0

# print_string &quot;Hello, world!\n&quot;;;
Hello, world!
- : unit = ()
# #quit;;
$ &lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;The &lt;code class=&quot;highlighter-rouge&quot;&gt;$&lt;/code&gt; prompt is the command line and the &lt;code class=&quot;highlighter-rouge&quot;&gt;#&lt;/code&gt; prompt is where toplevel is awaiting a new line of input.  The input can span multiple lines and is terminated by &lt;code class=&quot;highlighter-rouge&quot;&gt;;;&lt;/code&gt; (as in the source code).&lt;/p&gt;

&lt;p&gt;To exit toplevel, type &lt;code class=&quot;highlighter-rouge&quot;&gt;#quit;;&lt;/code&gt;.  It took me three attempts to get that right.  I haven’t really played around with toplevel much and I think I’m likely to stick with source code and compiling until I’m a little more comfortable with the syntax.&lt;/p&gt;

&lt;p&gt;That’s pretty much where I am for the moment and everything so far has been straightforward.  Obviously, I should push myself a bit harder :)&lt;/p&gt;

&lt;h2 id=&quot;resources&quot;&gt;Resources&lt;/h2&gt;

&lt;p&gt;This is the material I found and have been looking over for the last couple of days.  Useful as background but I’d say I’m in danger of (semi-productive) procrastination if I’m not careful.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://caml.inria.fr/pub/docs/manual-ocaml-4.00&quot;&gt;OCaml Manual&lt;/a&gt; (from INRIA)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://caml.inria.fr/about/taste.en.html&quot;&gt;OCaml examples&lt;/a&gt; (also INRIA)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://en.wikibooks.org/wiki/Objective_Caml/Introduction&quot;&gt;OCaml Intro&lt;/a&gt; (wikibooks)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://ocaml.janestreet.com/?q=node/82&quot;&gt;Minsky on ML&lt;/a&gt; (Jane Street)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://sites.google.com/site/steveyegge2/ocaml&quot;&gt;OCaml pros&lt;/a&gt; (Steve Yegge)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.podval.org/~sds/ocaml-sucks.html&quot;&gt;OCaml cons&lt;/a&gt; (Sam Steingold)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.thinkocaml.com&quot;&gt;Think OCaml&lt;/a&gt; (PDF book)&lt;/li&gt;
&lt;/ul&gt;

&lt;!--
    http://news.ycombinator.com/item?id=112129
    http://dave.fayr.am/posts/2011-08-19-lets-go-shopping.html
--&gt;
></content>
  </entry>
  
  <entry>
    <title>Thirty Days of OCaml</title>
    <link href="http://amirchaudhry.com/thirty-days-of-ocaml"/>
    <author>Amir Chaudhry</author>
    <updated>2012-10-01T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/thirty-days-of-ocaml</id>
    <content type="html">
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/jeremyandchanel/6131620285/&quot;&gt;&lt;img src=&quot;/images/ocaml-30days/camel-bactrian-silhouette.jpg&quot; alt=&quot;Bactrian Camel Silhouette&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ve set myself a challenge that over the next thirty days, I’ll teach myself some &lt;a href=&quot;http://en.wikipedia.org/wiki/Functional_programming&quot;&gt;functional programming&lt;/a&gt; using &lt;a href=&quot;http://en.wikipedia.org/wiki/OCaml&quot;&gt;OCaml&lt;/a&gt;.  This will be my first experience of FP in addition to learning a new language so I expect it’ll be quite challenging.&lt;/p&gt;

&lt;p&gt;As I go along, I’ll try and write regular posts – hopefully one a day – describing my experiences and frustrations as well as the questions that occur to me.  I suspect a number of the posts might be summaries to help me organise my understanding, especially where things seem unexpected.  For the times where I can formulate well-posed questions, I’ll put them up in places like &lt;a href=&quot;http://stackoverflow.com/questions/tagged/ocaml&quot;&gt;Stack Overflow&lt;/a&gt; as well as describing them here.  Either way, keeping some form of diary will be useful for me and maybe also for other folks who’ve considered trying out FP and OCaml in particular.&lt;/p&gt;

&lt;p&gt;Obviously, I’m not completely new to programming but I would say I have any deep experience (especially compared to the folks I tend to hang out with). Just to give you a better picture, my coding experience so far has involved:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Some C/C++ with a little &lt;a href=&quot;http://en.wikipedia.org/wiki/Object-oriented_programming&quot;&gt;OOP&lt;/a&gt; programming for a High Energy Physics simulation (during my undergrad - a long time ago so I’ve forgotten everything)&lt;/li&gt;
  &lt;li&gt;A bunch of &lt;a href=&quot;http://www.mathworks.com/products/matlab/&quot;&gt;Matlab&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Bash_(Unix_shell)&quot;&gt;Bash&lt;/a&gt; scripting for analysis of neuroimaging data (during my PhD)&lt;/li&gt;
  &lt;li&gt;A bunch of &lt;a href=&quot;http://en.wikipedia.org/wiki/Visual_Basic_for_Applications&quot;&gt;VBA&lt;/a&gt; within MS Excel for analysing behavioural data (also during my PhD – I really wish someone had pointed me to Python back then)&lt;/li&gt;
  &lt;li&gt;Part of &lt;a href=&quot;http://learnpythonthehardway.org&quot;&gt;Learn Python the Hard Way&lt;/a&gt; (I keep dipping in and out of this)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I tried to dump most of my old scripts – at least those I could find – into a &lt;a href=&quot;https://github.com/amirmc/PhD_stuff&quot;&gt;github repo&lt;/a&gt;, but I still haven’t collated the Matlab bits.  You can judge my coding skills for yourself.&lt;/p&gt;

&lt;p&gt;By the end of the 30 days, I’m hoping to have the ability to pick up and read other people’s OCaml code and write basic stuff for myself.  I don’t actually have a particular project in mind but I’m not going to let that be an excuse for &lt;em&gt;not&lt;/em&gt; getting started.&lt;/p&gt;

&lt;p&gt;I’ll post again tomorrow with the mundane parts of how to get things installed and running on a Mac*.  Onward!&lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;*Admittedly, I already did this some time ago but I want this series of posts to start right from the beginning.&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>I'm in San Francisco (and later NYC)</title>
    <link href="http://amirchaudhry.com/im-in-san-francisco"/>
    <author>Amir Chaudhry</author>
    <updated>2012-08-28T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/im-in-san-francisco</id>
    <content type="html">
&lt;p&gt;Actually, I’ve been here for a while now and feeling (mostly) settled in.  I’m in the US for another couple of months, most of which will be in SF, with a short trip to Colorado and New York thrown in.&lt;/p&gt;

&lt;p&gt;So far, I’ve met a bunch of folks from ‘back home’, people that they know, and a handful of new ones.  While I’m out here, I’m hoping to meet a lot more people who might be interested in the work we’re doing in the Lab.  Specifically things related to Software Defined Networking, Identity and Functional Programming – basically anything that overlaps with projects like &lt;a href=&quot;http://perscon.net/overview/signpost.html&quot;&gt;Signpost&lt;/a&gt; and &lt;a href=&quot;http://www.openmirage.org/&quot;&gt;Mirage&lt;/a&gt; (if you happen to know anyone, bonus points for putting me in touch).&lt;/p&gt;

&lt;p&gt;I’ve also managed to get out of town, courtesy of friends-with-a-car, and saw the &lt;a href=&quot;http://www.montereybayaquarium.org/&quot;&gt;Monterey Aquarium&lt;/a&gt; (some pics below).  Not been hiking yet but will hopefully make it out of town again at some point.&lt;/p&gt;

&lt;p&gt;Overall, SF is a very interesting place and I can see the draw for people to come here.  Although a lot of the companies are further south, there’s much more ‘stuff’ happening here.  I’m looking forward to the next couple of months.&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
  &lt;noscript&gt;&lt;small&gt;&lt;em&gt;Note: The gallery needs JavaScript but I've tried to make it degrade gracefully. -Amir&lt;/em&gt;&lt;/small&gt;&lt;/noscript&gt;
  &lt;ul class=&quot;inline-list&quot;&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;monterey-aquarium-1&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-thumb-1.png&quot; alt=&quot;monterey-aquarium-thumb-1&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;monterey-aquarium-2&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-thumb-2.png&quot; alt=&quot;monterey-aquarium-thumb-2&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;monterey-aquarium-3&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-thumb-3.png&quot; alt=&quot;monterey-aquarium-thumb-3&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;monterey-aquarium-4&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-thumb-4.png&quot; alt=&quot;monterey-aquarium-thumb-4&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;monterey-aquarium-5&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-thumb-5.png&quot; alt=&quot;monterey-aquarium-thumb-5&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;monterey-aquarium-6&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-thumb-6.png&quot; alt=&quot;monterey-aquarium-thumb-6&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;monterey-aquarium-7&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-thumb-7.png&quot; alt=&quot;monterey-aquarium-thumb-7&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;monterey-aquarium-8&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-thumb-8.png&quot; alt=&quot;monterey-aquarium-thumb-8&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;monterey-aquarium-9&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-thumb-9.png&quot; alt=&quot;monterey-aquarium-thumb-9&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;monterey-aquarium-10&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-thumb-10.png&quot; alt=&quot;monterey-aquarium-thumb-10&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
  &lt;ul data-orbit=&quot;&quot; data-options=&quot;next_on_click:true; timer_speed:3000; pause_on_hover:false; bullets:false;&quot;&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;monterey-aquarium-1&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-1.jpg&quot; alt=&quot;monterey-aquarium-1&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;monterey-aquarium-2&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-2.jpg&quot; alt=&quot;monterey-aquarium-2&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;monterey-aquarium-3&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-3.jpg&quot; alt=&quot;monterey-aquarium-3&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;monterey-aquarium-4&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-4.jpg&quot; alt=&quot;monterey-aquarium-4&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;monterey-aquarium-5&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-5.jpg&quot; alt=&quot;monterey-aquarium-5&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;monterey-aquarium-6&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-6.jpg&quot; alt=&quot;monterey-aquarium-6&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;monterey-aquarium-7&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-7.jpg&quot; alt=&quot;monterey-aquarium-7&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;monterey-aquarium-8&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-8.jpg&quot; alt=&quot;monterey-aquarium-8&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;monterey-aquarium-9&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-9.jpg&quot; alt=&quot;monterey-aquarium-9&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;monterey-aquarium-10&quot;&gt;&lt;img src=&quot;/images/monterey-aquarium/monterey-aquarium-10.jpg&quot; alt=&quot;monterey-aquarium-10&quot; /&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;

></content>
  </entry>
  
  <entry>
    <title>The Illusion of Choice</title>
    <link href="http://amirchaudhry.com/illusion-of-choice"/>
    <author>Amir Chaudhry</author>
    <updated>2012-04-26T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/illusion-of-choice</id>
    <content type="html">
&lt;p&gt;&lt;a href=&quot;http://i.imgur.com/k0pv0.jpg&quot;&gt;&lt;img src=&quot;/images/web/illusion-of-choice-alpha.png&quot; alt=&quot;Illusion of Choice&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on the image for a bigger version.&lt;/p&gt;

&lt;p&gt;Not sure where this came from but it’s interesting (e.g I had no idea that Nestle did pet food nor that they had a stake in L’Oreal).&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Pics from TEDx Granta</title>
    <link href="http://amirchaudhry.com/tedx-granta-2012"/>
    <author>Amir Chaudhry</author>
    <updated>2012-04-13T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/tedx-granta-2012</id>
    <content type="html">
&lt;div class=&quot;gallery&quot;&gt;
  &lt;noscript&gt;&lt;small&gt;&lt;em&gt;Note: The gallery needs JavaScript but I've tried to make it degrade gracefully. -Amir&lt;/em&gt;&lt;/small&gt;&lt;/noscript&gt;
  &lt;ul class=&quot;inline-list&quot;&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;tedx-granta-2012-1&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-thumb-1.png&quot; alt=&quot;tedx-granta-2012-thumb-1&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;tedx-granta-2012-2&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-thumb-2.png&quot; alt=&quot;tedx-granta-2012-thumb-2&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;tedx-granta-2012-3&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-thumb-3.png&quot; alt=&quot;tedx-granta-2012-thumb-3&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;tedx-granta-2012-4&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-thumb-4.png&quot; alt=&quot;tedx-granta-2012-thumb-4&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;tedx-granta-2012-5&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-thumb-5.png&quot; alt=&quot;tedx-granta-2012-thumb-5&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;tedx-granta-2012-6&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-thumb-6.png&quot; alt=&quot;tedx-granta-2012-thumb-6&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;tedx-granta-2012-7&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-thumb-7.png&quot; alt=&quot;tedx-granta-2012-thumb-7&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;tedx-granta-2012-8&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-thumb-8.png&quot; alt=&quot;tedx-granta-2012-thumb-8&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;tedx-granta-2012-9&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-thumb-9.png&quot; alt=&quot;tedx-granta-2012-thumb-9&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;tedx-granta-2012-10&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-thumb-10.png&quot; alt=&quot;tedx-granta-2012-thumb-10&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
  &lt;ul data-orbit=&quot;&quot; data-options=&quot;next_on_click:true; timer_speed:3000; pause_on_hover:false; bullets:false;&quot;&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;tedx-granta-2012-1&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-1.jpg&quot; alt=&quot;tedx-granta-2012-1&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;tedx-granta-2012-2&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-2.jpg&quot; alt=&quot;tedx-granta-2012-2&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;tedx-granta-2012-3&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-3.jpg&quot; alt=&quot;tedx-granta-2012-3&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;tedx-granta-2012-4&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-4.jpg&quot; alt=&quot;tedx-granta-2012-4&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;tedx-granta-2012-5&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-5.jpg&quot; alt=&quot;tedx-granta-2012-5&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;tedx-granta-2012-6&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-6.jpg&quot; alt=&quot;tedx-granta-2012-6&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;tedx-granta-2012-7&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-7.jpg&quot; alt=&quot;tedx-granta-2012-7&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;tedx-granta-2012-8&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-8.jpg&quot; alt=&quot;tedx-granta-2012-8&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;tedx-granta-2012-9&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-9.jpg&quot; alt=&quot;tedx-granta-2012-9&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;tedx-granta-2012-10&quot;&gt;&lt;img src=&quot;/images/tedx-granta-2012/tedx-granta-2012-10.jpg&quot; alt=&quot;tedx-granta-2012-10&quot; /&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;About a month ago I was at &lt;a href=&quot;http://www.tedxgranta.com/&quot;&gt;TEDx Granta&lt;/a&gt;.  The theme was Alive &amp;amp; Kicking and it was a good event with some really interesting speakers, including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Eben Upton, on the Raspberry Pi Foundation (pic 2)&lt;/li&gt;
  &lt;li&gt;Merlin Crossingham, on Wallace &amp;amp; Gromit (pics 5&amp;amp;6)&lt;/li&gt;
  &lt;li&gt;Tim Minshall, on how engineers make the future (pic 9)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Videos will be on the website at some point for those who want to catchup.&lt;/p&gt;

&lt;p&gt;There’s also another TED event taking place in June. &lt;a href=&quot;http://www.tedxoxbridge.com/&quot;&gt;TEDx Oxbridge&lt;/a&gt;, organised by students from Oxford and Cambridge, will be on the theme of Unconventional Wisdom.  Not sure who the speakers are yet.&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>More likely to die Dancing than Skydiving</title>
    <link href="http://amirchaudhry.com/chances-of-dying"/>
    <author>Amir Chaudhry</author>
    <updated>2012-04-12T10:15:00+00:00</updated>
    <id>http://amirchaudhry.com/chances-of-dying</id>
    <content type="html">
&lt;p&gt;From the infographic below.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;“Odds of dying while skydiving in the US: 1 in 101,083”&lt;/li&gt;
    &lt;li&gt;“Dance parties: 1 in 100,000 chance of dying”&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Wonder what the &lt;a href=&quot;http://www.bcpa.org.uk/&quot;&gt;BCPA&lt;/a&gt; would make of this, since they recklessly combine both Skydiving &lt;em&gt;and&lt;/em&gt; parties on a regular basis (how extreme).&lt;/p&gt;

&lt;p&gt;Seriously though, this nicely depicts that many things have &lt;em&gt;worse&lt;/em&gt; odds than skydiving (although comparisons like this should be taken with a pinch of salt).  However, base jumping (which is not the same thing as skydiving) seems to be the most dangerous by far (1 in 60).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.besthealthdegrees.com/health-risks/&quot;&gt;&lt;img src=&quot;/images/web/chances-of-dying.jpg&quot; alt=&quot;Chances of Dying&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;via &lt;a href=&quot;http://www.besthealthdegrees.com/health-risks/&quot;&gt;BMD&lt;/a&gt;&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>Joining the Computer Lab Systems Group</title>
    <link href="http://amirchaudhry.com/joined-the-computer-lab"/>
    <author>Amir Chaudhry</author>
    <updated>2012-04-11T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/joined-the-computer-lab</id>
    <content type="html">
&lt;p&gt;This was the post I &lt;em&gt;meant&lt;/em&gt; to write all the way back in January.&lt;/p&gt;

&lt;p&gt;I’ve joined the &lt;a href=&quot;http://www.cl.cam.ac.uk/netos/&quot;&gt;Systems Research Group&lt;/a&gt; in the &lt;a href=&quot;http://www.cl.cam.ac.uk/&quot;&gt;Cambridge Computer Laboratory&lt;/a&gt;.  Much of the work here has a strong practical angle and people like to build useful things.  Several of the profs here have been involved in creating some prominent companies (one recent example is &lt;a href=&quot;http://www.xensource.com&quot;&gt;XenSource&lt;/a&gt;, which powers much of the public cloud - bought by Citrix).&lt;/p&gt;

&lt;p&gt;My work in the lab is related to &lt;a href=&quot;http://perscon.net/&quot;&gt;Personal Containers&lt;/a&gt;, which aims to give users access and control over their lifelong digital footprint.  It’s part of a wider research program funded by the &lt;a href=&quot;http://www.horizon.ac.uk/Horizon-Research&quot;&gt;Horizon Digital Economy Research Institute&lt;/a&gt;, which tackles topics ranging from energy efficiency to “Death 2.0” (that might sound odd but what &lt;em&gt;does&lt;/em&gt; happens to your online identity/ies when you die? What &lt;em&gt;should&lt;/em&gt; happen? How?).&lt;/p&gt;

&lt;p&gt;One of the first things I worked on was a paper with several other folks in the lab, which is currently being presented at a conference.  It’s about infrastructure to infer the carbon footprint of employees’ daily commute by analysing high resolution geolocation data from their smartphones.  Obviously, this must be done in a privacy-sensitive manner, which is what the paper discusses.  Once it’s published in the conference proceedings I’ll add a link to it here.&lt;/p&gt;

&lt;p&gt;I’ve also been writing a bit on the Personal Conatainer’s blog about privacy and personal data.  The posts there will be reposted here too, over the next few weeks.&lt;/p&gt;

&lt;p&gt;Other than that, here are some random pics from the lab.  The second pic will make more sense if you’ve seen the &lt;a href=&quot;http://xkcd.com/242/&quot;&gt;xkcd comic&lt;/a&gt; it’s based on.&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
  &lt;noscript&gt;&lt;small&gt;&lt;em&gt;Note: The gallery needs JavaScript but I've tried to make it degrade gracefully. -Amir&lt;/em&gt;&lt;/small&gt;&lt;/noscript&gt;
  &lt;ul class=&quot;inline-list&quot;&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;join-comp-lab-1&quot;&gt;&lt;img src=&quot;/images/join-comp-lab/join-comp-lab-thumb-1.png&quot; alt=&quot;join-comp-lab-thumb-1&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;join-comp-lab-2&quot;&gt;&lt;img src=&quot;/images/join-comp-lab/join-comp-lab-thumb-2.png&quot; alt=&quot;join-comp-lab-thumb-2&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;join-comp-lab-3&quot;&gt;&lt;img src=&quot;/images/join-comp-lab/join-comp-lab-thumb-3.png&quot; alt=&quot;join-comp-lab-thumb-3&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
  &lt;ul data-orbit=&quot;&quot; data-options=&quot;next_on_click:true; timer_speed:3000; pause_on_hover:false; bullets:false;&quot;&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;join-comp-lab-1&quot;&gt;&lt;img src=&quot;/images/join-comp-lab/join-comp-lab-1.jpg&quot; alt=&quot;join-comp-lab-1&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;join-comp-lab-2&quot;&gt;&lt;img src=&quot;/images/join-comp-lab/join-comp-lab-2.jpg&quot; alt=&quot;join-comp-lab-2&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;join-comp-lab-3&quot;&gt;&lt;img src=&quot;/images/join-comp-lab/join-comp-lab-3.jpg&quot; alt=&quot;join-comp-lab-3&quot; /&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;

></content>
  </entry>
  
  <entry>
    <title>I moved my site to GitHub Pages</title>
    <link href="http://amirchaudhry.com/i-moved-my-site-to-github-pages"/>
    <author>Amir Chaudhry</author>
    <updated>2012-04-07T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/i-moved-my-site-to-github-pages</id>
    <content type="html">
&lt;p&gt;Yet again, it’s been several months since my last post (it’s almost a habit now).  This isn’t intended to be another catchup post, though.&lt;/p&gt;

&lt;p&gt;The reason for this post is that I’ve moved my site (&lt;a href=&quot;http://amirchaudhry.com&quot;&gt;amirchaudhry.com&lt;/a&gt;) to &lt;a href=&quot;http://pages.github.com&quot;&gt;GitHub Pages&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since I’m using my own domain, this is unlikely to affect anyone but I’ve copied this post into both the new GitHub site and old Posterous site just in case.  If you’re reading this via &lt;a href=&quot;http://amirmc.posterous.com&quot;&gt;my Posterous site&lt;/a&gt; (presumably through the share/follow features there), then it’ll be the last post to go up there.&lt;/p&gt;

&lt;p&gt;There are still a bunch of things that are bit broken in the new place.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;No tweet/sharing buttons*&lt;/li&gt;
  &lt;li&gt;Tags don’t sort properly&lt;/li&gt;
  &lt;li&gt;Search doesn’t work well&lt;/li&gt;
  &lt;li&gt;RSS/Atom feed is probably a mess&lt;/li&gt;
  &lt;li&gt;Syntax highlighting isn’t working**&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;moving-from-posterous-to-github-pages&quot;&gt;Moving from Posterous to GitHub Pages&lt;/h3&gt;

&lt;p&gt;The process of moving to GitHub was a useful experience.  Here are the steps I ended up taking before I pointed the domain to the new site. Overall, I’m really glad that my posts aren’t tied up in someone else’s platform anymore.&lt;/p&gt;

&lt;h4 id=&quot;getting-set-up-with-github-pages&quot;&gt;Getting set up with GitHub Pages&lt;/h4&gt;

&lt;p&gt;I used &lt;a href=&quot;http://jekyllbootstrap.com&quot;&gt;Jekyll Bootstrap&lt;/a&gt; and the default &lt;a href=&quot;http://twitter.github.com/bootstrap/&quot;&gt;bootstrap theme&lt;/a&gt;. It was &lt;em&gt;ridiculously&lt;/em&gt; quick and easy to get a basic site up and start playing around.  The first thing I did was try to re-create structure of my old site and then worry about how it looked.  I’d never dealt with CSS before so this was always going to take a while. For example, it took me &lt;em&gt;ages&lt;/em&gt; to figure out why items kept shifting between pages. Turns out I needed the following line in my style file:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-css&quot; data-lang=&quot;css&quot;&gt;&lt;span class=&quot;nt&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;overflow-y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;scroll&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Although dealing with the CSS took a while, Bootstrap made it really easy to copy/paste/edit the bits I wanted to change.  The nav section was a pain to sort out.  It took a few weeks to get to this point but you’re looking at a bootstrap site, which looks nothing like bootstrap (win!). It’s likely that I’ll keep tweaking things but I’m not expecting to do anything major.&lt;/p&gt;

&lt;h4 id=&quot;migrating-the-posts&quot;&gt;Migrating the posts&lt;/h4&gt;

&lt;p&gt;There wasn’t an easy way to migrate directly from Posterous to GitHub. There are scripts available but either through bad-luck or ineptitude, I couldn’t get them to work.  A guy called &lt;a href=&quot;http://jazzychad.net/&quot;&gt;Chad&lt;/a&gt; recently created &lt;a href=&quot;http://exportmyposts.com&quot;&gt;Export My Posts&lt;/a&gt;, which pulled out all my content in html format (phew!).  I really didn’t want to deal with learning an API or parsing an xml file, so I’m glad he put this together.  It works extremely well.&lt;/p&gt;

&lt;p&gt;Next step was to run all the html posts through &lt;a href=&quot;http://johnmacfarlane.net/pandoc&quot;&gt;pandoc&lt;/a&gt; to convert them to markdown. I wrote a fairly trivial shell script to do this.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Files to convert to md? &quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;read&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt; allfiles
&lt;span class=&quot;c&quot;&gt;#args=(&quot;$@&quot;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;file &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;allfiles&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[*]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;   %s&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$file&lt;/span&gt;
    pandoc &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; ./convert/&lt;span class=&quot;nv&quot;&gt;$file&lt;/span&gt;.md &lt;span class=&quot;nv&quot;&gt;$file&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Then came the slow process of checking each file, removing the left-over html, adding the appropriate headers, dealing with image galleries etc.  Part of this could have been automated but I don’t have that many posts so I went through them manually.&lt;/p&gt;

&lt;p&gt;Once all that was done, I simply had to switch the domain over and everything was fine.&lt;/p&gt;

&lt;h4 id=&quot;lessons-learned&quot;&gt;Lessons learned&lt;/h4&gt;

&lt;p&gt;I need to keep a local copy of content. Of course, this is now solved but even before-hand I would write and save things locally before sending them up. The problem was that I’d always have to tweak something or edit a typo and &lt;em&gt;those&lt;/em&gt; changes happened on the site (never on my local copy).&lt;/p&gt;

&lt;p&gt;Having existing things I can dig into and copy from (i.e. bootstrap) really speeds up my learning. I don’t think I could have gotten this far this quickly without such resources.  If you look at the code itself it’s probably a mess, but it’s &lt;em&gt;my&lt;/em&gt; mess.&lt;/p&gt;

&lt;p&gt;Scripting things will help. Quickly creating image galleries is the next thing I need to figure out. The process is obvious to me now (since I did parts of it by hand) but I have to automate it using &lt;a href=&quot;http://www.imagemagick.org&quot;&gt;ImageMagick&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Overall, I’m quite pleased with myself.  I’ve gone from knowing nothing about CSS, static sites, and bootstrap to being vaguely (in)competent. Rock on!&lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;*Though I'll probably use something like &lt;a href=&quot;http://www.addthis.com&quot;&gt;AddThis&lt;/a&gt;. ... Edit: Ok, so at the time of writing, I didn't have the buttons but by the time of publishing I'd figured it out :)&lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;**Yup, managed to fix that too :)&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Long overdue catchup post</title>
    <link href="http://amirchaudhry.com/catchup-post-oct-dec"/>
    <author>Amir Chaudhry</author>
    <updated>2012-01-25T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/catchup-post-oct-dec</id>
    <content type="html">
&lt;!-- permalink: http://amirchaudhry.com/catchup-post-oct-dec --&gt;

&lt;h3 id=&quot;aka-highlights-of-the-last-few-months&quot;&gt;aka ‘highlights of the last few months’&lt;/h3&gt;

&lt;p&gt;It’s been quite a while since I posted anything and it’s time I did.  The last few months have been pretty busy so I thought I’d write some notes about the main items in one post and then we can pretend that I’m current again.  I’m well aware that the sheer size of this post means it’s unlikely to be read fully by most people.  There are some pics so perhaps that might be enough to hold your interest :)&lt;/p&gt;

&lt;p&gt;Later this week, I’ll write a separate post about the things I’m working on now and I’ll try to keep more up to date from then onwards.&lt;/p&gt;

&lt;p&gt;All of the following covers October to December.&lt;/p&gt;

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

&lt;h3 id=&quot;silicon-valley-comes-to-the-uk&quot;&gt;Silicon Valley comes to the UK&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;http://www.svc2uk.com&quot;&gt;SVc2UK&lt;/a&gt; was a 5/6 day conference with events taking place in Cambridge and London.  The aim is to introduce students from universities to high-profile folks from the Valley and inspire the students to consider startups as a career path (either by founding or joining them).  I was involved in this conference back in 2009 and decided to join the the new team for the 2011 events.  This year the conference was preceded by a several ‘Appathons’ (read: hackathons), which took place at 6 Universities, including Cambridge.  You can find out more about the Appathon and the conference via &lt;a href=&quot;http://www.svc2uk.com&quot;&gt;svc2uk.com&lt;/a&gt; but here are some short notes and some pics.&lt;/p&gt;

&lt;h3 id=&quot;-cambridge-appathon-&quot;&gt;– Cambridge Appathon –&lt;/h3&gt;

&lt;p&gt;The hackathons were 2-day events aimed at students and the theme was open government data.  I ran the Cambridge event on behalf of &lt;a href=&quot;http://www.cue.org.uk&quot;&gt;Cambridge University Entrepreneurs&lt;/a&gt; and we had about 80 people taking part over the course of the weekend.  Representatives from Google, Facebook, Apple and the Technology Strategy Board were present to advise the student teams and folks from the local tech community also got involved.  At the end of the weekend, we awarded Amazon Kindles to three winning teams (as decided by audience vote) and everyone was encouraged to enter the national competition too.  One of the Cambridge teams also won the national prize (a trip to SV).  Yeay!&lt;/p&gt;

&lt;p&gt;Given the sheer amount of brain-ache involved, I could (should?) write a separate post on how to run a hackathon.  Maybe I’ll get around to it at some point but in the meantime, here’s the team that actually pulled this together: &lt;a href=&quot;http://web.math.pmf.unizg.hr/~mabotinc/index.html&quot;&gt;Matko&lt;/a&gt;, &lt;a href=&quot;http://www.cl.cam.ac.uk/~arb33/&quot;&gt;Alistair&lt;/a&gt; and &lt;a href=&quot;http://www.cl.cam.ac.uk/~acr31/&quot;&gt;Andy&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/benfwirtz&quot;&gt;Ben&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/#!/ivanmazour&quot;&gt;Ivan&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/#!/simofeja&quot;&gt;Simona&lt;/a&gt;, &lt;a href=&quot;http://www.saardrimer.com/&quot;&gt;Saar&lt;/a&gt;, &lt;a href=&quot;http://uk.linkedin.com/pub/roger-coulston/26/598/7a1&quot;&gt;Roger&lt;/a&gt;.  I’m also especially grateful to the sponsors/supporters of the event: &lt;a href=&quot;http://www.red-gate.com/&quot;&gt;Red Gate Software&lt;/a&gt;, &lt;a href=&quot;http://cocoacontrols.com/&quot;&gt;Cocoa Controls&lt;/a&gt;, &lt;a href=&quot;https://plus.google.com/106738482735452735039/posts&quot;&gt;Nick&lt;/a&gt; (at Google), &lt;a href=&quot;http://www.svc2uk.com&quot;&gt;SVc2UK&lt;/a&gt; and the &lt;a href=&quot;http://www.cl.cam.ac.uk/&quot;&gt;Cambridge Computer Laboratory&lt;/a&gt; (who hosted us for a weekend).  Below are some pictures of the event itself and the national awards ceremony at Downing Street.&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
  &lt;noscript&gt;&lt;small&gt;&lt;em&gt;Note: The gallery needs JavaScript but I've tried to make it degrade gracefully. -Amir&lt;/em&gt;&lt;/small&gt;&lt;/noscript&gt;
  &lt;ul class=&quot;inline-list&quot;&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;appathon-1&quot;&gt;&lt;img src=&quot;/images/appathon/appathon-thumb-1.png&quot; alt=&quot;appathon-thumb-1&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;appathon-2&quot;&gt;&lt;img src=&quot;/images/appathon/appathon-thumb-2.png&quot; alt=&quot;appathon-thumb-2&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;appathon-3&quot;&gt;&lt;img src=&quot;/images/appathon/appathon-thumb-3.png&quot; alt=&quot;appathon-thumb-3&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;appathon-4&quot;&gt;&lt;img src=&quot;/images/appathon/appathon-thumb-4.png&quot; alt=&quot;appathon-thumb-4&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;appathon-5&quot;&gt;&lt;img src=&quot;/images/appathon/appathon-thumb-5.png&quot; alt=&quot;appathon-thumb-5&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;appathon-6&quot;&gt;&lt;img src=&quot;/images/appathon/appathon-thumb-6.png&quot; alt=&quot;appathon-thumb-6&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;appathon-7&quot;&gt;&lt;img src=&quot;/images/appathon/appathon-thumb-7.png&quot; alt=&quot;appathon-thumb-7&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;appathon-8&quot;&gt;&lt;img src=&quot;/images/appathon/appathon-thumb-8.png&quot; alt=&quot;appathon-thumb-8&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
  &lt;ul data-orbit=&quot;&quot; data-options=&quot;next_on_click:true; timer_speed:3000; pause_on_hover:false; bullets:false;&quot;&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;appathon-1&quot;&gt;&lt;img src=&quot;/images/appathon/appathon-1.jpg&quot; alt=&quot;appathon-1&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;appathon-2&quot;&gt;&lt;img src=&quot;/images/appathon/appathon-2.jpg&quot; alt=&quot;appathon-2&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;appathon-3&quot;&gt;&lt;img src=&quot;/images/appathon/appathon-3.jpg&quot; alt=&quot;appathon-3&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;appathon-4&quot;&gt;&lt;img src=&quot;/images/appathon/appathon-4.jpg&quot; alt=&quot;appathon-4&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;appathon-5&quot;&gt;&lt;img src=&quot;/images/appathon/appathon-5.jpg&quot; alt=&quot;appathon-5&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;appathon-6&quot;&gt;&lt;img src=&quot;/images/appathon/appathon-6.jpg&quot; alt=&quot;appathon-6&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;appathon-7&quot;&gt;&lt;img src=&quot;/images/appathon/appathon-7.jpg&quot; alt=&quot;appathon-7&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;appathon-8&quot;&gt;&lt;img src=&quot;/images/appathon/appathon-8.jpg&quot; alt=&quot;appathon-8&quot; /&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;

&lt;h3 id=&quot;-svc2c-conference-&quot;&gt;– SVc2C Conference –&lt;/h3&gt;

&lt;p&gt;This was the main part of the conference and the guests from the Valley were in Cambridge for two days.  In that time, they took part in a pretty large number of events and hopefully met a lot of interesting students.  If you’re interested in the list of guests, you can check them out via the link on the conference website (&lt;a href=&quot;http://www.svc2uk.com&quot;&gt;svc2uk.com&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;You can find videos of this year’s sessions on the &lt;a href=&quot;http://vimeo.com/user5407037&quot;&gt;Vimeo account&lt;/a&gt;.&lt;/p&gt;

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

&lt;h3 id=&quot;stanford-online-courses&quot;&gt;Stanford online courses&lt;/h3&gt;

&lt;p&gt;I did all three of the inaugural classes. Machine Learning, Artificial Intelligence and Databases … and I enjoyed them in that order.  The following is a short summary/review of each.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://www.ml-class.org/&quot;&gt;ML-Class&lt;/a&gt;&lt;/strong&gt; was fantastic since you had to write actual scripts and I really looked forward to both the videos and exercises every week.  At times, the exercises felt a bit contrived (one line of code in a file) but there were occasions where I had to really think properly to &lt;em&gt;get&lt;/em&gt; that one line.  Once you got the hang of matrix multiplication the exercises got easier.  The scores don’t really mean anything since you could repeat the questions until you got a perfect score. At some point, I’ll go back over the iTunes U content from the profs 2008 class.  It has more theory/maths and covers reinforcement learning, which the applied course didn’t.  You can find my ‘programming’ exercises &lt;a href=&quot;https://github.com/amirmc/ai-ml-classes&quot;&gt;on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.ai-class.com/&quot;&gt;AI-Class&lt;/a&gt;&lt;/strong&gt; was a very different course and it didn’t seem as ‘slick’ as the ML class but I learnt &lt;em&gt;way&lt;/em&gt; more maths, specifically about probability.  Since I was terrible at probability at school, I really wanted to get a better handle on it and this class really made me work.  I have pages and pages of calculations for some of the in-class questions and I hope I can retain what I’ve learnt.  At times there was only a cursory overview of a topic before moving on but I should have expected that from an “Intro to…” course.  This was the only class with &lt;em&gt;both&lt;/em&gt; graded homeworks and exams. Overall, I was in the ‘top 25%’ according the statement I got (overall mark was 95%).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://www.db-class.org&quot;&gt;DB-Class&lt;/a&gt;&lt;/strong&gt; was the one I least understood but the one I originally thought I was going to stick with.  Within the first few lectures, I knew I was going to find it tough.  Relational Algebra made no sense to me and the videos seemed to cover each example once and move on to something else.  Since I didn’t have enough time to find additional resources, I ended up barely following along and basically flunked the course.  There was a mid-term and final exam and the homeworks could be repeated until you got a perfect score (but I ended up not bothering).  No idea what score I got but you needed &amp;gt;50% to get a statement and I didn’t get one :)&lt;/p&gt;

&lt;p&gt;In general, I was very impressed by the dedication and effort the profs and the teams working with them put into the courses.  Although the profs were the folks centre stage, there were a group of largely unsung heroes who kept things running, put together exercises and enabled everything to happen.  This method of learning is really going to take off and if people can figure out how to deal with proper certification, then it might even challenge the notion of going to University.  There have been a slew of new courses available and I think I’ll try two more if I can fit them in (i.e. &lt;a href=&quot;http://www.pgm-class.org/&quot;&gt;Probabilistic Graphical Models&lt;/a&gt; and &lt;a href=&quot;http://www.modelthinker-class.org/&quot;&gt;Model Thinking&lt;/a&gt;).&lt;/p&gt;

&lt;h3 id=&quot;learning-to-code&quot;&gt;Learning to code&lt;/h3&gt;

&lt;p&gt;I’ve also been trying to keep up with learning Python via &lt;a href=&quot;http://learnpythonthehardway.org/&quot;&gt;LPtHW&lt;/a&gt; (see &lt;a href=&quot;https://github.com/amirmc/TheHardWay&quot;&gt;GitHub repo&lt;/a&gt; for progress).   I’d describe myself as chugging along and I’m glad that I’m not finding anything too difficult.&lt;/p&gt;

&lt;p&gt;The trickiest part is finding ways to actually fit some coding into things I need done.  Since I finished analysing my PhD data, I’ve not had the need to write scripts or manipulate data in any substantive way and I don’t fancy re-writing any of my old stuff (NB I also tried to collate all of that and added it to GitHub too).  I’m sure I can find something worth doing and I suspect it might involve Django sooner than I thought.&lt;/p&gt;

&lt;p&gt;I also signed up to Code Academy’s ‘Code Year’ but I’ve not opened any of their emails yet (and I suspect I won’t have time).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/web/lpthwbook.jpg&quot; alt=&quot;LPtHW&quot; title=&quot;Learn Python the Hard Way&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;events-and-occasional-startup-stuff&quot;&gt;Events and occasional startup stuff&lt;/h3&gt;

&lt;p&gt;As always there have been a bunch of events and startup-related items in the last few months.  Normally I wouldn’t bother mentioning these but I’m in a list-y mood.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.seedcamp.com/2011/09/seedcamp-week-breaking-records-yet-again.html&quot;&gt;Seedcamp Demo Day&lt;/a&gt; (Sep)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/#!/charityhack2011&quot;&gt;CharityHack&lt;/a&gt; (Oct - not that I did much)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.meetup.com/SiliconRoundaboutSocialClub/&quot;&gt;Silicon Roundabout Social Club&lt;/a&gt; (Oct)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.productcamplondon.com/events/productcamp-london-3-november-26th-2011/&quot;&gt;Product Camp&lt;/a&gt; (Nov)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.dar.cam.ac.uk/connections&quot;&gt;Connections talks&lt;/a&gt; (Nov &amp;amp; Dec - Cyberwarfare and Energy)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.cabume.co.uk/the-cluster/the-future-is-now-eric-ries-in-cambridge.html&quot;&gt;Eric Ries - Lean Startup&lt;/a&gt; (Jan - UK Book Launch)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.meetup.com/hnlondon/&quot;&gt;HackerNews London Meetups&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Visit to Olympic park &lt;em&gt;(ok, so this was waaay back in May and should have had it’s own post but I never got around to it)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pics of Visit to Olympic Park (in May)&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
  &lt;noscript&gt;&lt;small&gt;&lt;em&gt;Note: The gallery needs JavaScript but I've tried to make it degrade gracefully. -Amir&lt;/em&gt;&lt;/small&gt;&lt;/noscript&gt;
  &lt;ul class=&quot;inline-list&quot;&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;olympic-park-1&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-thumb-1.png&quot; alt=&quot;olympic-park-thumb-1&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;olympic-park-2&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-thumb-2.png&quot; alt=&quot;olympic-park-thumb-2&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;olympic-park-3&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-thumb-3.png&quot; alt=&quot;olympic-park-thumb-3&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;olympic-park-4&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-thumb-4.png&quot; alt=&quot;olympic-park-thumb-4&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;olympic-park-5&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-thumb-5.png&quot; alt=&quot;olympic-park-thumb-5&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;olympic-park-6&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-thumb-6.png&quot; alt=&quot;olympic-park-thumb-6&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;olympic-park-7&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-thumb-7.png&quot; alt=&quot;olympic-park-thumb-7&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;olympic-park-8&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-thumb-8.png&quot; alt=&quot;olympic-park-thumb-8&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;olympic-park-9&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-thumb-9.png&quot; alt=&quot;olympic-park-thumb-9&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;olympic-park-10&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-thumb-10.png&quot; alt=&quot;olympic-park-thumb-10&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
  &lt;ul data-orbit=&quot;&quot; data-options=&quot;next_on_click:true; timer_speed:3000; pause_on_hover:false; bullets:false;&quot;&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;olympic-park-1&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-1.jpg&quot; alt=&quot;olympic-park-1&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;olympic-park-2&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-2.jpg&quot; alt=&quot;olympic-park-2&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;olympic-park-3&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-3.jpg&quot; alt=&quot;olympic-park-3&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;olympic-park-4&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-4.jpg&quot; alt=&quot;olympic-park-4&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;olympic-park-5&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-5.jpg&quot; alt=&quot;olympic-park-5&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;olympic-park-6&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-6.jpg&quot; alt=&quot;olympic-park-6&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;olympic-park-7&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-7.jpg&quot; alt=&quot;olympic-park-7&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;olympic-park-8&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-8.jpg&quot; alt=&quot;olympic-park-8&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;olympic-park-9&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-9.jpg&quot; alt=&quot;olympic-park-9&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;olympic-park-10&quot;&gt;&lt;img src=&quot;/images/olympic-park/olympic-park-10.jpg&quot; alt=&quot;olympic-park-10&quot; /&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;

&lt;h3 id=&quot;-and-finally&quot;&gt;… and finally&lt;/h3&gt;

&lt;p&gt;I managed to get this done in October.  Took a while.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/singles/thesis.jpg&quot; alt=&quot;PhD Thesis&quot; title=&quot;PhD Thesis&quot; /&gt;&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Infographic of the day - What success really looks like</title>
    <link href="http://amirchaudhry.com/what-success-really-looks-like"/>
    <author>Amir Chaudhry</author>
    <updated>2011-09-20T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/what-success-really-looks-like</id>
    <content type="html">
&lt;p&gt;&lt;a href=&quot;https://plus.google.com/117689362923608221663/posts/8v7RBNncmAJ&quot;&gt;&lt;img src=&quot;/images/singles/what-success-really-looks-like-alpha.png&quot; alt=&quot;What success really looks like&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;via &lt;a href=&quot;https://plus.google.com/104537541227697934010/posts/HAi5TTMymUx&quot;&gt;Ian Bicking&lt;/a&gt; via &lt;a href=&quot;https://plus.google.com/102976465024742837897/posts/fNuHVGKxCVs&quot;&gt;Kim Sherrell&lt;/a&gt; via &lt;a href=&quot;https://plus.google.com/117689362923608221663/posts/8v7RBNncmAJ&quot;&gt;Jason Keath&lt;/a&gt;&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>Snake oil? Scientific evidence for health supplements</title>
    <link href="http://amirchaudhry.com/scientific-evidence-for-health-supplements"/>
    <author>Amir Chaudhry</author>
    <updated>2011-07-28T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/scientific-evidence-for-health-supplements</id>
    <content type="html">
&lt;p&gt;&lt;a href=&quot;http://www.informationisbeautiful.net/visualizations/snake-oil-supplements/&quot;&gt;&lt;img src=&quot;/images/web/snakeoil-supplements.png&quot; alt=&quot;Scientific evidence for health supplements&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;via &lt;a href=&quot;http://www.informationisbeautiful.net/visualizations/snake-oil-supplements/&quot;&gt;informationisbeautiful.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Great graphic. I’m surprised to see Vitamins A &amp;amp; E so far down the list though.&lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;
Comment from original post: Jul 28, 2011 - 
&lt;a href=&quot;http://twitter.com/benmordue&quot;&gt;benmordue&lt;/a&gt; said...
A possible reason that the &quot;tangible health benefits&quot; of Vitamins A &amp;amp; E is low is that a &quot;healthy diet&quot; (mentioned at the top of the graphic) already includes enough of those nutrients, and consuming extra vitamins above the required level does not confer extra health benefits. Also: hello! How do? ;-) &lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;Comment from original post: Jul 28, 2011 - &lt;a href=&quot;http://twitter.com/benmordue&quot;&gt;benmordue&lt;/a&gt; said ... Aargh! Meant to say, &quot;of Vitamin A &amp;amp; E *supplements*&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>My thoughts on the Seedsummit Term Sheet</title>
    <link href="http://amirchaudhry.com/my-thoughts-on-the-seedsummit-term-sheet"/>
    <author>Amir Chaudhry</author>
    <updated>2011-07-11T14:02:00+00:00</updated>
    <id>http://amirchaudhry.com/my-thoughts-on-the-seedsummit-term-sheet</id>
    <content type="html">
&lt;p&gt;&lt;img src=&quot;/images/web/seedsummit-termsheet.jpg&quot; alt=&quot;Affärsbilder by Dan Eriksson on Flickr&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A few days ago, &lt;a href=&quot;http://seedsummit.org&quot;&gt;Seedsummit&lt;/a&gt; released a Term
Sheet intended to be (or become) standard across Europe for early stage
investment.&lt;/p&gt;

&lt;p&gt;It’s been several days since the announcement and so far I haven’t seen
much in-depth commentary on it (other than acknowledging its existence
and how difficult it must have been to achieve consensus). That might be
because the announcement seemed to come as a surprise, so perhaps folks
haven’t had a chance to digest it yet. Or maybe nobody cares?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.guardian.co.uk/technology/pda/2011/jul/06/startups-terms-seed&quot;&gt;One post from the Guardian&lt;/a&gt; offered some criticism, but beyond that it’s all been a bit quiet. Since no-one else has posted any thoughts, I thought I’d go through the document and offer my opinions. I’ve put the notes in a &lt;a href=&quot;http://amirchaudhry.com/review-of-the-seedsummit-term-sheet&quot;&gt;more comprehensive post&lt;/a&gt; and summarised the main points here (mostly because going through a legal document is a little bit dreary).&lt;/p&gt;

&lt;h3 id=&quot;main-comments-on-seedsummit-term-sheet&quot;&gt;Main comments on Seedsummit term sheet&lt;/h3&gt;

&lt;p&gt;There are a few of things that founders should be careful of. First is
the liquidation preference, where founders should be getting the
non-participating option (Option 1). Second is vesting, since founders
probably want to adjust the values described. Third is how the option
pool is set up (before/after the funding). Finally, the anti-dilution
provisions don’t seem to provide any useful information so founders
should check this carefully if they’re presented with it. For more
detail on any of these points, see the relevant section in the &lt;a href=&quot;http://amirchaudhry.com/review-of-the-seedsummit-term-sheet&quot;&gt;detailed
review&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The overall impression I got was that these are documents for &lt;strong&gt;dealing
with VCs&lt;/strong&gt; &lt;em&gt;(edit: It seems an additional note was added to the download
page to this effect)&lt;/em&gt;. Unsurprising since it was put together by 21 VC
firms from across Europe. Surprising because I’m guessing no Angel
investors were involved, despite the term sheet being advertised for
‘early stage’ financing. Since Seedsummit is trying to build a network
of european investors (and credit to them for that), I did find it a
little odd that there didn’t seem to be any Angels listed as helping to
create this document. Perhaps it’s because the Angels aren’t investing
on a pan-european basis? I’d love to see a Series A term sheet for
comparison and my gut feel is that the Seedsummit document has a lot
more in common with Series A than with Angel docs. This does beg the
question, what does ‘seed’ actually mean?&lt;/p&gt;

&lt;h4 id=&quot;what-does-seed-mean&quot;&gt;What does &lt;em&gt;seed&lt;/em&gt; mean?&lt;/h4&gt;

&lt;p&gt;In 2009, I set up and ran the first iteration of
&lt;a href=&quot;http://www.springboard.com&quot;&gt;Springboard&lt;/a&gt; (a seed accelerator). We were
helping early-stage teams to get a product out the door and to start
getting feedback from users (&lt;a href=&quot;http://www.slideshare.net/venturehacks/customer-development-methodology-presentation&quot;&gt;customer development&lt;/a&gt;).
When teams came out of the programme, I considered them ‘seed-stage’,
i.e likely to be ready for seed investment, wherever that may come from.
Ideally, the team would have a version of the product that was being
used by early adopters. The team would be adapting that product based on
feedback, although they would likely have little/no revenue. That
basically sums up what I picture in my head when I think of
‘seed-stage’.&lt;/p&gt;

&lt;p&gt;Over the last week I’ve met several VCs from different firms and asked
them directly what &lt;em&gt;seed&lt;/em&gt; means to them. For each of them, seed-stage
investing involves companies that have a product, customers and
revenues. This was pretty much the case for &lt;em&gt;all&lt;/em&gt; the VCs I spoke to. I
wish I’d probed for more detail as to what kind of revenue/customer
numbers they expect but never mind.&lt;/p&gt;

&lt;p&gt;In any case, despite using the same language, there’s obviously a gap
between the above viewpoints. I’m not suggesting either of them is right
or wrong but I think it’s important to point out such differences,
especially in the light of the new ‘standard’ term sheet.&lt;/p&gt;

&lt;h3 id=&quot;what-does-this-term-sheet-mean-for-founders&quot;&gt;What does this term sheet mean for founders?&lt;/h3&gt;

&lt;p&gt;In brief, founders should do their homework. In going through this
document, I spent quite a while researching and there’s actually a lot
of information out there about what the terms mean and the impact they
might have. As we now have a European VC term sheet in the open it’ll
make comparisons with US VCs a lot easier. Any major disparities will
quickly be picked on by the popular startups who might go elsewhere to
raise money. Indeed, the real test will be whether or not a ‘hot’ new
startup uses these terms and as they stand, I doubt that will be the
case. Founders will still need lawyers and VCs will still be willing to
negotiate terms.&lt;/p&gt;

&lt;p&gt;We’re not quite at the point-and-click stage for early stage financing
but with more and more information being put into the open, it does
become easier for startups to make better informed decisions.&lt;/p&gt;

&lt;p&gt;If you haven’t already, you can go check my &lt;a href=&quot;http://amirchaudhry.com/journal/review-of-the-seedsummit-term-sheet&quot;&gt;review of the Seedsummit terms&lt;/a&gt; now.&lt;/p&gt;

&lt;p&gt;Did you find this useful? &lt;a href=&quot;http://news.ycombinator.com/item?id=2750689&quot;&gt;Upvote and comment on HN&lt;/a&gt;&lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;Photo credit: &lt;a href=&quot;http://www.flickr.com/photos/26601279@N04/2496121873/&quot;&gt;Affärsbilder by Dan Eriksson on Flickr&lt;/a&gt;&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Review of the Seedsummit Term Sheet</title>
    <link href="http://amirchaudhry.com/review-of-the-seedsummit-term-sheet"/>
    <author>Amir Chaudhry</author>
    <updated>2011-07-11T14:00:00+00:00</updated>
    <id>http://amirchaudhry.com/review-of-the-seedsummit-term-sheet</id>
    <content type="html">
&lt;p&gt;&lt;strong&gt;Please read the &lt;a href=&quot;http://amirchaudhry.com/my-thoughts-on-the-seedsummit-term-sheet&quot;&gt;summary post&lt;/a&gt; (above) before reading this one.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Summary: Last week, &lt;a href=&quot;http://seedsummit.org&quot;&gt;Seedsummit&lt;/a&gt; released a Term
Sheet intended to be (or become) standard across Europe for early stage
investment. To achieve this, 21 European VC firms convened and agreed on
a ‘standard’ set of terms. The aim of producing this document is to make
“… seed funding easier to access, better to understand, and fair for all
parties”. If you want to, you can &lt;a href=&quot;http://www.seedcamp.com/docs/seedsummit_general_termsheet_v1p.doc&quot;&gt;download the general term sheet&lt;/a&gt;
for yourself. I’ll go through this document below.&lt;/p&gt;

&lt;h3 id=&quot;things-to-note&quot;&gt;Things to note&lt;/h3&gt;

&lt;p&gt;Before I get into the document itself, there are a few things I should
point out:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The most important is that &lt;strong&gt;I Am Not A Lawyer&lt;/strong&gt;. Anyone dealing
with &lt;em&gt;legal docs&lt;/em&gt; should obviously get &lt;em&gt;legal advice&lt;/em&gt;. However,
since this term sheet is meant to be “reader-friendly” (as
SeedSummit says), I’d hope that someone like myself should be able
to understand and interpret it to some degree. If not, one of the
benefits of this document diminishes since I still need a lawyer to
translate it for me.&lt;/li&gt;
  &lt;li&gt;I’m only reviewing the general term sheet, not the EIS specific
sheet.&lt;/li&gt;
  &lt;li&gt;I’ve read typical angel investment docs since I’ve led one angel
investment before (for someone else). Hence my point of view is
likely to be influenced by that.&lt;/li&gt;
  &lt;li&gt;I’ve never seen a term sheet from a VC so I can’t make any specific
comparisons between the new SeedSummit sheet or a prior VC term
sheet (though I’d like to).&lt;/li&gt;
  &lt;li&gt;Obviously, everything you read is here is just my opinion. Whether
you agree or disagree, I just want to see some discussion.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;about-seedsummit&quot;&gt;About Seedsummit&lt;/h2&gt;

&lt;p&gt;I realised I know very little about Seedsummit itself so I looked around
their website and also for other links via Google.&lt;/p&gt;

&lt;p&gt;In a few words, SeedSummit is Europe’s answer to
&lt;a href=&quot;http://angel.co/&quot;&gt;AngelList&lt;/a&gt;. More specifically, it’s SeedCamp’s answer
to AngelList (it’s run by the same people rather than independently). It
seems there are about 120-ish investors (assuming all profiles are
visible) and the investment range is from 10k to 500k EUR (which is the
kind of range I consider to be ‘seed’). Randomly clicking through the
profiles, I see that the majority of them say “I am investing: My own
money”. At first, I took that to mean there were more Angels on the
platform but looking closer I noticed that some of those profiles are of
Partners in VC funds. Although these folks have ‘skin in the game’ I
expect they only invest via their funds so it would have been more
appropriate to say “Money from a fund”. In any case, this made it more
tricky to guess at the ratio between Angels and VCs on Seedsummit, so I
gave up trying. If anyone else knows the answer, please let me know.&lt;/p&gt;

&lt;h2 id=&quot;comments-on-the-seedsummit-term-sheet&quot;&gt;Comments on the Seedsummit Term Sheet&lt;/h2&gt;

&lt;p&gt;I’ll go through this term by term and note my comments so you can follow
along with the document. I’ll skip the stuff that doesn’t warrant much
discussion (e.g Company, Founders, etc). Since this document was based
on the &lt;a href=&quot;http://www.seriesseed.com/&quot;&gt;Series Seed&lt;/a&gt; documents from the US,
I’ll also make a quick comparison between them.&lt;/p&gt;

&lt;h3 id=&quot;structure-of-financing&quot;&gt;Structure of financing&lt;/h3&gt;

&lt;p&gt;The &lt;a href=&quot;http://www.investopedia.com/ask/answers/114.asp&quot;&gt;pre-money&lt;/a&gt;
valuation includes the employee share option pool, which effectively
dilutes the founders a little more than they would otherwise have
expected. There’s a pretty good post by &lt;a href=&quot;http://www.avc.com/a_vc/2009/11/valuation-and-option-pool.html&quot;&gt;Fred Wilson on valuations and option pools&lt;/a&gt;
and I’d recommend people read that for more information.&lt;/p&gt;

&lt;h3 id=&quot;type-of-security&quot;&gt;Type of security&lt;/h3&gt;

&lt;p&gt;This basically says that the new shares have preferential rights (i.e
they are not common stock).&lt;/p&gt;

&lt;h3 id=&quot;liquidation-preferences&quot;&gt;Liquidation preferences&lt;/h3&gt;

&lt;p&gt;There are two options here and both state “… one times the original
purchase price …”, in other words it’s the same amount of money the
investor put in. Had this been anything other than ‘one’ it would be
cause for concern. The main difference between the two options is
whether the investor is &lt;em&gt;non-participating&lt;/em&gt; or &lt;em&gt;fully-participating&lt;/em&gt;
which are quite different.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Non-participating&lt;/em&gt; means that the investor can do one of two things
when there’s a ‘liquidity event’ (e.g acquisition). They can either make
sure they get their money back (i.e one times the purchase price), with
any left over being divided amongst the other shareholders. Or they can
choose to get an amount in proportion to the shares they hold. They will
take whichever returns the most money. Obviously, both the founder and
investor want the sale to be as large as possible so both will be aiming
for the latter case. In the case where the exit isn’t quite what the
investor imagined, then they’ll try and get their money back. It seems
there is an example of this in practice when &lt;a href=&quot;http://www.avc.com/a_vc/2010/08/heres-why-you-need-a-liquidation-preference.html&quot;&gt;Fred wrote about Slide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fully-participating&lt;/em&gt; means the investor gets to do &lt;strong&gt;both&lt;/strong&gt; of the
above. They will get their money out first and then will &lt;em&gt;also&lt;/em&gt; take a
share of any left over money (sometimes referred to as
‘double-dipping’). This is definitely the less founder-friendly option
and I expect founders would not accept it (assuming they have enough
bargaining power to push back). It does seem a little odd to me that
this is listed as an option in an early stage term sheet, especially
since terms usually get carried forward into subsequent funding rounds.
For an example of how liquidation preferences can affect the way money
gets distributed, you can read &lt;a href=&quot;http://venturebeat.com/2010/08/16/beware-the-trappings-of-liquidation-preference/&quot;&gt;VentureBeat on liquidation preferences&lt;/a&gt;
(scroll down to the example).&lt;/p&gt;

&lt;h3 id=&quot;anti-dilution-provisions&quot;&gt;Anti-dilution provisions&lt;/h3&gt;

&lt;p&gt;This term, which is indicated as optional, dictates what happens if a
subsequent round of funding occurs at a lower valuation than the current
one. Except it doesn’t. Those deceptive square brackets could hold a
range of scary sounding words and in some cases you might even find
equations in there. Since there’s no suggested text here, I don’t have
much to say. Feel free to google and you’ll find some variations on what
could end up in here.&lt;/p&gt;

&lt;h3 id=&quot;important-decisions&quot;&gt;Important Decisions&lt;/h3&gt;

&lt;p&gt;A list of things you can’t do without the investor’s consent. The
options here basically whether the list is written in the terms or
referred to in an appendix. From the suggested list, there isn’t
anything I haven’t seen before.&lt;/p&gt;

&lt;p&gt;One thing that might be &lt;em&gt;missing&lt;/em&gt; is the proportion of shares that must
be maintained by these investors to maintain this right. As it stands,
the investor could hold any amount of shares and still maintain the
right (e.g they could hold less than 5% and still block a sale of the
company even if the other 95+% agreed to it).&lt;/p&gt;

&lt;h3 id=&quot;pre-emption-right-of-first-refusal-and-co-sale&quot;&gt;Pre-emption, Right of first-refusal and Co-sale&lt;/h3&gt;

&lt;p&gt;I’ve seen most of this before but there are a couple of things I don’t
understand. Firstly, for pre-emption, “The Investors my assign this
right to another member of their fund group”. I have no idea what this
means since I can’t figure what ‘fund group’ is being referred to.
Secondly, for the Right of first-refusal, I’m not sure what “…transfers
by Investors to affiliated funds” means either.&lt;/p&gt;

&lt;h3 id=&quot;drag-along&quot;&gt;Drag Along&lt;/h3&gt;

&lt;p&gt;The important point here is that &lt;em&gt;both&lt;/em&gt; a majority of the Preference
shares &lt;em&gt;and&lt;/em&gt; of the Ordinary shares is required to enact it. Had it only
been a majority of Preference shares then it would be drastically
one-sided.&lt;/p&gt;

&lt;h3 id=&quot;restrictive-covenants-and-founders-undertakings&quot;&gt;Restrictive Covenants and Founders Undertakings&lt;/h3&gt;

&lt;p&gt;Other documents come into play here, for example the employment
contracts. An interesting point is that the founders shouldn’t work on
anything else during their ‘business time’, which mean any side projects
might need permission from the investors. It’s reasonable to expect
founders to commit themselves to the business but they would need to
check the employment contract to make sure there isn’t anything
untoward. The last sentence referring to immediate dismissal for cause
seems a little harsh.&lt;/p&gt;

&lt;h3 id=&quot;founder-shares&quot;&gt;Founder Shares&lt;/h3&gt;

&lt;p&gt;Apparently the shares held by founders would be subject to &lt;em&gt;reverse
vesting&lt;/em&gt;. In effect, whatever shares you thought you ‘owned’, you don’t
really have anymore. Reverse vesting means that although you have your
shares the company will repurchase them from you (at practically no
cost) if you leave or are fired. That ‘right-to-repurchase’ diminishes
over time. This doesn’t sound like a good deal for the founders but it’s
understandable that the investor wants to keep the founders committed to
the company.&lt;/p&gt;

&lt;p&gt;The interesting part are the suggested figures. 25% of the founder
shares vest after a year and the rest on a monthly basis over another
two years. This seems a bit excessive to me. Firstly, I don’t see any
reason why more of the shares can’t vest immediately and the rest on a
monthly basis thereafter. Secondly, I think a three year time frame is
quite long and although I’ve seen it for employee options it doesn’t
seem appropriate for founders at an early stage. (edit to add: I’ve
heard from friends in San Francisco that four year vesting with a one
year cliff is pretty standard out there)&lt;/p&gt;

&lt;p&gt;For the kinds of startups I’ve dealt with, I’m generally of the opinion
that if a founder leaves, then the company is effectively over.
Provisions for clawing back shares, like the one one here, seem largely
pointless to me. In any case, I think founders will have to look
carefully at what the vesting looks like and see if it works for them&lt;/p&gt;

&lt;h3 id=&quot;expenses&quot;&gt;Expenses&lt;/h3&gt;

&lt;p&gt;Option 1 just plain sucks. I find it slightly ridiculous that the
investor expects the company to pay for their legal fees and the amount
isn’t even capped. Option 2 is slightly better in that everyone pays
their own fees but it also includes a caveat that if the founders decide
to withdraw, then they’ll have to pay the investor’s legal fees to date.
That would seem fair enough but notice there’s no caveat for the case
where the &lt;em&gt;investor&lt;/em&gt; decides to change their mind. I’d certainly push
for that to be added too.&lt;/p&gt;

&lt;h2 id=&quot;brief-comparison-with-series-seed&quot;&gt;Brief comparison with Series Seed&lt;/h2&gt;

&lt;p&gt;The Seedsummit term sheet is itself based on the &lt;a href=&quot;http://www.seriesseed.com/&quot;&gt;Series Seed&lt;/a&gt; documents so I thought it would make
sense to do a quick comparison between them.&lt;/p&gt;

&lt;p&gt;There are a handful of things I noticed which were:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Series seed only mentions a non-participating liquidation preference
(Seedsummit includes an option for fully participating)&lt;/li&gt;
  &lt;li&gt;In the Series Seed document, the investor’s legal expenses are paid
for by the company but they’re capped ($10,000).&lt;/li&gt;
  &lt;li&gt;Series Seed’s founder vesting is over 4 years (but gives no
suggestions).&lt;/li&gt;
  &lt;li&gt;No anti-dilution provisions in Series Seed term sheet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you got this far then congratulations on your patience!&lt;/p&gt;

&lt;p&gt;You can either go &lt;a href=&quot;http://amirchaudhry.com/journal/my-thoughts-on-the-seedsummit-term-sheet&quot;&gt;back to the summary post&lt;/a&gt;
or &lt;a href=&quot;http://news.ycombinator.com/item?id=2750689&quot;&gt;upvote and comment on HN&lt;/a&gt;&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Tech Company Org Charts - and other cool comics</title>
    <link href="http://amirchaudhry.com/tech-company-org-charts-and-other-cool-comics"/>
    <author>Amir Chaudhry</author>
    <updated>2011-07-01T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/tech-company-org-charts-and-other-cool-comics</id>
    <content type="html">
&lt;p&gt;&lt;a href=&quot;http://www.bonkersworld.net/organizational-charts/&quot;&gt;&lt;img src=&quot;/images/web/tech-org-charts-comic.png&quot; alt=&quot;Tech Company Org Charts&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;via &lt;a href=&quot;http://www.bonkersworld.net/organizational-charts/&quot;&gt;bonkersworld.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just found this and I think it’s great. There are some other fun comics on the site too. Go check them out.&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Did Google+ Hangout just kill Skype?</title>
    <link href="http://amirchaudhry.com/did-google-hangout-just-kill-skype"/>
    <author>Amir Chaudhry</author>
    <updated>2011-06-30T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/did-google-hangout-just-kill-skype</id>
    <content type="html">
&lt;p&gt;&lt;img src=&quot;/images/singles//google-plus.png&quot; alt=&quot;google-plus&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;i&gt;Disclaimer: I still haven’t tried Hangout, not enough people in my
circles yet.&lt;/i&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Skype has been great for conference calls and video calls but it’s
nearly always been a hassle with more than 2 people. It’s analogous to
the way in which phones work i.e great when only two people need to talk
but confusing to set up if there are more.&lt;/p&gt;

&lt;p&gt;Although it’s different, Hangout might obviate the need to use Skype
video again. Having multiple people, with cameras, all in one ‘room’ and
effectively with one-click sounds fantastic. Of course, I haven’t tried
it yet but I can imagine not needing to use Skype video again.&lt;/p&gt;

&lt;p&gt;Skype will still have it’s place (for now) since I find it useful to see
who’s online and ask quick questions via IM. However, even that benefit
might disappear in time.&lt;/p&gt;

&lt;p&gt;I’m curious to know what other people think.&lt;/p&gt;

&lt;p&gt;Edit: Some discussion now on &lt;a href=&quot;http://news.ycombinator.com/item?id=2713595&quot; title=&quot;HN Post&quot;&gt;Hacker News&lt;/a&gt;.&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Solar 3d Printer. Fantastic video</title>
    <link href="http://amirchaudhry.com/solar-3d-printer-fantastic-video"/>
    <author>Amir Chaudhry</author>
    <updated>2011-06-26T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/solar-3d-printer-fantastic-video</id>
    <content type="html">
&lt;div class=&quot;flex-video&quot;&gt;
    &lt;iframe src=&quot;http://player.vimeo.com/video/25401444?title=0&amp;amp;byline=0&amp;amp;portrait=0&quot; width=&quot;540&quot; height=&quot;304&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;Solar 3d Printer video&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;via &lt;a href=&quot;http://vimeo.com/25401444&quot;&gt;vimeo.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wow. I’d love to know how strong those pieces actually are.&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>On my facebook wall tonight</title>
    <link href="http://amirchaudhry.com/on-my-facebook-wall-tonight"/>
    <author>Amir Chaudhry</author>
    <updated>2011-06-09T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/on-my-facebook-wall-tonight</id>
    <content type="html">
&lt;p&gt;&lt;img src=&quot;/images/singles/on-my-fb-wall.jpg&quot; alt=&quot;On my FB Wall tonight&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ok, so I’ve been busy for the last couple of days. Last night was the
CUE Grand Finale and tonight was the CUTEC conference and dinner. Both
were fabulous and I guess I should write about them soon (It’s been a
while since I actually posted new stuff here).&lt;/p&gt;

&lt;p&gt;Let the damage limitation begin :-P&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Lego is Amazing</title>
    <link href="http://amirchaudhry.com/lego-is-amazing"/>
    <author>Amir Chaudhry</author>
    <updated>2011-05-06T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/lego-is-amazing</id>
    <content type="html">
&lt;div class=&quot;gallery&quot;&gt;
  &lt;noscript&gt;&lt;small&gt;&lt;em&gt;Note: The gallery needs JavaScript but I've tried to make it degrade gracefully. -Amir&lt;/em&gt;&lt;/small&gt;&lt;/noscript&gt;
  &lt;ul class=&quot;inline-list&quot;&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;lego-is-amazing-1&quot;&gt;&lt;img src=&quot;/images/lego-is-amazing/lego-is-amazing-thumb-1.png&quot; alt=&quot;lego-is-amazing-thumb-1&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;lego-is-amazing-2&quot;&gt;&lt;img src=&quot;/images/lego-is-amazing/lego-is-amazing-thumb-2.png&quot; alt=&quot;lego-is-amazing-thumb-2&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;lego-is-amazing-3&quot;&gt;&lt;img src=&quot;/images/lego-is-amazing/lego-is-amazing-thumb-3.png&quot; alt=&quot;lego-is-amazing-thumb-3&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;lego-is-amazing-4&quot;&gt;&lt;img src=&quot;/images/lego-is-amazing/lego-is-amazing-thumb-4.png&quot; alt=&quot;lego-is-amazing-thumb-4&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;lego-is-amazing-5&quot;&gt;&lt;img src=&quot;/images/lego-is-amazing/lego-is-amazing-thumb-5.png&quot; alt=&quot;lego-is-amazing-thumb-5&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;lego-is-amazing-6&quot;&gt;&lt;img src=&quot;/images/lego-is-amazing/lego-is-amazing-thumb-6.png&quot; alt=&quot;lego-is-amazing-thumb-6&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;lego-is-amazing-7&quot;&gt;&lt;img src=&quot;/images/lego-is-amazing/lego-is-amazing-thumb-7.png&quot; alt=&quot;lego-is-amazing-thumb-7&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;lego-is-amazing-8&quot;&gt;&lt;img src=&quot;/images/lego-is-amazing/lego-is-amazing-thumb-8.png&quot; alt=&quot;lego-is-amazing-thumb-8&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
  &lt;ul data-orbit=&quot;&quot; data-options=&quot;next_on_click:true; timer_speed:3000; pause_on_hover:false; bullets:false;&quot;&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;lego-is-amazing-1&quot;&gt;&lt;img src=&quot;/images/lego-is-amazing/lego-is-amazing-1.jpg&quot; alt=&quot;lego-is-amazing-1&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;lego-is-amazing-2&quot;&gt;&lt;img src=&quot;/images/lego-is-amazing/lego-is-amazing-2.jpg&quot; alt=&quot;lego-is-amazing-2&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;lego-is-amazing-3&quot;&gt;&lt;img src=&quot;/images/lego-is-amazing/lego-is-amazing-3.jpg&quot; alt=&quot;lego-is-amazing-3&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;lego-is-amazing-4&quot;&gt;&lt;img src=&quot;/images/lego-is-amazing/lego-is-amazing-4.jpg&quot; alt=&quot;lego-is-amazing-4&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;lego-is-amazing-5&quot;&gt;&lt;img src=&quot;/images/lego-is-amazing/lego-is-amazing-5.jpg&quot; alt=&quot;lego-is-amazing-5&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;lego-is-amazing-6&quot;&gt;&lt;img src=&quot;/images/lego-is-amazing/lego-is-amazing-6.jpg&quot; alt=&quot;lego-is-amazing-6&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;lego-is-amazing-7&quot;&gt;&lt;img src=&quot;/images/lego-is-amazing/lego-is-amazing-7.jpg&quot; alt=&quot;lego-is-amazing-7&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;lego-is-amazing-8&quot;&gt;&lt;img src=&quot;/images/lego-is-amazing/lego-is-amazing-8.jpg&quot; alt=&quot;lego-is-amazing-8&quot; /&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;I just spent the afternoon &lt;del&gt;playing&lt;/del&gt; &lt;em&gt;doing valuable research&lt;/em&gt; with Lego.
The pics above show my amazing creation but they don’t do justice to the
complexity of it. I really didn’t think I’d need the instructions but I
was so wrong.&lt;/p&gt;

&lt;p&gt;This was actually part of a research study that will be done with 4-5
year old children. Essentially, the kids will be asked to follow
instructions to build objects and the researchers are interested in the
self-regulatory processes during constructive play … woosh … Me play
with Lego. Me happy.&lt;/p&gt;

&lt;p&gt;Apparently, the bus above is considered too complex, which doesn’t
surprise me since it took me a few hours to put it together. Most of
that time was spent rummaging around in the box for the right parts
(that’s part of the study design). I didn’t help myself by deciding part
way through that I wanted it to be a right-hand drive bus instead of the
left-hand drive that the instructions described (you might be able to
spot the difference between pics 2 and 3). That was fun.&lt;/p&gt;

&lt;p&gt;Lego itself is pretty interesting and there are some really strict
tolerances required in its manufacture. If you’ve ever played with Lego,
consider the following: the pieces are held together only by friction,
yet you can create and dismantle fairly large and robust objects; if you
build a wall of Lego, the plane of that wall is pretty smooth (no
protruding bricks). If you’re manufacturing millions of these little
things, you can only achieve that with some damn precise engineering.
Apparently the moulds are made within a tolerance of 2 micrometers. For
comparison, the width of a human hair ranges from 17-180 micrometers.
It’s even more impressive when you consider that bricks from 1958 are
still compatible with bricks made today.&lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;Check out the &lt;a href=&quot;http://en.wikipedia.org/wiki/Lego&quot; alt=&quot;Lego on Wikipedia&quot;&gt;Lego Wikipedia article&lt;/a&gt; for more info.&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>Just found MovieBarCode. Fantastic images by stretching and lining up movie frames</title>
    <link href="http://amirchaudhry.com/moviebarcode-fantastic-images"/>
    <author>Amir Chaudhry</author>
    <updated>2011-03-09T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/moviebarcode-fantastic-images</id>
    <content type="html">
&lt;p&gt;&lt;a href=&quot;http://moviebarcode.tumblr.com/page/3&quot;&gt;&lt;img src=&quot;/images/web/movie-barcode.jpg&quot; alt=&quot;Movie Barcode - Requiem for a Dream&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;via &lt;a href=&quot;http://moviebarcode.tumblr.com/page/3&quot;&gt;moviebarcode.tumblr.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The image above is from Requiem for a Dream. Apparently some of them are available as prints.&lt;/p&gt;

&lt;p&gt;Also a news story at &lt;a href=&quot;http://www.wired.co.uk/news/archive/2011-03/08/moviebarcodes-interview&quot; title=&quot;Wired&quot;&gt;Wired&lt;/a&gt;&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Life's Too Short for the Wrong Job</title>
    <link href="http://amirchaudhry.com/lifes-too-short-for-the-wrong-job"/>
    <author>Amir Chaudhry</author>
    <updated>2011-03-03T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/lifes-too-short-for-the-wrong-job</id>
    <content type="html">
&lt;p&gt;Fantastic set of pics for a German ad campaign. Make sure to check out the full set. (via: &lt;a href=&quot;http://honeybeeinthecity.blogspot.com/2011/02/lifes-too-short-for-wrong-job.html&quot;&gt;honeybeeinthecity.blogspot.com&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/too-short-wrong-job/too-short-wrong-job-1.jpg&quot; alt=&quot;life's too short for the wrong job&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/too-short-wrong-job/too-short-wrong-job-2.jpg&quot; alt=&quot;life's too short for the wrong job&quot; /&gt;&lt;/p&gt;

&lt;p&gt;via &lt;a href=&quot;http://honeybeeinthecity.blogspot.com/2011/02/lifes-too-short-for-wrong-job.html&quot;&gt;honeybeeinthecity.blogspot.com&lt;/a&gt;&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>Richard Stallman on Free Software and your Freedom (lecture)</title>
    <link href="http://amirchaudhry.com/richard-stallman-on-free-software-and-your-freedom"/>
    <author>Amir Chaudhry</author>
    <updated>2011-03-01T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/richard-stallman-on-free-software-and-your-freedom</id>
    <content type="html">
&lt;p&gt;Lecture at Cambridge Computer Lab on 1 March 2011 - Sponsored by
Software East (@markdalgarno)&lt;/p&gt;

&lt;p&gt;[pls excuse the typos &amp;amp; poor grammar. I’m typing this on the fly and
unlikely to edit it before posting. Caveat emptor]&lt;/p&gt;

&lt;p&gt;[edit: It was a long talk and I missed some chunks. Overall, he spoke
for just over 90mins. Longer than I was expecting]&lt;/p&gt;

&lt;p&gt;Bio: Richard Stallman launched the development of the GNU operating system (see &lt;a href=&quot;http://www.gnu.org&quot;&gt;www.gnu.org&lt;/a&gt;) in 1984. GNU is free software: everyone has the freedom to copy it and redistribute it, as well as to make changes either large or small. The GNU/Linux system, basically the GNU operating system with Linux added, is used on tens of millions of computers today. Stallman has received the ACM Grace Hopper Award, a MacArthur Foundation fellowship, the Electrical Frontier Foundation’s Pioneer Award, and the Takeda Award for Social/Economic Betterment, as well as several honorary doctorates. &lt;br /&gt;
[taken from: &lt;a href=&quot;http://www.theiet.org/local/emea/europe/switzerland/stallman-2010.cfm&quot;&gt;http://www.theiet.org/local/emea/europe/switzerland/stallman-2010.cfm&lt;/a&gt; see his website at stallman.org]&lt;/p&gt;

&lt;p&gt;Stallman enters room and hush descends immediately. Cue joke about slides and “definitely not PowerPoint”.&lt;/p&gt;

&lt;p&gt;What is free software? It sw that respects your freedom. Think of free speech not free beer. A non free sw is digital colonization. It acts to divide and conquer people&lt;/p&gt;

&lt;p&gt;A program is free if you have 4 freedoms &lt;br /&gt;
0 - To run it as you wish &lt;br /&gt;
1 - Have source to edit to run as you wish &lt;br /&gt;
2 - To share &amp;amp; distribute &amp;amp; help others, as you wish &lt;br /&gt;
3 - To distribute modified, copies if you wish&lt;/p&gt;

&lt;p&gt;If sw does not obey these then it’s unethical. Notice that these are not
about the technical issues. The difference is an ethical, social and
political distinction. The use of propriety sw is a social problem and
we should aim to eliminate the problem. ie eliminate propriety sw. Goal
of free sw is to make all sw free so that users are free. If you use a
program without freedom 2 then you end up in a moral dilemma. If someone
says “Hey, great sw. Can I get a copy?”. In this case you should choose
lesser of two evils, which is to violate the license and give your
friend a copy. Being the lesser evil doesn’t mean it’s good though. When
you’ve fully studied this dilemma what should you do? Option 1: don’t
have any friends! That what the proprietary debs would have you do.
Option 2: don’t have that sw in the first place so you don’t end up in
the dilemma in the first place. Note on Piracy: They attack ships. With
arms. Freedom 0 - Essential so you can control your computing. No one
else should have that control. Only you. There are proprietary programs
that have licenses that restrict your freedom of speech (ie website
software that means you cannot publish stuff disparaging to sw vendor)&lt;/p&gt;

&lt;p&gt;Freedom 1 - Being a victim of malicious sw is something that ppl are
subject to all the time. For example back-doors, DRM, spyware,
handcuffs. The sw is not there to serve you but is actually a prison
guard. Eg in MSFT sw can install stuff on pc w/out user consent or
knowledge. Once windows has installed then it’s no longer your machine.
Apple is no better. They’ve even stolen the ability to install apps.
They don’t even agree w free sw. Also a back-door by which Apple can
delete sw installed on users machine. Even apps exist that detect
Jailbreak and refuse to operate. All these are Malware. Products
include: Apple iMoan, Apple iBad, Amazon Swindle - “Kindle was conceived
to burn books.” (riffs on Amazon taking books off devices etc)&lt;/p&gt;

&lt;p&gt;Even if devs of proprietary sw are good, they’re human and make errors.
ie bugs. Without freedom 1 you are a prisoner. Freedom 1 isn’t enough.
There too much sw and plenty of non-devs cannot edit it. That’s why we
need Freedom 3. To contribute to your community and spread benefits.
Without this freedom what a waste it would be for people to write
changes over and over. Every user can take part in Freedom 0 and 2 since
it doesn’t require any programming knowledge. Freedom 1 and 3 allow
those who can to make improvements. With free software. Support is a
free-market since everyone can study the code and master it. Hence
people can get better support. Since support for proprietary sw is a
monopoly, the support sucks.&lt;/p&gt;

&lt;p&gt;The four freedoms together give us democracy. These are sufficient for
people to have control over the sw. Without these the sw controls the
ppl. Launched free software foundation in 1983. All operating systems
were proprietary hence ppl immediately lost freedom when they had to
install an OS. This was an injustice. As an OS developer, he could write
the OS and then legally make it free. At the time, the free sw movement
had no enemies at the time. Mostly because ppl thought the job was so
big that it couldn’t get done. Following the basic design of UNIX made
sense. Then I gave it a name which was a joke. [digs in bag]. GNU = Gnu
Not Unix. (riffs on the name and pronunciation). History of Linux.
Aside: What is a free sw license? Why do we need them? &lt;br /&gt;
Copyright law automatically limits anything that’s written so you have
to explicitly grant the four freedoms. Even then there are distinctions.
Eg copy-left licenses and non copy-left licenses. Specifically, user has
to pass on the freedoms that have been passed on to him (copy-left).
Torvalds made the Linux Kernel free under the GNU license.&lt;/p&gt;

&lt;p&gt;The name matters. Linux does not have the same views on ‘free’ as GNU.
Yet people using Linux think that most of the ideas came from Torvalds
rather than GNU. Debate on Human Rights has continued for centuries. Yet
the debate on free/proprietary sw has only gone on for about 20yrs.
Therefore the debate on what human rights are applicable to sw have only
involved the devs, who obviously have said “none”. Another problem. Now
ppl have another term: Open-Source. The ideas that surround this didn’t
include the ethical aspects of ‘free’. Easy to lose freedom if you don’t
fight for it. There are now distros that contain proprietary sw and are
no longer free. Free distros can be found at gnu.org/distros. Why did
all this happen? &lt;br /&gt;
Because the idea of freedom wasn’t important to people. They didn’t
appreciate it. We have to teach ppl to value freedom and demand it. Our
greatest scarcity in FSF is not ppl to write sw but ppl to fight for the
idea of freedoms. Freedom is now different since JavaScript in browsers
means that things get installed in browser without your knowledge.
‘Like’ buttons even track ppl that don’t use Facebook. Ppl need to be
educated. Even SaaS is becoming pervasive and is worse than proprietary
since the data goes elsewhere. There’s no remedy for this, other than
not to use it. Only a minority of things like this but need to be aware
(eg GoogleDocs). Free software and Education &lt;br /&gt;
Schools must only teach free software. It’s cheaper (but should be
considered secondary benefit). Free stuff from proprietary vendors is
simply a drug to get them hooked. Only free sw gives ppl the opportunity
to learn from code of large Programs. Even deeper reason though. For
goodwill and the moral imperative of sharing knowledge. Every school
from nursery to university must practice this. The issue should always
be an ethical one. Biggest obstacle to free sw is social inertia.
Websites for more info: &lt;br /&gt;
Gnu.org &lt;br /&gt;
FSF.org &lt;br /&gt;
Defectivebydesign.org (against digital handcuffs)&lt;/p&gt;

&lt;p&gt;[dresses up] St Ignuseus of emacs [riffs on emacs and free sw].&lt;/p&gt;

&lt;p&gt;Applause &lt;br /&gt;
[ends]&lt;/p&gt;

&lt;p&gt;Sent via mobile&lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;Comment on original post: Nov 21, 2011 - 
&lt;a href=&quot;http://mrhpages.blogspot.com/&quot;&gt;human&lt;/a&gt; said...
thank u so much, This is the same lecture of richard in benghazi-libya at november 2010 :)
i hope to get this lecture in a audio file
&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Session 4: Using audience insight to drive product success (BBC Case Study) #pcampldn</title>
    <link href="http://amirchaudhry.com/session-4-using-audience-insight"/>
    <author>Amir Chaudhry</author>
    <updated>2011-02-26T14:32:41+00:00</updated>
    <id>http://amirchaudhry.com/session-4-using-audience-insight</id>
    <content type="html">
&lt;p&gt;Nic Newman&lt;/p&gt;

&lt;p&gt;Story of how they got it wrong and then put it right.&lt;/p&gt;

&lt;p&gt;History: 2yrs ago, Weather site was pretty dated and had grand ambitions to update site.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Editorially led site&lt;/li&gt;
  &lt;li&gt;No product manager&lt;/li&gt;
  &lt;li&gt;No audience research plan&lt;/li&gt;
  &lt;li&gt;Drew wrong conclusions from research they did do&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;[video]&lt;/p&gt;

&lt;p&gt;Product took over a year to get out. BBC recorded thousands of complaints. Within 2-3 months it was re-launched, solving most of the problems. Site retested in beta with people who complained the last time around.&lt;/p&gt;

&lt;p&gt;In original version did lots of focus groups and used this to decide what to do. eg ppl said they wanted everything on one page, so they did (without checking that it was right). Second thing was beta test was on folks that were weather nuts so they wanted all the detail. Public wanted simplicity.&lt;/p&gt;

&lt;p&gt;For version 2, checked people’s complaints and coded them so that there was a top ten list of things people didn’t like. Then went back out to focus groups. Found people who were really angry and tried to work with these people to improve. Pressure from above (director general et al) meant quick wins were important.&lt;/p&gt;

&lt;p&gt;Beta test 2, tested on 1300 people and survey on their views in comparison with old weather site. Some quantitative data made a big difference when talking to DG about whether new site is going to work.&lt;/p&gt;

&lt;p&gt;Key learnings:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Have audience insight plan a&lt;/li&gt;
  &lt;li&gt;Qualitative followed by quantitative test is key&lt;/li&gt;
  &lt;li&gt;Make it iterative … Audience research, usability and dev going concurrently&lt;/li&gt;
  &lt;li&gt;Regular testing to ensure that NetPromoter detractors and promoters both accept changes&lt;/li&gt;
  &lt;li&gt;Audience insights to inform communication plans of changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Q. What kind of quantitative measures? &lt;br /&gt;
A. Surveys and click-tracking. Eg of 1300 people, how many get to the forecast page and how many personalize the homepage.&lt;/p&gt;

&lt;p&gt;Q. Is it important to build the tracking into the homepage? &lt;br /&gt;
A. Yes, important not only in final site but also in the beta sites etc.&lt;/p&gt;

&lt;p&gt;Q. Is there danger that some of the ppl who complain the loudest are not representative? &lt;br /&gt;
A. Absolutely. Danger is that others in company look at emails, comments, blogs and assume it’s representative. Good to have data to show that they’re not.&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Session 3: What's your Product Mgmnt Persona? #pcampldn</title>
    <link href="http://amirchaudhry.com/session-3-whats-your-product-mgmnt-persona"/>
    <author>Amir Chaudhry</author>
    <updated>2011-02-26T12:30:55+00:00</updated>
    <id>http://amirchaudhry.com/session-3-whats-your-product-mgmnt-persona</id>
    <content type="html">
&lt;p&gt;[Missed session 2 due to Apple Mail + Wireless fail.]&lt;/p&gt;

&lt;p&gt;Ian Lunn from Product Focus&lt;/p&gt;

&lt;p&gt;Only handful of ppl put hand up to Q of “who thinks they’re a good PM” :)&lt;/p&gt;

&lt;p&gt;Product Focus do survey on ProdMgmnt.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Ave PM has been a PM for 8.5yrs (up from 7.5yrs last yr)&lt;/li&gt;
  &lt;li&gt;44% of time spent on firefighting and 56% on planned activities “too much time on tactical”&lt;/li&gt;
  &lt;li&gt;lack of clarity on role/responsibility&lt;/li&gt;
  &lt;li&gt;51% of projects delivered on time (some ppl in room think that’s
high)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Effective ProdMgmnt. Now we have a 2x2 matrix [notepad ain’t gonna help me w that]. Axes are knowledge/skills and actions.&lt;/p&gt;

&lt;p&gt;8 Personas&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Numbers Guy&lt;/li&gt;
  &lt;li&gt;Subject Matter Expert&lt;/li&gt;
  &lt;li&gt;Expert Compromiser&lt;/li&gt;
  &lt;li&gt;Troubleshooter: Wild West Style&lt;/li&gt;
  &lt;li&gt;Product Champion/Advocate&lt;/li&gt;
  &lt;li&gt;Voice of Market&lt;/li&gt;
  &lt;li&gt;Reliable Project Manager&lt;/li&gt;
  &lt;li&gt;Multi-CEO (bit of everything)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Biggest issue in ProdMgmnt in companies seems to be:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Lack of clarity on roles&lt;/li&gt;
  &lt;li&gt;lack of time for strategy&lt;/li&gt;
  &lt;li&gt;Ave salary is £61k base (cue murmurs from room…)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Job titles can be misleading. Can split work by activities.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Strategic PM Activities: Working out the right product&lt;/li&gt;
  &lt;li&gt;Inbound Activities: Helping business deliver the product&lt;/li&gt;
  &lt;li&gt;Outbound Activities: Helping business to sell the product&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Q. Has the role of PM changed over the years as it becomes more
recognised? &lt;br /&gt;
A. Still a way to go. Better recognised but need more exposure.&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Session 1: Data Driven Decisions #pcampldn</title>
    <link href="http://amirchaudhry.com/session-1-data-driven-decisions-pcampldn"/>
    <author>Amir Chaudhry</author>
    <updated>2011-02-26T11:44:00+00:00</updated>
    <id>http://amirchaudhry.com/session-1-data-driven-decisions-pcampldn</id>
    <content type="html">
&lt;p&gt;Talk by Lucy from LoveFilm (@lucyjspence) Slides at
&lt;a href=&quot;http://slidesha.re/hFq1OB&quot;&gt;http://slidesha.re/hFq1OB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Measure change through Experiments.&lt;/p&gt;

&lt;p&gt;About half the room has done some form of A/B testing before. Different changes, pages etc etc. Next thing to try is multivariate testing (MVT).&lt;/p&gt;

&lt;p&gt;Radical A/B testing. Taken to an extreme you can have different journeys (separate website, even?).&lt;/p&gt;

&lt;p&gt;Statistical significance. Important to take note of since you need a certain volume of traffic before you can declare something as valid or not.&lt;/p&gt;

&lt;p&gt;Relation to product lifecycle. Lifecycle affects the kinds of tests you can do. Early on, can only do simple tests since you don’t have volume to do valid MVT. As volume grows, then You can do more stuff and segment people. Eg separate ppl who come in via email campaign from other sources.&lt;/p&gt;

&lt;p&gt;Advice:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Respond to results&lt;/li&gt;
  &lt;li&gt;Design for experimentation&lt;/li&gt;
  &lt;li&gt;Design to segment/identify people by preference behaviour.&lt;/li&gt;
  &lt;li&gt;Get the right tools for your org.&lt;/li&gt;
  &lt;li&gt;Get ppl involved and pulling same direction&lt;/li&gt;
  &lt;li&gt;Be prepared for things to go in the wrong direction from time to time. Don’t get dispirited.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Q&amp;amp;A:&lt;/p&gt;

&lt;p&gt;Q Getting the right tools. Any recommendations? &lt;br /&gt;
A Google is a good start. website optimizer. Can let marketing ppl see what’s going on. It’s a monthly thing&lt;/p&gt;

&lt;p&gt;Q. A/B testing is great for testing ideas you’ve already got but doesn’t help come up with new ideas. Does MVT etc help org come up with new ideas? &lt;br /&gt;
A. In some situations saying you can test things helps reduce risk. Depends on risk appetite of ppl too. It’s just a tool so it just helps provide more info on what’s happening.&lt;/p&gt;

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

&lt;p&gt;[Ok, I need to work on my note-taking skillz. Missed a lot while trying to type.]&lt;/p&gt;

&lt;p&gt;Sent via mobile&lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;Comment on original post: Feb 26, 2011 - 
&lt;a href=&quot;http://cathyma.com/&quot;&gt;Cathy&lt;/a&gt; said...
Great thank you for the notes - I was gutted that I missed her presentation... Sounds like it was a great one!&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>I'm at product camp London</title>
    <link href="http://amirchaudhry.com/im-at-product-camp-london"/>
    <author>Amir Chaudhry</author>
    <updated>2011-02-26T11:14:43+00:00</updated>
    <id>http://amirchaudhry.com/im-at-product-camp-london</id>
    <content type="html">
&lt;p&gt;Will try and write notes and post them up as I go. This could go horribly wrong. Whatever.&lt;/p&gt;

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

&lt;p&gt;Sent via mobile&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Moved desks and discovered spent munitions as well as a weapons stockpile</title>
    <link href="http://amirchaudhry.com/moved-desks-and-discovered-spent-munitions"/>
    <author>Amir Chaudhry</author>
    <updated>2010-12-30T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/moved-desks-and-discovered-spent-munitions</id>
    <content type="html">
&lt;p&gt;&lt;img src=&quot;/images/singles/weapons-stockpile.jpg&quot; alt=&quot;Weapons stockpile&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I just moved desks from one side of the room to the other. While messing
with the cabling I also cleared out a bunch of nerf bullets from under
the desk.&lt;/p&gt;

&lt;p&gt;As if that’s not ominous enough, behind me is what appears to be the
weapons stockpile (see pic above).&lt;/p&gt;

&lt;p&gt;I’d like to think that the New Year will bring peace, love and harmony
to this part of the building but that would be crazy talk.&lt;/p&gt;

&lt;p&gt;I’m going to be Switzerland (or maybe the Red Cross).&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>Random things I learned at school</title>
    <link href="http://amirchaudhry.com/random-things-i-learned-at-school"/>
    <author>Amir Chaudhry</author>
    <updated>2010-12-03T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/random-things-i-learned-at-school</id>
    <content type="html">
&lt;p&gt;One of the useful but slightly odd things that stuck with me from school came from one of the teachers I really didn’t like. I never thought that particular class would have any relevance to the Rest Of My Life but here I am thinking about it.&lt;/p&gt;

&lt;p&gt;That one thing was a phrase that the teacher kept repeating, week after week. Anyone from my school will know exactly who I’m talking about.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;“Make a statement, back it up with a quotation, then explain fully.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ok, so the ‘explain fully’ part wasn’t entirely explained (the irony), but I’ve found the general principle to be helpful when I’m trying to get my thoughts on paper.&lt;/p&gt;

&lt;p&gt;Make your point. Provide some evidence. Explain it clearly.&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Why Obama got the Peace Prize</title>
    <link href="http://amirchaudhry.com/why-obama-got-the-peace-prize-comic"/>
    <author>Amir Chaudhry</author>
    <updated>2010-11-25T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/why-obama-got-the-peace-prize-comic</id>
    <content type="html">
&lt;p&gt;&lt;a href=&quot;http://www.slowpokecomics.com/strips/terminatrix.html&quot;&gt;&lt;img src=&quot;/images/web/terminatrix.gif&quot; alt=&quot;Obama Peace Prize&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;via &lt;a href=&quot;http://imeveryone.com/discuss/182&quot;&gt;imeveryone.com&lt;/a&gt; &amp;lt;p class=&quot;footnote&quot;&amp;gt;The ‘imeveryone’ link is now dead (April 2012). Updated the image link though.&amp;lt;/p&amp;gt;&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>How to discourage people from messing with your [insert object here]</title>
    <link href="http://amirchaudhry.com/how-to-discourage-people-from-messing-with-your-stuff"/>
    <author>Amir Chaudhry</author>
    <updated>2010-10-29T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/how-to-discourage-people-from-messing-with-your-stuff</id>
    <content type="html">
&lt;div class=&quot;gallery&quot;&gt;
  &lt;noscript&gt;&lt;small&gt;&lt;em&gt;Note: The gallery needs JavaScript but I've tried to make it degrade gracefully. -Amir&lt;/em&gt;&lt;/small&gt;&lt;/noscript&gt;
  &lt;ul class=&quot;inline-list&quot;&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;nick-pumpkin-1&quot;&gt;&lt;img src=&quot;/images/nick-pumpkin/nick-pumpkin-thumb-1.png&quot; alt=&quot;nick-pumpkin-thumb-1&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;nick-pumpkin-2&quot;&gt;&lt;img src=&quot;/images/nick-pumpkin/nick-pumpkin-thumb-2.png&quot; alt=&quot;nick-pumpkin-thumb-2&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
  &lt;ul data-orbit=&quot;&quot; data-options=&quot;next_on_click:true; timer_speed:3000; pause_on_hover:false; bullets:false;&quot;&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;nick-pumpkin-1&quot;&gt;&lt;img src=&quot;/images/nick-pumpkin/nick-pumpkin-1.jpg&quot; alt=&quot;nick-pumpkin-1&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;nick-pumpkin-2&quot;&gt;&lt;img src=&quot;/images/nick-pumpkin/nick-pumpkin-2.jpg&quot; alt=&quot;nick-pumpkin-2&quot; /&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;This is on @nick_wood’s desk. Yes, that’s real hair. Yes, it’s Nick’s hair. So far you can see that it works on iPads and cakes.&lt;/p&gt;

&lt;p&gt;Not sure how much my therapy* will cost but it’s going on expenses :-P&lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;*that's therapy &lt;strong&gt;and&lt;/strong&gt; a dustbuster&lt;/p&gt;

&lt;p&gt;Update: Turns out that it doesn’t work as well on cakes as I previously thought. I’d take another photo, but the cake is gone…&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Collective Intelligence in Human Groups</title>
    <link href="http://amirchaudhry.com/collective-intelligence-in-human-groups"/>
    <author>Amir Chaudhry</author>
    <updated>2010-10-04T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/collective-intelligence-in-human-groups</id>
    <content type="html">
&lt;blockquote&gt;
  &lt;h3 id=&quot;evidence-for-a-collective-intelligence-factor-in-the-performance-of-human-groups&quot;&gt;Evidence for a Collective Intelligence Factor in the Performance of Human Groups&lt;/h3&gt;

  &lt;p&gt;&lt;strong&gt;Anita Williams Woolley,&lt;sup&gt;1,*&lt;/sup&gt; Christopher F. Chabris,&lt;sup&gt;2,3&lt;/sup&gt;
Alexander Pentland,&lt;sup&gt;3,4&lt;/sup&gt; Nada Hashmi,&lt;sup&gt;3,5&lt;/sup&gt; Thomas W.
Malone&lt;sup&gt;3,5&lt;/sup&gt;&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;Psychologists have repeatedly shown that a single
statistical factor—often called “general intelligence”—emerges from
the correlations among people’s performance on a wide variety of
cognitive tasks. But no one has systematically examined whether a
similar kind of “collective intelligence” exists for groups of
people. In two studies with 699 individuals, working in groups of two
to five, we find converging evidence of a general
collective intelligence factor that explains a group’s performance on
a wide variety of tasks. This “&lt;em&gt;c&lt;/em&gt; factor” is not strongly
correlated with the average or maximum individual intelligence of
group members but is correlated with the average social
sensitivity of group members, the equality in distribution of
conversational turn-taking, and the proportion of females in the
group.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;small&gt;&lt;/small&gt;&lt;/p&gt;
  &lt;ol&gt;
    &lt;li&gt;Carnegie Mellon University, Tepper School of Business, Pittsburgh, PA 15213, USA.&lt;/li&gt;
    &lt;li&gt;Union College, Schenectady, NY 12308, USA.&lt;/li&gt;
    &lt;li&gt;Massachusetts Institute of Technology (MIT) Center for Collective Intelligence, Cambridge, MA 02142, USA.&lt;/li&gt;
    &lt;li&gt;MIT Media Lab, Cambridge, MA 02139, USA.&lt;/li&gt;
    &lt;li&gt;MIT Sloan School of Management, Cambridge, MA 02142, USA.
&amp;lt;/small&amp;gt;&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;via &lt;a href=&quot;http://www.sciencemag.org/cgi/content/abstract/science.1193147v2&quot;&gt;sciencemag.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This sounds like great work and it’s one of the things I wanted to study just before I started my PhD. Interesting to see that performance correlates with social sensitivity as well as the proportion of females in the group. I’d be very interested to know exactly what &lt;em&gt;kinds&lt;/em&gt; of tasks the teams were asked to perform.&lt;/p&gt;

&lt;p&gt;I’ll have to wait till I’m next on campus before I can download the paper itself.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://news.ycombinator.com/item?id=1755269&quot; title=&quot;HN thread&quot;&gt;Discussion thread on HN&lt;/a&gt;&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Fantastic Eyjafjallajökull time lapse movie</title>
    <link href="http://amirchaudhry.com/fantastic-eyjafjallajokull-time-lapse-movie"/>
    <author>Amir Chaudhry</author>
    <updated>2010-09-30T23:12:00+00:00</updated>
    <id>http://amirchaudhry.com/fantastic-eyjafjallajokull-time-lapse-movie</id>
    <content type="html">
&lt;div class=&quot;flex-video widescreen vimeo&quot;&gt;
    &lt;iframe src=&quot;http://player.vimeo.com/video/11673745?title=0&amp;amp;byline=0&amp;amp;portrait=0&quot; width=&quot;540&quot; height=&quot;270&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;Fantastic Eyjafjallajökull time lapse movie&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;via &lt;a href=&quot;http://vimeo.com/11673745&quot;&gt;vimeo.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another great time lapse movie. This volcano nearly scuppered my travel plans earlier this year but somehow I completely missed this footage.&lt;/p&gt;

&lt;p&gt;Great work.&lt;/p&gt;

&lt;p&gt;(hat tip: Kim R)&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>The future is now</title>
    <link href="http://amirchaudhry.com/the-future-is-now"/>
    <author>Amir Chaudhry</author>
    <updated>2010-09-30T17:22:00+00:00</updated>
    <id>http://amirchaudhry.com/the-future-is-now</id>
    <content type="html">
&lt;p&gt;&lt;a href=&quot;http://geekandpoke.typepad.com/geekandpoke/2010/01/tweetrets.html&quot;&gt;&lt;img src=&quot;/images/web/just-tweeted.jpg&quot; alt=&quot;Twitter Fail&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;via &lt;a href=&quot;http://geekandpoke.typepad.com/geekandpoke/2010/01/tweetrets.html&quot;&gt;geekandpoke.typepad.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also applies to DMs getting screwed up.&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>PhD Vivas: The Dutch do it better</title>
    <link href="http://amirchaudhry.com/phd-vivas-the-dutch-do-it-better"/>
    <author>Amir Chaudhry</author>
    <updated>2010-09-30T10:48:00+00:00</updated>
    <id>http://amirchaudhry.com/phd-vivas-the-dutch-do-it-better</id>
    <content type="html">
&lt;div class=&quot;gallery&quot;&gt;
  &lt;noscript&gt;&lt;small&gt;&lt;em&gt;Note: The gallery needs JavaScript but I've tried to make it degrade gracefully. -Amir&lt;/em&gt;&lt;/small&gt;&lt;/noscript&gt;
  &lt;ul class=&quot;inline-list&quot;&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;jw-phd-viva-1&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-thumb-1.png&quot; alt=&quot;jw-phd-viva-thumb-1&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;jw-phd-viva-2&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-thumb-2.png&quot; alt=&quot;jw-phd-viva-thumb-2&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;jw-phd-viva-3&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-thumb-3.png&quot; alt=&quot;jw-phd-viva-thumb-3&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;jw-phd-viva-4&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-thumb-4.png&quot; alt=&quot;jw-phd-viva-thumb-4&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;jw-phd-viva-5&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-thumb-5.png&quot; alt=&quot;jw-phd-viva-thumb-5&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;jw-phd-viva-6&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-thumb-6.png&quot; alt=&quot;jw-phd-viva-thumb-6&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;jw-phd-viva-7&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-thumb-7.png&quot; alt=&quot;jw-phd-viva-thumb-7&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;jw-phd-viva-8&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-thumb-8.png&quot; alt=&quot;jw-phd-viva-thumb-8&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;jw-phd-viva-9&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-thumb-9.png&quot; alt=&quot;jw-phd-viva-thumb-9&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;jw-phd-viva-10&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-thumb-10.png&quot; alt=&quot;jw-phd-viva-thumb-10&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;jw-phd-viva-11&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-thumb-11.png&quot; alt=&quot;jw-phd-viva-thumb-11&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;jw-phd-viva-12&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-thumb-12.png&quot; alt=&quot;jw-phd-viva-thumb-12&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;jw-phd-viva-13&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-thumb-13.png&quot; alt=&quot;jw-phd-viva-thumb-13&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;jw-phd-viva-14&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-thumb-14.png&quot; alt=&quot;jw-phd-viva-thumb-14&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;jw-phd-viva-15&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-thumb-15.png&quot; alt=&quot;jw-phd-viva-thumb-15&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
  &lt;ul data-orbit=&quot;&quot; data-options=&quot;next_on_click:true; timer_speed:3000; pause_on_hover:false; bullets:false;&quot;&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;jw-phd-viva-1&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-1.jpg&quot; alt=&quot;jw-phd-viva-1&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;jw-phd-viva-2&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-2.jpg&quot; alt=&quot;jw-phd-viva-2&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;jw-phd-viva-3&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-3.jpg&quot; alt=&quot;jw-phd-viva-3&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;jw-phd-viva-4&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-4.jpg&quot; alt=&quot;jw-phd-viva-4&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;jw-phd-viva-5&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-5.jpg&quot; alt=&quot;jw-phd-viva-5&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;jw-phd-viva-6&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-6.jpg&quot; alt=&quot;jw-phd-viva-6&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;jw-phd-viva-7&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-7.jpg&quot; alt=&quot;jw-phd-viva-7&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;jw-phd-viva-8&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-8.jpg&quot; alt=&quot;jw-phd-viva-8&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;jw-phd-viva-9&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-9.jpg&quot; alt=&quot;jw-phd-viva-9&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;jw-phd-viva-10&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-10.jpg&quot; alt=&quot;jw-phd-viva-10&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;jw-phd-viva-11&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-11.jpg&quot; alt=&quot;jw-phd-viva-11&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;jw-phd-viva-12&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-12.jpg&quot; alt=&quot;jw-phd-viva-12&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;jw-phd-viva-13&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-13.jpg&quot; alt=&quot;jw-phd-viva-13&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;jw-phd-viva-14&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-14.jpg&quot; alt=&quot;jw-phd-viva-14&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;jw-phd-viva-15&quot;&gt;&lt;img src=&quot;/images/jw-phd-viva/jw-phd-viva-15.jpg&quot; alt=&quot;jw-phd-viva-15&quot; /&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;I was at a good friend’s PhD viva a couple of weeks ago and I was impressed with the ‘pomp and circumstance’ surrounding it.  Basically, the Dutch do PhD vivas/ceremonies way better than the Brits, especially given how much blood, sweat and tears are involved in getting to that stage.&lt;/p&gt;

&lt;p&gt;There were lots of photos that day but I’ve managed to capture most of the story in the selection of pictures above. There are lots of differences between what I saw and the UK system.&lt;/p&gt;

&lt;p&gt;For example, it’s obvious that the event is a public affair although seating is strictly limited so it’s usually just friends and relatives of the graduand (he’s the tall guy in the middle of the first pic).  There is a committee of examiners who can question the candidate, which includes his supervisor and the period of questioning lasts no more than 45 minutes.  That’s it.  At the end of the 45th minute, the master of ceremonies (can’t remember his official title) will stop whoever’s speaking and usher the committee out to deliberate.  By contrast, in the UK, the event would be a private meeting with only two examiners (supervisor not present), lasting anywhere between 1.5 to 3 hours.&lt;/p&gt;

&lt;p&gt;Having said all that, the comparison isn’t really fair.  In the Dutch system, the viva is much more of a ceremony than an examination.  The Thesis will already have been read and approved long before the public defence takes place.  That’s including any corrections that have been requested.  Therefore, barring allegations of plagiarism, the outcome of the viva is already known to everyone which lends a much more ceremonial air to the proceedings.  That doesn’t make the questions any less tricky though.  Once the committee returns from it’s recess, there are some proclamations and the degree itself is awarded (it’s in the blue tube).  After that, there’s a drinks reception and few family/friends head off for dinner.  Overall, a very civilised affair with the attention squarely on the graduate throughout.&lt;/p&gt;

&lt;p&gt;Frankly, I thought the Dutch method of graduating was way better than the UK equivalent (the expense notwithstanding).  After spending several years working on research followed by the effort of writing it up, I’ve always felt the UK ceremony was a bit of a let down.  Over here, families sit in a large room full of strangers, and watch a procession of other strangers spend 30-45 seconds in front of a robed figure before picking up a sheet of paper on their way out of the back door.  There’s a brief flurry of excitement as you see your (insert_relation_here) have their few seconds of attention followed by the realisation that you still have to sit through the remainder of the class before you can leave.  Not much of a celebration of the achievement in my opinion (not that I should disparage it too much since I have yet to finish myself!)&lt;/p&gt;

&lt;p&gt;Given the fundamental differences in how PhDs are examined between the UK and the Netherlands, I’m not sure what we could do to introduce more of an ‘individual ceremony’, though it would certainly be nice to try.  If I ever get there, I’m making sure I mark the occasion properly … which reminds me, back to work. :)&lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;Comment on original post: Apr 30, 2011 - 
&lt;a href=&quot;http://www.gilljames.co.uk/&quot;&gt;Gill James&lt;/a&gt; said...
You can have your Ph D superviser in the room at UK universities. I opted not to, but in retrospect wish I had had him there. Just back form the Netherlands and watcehd a Ph D defense. Fascinating!&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>This time-lapse montage will blow your mind</title>
    <link href="http://amirchaudhry.com/this-time-lapse-montage-will-blow-your-mind"/>
    <author>Amir Chaudhry</author>
    <updated>2010-09-29T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/this-time-lapse-montage-will-blow-your-mind</id>
    <content type="html">
&lt;div class=&quot;flex-video widescreen vimeo&quot;&gt;
    &lt;iframe src=&quot;http://player.vimeo.com/video/14352658?title=0&amp;amp;byline=0&amp;amp;portrait=0&quot; width=&quot;540&quot; height=&quot;304&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;Time lapse montage&lt;/iframe&gt;
&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;What? Were you trying to use your brain for something right this
moment? Please stop that. Stop your multitasking, your conference
calling, and your SMS messaging for 2 minutes and 24 seconds, just
long enough to enjoy this fantastic time-lapse montage from Mike
Flores. It’s worth it.&lt;/p&gt;

  &lt;p&gt;The video was shot with a Canon 5D MKII and various lenses, including
the Canon 16-35mm f2.8 II, Canon 14mm f2.8 II, and Canon 24mm f1.4 II.&lt;/p&gt;

  &lt;p&gt;via
&lt;a href=&quot;http://www.geek.com/articles/geek-cetera/this-time-lapse-montage-will-blow-your-mind-20100925/&quot;&gt;geek.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s the audio that makes this work so well. The scenes with people in
aren’t that spectacular so they’re a little distracting, when compared
to the epic nature scenes.&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>When girls say I love you...</title>
    <link href="http://amirchaudhry.com/when-girls-say-i-love-you"/>
    <author>Amir Chaudhry</author>
    <updated>2010-09-27T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/when-girls-say-i-love-you</id>
    <content type="html">
&lt;blockquote&gt;
  &lt;p&gt;When girls say stuff like “I love you, but I’m not &lt;strong&gt;IN&lt;/strong&gt; love with
you,” I just wanna poke her in the eye.&lt;/p&gt;

  &lt;p&gt;Girl: OW! You poked my eye!&lt;/p&gt;

  &lt;p&gt;Boy: No, I poked you &lt;strong&gt;IN&lt;/strong&gt; the eye. And according to you, there’s a
&lt;strong&gt;HUGE&lt;/strong&gt; difference.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;http://shybii.wordpress.com/2010/01/02/ruby-and-nabiil&quot; title=&quot;Ruby and Nabiil&quot;&gt;&lt;img src=&quot;/images/web/siobhan-alcaide_ruby-nabiil.jpg&quot; alt=&quot;The Artwork of Siobhan Alcaide Ruby and Nabiil&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(image via &lt;a href=&quot;http://shybii.wordpress.com/2010/01/02/ruby-and-nabiil&quot; title=&quot;Ruby and Nabiil&quot;&gt;The Artwork of Siobhan
Alcaide&lt;/a&gt;)&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>Woah! Drinking tea prevents testicle shrinkage. Are you getting enough?</title>
    <link href="http://amirchaudhry.com/woah-drinking-tea-prevents-testicle-shrinkage"/>
    <author>Amir Chaudhry</author>
    <updated>2010-09-24T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/woah-drinking-tea-prevents-testicle-shrinkage</id>
    <content type="html">
&lt;p&gt;&lt;a href=&quot;/images/tea-testicles.jpg&quot;&gt;&lt;img src=&quot;/images/web/tea-testicles.jpg&quot; alt=&quot;Tea and testicle shrinkage&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wow. Random fact of the day.&lt;/p&gt;

&lt;p&gt;Apparently the recommended daily amount of Manganese is around few milligrams per day (some sites say up to a max of 11mg per day). The average cup of black tea has 0.2-0.8 mg of Manganese. Other sources of the mineral include soy, rice and beans and coffee (though I couldn’t find how much there was in coffee)&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>I guess I'm going to have to play Starcraft 2</title>
    <link href="http://amirchaudhry.com/i-guess-im-going-to-have-to-play-starcraft-2"/>
    <author>Amir Chaudhry</author>
    <updated>2010-09-23T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/i-guess-im-going-to-have-to-play-starcraft-2</id>
    <content type="html">
&lt;p&gt;&lt;img src=&quot;/images/web/starcraft2-face.jpg&quot; alt=&quot;Starcraft 2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Had a slightly bizarre experience at lunch today. Pretty much everyone I sat with was talking about games they’d played in Starcraft II (see below). Words like &lt;em&gt;fast expand&lt;/em&gt;, &lt;em&gt;Cruisers&lt;/em&gt; and &lt;em&gt;Zerg&lt;/em&gt; were being bandied about and for several minutes it felt like a different language (the terminology gets even more odd with things like &lt;a href=&quot;http://www.google.co.uk/search?hl=en&amp;amp;q=cheese+tactic&quot;&gt;cheese tactics&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;I mean, I speak English so I &lt;em&gt;knew&lt;/em&gt; all the words but the order they were strung together in was alien to me. Direct peer pressure rarely works on me (and they’ve already tried) but apparently being part of a conversation where I’m failing to understand anything is like crack. I have to go off, google stuff and try and get a basic understanding. In this case, if I want to continue having lunch with these guys I’ll probably have to start playing. Given my tendency for getting addicted to (good) computer games, this could end badly for everyone.&lt;/p&gt;

&lt;p&gt;Luckily, (this time) the conversation did move on to other topics, including male nurses and how PAs could take over the world. Epic stuff.&lt;/p&gt;

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

&lt;p class=&quot;footnote&quot;&gt;folks were: @plc, @leemallabone, @rahulvohra, @matclayton, @robbiethng&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>What the Facebook Phone would look like</title>
    <link href="http://amirchaudhry.com/what-the-facebook-phone-would-look-like"/>
    <author>Amir Chaudhry</author>
    <updated>2010-09-21T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/what-the-facebook-phone-would-look-like</id>
    <content type="html">
&lt;p&gt;&lt;a href=&quot;http://www.esarcasm.com/18143/the-facebook-phone-is-real-and-we-have-one&quot;&gt;&lt;img src=&quot;/images/fb-phone/esarcasm.png&quot; alt=&quot;Facebook Phone&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;via &lt;a href=&quot;http://www.esarcasm.com/18143/the-facebook-phone-is-real-and-we-have-one/&quot;&gt;esarcasm.com&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Not surprisingly, the phone is designed for a world in which “sharing
is the social norm.” Not only will you be able to scroll through your
friends list and call people by tapping a button, Facebook will also
record who you called, what you said, and what you were wearing at the
time. This information will only be shared with law enforcement
agencies and carefully selected advertisers”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Edit to add:&lt;/p&gt;

&lt;p&gt;Also found the following more recently (Oct 2010)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.seanpercival.com/blog/2010/09/19/first-photo-of-the-facebook-phone&quot;&gt;&lt;img src=&quot;/images/fb-phone/seanpercival.jpg&quot; alt=&quot;Another Facebook Phone&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;via &lt;a href=&quot;http://www.seanpercival.com/blog/2010/09/19/first-photo-of-the-facebook-phone/&quot;&gt;seanpercival.com&lt;/a&gt;&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Cambridge ousts Harvard as world's best university</title>
    <link href="http://amirchaudhry.com/cambridge-ousts-harvard-as-worlds-best-university"/>
    <author>Amir Chaudhry</author>
    <updated>2010-09-08T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/cambridge-ousts-harvard-as-worlds-best-university</id>
    <content type="html">
&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;http://www.guardian.co.uk/education/2010/sep/08/cambridge-worlds-best-university-harvard&quot;&gt;&lt;img src=&quot;/images/web/cam-uni-ousts-harvard.jpg&quot; alt=&quot;Cambridge University&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

  &lt;p&gt;via &lt;a href=&quot;http://www.guardian.co.uk/education/2010/sep/08/cambridge-worlds-best-university-harvard&quot;&gt;guardian.co.uk&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;“Cambridge was voted best for research quality in a survey of 15,000 academics. It has an outstanding pedigree: famous minds who pushed back the frontiers of knowledge there include Newton, Darwin and Wittgenstein. Cambridge took overall first place in the rankings, which also use citation counts from a database of academic publishing”&lt;/p&gt;

&lt;p&gt;The pic is of the first court in Emmanuel College, as viewed from the entrance&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Cooking recipes as Gantt charts. Genius!</title>
    <link href="http://amirchaudhry.com/cooking-recipes-as-gantt-charts-genius"/>
    <author>Amir Chaudhry</author>
    <updated>2010-09-02T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/cooking-recipes-as-gantt-charts-genius</id>
    <content type="html">
&lt;p&gt;&lt;a href=&quot;http://kangasbros.fi/visual-cookbook/&quot;&gt;&lt;img src=&quot;/images/web/gantt-cooking.png&quot; alt=&quot;Cooking by Gantt&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;via &lt;a href=&quot;http://kangasbros.fi/visual-cookbook/&quot;&gt;kangasbros.fi&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fantastic idea! I used to try doing this with recipes to make cooking easier but it always felt like too much effort.&lt;/p&gt;

&lt;p&gt;If there was a way to add your own recipes and have them presented back in this format, that would be really cool.&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Paul Graham joins Twitter</title>
    <link href="http://amirchaudhry.com/paul-graham-joins-twitter"/>
    <author>Amir Chaudhry</author>
    <updated>2010-08-28T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/paul-graham-joins-twitter</id>
    <content type="html">
&lt;p&gt;He got the name @paulg and @avibryant sorted it out for him. Seems like
the update hasn’t filtered everywhere yet since I found the following at
&lt;a href=&quot;http://twittercounter.com/paulg?manual_update=1&quot;&gt;http://twittercounter.com/paulg?manual_update=1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looks like the previous owner was a Paul Gardi. I wonder if he has any
idea how many followers his old handle now has (or will have soon).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/singles/PaulgTwitter.jpg&quot; alt=&quot;Paulgtwitter&quot; /&gt;&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Base Jumping meets Free Diving (kind of)</title>
    <link href="http://amirchaudhry.com/base-jumping-meets-free-diving-kind-of"/>
    <author>Amir Chaudhry</author>
    <updated>2010-08-27T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/base-jumping-meets-free-diving-kind-of</id>
    <content type="html">
&lt;div class=&quot;flex-video&quot;&gt;
    &lt;iframe width=&quot;540&quot; height=&quot;304&quot; src=&quot;http://www.youtube-nocookie.com/embed/uQITWbAaDx0?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;Free-diving video&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;via &lt;a href=&quot;http://www.youtube.com/watch?v=uQITWbAaDx0&quot;&gt;youtube.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Awesome video. The summary says it’s an artistic project and I think it came out really well.&lt;/p&gt;

&lt;p&gt;Almost makes me want to dive. Almost, but not quite. :)&lt;/p&gt;

&lt;p&gt;(hat-tip: Martina - she keeps sending me cool stuff)&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Gary Arndt: Things I've Learned From Traveling Around the World for Three Years</title>
    <link href="http://amirchaudhry.com/gary-arndt-things-ive-learned-from-traveling"/>
    <author>Amir Chaudhry</author>
    <updated>2010-08-24T14:37:59+00:00</updated>
    <id>http://amirchaudhry.com/gary-arndt-things-ive-learned-from-traveling</id>
    <content type="html">
&lt;p&gt;&lt;a href=&quot;http://www.huffingtonpost.com/gary-arndt/20-thing-ive-learned-from_b_673264.html&quot;&gt;&lt;img src=&quot;/images/web/learned-from-traveling.jpeg&quot; alt=&quot;Gary Arndt - Traveling&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;via &lt;a href=&quot;http://www.huffingtonpost.com/gary-arndt/20-thing-ive-learned-from_b_673264.html&quot;&gt;huffingtonpost.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fantastic write up of a three year journey around the world. I’ve heard
of this guy before but never took the time to look him up.&lt;/p&gt;

&lt;p&gt;Click on the pic above to go to the main story.&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Maz Jobrani: Did you hear the one about the Iranian-American?</title>
    <link href="http://amirchaudhry.com/maz-jobrani-did-you-hear-the-one-about-the-iranian-american"/>
    <author>Amir Chaudhry</author>
    <updated>2010-08-24T12:28:40+00:00</updated>
    <id>http://amirchaudhry.com/maz-jobrani-did-you-hear-the-one-about-the-iranian-american</id>
    <content type="html">
&lt;div class=&quot;flex-video widescreen&quot;&gt;
    &lt;iframe width=&quot;540&quot; height=&quot;304&quot; src=&quot;http://www.youtube-nocookie.com/embed/RmXiItk49Gw?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;Maz Jobrani&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;via &lt;a href=&quot;http://www.youtube.com/watch?v=RmXiItk49Gw&quot;&gt;youtube.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So funny. This was at TEDxGlobal in Oxford.&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>A Periodic Table of Visualisation Methods</title>
    <link href="http://amirchaudhry.com/a-periodic-table-of-visualisation-methods"/>
    <author>Amir Chaudhry</author>
    <updated>2010-08-13T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/a-periodic-table-of-visualisation-methods</id>
    <content type="html">
&lt;p&gt;&lt;a href=&quot;http://news.ycombinator.com/item?id=1601068&quot; title=&quot;Upvote article on HN&quot;&gt;Upvote on HN&lt;/a&gt; (for those who care).&lt;/p&gt;

&lt;p&gt;Found this great table of visualisations. Below is an image but you have
to visit the page at &lt;a href=&quot;http://www.visual-literacy.org/periodic_table/periodic_table.html&quot; title=&quot;Periodic Table of Visualisations&quot;&gt;visual-literacy.org&lt;/a&gt; and hover over the ‘elements’ to see the examples. Neat.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/web/VizMethdCrop.png&quot; alt=&quot;Vizualisation Methods&quot; /&gt;&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Awesome present for a cool nephew</title>
    <link href="http://amirchaudhry.com/awesome-present-for-a-cool-nephew"/>
    <author>Amir Chaudhry</author>
    <updated>2010-08-03T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/awesome-present-for-a-cool-nephew</id>
    <content type="html">
&lt;p&gt;&lt;img src=&quot;/images/singles/nephew-tshirt.jpg&quot; alt=&quot;Awesome T-shirt&quot; /&gt;&lt;/p&gt;

&lt;p&gt;How cool is that! Came out even better than I’d hoped. :-D&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>Easily Aggregate Outlook, Google &amp; iCal calendar feeds</title>
    <link href="http://amirchaudhry.com/easily-aggregate-outlook-google-ical-calendar"/>
    <author>Amir Chaudhry</author>
    <updated>2010-07-13T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/easily-aggregate-outlook-google-ical-calendar</id>
    <content type="html">
&lt;h3 id=&quot;summary&quot;&gt;Summary&lt;/h3&gt;

&lt;p&gt;For those who don’t want to read the rest, here’s what you do.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Visit the free service &lt;a href=&quot;http://www.mashical.com&quot;&gt;MashiCal&lt;/a&gt; &amp;amp; create
a calendar&lt;/li&gt;
  &lt;li&gt;Add each of your iCal feeds to your MashiCal calendar (adjust
settings as appropriate)&lt;/li&gt;
  &lt;li&gt;Copy the subscribe link (right-click and ‘copy link’ on the
aggregated calendar)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You now have a link to an aggregated iCal feed of your calendar!\
 Below is the rest of the post for those with more patience ;)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/singles/Cal-Logos.png&quot; alt=&quot;Cal Logos&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;why-would-anyone-need-to-do-this&quot;&gt;Why would anyone need to do this?&lt;/h3&gt;

&lt;p&gt;If you have multiple calendars, sharing free/busy information becomes
painful. One result is that too much time can be spent scheduling
meetings.*&lt;/p&gt;

&lt;p&gt;If I could combine all the calendar feeds into one free/busy feed then
I’d only have to share that one calendar with colleagues. So far none of
the applications I use are able to do this intelligently, and that’s
without the additional complexity of having multiple calendars in each
application.&lt;/p&gt;

&lt;p&gt;Enter MashiCal.&lt;/p&gt;

&lt;h3 id=&quot;using-mashical-to-merge-ics-feeds&quot;&gt;Using MashiCal to merge .ics feeds&lt;/h3&gt;

&lt;p&gt;I was already using BusyCal from &lt;a href=&quot;http://www.busymac.com&quot;&gt;BusyMac&lt;/a&gt; so my
Apple iCal calendars sync with Google quite nicely. Therefore, I only
need to worry about getting my Google and Outlook calendars into one
feed. (NB It’s possible to publish a feed directly from Apple iCal so
you don’t need to buy any software)&lt;/p&gt;

&lt;h4 id=&quot;getting-a-feed-from-google&quot;&gt;Getting a feed from Google&lt;/h4&gt;

&lt;p&gt;To get your ics feed from your google calendar, visit the calendar’s
settings page. Make sure the calendar is shared otherwise the feed will
not work.&lt;/p&gt;

&lt;h4 id=&quot;getting-a-feed-from-outlook&quot;&gt;Getting a feed from Outlook&lt;/h4&gt;

&lt;p&gt;In Outlook 2007 you’ll need to right-click on the calendar you want to
create a feed for and “Publish to Internet”. When you’re prompted to
share the feed you just created you’ll be able to see the URL you need.&lt;/p&gt;

&lt;h4 id=&quot;aggregating-the-feeds&quot;&gt;Aggregating the feeds&lt;/h4&gt;

&lt;p&gt;Now that you have the iCal feeds you want to aggregate, visit MashiCal
and put them together. The interface is quite simple and MashiCal will
produce an Agenda view and provide a link at the top of the calendar
that you can share.&lt;/p&gt;

&lt;p&gt;Be aware of the calendar settings for each feed you are entering since
timezones and refresh schedules may be relevant. Once it’s done you’ll
have a aggregated iCal feed that you can share with others. You can see
what my free/busy feed looks like
&lt;a href=&quot;http://www.mashical.com/cal?id=34df5231-84c6-475b-981e-6370459a84fb&quot;&gt;here&lt;/a&gt;.
I’ve also collated my calendars into a general
&lt;a href=&quot;http://amirchaudhry.com/pages/freebusy&quot;&gt;free/busy&lt;/a&gt; page too.&lt;/p&gt;

&lt;p&gt;I hope this was useful. I wrote this since it took me a while to
discover MashiCal and thought it might be useful for others too.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;*I’m aware there are services that try and solve this problem (e.g
&lt;a href=&quot;http://MeetWith.me&quot;&gt;MeetWithMe&lt;/a&gt; and &lt;a href=&quot;http://www.tungle.me&quot;&gt;Tungle.Me&lt;/a&gt;
come to mind). However, I’m more interested in having an aggregated
free/busy feed which people can subscribe to.&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p class=&quot;footnote&quot;&gt;
Comment on original post: Apr 17, 2011 - 
Zack said...
This is cool. The scenario that really needs to be solved is... 2 working parents needing to view each others work schedules as well as personal appointments, maybe personal hotmail or gmail calendars at home and each has an outlook calendar on different work domains. And maybe throw in a teenager's schedule into the mix. Some details you want all to see and some you want to keep private but busy. Now take these calendars and figure out how to view them on each parent's phone. I've been playing with outlook connector which is great when you're at a pc, but the phone experience is missing and you really need that when you're on the road. Has anyone figured out the aggregate when multiple people are involved, and how to do it cleanly on phones?&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>CfEL Ignite programme - Celebration Dinner</title>
    <link href="http://amirchaudhry.com/cfel-ignite-programme-celebration-dinner"/>
    <author>Amir Chaudhry</author>
    <updated>2010-07-03T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/cfel-ignite-programme-celebration-dinner</id>
    <content type="html">
&lt;p&gt;Photos from the final dinner of the CfEL Ignite programme. At Corpus Christi College.&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
  &lt;noscript&gt;&lt;small&gt;&lt;em&gt;Note: The gallery needs JavaScript but I've tried to make it degrade gracefully. -Amir&lt;/em&gt;&lt;/small&gt;&lt;/noscript&gt;
  &lt;ul class=&quot;inline-list&quot;&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;cfel-ignite-dinner-2010-1&quot;&gt;&lt;img src=&quot;/images/cfel-ignite-dinner-2010/cfel-ignite-dinner-2010-thumb-1.png&quot; alt=&quot;cfel-ignite-dinner-2010-thumb-1&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;cfel-ignite-dinner-2010-2&quot;&gt;&lt;img src=&quot;/images/cfel-ignite-dinner-2010/cfel-ignite-dinner-2010-thumb-2.png&quot; alt=&quot;cfel-ignite-dinner-2010-thumb-2&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;cfel-ignite-dinner-2010-3&quot;&gt;&lt;img src=&quot;/images/cfel-ignite-dinner-2010/cfel-ignite-dinner-2010-thumb-3.png&quot; alt=&quot;cfel-ignite-dinner-2010-thumb-3&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
      &lt;li&gt;&lt;a data-orbit-link=&quot;cfel-ignite-dinner-2010-4&quot;&gt;&lt;img src=&quot;/images/cfel-ignite-dinner-2010/cfel-ignite-dinner-2010-thumb-4.png&quot; alt=&quot;cfel-ignite-dinner-2010-thumb-4&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
  &lt;ul data-orbit=&quot;&quot; data-options=&quot;next_on_click:true; timer_speed:3000; pause_on_hover:false; bullets:false;&quot;&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;cfel-ignite-dinner-2010-1&quot;&gt;&lt;img src=&quot;/images/cfel-ignite-dinner-2010/cfel-ignite-dinner-2010-1.jpg&quot; alt=&quot;cfel-ignite-dinner-2010-1&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;cfel-ignite-dinner-2010-2&quot;&gt;&lt;img src=&quot;/images/cfel-ignite-dinner-2010/cfel-ignite-dinner-2010-2.jpg&quot; alt=&quot;cfel-ignite-dinner-2010-2&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;cfel-ignite-dinner-2010-3&quot;&gt;&lt;img src=&quot;/images/cfel-ignite-dinner-2010/cfel-ignite-dinner-2010-3.jpg&quot; alt=&quot;cfel-ignite-dinner-2010-3&quot; /&gt;&lt;/li&gt;
    
    &lt;li class=&quot;gallery-image&quot; data-orbit-slide=&quot;cfel-ignite-dinner-2010-4&quot;&gt;&lt;img src=&quot;/images/cfel-ignite-dinner-2010/cfel-ignite-dinner-2010-4.jpg&quot; alt=&quot;cfel-ignite-dinner-2010-4&quot; /&gt;&lt;/li&gt;
    
  &lt;/ul&gt;
&lt;/div&gt;

></content>
  </entry>
  
  <entry>
    <title>My first 3-way</title>
    <link href="http://amirchaudhry.com/my-first-3-way"/>
    <author>Amir Chaudhry</author>
    <updated>2010-07-01T00:00:00+00:00</updated>
    <id>http://amirchaudhry.com/my-first-3-way</id>
    <content type="html">
&lt;h3 id=&quot;bcpa-monthly-draw--june&quot;&gt;BCPA Monthly Draw – June&lt;/h3&gt;

&lt;p&gt;I’m the guy in the white helmet.&lt;/p&gt;

&lt;div class=&quot;flex-video&quot;&gt;
    &lt;iframe width=&quot;540&quot; height=&quot;405&quot; src=&quot;http://www.youtube-nocookie.com/embed/3e4t-BA20Jo?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;lipsum&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;The above was my first attempt at a proper 3-way skydive. If you look closely it becomes obvious that I’m being dragged around. I’ve clearly got some work to do before I can keep up with these guys by myself. We did get 7 or 8 points though!&lt;/p&gt;

&lt;h4 id=&quot;about-the-video&quot;&gt;About the video&lt;/h4&gt;

&lt;p&gt;The &lt;a href=&quot;http://www.ukskydiver.co.uk/cms/index.php?/topic/9412-bcpa-about-contact-how-to-join/&quot;&gt;BCPA&lt;/a&gt; is the national student body that promotes skydiving. Every month there’s a draw of three formations. The idea is to complete the sequence of formations (and repeat) as many times as possible within the time allowed (35sec).&lt;/p&gt;

&lt;p&gt;June was the last draw of this academic year and the formations in the video are Sputnik, Opal and Cluster. The divepool these formations came from can be found &lt;a href=&quot;http://img638.imageshack.us/img638/5070/bcpafs3waydivepool.gif&quot;&gt;here&lt;/a&gt;&lt;/p&gt;

></content>
  </entry>
  
  <entry>
    <title>Learning Markdown</title>
    <link href="http://amirchaudhry.com/learning-markdown"/>
    <author>Amir Chaudhry</author>
    <updated>2010-06-30T22:57:00+00:00</updated>
    <id>http://amirchaudhry.com/learning-markdown</id>
    <content type="html">
&lt;h3 id=&quot;my-first-attempt-at-markdown&quot;&gt;My first attempt at markdown&lt;/h3&gt;

&lt;p&gt;Having come across &lt;a href=&quot;http://daringfireball.net/projects/markdown&quot;&gt;markdown&lt;/a&gt; some time ago, I’ve decided to give it a try. This post is basically my attempt at using as many of the tags as possible. At least those I’m likely to
need.&lt;/p&gt;

&lt;hr /&gt;

&lt;h4 id=&quot;reasons&quot;&gt;Reasons&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;More control over how how posts &lt;em&gt;look&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;To be able to &lt;strong&gt;emphasise&lt;/strong&gt; things in plain text&lt;/li&gt;
  &lt;li&gt;Because I prefer using plain text email&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As Gruber says:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Markdown’s syntax is intended for one purpose: to be used as a format
for writing for the web&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’m hoping I can get used to it. The last thing I need is to give myself
another roadblock to writing.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;edit: I didn’t get the list stuff correct the first time around&lt;/em&gt;&lt;/p&gt;
></content>
  </entry>
  
  <entry>
    <title>This is my posterous</title>
    <link href="http://amirchaudhry.com/this-is-my-posterous"/>
    <author>Amir Chaudhry</author>
    <updated>2010-06-30T22:15:00+00:00</updated>
    <id>http://amirchaudhry.com/this-is-my-posterous</id>
    <content type="html">
&lt;p&gt;I’ve finally set up a blog after procrastinating for several months.&lt;/p&gt;

&lt;p&gt;Still not sure what I’ll be doing with it but since it seems to run via
email I expect I’ll actually use it a lot more than other services.&lt;/p&gt;

&lt;p&gt;Next post will be a link to my 3-way skydive video. :)&lt;/p&gt;

&lt;p class=&quot;footnote&quot;&gt;Edit: This used to be Posterous, until I moved to Jekyll and GitHub Pages in April 2012&lt;/p&gt;
></content>
  </entry>
  
</feed>
