<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>/var/log/mind</title>
<link href="https://blog.dhananjaynene.com/theme/css/main.css" rel="stylesheet" />
<link href="https://blog.dhananjaynene.com/var/log/mind" rel="alternate" title="/var/log/mind Atom Feed" type="application/atom+xml" />
<!--[if IE]>
            <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
        <![endif]-->
</head>
<body class="home" id="index">
<header class="body" id="banner">
<h1><a href="/">/var/log/mind </a></h1>
<nav><ul>
<li><a href="/blog/archives/">Archives</a></li>
<li><a href="/pages/about.html">About</a></li>
</ul>
</nav>
</header><!-- /#banner -->
<aside class="body" id="featured">
<article>
<h1 class="entry-title"><a href="/2018/01/analysing-tourism-data-with-kotlin/">Analysing Tourism Data with Kotlin</a></h1>
<footer class="post-info">
<span>Tue 09 January 2018</span>
<span>| tags: <a href="/tags/kotlin/">kotlin</a></span>
</footer><!-- /.post-info --><p>Here's a brief example of some of the functional processing capabilities of Kotlin.</p>
<p>To get some raw data I headed out to http://data.gov.in</p>
<p>The original data set can be found at <a href="/catalog/foreign-tourist-arrivals-india-top-15-source-countries">Foreign Tourist Arrivals In India From Top 15 Source Countries</a></p>
<p>The modified CSV with the continents added is <a href="/files/tourists-to-india.csv">here</a></p>
<p>Thus the CSV has the following columnar structure.</p>
<ul>
<li>Column 1: Country of Tourist</li>
<li>Column 2: Continent</li>
<li>Columns 3 onwards: Number of tourists visiting India starting 2001 to 2015</li>
</ul>
<p>The problem statement I made up is kind of contrived to be able to demonstrate some interesting coding aspects. In any case the statement is as follows:</p>
<p>Read the file. Group all the data by continents. For each continent compute the following</p>
<ul>
<li>Total number of tourists from all countries in that continent in 2015</li>
<li>Percentage growth for total number of tourists for that continent from 2001 to 2015</li>
<li>Country from whom the maximum number of tourists visited India in 2015 from that continent</li>
</ul>
<p>Display the data in the descending order of the percentage growth rate from that continent</p>
<p>The resultant Kotlin code is as follows</p>
<div class="highlight"><pre><span></span><span class="k">import</span> <span class="nn">java.io.File</span>

<span class="k">data</span> <span class="k">class</span> <span class="nc">CountryData</span><span class="p">(</span><span class="k">val</span> <span class="py">name</span><span class="p">:</span> <span class="n">String</span><span class="p">,</span> <span class="k">val</span> <span class="py">visitors</span><span class="p">:</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">Int</span><span class="p">&gt;)</span>
<span class="k">data</span> <span class="k">class</span> <span class="nc">Result</span><span class="p">(</span><span class="k">val</span> <span class="py">tourists2015</span><span class="p">:</span> <span class="n">Int</span><span class="p">,</span> <span class="k">val</span> <span class="py">pctGrowth</span><span class="p">:</span> <span class="n">Int</span><span class="p">,</span> <span class="k">val</span> <span class="py">maxCountry</span><span class="p">:</span> <span class="n">String</span><span class="p">)</span>

<span class="k">fun</span> <span class="nf">main</span><span class="p">(</span><span class="n">args</span><span class="p">:</span> <span class="n">Array</span><span class="p">&lt;</span><span class="n">String</span><span class="p">&gt;)</span> <span class="p">{</span>
<span class="c1">//  Open file</span>
  <span class="n">File</span><span class="p">(</span><span class="s">"tourists-to-india.csv"</span><span class="p">)</span>
      <span class="c1">// Read all lines</span>
    <span class="p">.</span><span class="n">readLines</span><span class="p">(</span><span class="n">Charsets</span><span class="p">.</span><span class="n">US_ASCII</span><span class="p">)</span>
      <span class="c1">// Drop the first line (column headers)</span>
    <span class="p">.</span><span class="n">drop</span><span class="p">(</span><span class="m">1</span><span class="p">)</span>
      <span class="c1">// Drop the last line (file totals)</span>
    <span class="p">.</span><span class="n">dropLast</span><span class="p">(</span><span class="m">1</span><span class="p">)</span>
      <span class="c1">// For each remaining row in the file</span>
    <span class="p">.</span><span class="n">map</span> <span class="p">{</span> <span class="n">row</span> <span class="p">-&gt;</span>
      <span class="c1">// split into cells using a comma as the delimiter</span>
      <span class="n">row</span><span class="p">.</span><span class="n">split</span><span class="p">(</span><span class="s">","</span><span class="p">)</span>
          <span class="c1">// for the array of cells in each row</span>
          <span class="p">.</span><span class="n">let</span> <span class="p">{</span> <span class="n">array</span> <span class="p">-&gt;</span>
            <span class="c1">// create a pair. The first value is the continent name (array[1])</span>
            <span class="c1">// The second value is the CountryData ie.</span>
            <span class="c1">//    list of tourists from that country each year starting 2011</span>
            <span class="n">array</span><span class="p">[</span><span class="m">1</span><span class="p">]</span> <span class="n">to</span> <span class="n">CountryData</span><span class="p">(</span><span class="n">array</span><span class="p">[</span><span class="m">0</span><span class="p">],</span> <span class="n">array</span><span class="p">.</span><span class="n">drop</span><span class="p">(</span><span class="m">2</span><span class="p">).</span><span class="n">map</span> <span class="p">{</span> <span class="n">it</span><span class="p">.</span><span class="n">toInt</span><span class="p">()</span> <span class="p">})</span>
          <span class="p">}</span>
    <span class="p">}</span>
      <span class="c1">// collate all country data for each continent into a list of countrydata</span>
      <span class="c1">// for that continent</span>
    <span class="p">.</span><span class="n">groupBy</span><span class="p">({</span><span class="n">it</span><span class="p">.</span><span class="n">first</span><span class="p">},</span> <span class="p">{</span> <span class="n">it</span><span class="p">.</span><span class="n">second</span> <span class="p">})</span>
      <span class="c1">// for each continent</span>
    <span class="p">.</span><span class="n">map</span> <span class="p">{</span> <span class="p">(</span><span class="n">continent</span><span class="p">,</span> <span class="n">countriesData</span><span class="p">)</span> <span class="p">-&gt;</span>
      <span class="c1">// compute tourists from across the continent in 2001</span>
      <span class="k">val</span> <span class="py">tourists2001</span> <span class="p">=</span> <span class="n">countriesData</span><span class="p">.</span><span class="n">sumBy</span> <span class="p">{</span> <span class="n">it</span><span class="p">.</span><span class="n">visitors</span><span class="p">[</span><span class="m">0</span><span class="p">]</span> <span class="p">}</span>
      <span class="c1">// compute tourists from across the continent in 2015</span>
      <span class="k">val</span> <span class="py">tourists2015</span> <span class="p">=</span> <span class="n">countriesData</span><span class="p">.</span><span class="n">sumBy</span> <span class="p">{</span> <span class="n">it</span><span class="p">.</span><span class="n">visitors</span><span class="p">[</span><span class="m">14</span><span class="p">]</span> <span class="p">}</span>
      <span class="c1">// compute percentage growth</span>
      <span class="k">val</span> <span class="py">pctGrowth</span> <span class="p">=</span> <span class="p">(</span><span class="n">tourists2015</span> <span class="p">-</span> <span class="n">tourists2001</span><span class="p">)</span> <span class="p">*</span> <span class="m">100</span> <span class="p">/</span> <span class="n">tourists2001</span>
      <span class="c1">// now we want to find out which country in that continent sent</span>
      <span class="c1">// the maximum number of tourists</span>
      <span class="k">val</span> <span class="py">maxCountry</span> <span class="p">=</span> <span class="n">countriesData</span>
          <span class="c1">// sort data based on 14th element in the list ie. visitors for 2015</span>
          <span class="p">.</span><span class="n">sortedByDescending</span> <span class="p">{</span> <span class="n">it</span><span class="p">.</span><span class="n">visitors</span><span class="p">[</span><span class="m">14</span><span class="p">]</span> <span class="p">}</span>
          <span class="c1">// take the first country data and specifically its name attribute</span>
          <span class="p">.</span><span class="n">first</span><span class="p">().</span><span class="n">name</span>
      <span class="c1">// construct a pair of continent to result</span>
      <span class="n">continent</span> <span class="n">to</span> <span class="n">Result</span><span class="p">(</span><span class="n">tourists2015</span><span class="p">,</span> <span class="n">pctGrowth</span><span class="p">,</span> <span class="n">maxCountry</span><span class="p">)</span>
    <span class="p">}</span>
      <span class="c1">// sort the continent result pairs based on the percentage growth</span>
    <span class="p">.</span><span class="n">sortedByDescending</span> <span class="p">{</span> <span class="n">it</span><span class="p">.</span><span class="n">second</span><span class="p">.</span><span class="n">pctGrowth</span> <span class="p">}</span>
      <span class="c1">// display the results</span>
    <span class="p">.</span><span class="n">forEach</span> <span class="p">{</span> <span class="n">println</span><span class="p">(</span><span class="n">it</span><span class="p">)</span> <span class="p">}</span>
<span class="p">}</span>
</pre></div> </article>
</aside><!-- /#featured -->
<section class="body" id="content">
<h1>Other articles</h1>
<ol class="hfeed" id="posts-list">
<li><article class="hentry">
<header>
<h1><a href="/2016/04/exercises-in-kotlin-part-5-classes/" rel="bookmark" title="Permalink to Exercises in Kotlin: Part 5 - Classes">Exercises in Kotlin: Part 5 - Classes</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Fri 29 April 2016</span>
<span>| tags: <a href="/tags/kotlin/">kotlin</a></span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2016/04/exercises-in-kotlin-part-5-classes/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2016/04/exercises-in-kotlin-part-4-control-flows-and-return/" rel="bookmark" title="Permalink to Exercises in Kotlin: Part 4 - Control flows and return">Exercises in Kotlin: Part 4 - Control flows and return</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Wed 27 April 2016</span>
<span>| tags: <a href="/tags/kotlin/">kotlin</a><a href="/tags/kotlin-exercises/">kotlin-exercises</a></span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2016/04/exercises-in-kotlin-part-4-control-flows-and-return/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2016/04/exercises-in-kotlin-part-3-functions/" rel="bookmark" title="Permalink to Exercises in Kotlin: Part 3 - Functions">Exercises in Kotlin: Part 3 - Functions</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Wed 20 April 2016</span>
<span>| tags: <a href="/tags/kotlin/">kotlin</a><a href="/tags/kotlin-exercises/">kotlin-exercises</a></span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2016/04/exercises-in-kotlin-part-3-functions/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2016/04/exercises-in-kotlin-part-2-high-level-syntax-and-variables/" rel="bookmark" title="Permalink to Exercises in Kotlin: Part 2 - High level syntax and Variables">Exercises in Kotlin: Part 2 - High level syntax and Variables</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Tue 19 April 2016</span>
<span>| tags: <a href="/tags/kotlin/">kotlin</a><a href="/tags/kotlin-exercises/">kotlin-exercises</a></span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2016/04/exercises-in-kotlin-part-2-high-level-syntax-and-variables/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2016/04/exercises-in-kotlin-part-1-getting-started/" rel="bookmark" title="Permalink to Exercises in Kotlin: Part 1 - Getting Started">Exercises in Kotlin: Part 1 - Getting Started</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Mon 18 April 2016</span>
<span>| tags: <a href="/tags/kotlin/">kotlin</a><a href="/tags/kotlin-exercises/">kotlin-exercises</a></span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2016/04/exercises-in-kotlin-part-1-getting-started/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2016/04/few-thoughts-about-kotlin-and-why-i-like-it-so-much/" rel="bookmark" title="Permalink to Few thoughts about Kotlin and why I like it so much">Few thoughts about Kotlin and why I like it so much</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Fri 15 April 2016</span>
<span>| tags: <a href="/tags/kotlin/">kotlin</a></span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2016/04/few-thoughts-about-kotlin-and-why-i-like-it-so-much/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2015/09/the-draft-encryption-policy-an-impractical-exercise/" rel="bookmark" title="Permalink to The Draft Encryption Policy - An impractical exercise">The Draft Encryption Policy - An impractical exercise</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Tue 22 September 2015</span>
<span>| tags: <a href="/tags/government/">government</a><a href="/tags/encryption/">encryption</a><a href="/tags/policy/">policy</a><a href="/tags/india/">india</a></span>
</footer><!-- /.post-info --> <p class="first last">A view on the new draft encryption policy published by the Government
of India</p>
<a class="readmore" href="/2015/09/the-draft-encryption-policy-an-impractical-exercise/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2013/10/have-we-misunderstood-dvcs-git-hg/" rel="bookmark" title="Permalink to Have we misunderstood DVCS and git / hg ?">Have we misunderstood DVCS and git / hg  ?</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Fri 04 October 2013</span>
<span>| tags: <a href="/tags/dvcs/">dvcs</a><a href="/tags/git/">git</a><a href="/tags/hg/">hg</a><a href="/tags/mercurial/">mercurial</a><a href="/tags/distributed/">distributed</a><a href="/tags/federated/">federated</a></span>
</footer><!-- /.post-info --> <p class="first last">Exploring our understanding of DVCS in the context of recent github downtime.</p>
<a class="readmore" href="/2013/10/have-we-misunderstood-dvcs-git-hg/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2013/10/partially-applied-functions-and-decorators-in-python/" rel="bookmark" title="Permalink to Partially applied functions and decorators in python">Partially applied functions and decorators in python</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Thu 03 October 2013</span>
<span>| tags: <a href="/tags/python/">python</a><a href="/tags/functional-programming/">functional programming</a><a href="/tags/decorators/">decorators</a><a href="/tags/partial-application/">partial application</a></span>
</footer><!-- /.post-info --> <p class="first last">A detailed look at decorators and associated concepts like partial application of functions, closures et.</p>
<a class="readmore" href="/2013/10/partially-applied-functions-and-decorators-in-python/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2013/09/screencast-overview-of-python-enums-pep-435/" rel="bookmark" title="Permalink to A screencast overview of python enums as introduced by PEP 435">A screencast overview of python enums as introduced by PEP 435</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Sat 28 September 2013</span>
<span>| tags: <a href="/tags/python/">python</a></span>
</footer><!-- /.post-info --> <p class="first last">Screencast and helper notes as a overview of python enums introduced by PEP 435</p>
<a class="readmore" href="/2013/09/screencast-overview-of-python-enums-pep-435/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a 1""="" exploring="" href="/2013/02/exploring-java8-lambdas-part-1/" java8="" lambdas.="" part="" rel="bookmark" title="Permalink to ">"Exploring Java8 Lambdas. Part 1"</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Tue 26 February 2013</span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2013/02/exploring-java8-lambdas-part-1/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2012/01/conference-report-hasgeek-jsfoo-pune-2012/" rel="bookmark" title="Permalink to Conference Report - Hasgeek jsFoo Pune 2012">Conference Report - Hasgeek jsFoo Pune 2012</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Sat 21 January 2012</span>
<span>| tags: <a href="/tags/conference/">conference</a><a href="/tags/hasgeek/">hasgeek</a><a href="/tags/javascript/">javascript</a><a href="/tags/jsfoo/">jsfoo</a><a href="/tags/pune/">pune</a></span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2012/01/conference-report-hasgeek-jsfoo-pune-2012/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2012/01/why-osgi-or-why-not-using-it-makes-your-jvm-runtime-unsafe/" rel="bookmark" title="Permalink to Why OSGi? Or why not using it makes your JVM runtime unsafe.">Why OSGi? Or why not using it makes your JVM runtime unsafe.</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Sat 21 January 2012</span>
<span>| tags: <a href="/tags/osgi/">osgi</a></span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2012/01/why-osgi-or-why-not-using-it-makes-your-jvm-runtime-unsafe/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2012/01/scala-needs-terraces/" rel="bookmark" title="Permalink to Scala needs terraces">Scala needs terraces</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Wed 11 January 2012</span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2012/01/scala-needs-terraces/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2011/10/which-risk-would-you-manage-what-would-you-want-to-prove-programming-languages-and-type-systems/" rel="bookmark" title="Permalink to Which risk would you manage? What would you want to prove? Programming Languages and Type Systems">Which risk would you manage? What would you want to prove? Programming Languages and Type Systems</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Wed 12 October 2011</span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2011/10/which-risk-would-you-manage-what-would-you-want-to-prove-programming-languages-and-type-systems/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2011/08/cperformance-comparison-languages-styles-and-vms-java-scala-python-erlang-clojure-ruby-groovy-javascript/" rel="bookmark" title="Permalink to Contrasting Performance : Languages, styles and VMs - Java, Scala, Python, Erlang, Clojure, Ruby, Groovy, Javascript">Contrasting Performance : Languages, styles and VMs - Java, Scala, Python, Erlang, Clojure, Ruby, Groovy, Javascript</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Mon 15 August 2011</span>
<span>| tags: <a href="/tags/clojure/">clojure</a><a href="/tags/comparison/">comparison</a><a href="/tags/erlang/">erlang</a><a href="/tags/groovy/">groovy</a><a href="/tags/java/">java</a><a href="/tags/javascript/">javascript</a><a href="/tags/jruby/">jruby</a><a href="/tags/performance/">performance</a><a href="/tags/pypy/">pypy</a><a href="/tags/python/">python</a><a href="/tags/ruby/">ruby</a><a href="/tags/scala/">scala</a><a href="/tags/v8/">v8</a></span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2011/08/cperformance-comparison-languages-styles-and-vms-java-scala-python-erlang-clojure-ruby-groovy-javascript/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2011/07/why-you-should-register-to-attend-python-conference-pune-sept-2011-right-now/" rel="bookmark" title="Permalink to Why you should register to attend Python Conference Pune (Sept 2011) right now">Why you should register to attend Python Conference Pune (Sept 2011) right now</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Tue 26 July 2011</span>
<span>| tags: <a href="/tags/pycon/">pycon</a><a href="/tags/pycon-india/">pycon india</a></span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2011/07/why-you-should-register-to-attend-python-conference-pune-sept-2011-right-now/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2011/07/google-plus-getting-close-to-the-sweet-spot-by-getting-the-basics-right/" rel="bookmark" title="Permalink to Google Plus : Getting close to the sweet spot by getting the basics right">Google Plus : Getting close to the sweet spot by getting the basics right</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Sun 10 July 2011</span>
<span>| tags: <a href="/tags/facebook/">facebook</a><a href="/tags/google-plus/">google plus</a><a href="/tags/twitter/">twitter</a></span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2011/07/google-plus-getting-close-to-the-sweet-spot-by-getting-the-basics-right/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2011/06/10-python-one-liners-to-impress-your-friends/" rel="bookmark" title="Permalink to 10 Python one liners to impress your friends">10 Python one liners to impress your friends</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Thu 02 June 2011</span>
<span>| tags: <a href="/tags/brevity/">brevity</a><a href="/tags/clojure/">clojure</a><a href="/tags/coffeescript/">coffeescript</a><a href="/tags/oneliners/">oneliners</a><a href="/tags/python/">python</a><a href="/tags/ruby/">ruby</a><a href="/tags/scala/">scala</a></span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2011/06/10-python-one-liners-to-impress-your-friends/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2011/05/why-java-folks-should-look-forward-to-scala/" rel="bookmark" title="Permalink to Why Java folks should look forward to Scala">Why Java folks should look forward to Scala</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Tue 31 May 2011</span>
<span>| tags: <a href="/tags/c/">C#</a></span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2011/05/why-java-folks-should-look-forward-to-scala/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2011/04/the-cloud-just-got-stronger-even-as-aws-went-down/" rel="bookmark" title="Permalink to The cloud just got stronger, even as AWS went down">The cloud just got stronger, even as AWS went down</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Fri 22 April 2011</span>
<span>| tags: <a href="/tags/aws/">aws</a><a href="/tags/iaas/">iaas</a><a href="/tags/outage/">outage</a></span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2011/04/the-cloud-just-got-stronger-even-as-aws-went-down/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2010/09/code-kata-ruby-programming-challenge-for-newbies-in-python/" rel="bookmark" title="Permalink to Code Kata : Ruby Programming Challenge for Newbies in Python">Code Kata : Ruby Programming Challenge for Newbies in Python</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Wed 01 September 2010</span>
<span>| tags: <a href="/tags/functional-programming/">functional programming</a><a href="/tags/python/">python</a><a href="/tags/rubylearning/">rubylearning</a></span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2010/09/code-kata-ruby-programming-challenge-for-newbies-in-python/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2010/08/monads-in-an-object-oriented-context/" rel="bookmark" title="Permalink to Monads in an Object Oriented context">Monads in an Object Oriented context</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Mon 30 August 2010</span>
<span>| tags: <a href="/tags/monads/">monads</a><a href="/tags/object-orientation/">object orientation</a><a href="/tags/ood/">ood</a></span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2010/08/monads-in-an-object-oriented-context/">read more</a>
</div><!-- /.entry-content -->
</article></li>
<li><article class="hentry">
<header>
<h1><a href="/2010/08/a-case-for-non-leaky-dual-abstractions./" rel="bookmark" title="Permalink to A case for non leaky dual abstractions.">A case for non leaky dual abstractions.</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<span>Thu 26 August 2010</span>
<span>| tags: <a href="/tags/abstractions/">abstractions</a><a href="/tags/design/">design</a><a href="/tags/implementation/">implementation</a><a href="/tags/interface/">interface</a><a href="/tags/ood/">ood</a></span>
</footer><!-- /.post-info -->
<a class="readmore" href="/2010/08/a-case-for-non-leaky-dual-abstractions./">read more</a>
</div><!-- /.entry-content -->
</article></li>
</ol><!-- /#posts-list -->
<p class="paginator">
    Page 1 / 6
        <a href="/page/2/">»</a>
</p>
</section><!-- /#content -->
<section class="body" id="extras">
<div class="social">
<h2>social</h2>
<ul>
<li><a href="/var/log/mind" rel="alternate" type="application/atom+xml">atom feed</a></li>
</ul>
</div><!-- /.social -->
</section><!-- /#extras -->
<footer class="body" id="contentinfo">
<p>Powered by <a href="/">Pelican</a>. Theme <a href="/blueicefield/pelican-blueidea/">blueidea</a>, inspired by the default theme.</p>
</footer><!-- /#contentinfo -->
<script type="text/javascript">
    var _gaq = _gaq || [];
    _gaq.push(['_setAccount', 'UA-3560002-1']);
    _gaq.push(['_trackPageview']);
    (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
    })();
    </script>
</body>
</html>