<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><description>Telling the story of our future, where technology is headed and what we need to know now.&#xD;
</description><title>eddology • by edd dumbill</title><generator>Tumblr (3.0; @eddology)</generator><link>http://eddology.com/</link><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/eddology" /><feedburner:info uri="eddology" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://tumblr.superfeedr.com/" /><media:copyright>Copyright Edd Dumbill</media:copyright><media:thumbnail url="http://s3.amazonaws.com/edd-podcast/podcast/oscon2010_casual_cropped_300.jpg" /><media:keywords>technology,web,data,opensource,strataconf</media:keywords><media:category scheme="http://www.itunes.com/dtds/podcast-1.0.dtd">Technology/Tech News</media:category><itunes:owner><itunes:email>edd@me.com</itunes:email><itunes:name>Edd Dumbill</itunes:name></itunes:owner><itunes:author>Edd Dumbill</itunes:author><itunes:explicit>no</itunes:explicit><itunes:image href="http://s3.amazonaws.com/edd-podcast/podcast/oscon2010_casual_cropped_300.jpg" /><itunes:keywords>technology,web,data,opensource,strataconf</itunes:keywords><itunes:subtitle>Telling the story of our future, where technology is headed, and what we need to know now.</itunes:subtitle><itunes:summary>A personal take on the technology and modern life from technologist, writer and tech conference chair Edd Dumbill.</itunes:summary><itunes:category text="Technology"><itunes:category text="Tech News" /></itunes:category><image><link>http://eddology.com/</link><url>http://edd-podcast.s3.amazonaws.com/podcast/oscon2010_casual_cropped_300.jpg</url><title>Eddology</title></image><feedburner:emailServiceId>eddology</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Feddology" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Feddology" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Feddology" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/eddology" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Feddology" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Feddology" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Feddology" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Feddology" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Feddology" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Feddology" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Feddology" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Feddology" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Feddology" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Feddology" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Feddology" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2Feddology" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item><title>Your week would have been even better if you'd read these</title><description>&lt;p&gt;And so would mine. Every week, my Instapaper queue fills with awesome links that I rarely get time to read. I figured I’d share some from the last 7 days.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;History&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;“Albert Einstein, whose theories exploded and reshaped our ideas of how the universe works, died on April 18, 1955, of heart failure. He was 76 … Armed with his camera and a case of scotch — to open doors and loosen tongues — Morse compiled a quietly intense record of a 20th-century icon’s passing. But aside from one now-famous image — of Einstein’s office, exactly how he left it, taken hours after his death — the pictures Morse took that day were never published.” &lt;a href="http://life.time.com/history/the-day-einstein-died-a-life-photographers-story/#1"&gt;&lt;a href="http://life.time.com/history/the-day-einstein-died-a-life-photographers-story/#1"&gt;http://life.time.com/history/the-day-einstein-died-a-life-photographers-story/#1&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Business bits&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The book is dead, long live the book! “&lt;span&gt;Lean Publishing&lt;/span&gt; is the act of self-publishing a book while you are writing it, evolving the book with feedback from your readers and finishing a first draft before optionally using the traditional publishing workflow.” &lt;a href="http://leanpub.com/manifesto"&gt;&lt;a href="http://leanpub.com/manifesto"&gt;http://leanpub.com/manifesto&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;“A software-defined network, which originated in government spy agencies, is similar to server virtualization, and because of that is quite likely bad news for networking equipment makers like Cisco and Juniper Networks.”  &lt;a href="http://bits.blogs.nytimes.com/2012/02/06/start-up-nicira-plans-to-disrupt-networking-giants/"&gt;&lt;a href="http://bits.blogs.nytimes.com/2012/02/06/start-up-nicira-plans-to-disrupt-networking-giants/"&gt;http://bits.blogs.nytimes.com/2012/02/06/start-up-nicira-plans-to-disrupt-networking-giants/&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Brain bits&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Any writer, programmer or artist gets “flow”, and gets how illusive it can be. Is it possible to induce the flow state electronically? &lt;a href="http://www.newscientist.com/article/mg21328501.600-zap-your-brain-into-the-zone-fast-track-to-pure-focus.html"&gt;&lt;a href="http://www.newscientist.com/article/mg21328501.600-zap-your-brain-into-the-zone-fast-track-to-pure-focus.html"&gt;http://www.newscientist.com/article/mg21328501.600-zap-your-brain-into-the-zone-fast-track-to-pure-focus.html&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;“When you are solving a difficult problem re-ask the problem so that your solution helps you learn faster. Find a faster way to fail, recover, and try again. If the problem you are trying to solve involves creating a magnum opus, you are solving the wrong problem.” &lt;a href="http://www.azarask.in/blog/post/the-wrong-problem/"&gt;&lt;a href="http://www.azarask.in/blog/post/the-wrong-problem/"&gt;http://www.azarask.in/blog/post/the-wrong-problem/&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Programming&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This week, a somewhat philosophical take on the discipline.&lt;/p&gt;
&lt;p&gt;The 10 rules of a Zen programmer – of which I think the most important has to be “no ego”. &lt;a href="http://www.grobmeier.de/the-10-rules-of-a-zen-programmer-03022012.html"&gt;&lt;a href="http://www.grobmeier.de/the-10-rules-of-a-zen-programmer-03022012.html"&gt;http://www.grobmeier.de/the-10-rules-of-a-zen-programmer-03022012.html&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There is no root cause of failure, says John Allspaw. Be suspicious of clearly attributed single “causes”. &lt;a href="http://www.kitchensoap.com/2012/02/10/each-necessary-but-only-jointly-sufficient/"&gt;&lt;a href="http://www.kitchensoap.com/2012/02/10/each-necessary-but-only-jointly-sufficient/"&gt;http://www.kitchensoap.com/2012/02/10/each-necessary-but-only-jointly-sufficient/&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the same way, you shouldn’t have just one teacher. Including yourself. &lt;a href="http://raganwald.posterous.com/autodidacticism"&gt;&lt;a href="http://raganwald.posterous.com/autodidacticism"&gt;http://raganwald.posterous.com/autodidacticism&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/l34LeXjeOZQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/l34LeXjeOZQ/17525143208</link><guid isPermaLink="false">http://eddology.com/post/17525143208</guid><pubDate>Sun, 12 Feb 2012 17:21:00 -0800</pubDate><category>roundup</category><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/17525143208</feedburner:origLink></item><item><title>Awesome things I might have read this week</title><description>&lt;p&gt;Every week, my Instapaper queue fills with awesome links that I rarely get time to read. I figured I’d share some from the last 7 days.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Self improvement&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Take nothing personally: don’t let your emotions hold you back&lt;br/&gt;&lt;a href="http://bennesvig.com/2012/01/27/taking-nothing-personally/"&gt;&lt;a href="http://bennesvig.com/2012/01/27/taking-nothing-personally/"&gt;http://bennesvig.com/2012/01/27/taking-nothing-personally/&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Why every professional should consider blogging: this is an excellent read. Even if nobody ever reads you, you’re still doing yourself a great favor. Writing on G+ counts, too! &lt;br/&gt;&lt;a href="http://technicalblogging.com/why-every-professional-should-consider-blogging/"&gt;&lt;a href="http://technicalblogging.com/why-every-professional-should-consider-blogging/"&gt;http://technicalblogging.com/why-every-professional-should-consider-blogging/&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Silicon Valley’s Productivity Secret: I include this because mostly I’m amused at a basic technique being heralded as a secret. Accountability is a superpower. &lt;br/&gt;&lt;a href="http://blog.idonethis.com/post/16736314554/silicon-valleys-productivity-secret"&gt;&lt;a href="http://blog.idonethis.com/post/16736314554/silicon-valleys-productivity-secret"&gt;http://blog.idonethis.com/post/16736314554/silicon-valleys-productivity-secret&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Design&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;“We do more reading on the screen today than we did even a year ago. If we are ever to have a golden age of reading on the screen, this might be the start of it.” &lt;br/&gt;&lt;a href="http://coding.smashingmagazine.com/2012/01/30/the-future-of-screen-typography-is-in-your-hands/"&gt;&lt;a href="http://coding.smashingmagazine.com/2012/01/30/the-future-of-screen-typography-is-in-your-hands/"&gt;http://coding.smashingmagazine.com/2012/01/30/the-future-of-screen-typography-is-in-your-hands/&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A Beginner’s Guide to Pairing Fonts&lt;br/&gt;&lt;a href="http://webdesign.tutsplus.com/articles/typography-articles/a-beginners-guide-to-pairing-fonts/"&gt;&lt;a href="http://webdesign.tutsplus.com/articles/typography-articles/a-beginners-guide-to-pairing-fonts/"&gt;http://webdesign.tutsplus.com/articles/typography-articles/a-beginners-guide-to-pairing-fonts/&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Programming&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Java Sucks, by Jamie Zawinski. Written in 2000 but pretty instructive still. “I think Java is the best language going today, which is to say, it’s the marginally acceptable one among the set of complete bagbiting loser languages that we have to work with out here in the real world.” I have no idea if JWZ loves Clojure, but I hope he does.&lt;br/&gt;&lt;a href="http://www.jwz.org/doc/java.html"&gt;&lt;a href="http://www.jwz.org/doc/java.html"&gt;http://www.jwz.org/doc/java.html&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cloud computing and big data&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A Tour of Amazon’s DynamoDB: in-depth briefing on the new database&lt;br/&gt;&lt;a href="http://www.paperplanes.de/2012/1/30/a-tour-of-amazons-dynamodb.html"&gt;&lt;a href="http://www.paperplanes.de/2012/1/30/a-tour-of-amazons-dynamodb.html"&gt;http://www.paperplanes.de/2012/1/30/a-tour-of-amazons-dynamodb.html&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Ups and Downs of the “America-Proof” Cloud&lt;br/&gt;&lt;a href="http://www.readwriteweb.com/cloud/2012/02/the-ups-and-downs-of-the-ameri.php"&gt;&lt;a href="http://www.readwriteweb.com/cloud/2012/02/the-ups-and-downs-of-the-ameri.php"&gt;http://www.readwriteweb.com/cloud/2012/02/the-ups-and-downs-of-the-ameri.php&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google’s Data Center Engineer Shares Secrets of “Warehouse” Computing&lt;br/&gt;&lt;a href="http://m.wired.com/wiredenterprise/2012/01/google-man/"&gt;&lt;a href="http://m.wired.com/wiredenterprise/2012/01/google-man/"&gt;http://m.wired.com/wiredenterprise/2012/01/google-man/&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Great Disk Drive in the Sky: How Web giants store big—and we mean big—data&lt;br/&gt;&lt;a href="http://arstechnica.com/business/news/2012/01/the-big-disk-drive-in-the-sky-how-the-giants-of-the-web-store-big-data.ars/1"&gt;&lt;a href="http://arstechnica.com/business/news/2012/01/the-big-disk-drive-in-the-sky-how-the-giants-of-the-web-store-big-data.ars/1"&gt;http://arstechnica.com/business/news/2012/01/the-big-disk-drive-in-the-sky-how-the-giants-of-the-web-store-big-data.ars/1&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/A3J_skMaU4I" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/A3J_skMaU4I/16975821903</link><guid isPermaLink="false">http://eddology.com/post/16975821903</guid><pubDate>Fri, 03 Feb 2012 07:06:15 -0800</pubDate><category>awesome</category><category>roundup</category><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/16975821903</feedburner:origLink></item><item><title>Frameworks, freedom and the cloud</title><description>&lt;p&gt;Open source web frameworks have been a big driver of web productivity in the last 5 years, and having them &lt;a href="http://googleappengine.blogspot.com/2012/01/app-engine-162-released.html"&gt;cloud-hosted “out of the box”&lt;/a&gt; is highly desirable for most people. But is there a downside?&lt;/p&gt;
&lt;p&gt;In one sense, frameworks are endangered by a cloud future. We’re slowly moving to a platform-oriented cloud (PaaS), as opposed to a virtualized infrastructure one (IaaS). In this future we’ll be using platform-as-a-service solutions such as Amazon’s DynamoDB or Google’s App Engine. In this world, the databases and frameworks will run out of the box. But where will the new open source frameworks come from? With little opportunity for development in the broader ecosystem, few will have the incentive to improve or create new frameworks.&lt;/p&gt;
&lt;p&gt;We should be as be wary of cloud “platform-as-a-service” as much as the closed world promoted by iOS. By abstracting away the moving parts of the operating system, platform-as-a-service offerings lock out many inventors from improving and innovating—except perhaps, for on top of the platform, which they have no control over.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On the shoulders of standards&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Standards and open source are both the safeguards of freedom and the catalyst to innovation. In the mobile world, having Android be open source is already proving beneficial for diversity and innovation.&lt;/p&gt;
&lt;p&gt;We’re living in a world built on the innovation made possible by open standards and open source. The standardized IBM PC gave birth to many new businesses and technologies, the most influential among these being Windows and Linux. On the internet, open standards have been crucial. Web frameworks such as Django and Ruby on Rails just wouldn’t have happened without the web and Linux.&lt;/p&gt;
&lt;p&gt;In order to preserve a strong software future for web development, we need to take care that our cloud infrastructure is open. Projects such as &lt;a href="http://openstack.org/"&gt;OpenStack&lt;/a&gt; are leading the way in this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The bargain of convenience&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;How does this tie into offerings such as Google’s AppEngine? On the one hand, AppEngine is marvelously progressive. Why bother with the troubles of virtualized physical machines, load balancing and so on, when the platform can do it for you? But on the other hand, we’re always trading off freedom for convenience.&lt;/p&gt;
&lt;p&gt;That’s not, on the face of it, a bad thing, except when it turns out to be a bad trade—and you don’t always know when that’ll be. If you don’t control the platform on top of which you’re innovating, you’re at the mercy of its owners changing the rules of the game without reference to you.&lt;/p&gt;
&lt;p&gt;It’s in the long-term interests of the industry to keep all the layers of the stack open, so we can continue to innovate on them and try different approaches.&lt;/p&gt;
&lt;p&gt;Even if your cloud provider is the smartest company in the world with the best record on uptime, security and redundancy, it’s not always enough. Control, or even merely the illusion of it, matters. One reason that EC2 is a wildly popular cloud hosting platform is because of the control developers get—even if the resulting architectures end up all looking much the same.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Open source is our guarantee&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When developing services that run in the cloud, you really do need to be careful not just about technical issues, but about those of direction and control. The IBM PC was changed slowly and relatively predictably. There aren’t the same restrictions or guarantees for software platforms.&lt;/p&gt;
&lt;p&gt;You may be thinking “so, you’re saying I should make my life less convenient so as to protect the interests of the following generation?” However great this sounds, we know from life this doesn’t happen very often, and exceeding rarely in business.&lt;/p&gt;
&lt;p&gt;Fortunately, competition comes to our aid. We’ve seen repeatedly that open source is a powerful weapon in the hands of a competitor. If you commoditize your opponent’s platform, they have nowhere to go.&lt;/p&gt;
&lt;p&gt;The advantages of open source in giving developers control, fostering innovation and seeding ecosystems mean that it is here to stay. There will be several open source Google AppEngines in the future, and who knows, perhaps even from Google themselves.&lt;/p&gt;
&lt;p&gt;So for now, recognize that open source is far from obsoleted by the cloud. It’s more important than ever. As long as there’s open source, there’s a place for innovation in our industry.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/z_nGYatQGic" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/z_nGYatQGic/16845391192</link><guid isPermaLink="false">http://eddology.com/post/16845391192</guid><pubDate>Tue, 31 Jan 2012 16:25:00 -0800</pubDate><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/16845391192</feedburner:origLink></item><item><title>Yak shaving</title><description>&lt;p&gt;&lt;span&gt;If your brain works the way mine does, you often find yourself doing a variety of related but not necessary tasks along the way to fulfilling a larger goal. For some reason, the history of which I’m not entirely sure, this is called “yak shaving.” Some of my finest work has been done that way, so I’m happy to embrace it, even if I do add hours to the job at hand.&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span&gt;This week’s yak shaving has neared epic proportions, but proved eminently satisfying. I’ve been working on collecting together an overview of big data products. It’s early days yet for Hadoop centered offerings, but 2012 will be the year that Microsoft and Oracle will join IBM and EMC Greenplum in having launched products in the marketplace.&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span&gt;Surveying who-offers-what is a bit like writing code. I naively started off with a spreadsheet, but I quickly realized that real life data doesn’t fit into grids. Even if you can coerce it that way, the effort required to get there is massive. Instead I wanted a structured description of the products that I could amend and refactor as the whole landscape came into perspective.&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span&gt;To get this done, I revived an old interest. Some years ago I contributed a little to &lt;/span&gt;&lt;span class="proflinkWrapper"&gt;&lt;a class="proflink" href="https://plus.google.com/101340276778954475832"&gt;Dave Beckett&lt;/a&gt;&lt;/span&gt;&lt;span&gt;’s Redland RDF project, and so I returned to this technology. RDF is simply a machine readable way of writing descriptions about things.&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span&gt;The task at hand was to collect knowledge about each vendor and their products, and have this in a format that could be used to create feature tables and comparison charts.&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span&gt;In my little project, each vendor has a file in which I’ve written a machine-readable description of their products. Here’s a little excerpt from my description of Cloudera:&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;&lt;/span&gt;&lt;a class="ot-anchor" href="http://www.cloudera.com/hadoop/"&gt;&lt;a href="http://www.cloudera.com/hadoop/"&gt;http://www.cloudera.com/hadoop/&lt;/a&gt;&lt;/a&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;    a :HadoopDistribution ;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;    dc:title "Cloudera's Distribution including Apache Hadoop" ;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;    :homePage &lt;&lt;/span&gt;&lt;a class="ot-anchor" href="http://www.cloudera.com/hadoop/"&gt;&lt;a href="http://www.cloudera.com/hadoop/"&gt;http://www.cloudera.com/hadoop/&lt;/a&gt;&lt;/a&gt;&lt;span&gt;&gt; .&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class="vg"&gt;You can probably figure out this is the beginning of a description of Cloudera’s Hadoop Distribution. This is in the Turtle dialect of RDF, which makes the whole thing a lot more readable. I’m not an RDF purist, and don’t have plans yet to publish this data publicly. I was simply using the technology as a shorthand for writing down a large amount of semi-structured information.&lt;br/&gt;&lt;br/&gt;After collating all the data together into a Redland database, I was able to write a small amount of Python code that queried the data, fed it into some templates, and spat out some chunks of HTML for inclusion into my article. For the curious, I used a combination of SPARQL and the regular Redland APIs to query the data, and chose the &lt;em&gt;jinja2&lt;/em&gt; templating engine to create my HTML. Excerpted screenshots are attached to this post.&lt;br/&gt;&lt;br/&gt;Yes, I could have chosen XML &amp; XSLT for this, or JSON, or, or… but that’s not really the point. The point was to have fun and learn stuff at the same time as achieving my goals. I brushed up on my Python, got some SPARQL experience in, and have content that can be easily kept up to date and repurposed.&lt;br/&gt;&lt;br/&gt;Oh, and if you’re going anywhere near RDF technology, I can recommend Redland as a pragmatic and straightforward toolkit.&lt;br/&gt;&lt;br/&gt;Look out for the Hadoop survey to be published tomorrow!&lt;/div&gt;
&lt;div class="vg"&gt;&lt;/div&gt;
&lt;div&gt;&lt;img src="http://media.tumblr.com/tumblr_ly0r8hYp0y1qz4vbw.png"/&gt;&lt;img src="http://media.tumblr.com/tumblr_ly0r8ndKXb1qz4vbw.png"/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/uzxIooHDfFw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/uzxIooHDfFw/16086294818</link><guid isPermaLink="false">http://eddology.com/post/16086294818</guid><pubDate>Wed, 18 Jan 2012 16:13:00 -0800</pubDate><category>rdf</category><category>writing</category><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/16086294818</feedburner:origLink></item><item><title>Writing style in ClojureScript</title><description>&lt;p&gt;Matt Might’s &lt;a href="http://matt.might.net/articles/shell-scripts-for-passive-voice-weasel-words-duplicates/"&gt;shell scripts for checking writing style&lt;/a&gt; are simple and effective, as is Benjamin Beckwith’s port of them to &lt;a href="https://github.com/bnbeckwith/writegood-mode"&gt;an Emacs mode&lt;/a&gt;. They pick up on some common defects in technical writing, such as use of the passive voice, &lt;a href="http://en.wikipedia.org/wiki/Weasel_word"&gt;weasel words&lt;/a&gt; and lexical illusions (inadvertent repetition of words.) &lt;/p&gt;
&lt;p&gt;As a fun exercise, I decided to port this code to a variety of languages. To start with, I chose ClojureScript. I’d ultimately like to get to the point where I could create a bookmarklet or browser extension for checking my style when writing prose straight into the web browser.&lt;/p&gt;
&lt;p&gt;My project’s called &lt;strong&gt;Wascal&lt;/strong&gt;, and it’s the perfect way to eliminate those wascally weasel words, passive voice and duplicate words from your writing. &lt;a href="https://github.com/edumbill/wascal/tree/master/clojurescript"&gt;Check out the code here on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here’s a screenshot of the Wascal in action. Below that I’ll present several observations about ClojureScript, discovered while writing the code&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lxg12oVMAt1qz4vbw.png"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A few observations&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ClojureScript’s regular expression support is that of JavaScript’s, as opposed to the Java regular expressions used by Clojure. This is fine, but you’ll need to hunt down a decent reference to them on the web—which turns out to be hard. Most material with a high Google ranking omits to mention the use of &lt;code&gt;\1&lt;/code&gt;, &lt;code&gt;\2&lt;/code&gt; etc for back-references in matching expressions, and also that, in substitution expressions, &lt;code&gt;$&amp;&lt;/code&gt; is the back-reference for the whole matched expression.&lt;/p&gt;
&lt;p&gt;ClojureScript’s default library for manipulating the DOM comes from Google Closure. While I love the minification and dependency handling parts of Closure, it does not present a nice interface for manipulating the DOM. Fortunately a variety of alternatives exist, none of which I’ve tried yet. The most promising to me seems to be Chris Granger’s &lt;a href="https://github.com/ibdknox/pinot"&gt;pinot&lt;/a&gt;, wonderfully named as a complement to his &lt;em&gt;noir&lt;/em&gt; Clojure web framework.&lt;/p&gt;
&lt;p&gt;JavaScript interoperability is one of ClojureScript’s incredibly strong points, but will also always be a source of confusion for the beginner. For instance, in order to call the JavaScript &lt;code&gt;e.preventDefault()&lt;/code&gt; I had to write &lt;code&gt;(. e (preventDefault))&lt;/code&gt;, as opposed to &lt;code&gt;(.preventDefault e)&lt;/code&gt;. The latter returns the &lt;code&gt;preventDefault&lt;/code&gt; method itself, whereas the former invokes it.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/D89HS_mPN3M" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/D89HS_mPN3M/15464913233</link><guid isPermaLink="false">http://eddology.com/post/15464913233</guid><pubDate>Sat, 07 Jan 2012 11:54:00 -0800</pubDate><category>clojurescript</category><category>writing</category><category>style</category><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/15464913233</feedburner:origLink></item><item><title>Hands-on with Dart</title><description>&lt;p&gt;&lt;a href="http://www.dartlang.org/"&gt;Dart&lt;/a&gt; is a new programming language for the web, developed by Google. It’s intended to bring more structure to programming for the browser.&lt;/p&gt;
&lt;p&gt;To get a taste of Dart, I re-implemented my &lt;a href="http://eddology.com/post/14592579289/busy-persons-clojure"&gt;ClojureScript coin-tossing experiment&lt;/a&gt; in the language, learning as I went along. The &lt;a href="https://github.com/edumbill/coin-tosser/tree/master/dart"&gt;source code is on GitHub&lt;/a&gt;, take a quick look at it before reading my comments.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Coin toss experiment screenshot" src="http://media.tumblr.com/tumblr_lx2sl2E3ig1qz4vbw.png"/&gt;&lt;/p&gt;
&lt;h3&gt;Pre-alpha geekery&lt;/h3&gt;
&lt;p&gt;Before you read on, it’s worth noting that Dart and its associated tools are not even in alpha release. They’re changing all the time and bugs are an expected part of the experience. The point of evaluating it now is to get a glimpse of the future, not to see whether Dart’s something to use in your next production system.&lt;/p&gt;
&lt;p&gt;Dart, as currently experienced, compiles to JavaScript. The ultimate idea is that there’ll be a Dart interpreter in your browser, which will run Dart programs natively. The Dart team don’t foresee a Dart virtual machine, much in the same way that JavaScript doesn’t have a VM. Seen in one light, Dart and JavaScript interpreters are VMs themselves—this is already in evidence with languages like ClojureScript and CoffeeScript compiling down to JavaScript.&lt;/p&gt;
&lt;h3&gt;IDE from the get-go&lt;/h3&gt;
&lt;p&gt;Though it’s possible to use a command-line compiler, the Dart project pushes you strongly in the direction of using the Dart Editor. The editor itself is a specialized version of Eclipse. Despite not being an habitual IDE user, I had little trouble adjusting to the Dart Editor.&lt;/p&gt;
&lt;p&gt;The most valuable feature of using the IDE is the incremental compilation, which enables you to catch errors early on, especially if you use static types. Another advantage of using types is that it brings the IDE autocomplete into play.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Dart Editor screenshot" src="http://media.tumblr.com/tumblr_lx322gMPC61qz4vbw.png"/&gt;&lt;/p&gt;
&lt;h3&gt;Static and dynamic types&lt;/h3&gt;
&lt;p&gt;Dart solves the issue of whether to use static or dynamic types by letting you do both. I am having a tough time deciding whether this is the smartest thing ever, or too much power for mere mortals to wield. For example, I can declare a variable either as simply a &lt;em&gt;var&lt;/em&gt; or as an &lt;em&gt;int &lt;/em&gt;and work with it in the same way. Here are my initial thoughts.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Having types is great&lt;/strong&gt;. It lets me find more errors at compile-time. It reminds me of how productive I felt when I first started using C#. In fact, Dart has as much affinity with C# than as with Java in my mind.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not having types is great&lt;/strong&gt;. There are moments when a programmer finds themselves putting 80% of their effort into dealing with artificial class hierarchies than actually doing work. I can duck the question of which class or generic to use and get on with writing code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;This could get messy&lt;/strong&gt;. I hope those Dart guys know what they’re doing!&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;The more you can use types, the more errors you’ll catch before execution. Here’s a &lt;a href="http://www.dartlang.org/articles/optional-types/"&gt;fuller explanation&lt;/a&gt; of Dart’s optional type system.&lt;/p&gt;
&lt;h3&gt;Generics&lt;/h3&gt;
&lt;p&gt;I’m old and grumpy enough not to like generics very much. They &lt;a href="http://stackoverflow.com/questions/8169141/why-optional-typing-in-dart"&gt;raise a lot of questions&lt;/a&gt; and make programmers do more work than they need to. If you’re unlucky in which examples of Dart code you encounter first, you might run away screaming because of the similarity to Java generics.&lt;/p&gt;
&lt;p&gt;However, it’s not as bad as it looks. Dart’s optional typing manages a compromise that, though I don’t yet truly understand how it works, lets me apply as much strong typing as I need to avoid errors, without making me dance in circles trying to keep up with it.&lt;/p&gt;
&lt;p&gt;I’ll conclude my desperately unscientific analysis of Dart types by saying that they’re doing something clever that makes typing feel more natural and gets less in the way, but because I don’t understand it yet, I worry that it might explode in my face one day.&lt;/p&gt;
&lt;h3&gt;Classes and Interfaces&lt;/h3&gt;
&lt;p&gt;Dart isn’t prototype-based, like JavaScript. Instead, compound behaviors are achieved through classes and interfaces. Much like Java, an interface defines a contract that gets implemented by an actual class.&lt;/p&gt;
&lt;p&gt;This is probably the most confusing thing about Dart right now. For example, &lt;em&gt;List&lt;/em&gt; is an interface. But you can use it directly, because it has a default implementation, &lt;em&gt;Array&lt;/em&gt;. However, that’s really not clear to any newcomer just reading source that throws lists around.&lt;/p&gt;
&lt;p&gt;I was completely stumped as to how I’d go about adding behavior to a &lt;em&gt;List&lt;/em&gt;. As I wrote the coin-tossing example, I wanted &lt;em&gt;min()&lt;/em&gt; and &lt;em&gt;max()&lt;/em&gt; functions for my list items. I could extend the &lt;em&gt;List&lt;/em&gt; interface OK, but then I had absolutely no idea how to go about providing a default implementation for these new methods. In the end I plumped for writing my functions in a Util class.&lt;/p&gt;
&lt;p&gt;Mixins, or something similar, would be an ideal way to solve these kind of issues. Apparently they’re under consideration.&lt;/p&gt;
&lt;p&gt;As a side note, my being forced to use an auxiliary utility class mightn’t be a bad thing. This is one of the most pernicious things about object oriented programming, you get caught up trying to fit your code into its arcane strictures rather than getting things done.&lt;/p&gt;
&lt;p&gt;The two most valuable things Dart could add to &lt;em&gt;List&lt;/em&gt;, or its parent &lt;em&gt;Collection, &lt;/em&gt;would be &lt;em&gt;map()&lt;/em&gt; and &lt;em&gt;reduce()&lt;/em&gt; functions. &lt;/p&gt;
&lt;h3&gt;This ain’t JavaScript&lt;/h3&gt;
&lt;p&gt;While Dart seems really familiar to a JavaScript developer, there’s quite a lot of peace of mind to be had from knowing you don’t have to worry about the crazy bits of JavaScript semantics.&lt;/p&gt;
&lt;p&gt;One of the most-needed holes in JavaScript that Dart fills is string interpolation, e.g. &lt;em&gt;“Hello ${name}” &lt;/em&gt;does just what any Perl or PHP programmer would expect it to.&lt;/p&gt;
&lt;p&gt;Dart also involves a whole lot less boilerplate. Rather than&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function() { }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;for a closure, you can write&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;() { }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And one-line function definitions have a shorthand with &lt;code&gt;=&gt;&lt;/code&gt;, for example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bool toss() =&gt; Math.random() &lt; 0.5;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Though a little cryptic at first, there’s a great shortcut for constructors that do little more than initialize member variables.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Foo(this.bar, this.baz);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Interacting with the page&lt;/h3&gt;
&lt;p&gt;Dart are working on a browser API that’s more abstracted than the browser DOM, in much the same way that jQuery is. They’ve sensibly adopted the jQuery selector syntax, and it was easy to figure out how to add event handlers, e.g.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;document.query("#mybutton").on.click.add((e) =&gt; print('hi!'));&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Miscellaneous observations&lt;/h3&gt;
&lt;p&gt;Dart is hard to search for in Google right now, being a generic term. I found adding the word “language” to my searches did the right thing in most cases.&lt;/p&gt;
&lt;p&gt;The API docs badly need a search. Google’s &lt;a href="https://plus.google.com/118397406534237711570/about"&gt;Seth Ladd&lt;/a&gt; says it’s coming.&lt;/p&gt;
&lt;p&gt;It was frustrating not to have an interactive Dart console to play around with stuff. Dart’s going to need either this or a debugger as part of its 1.0 release.&lt;/p&gt;
&lt;h3&gt;Dart vs ClojureScript&lt;/h3&gt;
&lt;p&gt;As I’ve written this program in both Dart &lt;a href="https://github.com/edumbill/coin-tosser/tree/master/clojurescript"&gt;and ClojureScript&lt;/a&gt;, there are ways in which I find them contrasting.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;ClojureScript’s optimized code is much smaller than Dart’s.&lt;/li&gt;
&lt;li&gt;Dart’s browser API libraries being part of the core feels more natural than ClojureScript’s delegation to Google Closure.&lt;/li&gt;
&lt;li&gt;In ClojureScript I found it easier to focus on the problem I was trying to solve rather than the mechanics of object-orientation.&lt;/li&gt;
&lt;li&gt;In Dart, I really miss having a REPL.&lt;/li&gt;
&lt;li&gt;Dart’s IDE makes it easier to get started.&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Dart looks promising. It feels web-native, and manages to bring in the advantages of modular organization and static typing without sacrificing the flexibility of a dynamic language. Dart is fun to write, which is for me an important test of a programming language.&lt;/p&gt;
&lt;p&gt;As a pre-alpha technology, there’s a lot of flux and change in Dart right now. With Google’s backing, I give it a good chance of being a key part of web development in a few years’ time. If you want to have a say in Dart, or be a part of it, it’s a good time to start splashing around.&lt;/p&gt;
&lt;p&gt;Check out the &lt;a href="https://github.com/edumbill/coin-tosser/tree/master/dart"&gt;Dart source code for my coin-toss experiment&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more Dart news, follow these folk on Google+: &lt;a href="https://plus.google.com/118397406534237711570/posts"&gt;Seth Ladd&lt;/a&gt;, &lt;a href="https://plus.google.com/100798142896685420545/posts"&gt;Bob Nystrom&lt;/a&gt;, &lt;a href="https://plus.google.com/106846248004202631982/posts"&gt;Dart Bits&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/HezNL3iBkDg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/HezNL3iBkDg/15093437259</link><guid isPermaLink="false">http://eddology.com/post/15093437259</guid><pubDate>Sat, 31 Dec 2011 11:39:00 -0800</pubDate><category>programming</category><category>dart</category><category>google</category><category>web</category><category>javascript</category><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/15093437259</feedburner:origLink></item><item><title>A busy person's introduction to Clojure</title><description>&lt;p&gt;Have a few hours spare and fancy getting to know Clojure and ClojureScript?&lt;/p&gt;
&lt;p&gt;Sometimes all you need to get learning a new programming language is the right size problem. Nothing too trivial or too daunting. Fortunately, while reading NN Taleb’s book “The Black Swan”, I got a right-sized idea.&lt;/p&gt;
&lt;p&gt;Taleb describes a coin-tossing game you can play to derive a Gaussian distribution for yourself. If the coin lands heads, you win $1. If tails, you lose $1. After a suitable number of tosses, record your net winnings. Repeat this again some number of times. Plot the frequency of each final amount and you’ll find the familiar bell curve. (You can get a similar curve just by recording the number of heads, but it’s not as much fun without the highs and lows of gambling!)&lt;/p&gt;
&lt;p&gt;I decided to implement a simulation of this game in Clojure. And beyond that, to package it up in a way that other people can use, and then to use it as an example of how to create a ClojureScript application that runs in the browser.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of ClojureScript demo" src="http://media.tumblr.com/tumblr_lwj30qIgFZ1qz4vbw.png"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The coin toss demo running in ClojureScript&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Buckle up, the whole thing will take a few hours, but by the end you’ll have an idea of what a Clojure program looks like, and how they’re run and compiled. If you want to skip to the end result right now, check out &lt;a href="https://github.com/edumbill/coin-tosser"&gt;the coin-tosser source on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Install Clojure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I’m not going to reproduce installation instructions here, but you can &lt;a href="http://dev.clojure.org/display/doc/Getting+Started+for+Beginners"&gt;find them on the Clojure Wiki&lt;/a&gt;. You need Clojure and Leiningen installed. Leiningen, often referred to as “lein”, is an excellent build tool and dependency manager that most Clojure programmers use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This is a conversation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You really can’t learn a new language without trying to converse in it. We don’t figure out what a word means just because we’ve seen a definition, but because we’ve heard or seen it used in several contexts and can deduce a meaning and appropriate usage from that experience.&lt;/p&gt;
&lt;p&gt;The same goes for programming. As you read I’m guessing you’ll be doing the same things I was when I was writing: Googling for information, trying code samples out. I’ve tried to write this so it’ll work as a standalone article, but you’ll have much more fun if you use it as a source of starting points.&lt;/p&gt;
&lt;h3 id="clojure"&gt;Tackling the problem&lt;/h3&gt;
&lt;p&gt;I’m just a beginner: this article is simply the story of how I went about modeling the coin toss game, mixed in with things I’ve learned by reading about Clojure for a few months. I wrote most of the code interactively in the Clojure REPL, that is the interactive immediate execution mode of running Clojure. You can play with one of these online at &lt;a href="http://tryclj.com/"&gt;TryClojure&lt;/a&gt;, or fire one up yourself once Clojure is installed.&lt;/p&gt;
&lt;p&gt;I began by modeling the fundamental action in the game, the coin toss. To keep it simple, always a virtue, I decided to craft a function that returned &lt;em&gt;true&lt;/em&gt; for heads and &lt;em&gt;false&lt;/em&gt; for tails. The expression &lt;code&gt;(= 1 (rand-int 2))&lt;/code&gt; does just that. Here’s the function:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn coin-toss []
  (= 1 (rand-int 2)))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This expression defines a function, with &lt;em&gt;defn,&lt;/em&gt; that has no arguments, hence the empty parameter list &lt;em&gt;[].&lt;/em&gt; Run it repeatedly to convince yourself it works.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user=&gt; (coin-toss)
false
user=&gt; (coin-toss)
false
user=&gt; (coin-toss)
true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can experiment with unfair coins by altering the definition of &lt;em&gt;coin-toss&lt;/em&gt; to make a heads result more or less probable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Settling scores&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now we’ve got a coin, how much do we win in each round? The rules of the game say we win a dollar for heads, and lose a dollar for tails.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn toss-score [toss]
  (if toss 1 -1))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The result of the coin toss is passed as a parameter, and the value of the function is the winnings. Clojure’s &lt;em&gt;if&lt;/em&gt; expression simply takes the first value if the passed expression is truthy, or the second value if it’s falsey.&lt;/p&gt;
&lt;p&gt;Truthy? Falsey? As with many programming languages, values other than the Boolean &lt;em&gt;true&lt;/em&gt; or &lt;em&gt;false&lt;/em&gt; can be used in a boolean context in Clojure. To put it simply &lt;em&gt;false&lt;/em&gt; and &lt;em&gt;nil&lt;/em&gt; are falsey, and everything else is truthy.&lt;/p&gt;
&lt;p&gt;Let’s check we get the expected results.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user=&gt; (toss-score true)
1
user=&gt; (toss-score false)
-1
user=&gt; (toss-score (coin-toss))
-1
user=&gt; (toss-score (coin-toss))
1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Repeat offender&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Unregenerate gamblers that we are, we’re going to be tossing that coin more than once. Clojure’s &lt;em&gt;repeatedly&lt;/em&gt; is the ideal way.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user=&gt; (repeatedly 5 coin-toss)
(true true false false true)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What we get back is a list of results. It’s also a &lt;em&gt;seq&lt;/em&gt;. A variety of data structures in Clojures are &lt;a href="http://clojure.org/sequences"&gt;&lt;em&gt;seq&lt;/em&gt;s&lt;/a&gt;, such as vectors, lists and hashmaps. It’s a basic interface for sequence types.&lt;/p&gt;
&lt;p&gt;Of course, we don’t care as much about the results as how much money we’re getting from them. So, let’s count our net winnings.&lt;/p&gt;
&lt;p&gt;The net winnings are the total of each individual winning. First, we want to calculate those individual winnings by applying our &lt;em&gt;toss-score&lt;/em&gt; to the result. Try this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user=&gt; (map toss-score [true false true])
(1 -1 1)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;em&gt;map&lt;/em&gt; function applies another function to a collection repeatedly, returning a sequence of the results. Now, we need to total them with our friend &lt;em&gt;reduce&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user=&gt; (reduce + [1 -1 1])
1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You’ve probably figured out that &lt;em&gt;reduce&lt;/em&gt; applies a two-argument function to a collection in order, taking the result of the previous calculation as one of the arguments along with the next item in sequence. In the example above, it’s performing the calculation &lt;em&gt;(+ (+ 1 -1) 1).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A little digression on syntax: you’re probably also wondering why I’m using square brackets, Clojure’s notation for vectors, instead of parentheses above. The short answer is that parentheses tell Clojure to treat the first item in the list as a function and the rest as arguments. Try &lt;em&gt;(reduce + (1 -1 1))&lt;/em&gt; and you’ll get an error message. If you want to use a list, write it as &lt;em&gt;(list 1 2 3)&lt;/em&gt; or in the quoted form &lt;em&gt;‘(1 2 3)&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Let’s put this all together and formulate our function for scoring a run of coin tosses.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn count-winnings [results]
  (reduce + (map toss-score results)))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It’s easy enough to test out and get some sample scores.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user=&gt; (count-winnings (repeatedly 5 coin-toss))
-3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, it’s going to be a chore to write all those &lt;em&gt;repeatedly&lt;/em&gt; expressions out, so we’ll define a function that says what we actually mean: find the winnings from an experiment with a specific sample size.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn sample-score [n]
  (count-winnings (repeatedly n coin-toss)))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Creating all these small functions might not be strictly necessary, but they provide a clarity to the program. I prefer to be working in terms of what the code &lt;em&gt;means&lt;/em&gt; rather than what it &lt;em&gt;does&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Run and run and run&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We’ve now got enough machinery to run a coin-toss game. In order to gather results, we’d like to run the game repeatedly. Again, it’s about as simple as writing down what we mean.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn sample-scores [n m]
  (repeatedly n #(sample-score m)))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What’s with the &lt;em&gt;#()&lt;/em&gt;? It’s Clojure shorthand for creating an anonymous function. We could have written the following instead.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(repeatedly n (fn [] (sample-score m)))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let’s run 20 games of 100 tosses each.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user=&gt; (sample-scores 20 100)
(8 18 -10 2 -6 14 2 0 10 -6 20 0 -4 6 -12 0 2 -12 -6 10)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The final part of the exercise is to count up how many times we get specific results, and chart them. We’ll use a &lt;a href="http://clojuredocs.org/clojure_core/clojure.core/hash-map"&gt;hash-map&lt;/a&gt; to store this frequency table. Let’s say we got $0 six times, $-2 twice and $2 four times, we’d end up with a map like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{0 6, -2 2, 2 4}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We’re going to look through the scores and do something with each one. As this isn’t just a straight transformation of the list, it’s a clue that we could use &lt;em&gt;reduce&lt;/em&gt; as part of our solution. We’re going to start off with an empty map &lt;code&gt;{}&lt;/code&gt;, and end up with one full of frequency counts. The function we’ll pass to &lt;em&gt;reduce&lt;/em&gt; should take the map as its first argument, along with a score, and then return an updated map. Let’s imagine what this might look like.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user=&gt; (reduce tally-score {} [8 18 -10 2 -6 14 2 0 10 -6 20 0 -4 6 -12 0 2 -12 -6 10])
{0 3, 2 3, -4 1, -6 3, 6 1, 8 1, -10 1, 10 2, -12 2, 14 1, 18 1, 20 1}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now we just need to figure out the mechanics of &lt;em&gt;tally-score&lt;/em&gt;. There are two scenarios to handle for each score.&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;If the results map has a key for the score we’re processing, we must increment the corresponding value by 1.&lt;/li&gt;
&lt;li&gt;If the result map has no key for the score, we need to add the key with the value set to 1.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;These scenarios can be handled with the following code, assuming &lt;em&gt;results&lt;/em&gt; contains the results map, and &lt;em&gt;score&lt;/em&gt; is the current score we’re processing.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(if-let [prev-count (results score)]
  (assoc results score (inc prev-count))
  (assoc results score 1)))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here’s a chance to use a few new Clojure features:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;em&gt;(results score)&lt;/em&gt; looks up the key &lt;em&gt;score&lt;/em&gt; in the hash-map &lt;em&gt;results&lt;/em&gt;. In Clojure, maps are functions. You pass the key, and you get the value. For example, evaluating &lt;code&gt;({1 "one", 2 "two"} 1)&lt;/code&gt; yields &lt;code&gt;"one"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;if-let&lt;/em&gt; performs the bindings in the square brackets, and if they’re all true evaluates the first expression, else the second.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;assoc&lt;/em&gt; returns an updated map with the key-value pair passed as arguments&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;I typically define these little fragments of code in the REPL and then put them together into a function when I’ve figured out how it should work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tally ho!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Putting together the above tallying process, we can create a function that took a seq of scores and returned a map of frequencies.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn tally-scores [scores]
  (let
      [tally-score (fn [results score]
                     (if-let [prev-count (results score)]
                       (assoc results score (inc prev-count))
                       (assoc results score 1)))]
    (reduce tally-score {} scores)))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Because we don’t need &lt;em&gt;tally-score&lt;/em&gt; anywhere outside of this function, I’ve declared it with &lt;em&gt;let&lt;/em&gt;, which makes it visible only inside the scope of the &lt;em&gt;let&lt;/em&gt; expression. This example also gives you a clue to what you may have suspected by now, that (&lt;em&gt;defn foo []…) &lt;/em&gt;is shorthand for &lt;em&gt;(def foo fn [] (…))&lt;/em&gt;. To make it even more concise, we could use &lt;em&gt;&lt;a href="http://clojuredocs.org/clojure_core/clojure.core/letfn"&gt;letfn&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Let’s try a sample run.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user=&gt; (tally-scores (sample-scores 100 20))
{0 15, -2 18, 2 17, -4 19, 4 8, -6 9, 6 5, -8 2, 8 3, 10 3, 12 1}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hooray!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Off the charts&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To make the bell curve apparent, we can use time-honored basic ASCII art. For each score, we can use a string of asterisks to represent its length. Let’s try with 10.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user=&gt; (repeat 10 "*")
("*" "*" "*" "*" "*" "*" "*" "*" "*" "*")&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Great, but that’s a seq of strings, not a string of 10 asterisks. Fortunately, we can use &lt;em&gt;join&lt;/em&gt;. This function lives in the &lt;em&gt;clojure.string&lt;/em&gt; namespace. Until now we’ve only be using functions from the core namespace. So, we’ll grab &lt;em&gt;join&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user=&gt; (use '[clojure.string :only (join)])
nil
user=&gt; (join (repeat 10 "*"))
"**********"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We can use this in a function &lt;em&gt;chart-line&lt;/em&gt;, which we’ll use to represent a line in our chart. Because we want to plot a continuous axis of the scores, we need to allow that our results tally map might have no value for certain scores, so &lt;em&gt;chart-line&lt;/em&gt; needs to accommodate a &lt;em&gt;nil&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn chart-line [tally val]
  (str val
       "\t"
       (if-let [c (tally val)]
         (join (repeat c "*")))))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Concatenating strings in Clojure is done by passing them as arguments to &lt;em&gt;str&lt;/em&gt;. To finish, we’ll create the whole chart. For every score, we want a line of asterisks representing the frequency. This is a task for &lt;em&gt;map&lt;/em&gt;. To create every chart line, we want something like the following.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(map chart-line (range lowest-value highest-value))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After a bit of tinkering to get a good-looking graph, this is what I came up with.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn chart-lines [scores]
  (let [tally (tally-scores scores)
        low (apply min (keys tally))
        high (apply max (keys tally))
        r (inc (max (Math/abs low) high))
        chart-line (fn [val]
                     (str val
                          "\t"
                          (if-let [c (tally val)]
                            (join (repeat c "*")))))]
    (map chart-line (range (- r) (inc r)))))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can see I decided I wanted my graph with 0 in the middle, so did a bit of calculation to get there. The interesting construct that you’ve not seen before in this function is &lt;em&gt;apply&lt;/em&gt;, which simply applies a function to a seq of arguments. In other words, these two are equivalent:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;(apply min [1 2 3 4])&lt;/code&gt; and &lt;code&gt;(min 1 2 3 4)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You’re probably also concerned about &lt;em&gt;Math/abs&lt;/em&gt;. Because Clojure is based on the JVM, we have all of Java at our disposal. Here we’re borrowing the &lt;em&gt;abs&lt;/em&gt; function from &lt;em&gt;java.lang.Math&lt;/em&gt;. Let’s not worry too much about that now, as this is the only Java we bring in.&lt;/p&gt;
&lt;p&gt;Let’s run this, and join up each line with a carriage return to get something pretty.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user=&gt; (println (join "\n" (chart-lines (sample-scores 50 10))))
-7	
-6	**
-5	
-4	*****
-3	
-2	************
-1	
0	**********
1	
2	*************
3	
4	*****
5	
6	***
7	
nil&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ta-da! The bell curve. Or something a bit like it. Mission accomplished. One final function to make this easier to run, and we can try as many sample sizes as we like.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn chart-scores [scores]
  (println (join "\n" (chart-lines scores))))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Tinker time&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you followed along and want some easy places to start fiddling, try the following exercises.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;What if the coin was unfair, and returned tails twice as often as heads?&lt;/li&gt;
&lt;li&gt;Would you get the same graph if you only counted the number of heads results?&lt;/li&gt;
&lt;li&gt;Adjust the program to count only heads, and alter the charting range so it looks pretty again.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;There are a couple of fundamental Clojure concepts that I’ve not really touched, and if you want to at least bluff your way as Clojure-credible, then you should learn about these.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Lazy_evaluation"&gt;Laziness&lt;/a&gt;, the idea of not evaluating expressions until they’re needed, and&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojure.org/functional_programming#Functional%20Programming--Recursive%20Looping"&gt;tail recursion&lt;/a&gt;, the way you loop.&lt;/li&gt;
&lt;/ul&gt;&lt;h3 id="smart"&gt;Get smart&lt;/h3&gt;
&lt;p&gt;Now we’ve got a bunch of code that works, let’s figure out how to make  this into a program that anybody else can use. There are few things that help make look Clojure code smart enough to go out in public.&lt;/p&gt;
&lt;p&gt;The first of these is &lt;em&gt;namespaces&lt;/em&gt;. As hinted earlier when we looked at &lt;em&gt;clojure.string/join&lt;/em&gt;, Clojure lets you organize functions by placing them in a namespace. This stops them stomping on  top of other functions with the same name. Because I’m a Brit with a schoolboy sense of humor, I picked the namespace &lt;em&gt;tosser&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Second, though Clojure doesn’t mandate a certain directory hierarchy in the same way Java does, there’s a convention most people adopt that helps things stay readable.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href="https://github.com/edumbill/coin-tosser/tree/master/clojure"&gt;the source code&lt;/a&gt; for the experiment we just developed. You’ll see a Leiningen &lt;em&gt;project.clj&lt;/em&gt; file in the root, and then the source tucked away in a directory corresponding to the namespace I decided to use, &lt;em&gt;tosser&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Third, in order to make our coin tossing system usable outside of the Clojure REPL, we need to write a “main” entry point that will take command-line arguments and run the experiment in response.&lt;/p&gt;
&lt;p&gt;You can find the source in &lt;a href="https://github.com/edumbill/coin-tosser/blob/master/clojure/src/tosser/main.clj"&gt;main.clj&lt;/a&gt;, but here’s the essence.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn -main
  "Main entry point"
  [repetitions sample-size]
  (chart-scores (sample-scores (Integer/parseInt repetitions)
                               (Integer/parseInt sample-size))))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notice we’re using &lt;em&gt;&lt;a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#parseInt(java.lang.String)"&gt;java.lang.Integer.parseInt&lt;/a&gt;&lt;/em&gt; to conver the string argument from the command line. Don’t forget that Clojure is a typed language, even though it’s dynamic and doesn’t require type declarations.&lt;/p&gt;
&lt;p&gt;The declaration &lt;code&gt;:main tosser.main&lt;/code&gt; in &lt;a href="https://github.com/edumbill/coin-tosser/blob/master/clojure/project.clj"&gt;project.clj&lt;/a&gt; tells the compiler, via Leiningen, which namespace contains the main function of the program.&lt;/p&gt;
&lt;p&gt;Once you’ve built the code with &lt;code&gt;lein compile&lt;/code&gt; you can invoke it via &lt;code&gt;lein run&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ lein compile
Copying 1 file to /Users/edd/work/git/coin-toss/clojure/lib
Compiling tosser.main
Compilation succeeded.
$ lein run 50 10
-7	
-6	***
-5	
-4	*********
-3	
-2	**********
-1	
0	**************
1	
2	*********
3	
4	*****
5	
6	
7	&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you want to understand what’s going on at the Java level here, you can also run the program like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ java -cp ./classes:lib/clojure-1.3.0.jar tosser.main 50 10&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you want to hand your program to somebody else, regardless of whether they’ve installed Clojure, use &lt;em&gt;lein uberjar&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ lein uberjar
Cleaning up.
Copying 1 file to /Users/edd/work/git/coin-toss/clojure/lib
Created /Users/edd/work/git/coin-toss/clojure/tosser-1.0.0.jar
Including tosser-1.0.0.jar
Including clojure-1.3.0.jar
Created /Users/edd/work/git/coin-toss/clojure/tosser-1.0.0-standalone.jar&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The program can now be run like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ java -jar tosser-1.0.0-standalone.jar 200 20&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you’re going to check your code into source control, be sure to ignore the &lt;em&gt;classes&lt;/em&gt; and &lt;em&gt;lib&lt;/em&gt; directories that Leiningen generates.&lt;/p&gt;
&lt;p&gt;And that’s about all there is to it. Welcome to computer programming, circa 1995. In the next section, we’ll move into the web age a little.&lt;/p&gt;
&lt;h3 id="clojurescript"&gt;Getting webby with it: ClojureScript&lt;/h3&gt;
&lt;p&gt;ClojureScript is a Clojure-like language that compiles to JavaScript. I say “Clojure-like” because ClojureScript isn’t Clojure. It’s a lot more like Clojure than JavaScript is like Java, but &lt;a href="https://github.com/clojure/clojurescript/wiki/Differences-from-Clojure"&gt;they’re not the same&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, it’s easy enough to port across our Clojure program to give ourselves a first taste of running ClojureScript. It also makes the coin-tossing experiment feel a lot more interactive!&lt;/p&gt;
&lt;p&gt;If you browse &lt;a href="https://github.com/edumbill/coin-tosser/tree/master/clojurescript"&gt;through the source&lt;/a&gt; of the ClojureScript coin-toss experiment, you’ll find it much the same. However, there are a few things to notice.&lt;/p&gt;
&lt;p&gt;Firstly, reinforcing the point that it’s a different language, the source code files have the suffix &lt;em&gt;.cljs&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Second, I’ve &lt;a href="https://github.com/edumbill/coin-tosser/blob/master/clojurescript/src/tosser/core.cljs#L41"&gt;marked functions&lt;/a&gt; that I want to be available to JavaScript with the &lt;code&gt;^:export&lt;/code&gt; notation.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn ^:export chart-lines
  "Given a list of scores, create a simple ASCII frequency graph"
  [scores] ... )&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The ClojureScript build process uses JavaScript “minification” for compression. The &lt;code&gt;export&lt;/code&gt; metadata tells the compiler to leave the name of that function alone, so it’s callable from outside the ClojureScript program.&lt;/p&gt;
&lt;p&gt;Third, you might be quietly fretting about the small bit of Java we call, &lt;em&gt;Math/abs&lt;/em&gt;. Obviously we’re not going to be calling Java from this program, so what gives? Instead, this is turned into a  JavaScript invocation. Fortuitously, JavaScript also has a  &lt;em&gt;Math.abs&lt;/em&gt; function that does exactly the same thing. We should really write &lt;code&gt;js/Math.abs&lt;/code&gt; to call the JavaScript object, but ClojureScript does “the right thing” for built-in JavaScript objects like &lt;em&gt;Math&lt;/em&gt; and &lt;em&gt;RegExp&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How do we drive this thing?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;First, we need to compile the program. Thanks to our &lt;a href="https://github.com/edumbill/coin-tosser/blob/master/clojurescript/project.clj"&gt;project.clj definition&lt;/a&gt; and the &lt;a href="https://github.com/bartonj/lein-clojurescript"&gt;lein-clojurescript&lt;/a&gt; plugin, this is as simple as invoking &lt;code&gt;lein compile&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;ClojureScript compile to JavaScript. In order to run the program, we need to create an HTML page that will load the script and call it. &lt;a href="https://github.com/edumbill/coin-tosser/blob/master/clojurescript/tosser-dev.html"&gt;This page&lt;/a&gt; looks something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
  &lt;head&gt;&lt;title&gt;Coin Toss Demo&lt;/title&gt;
    &lt;script type="text/javascript" 
       src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"&gt;&lt;/script&gt;
    &lt;strong&gt;&lt;script type="text/javascript" src="out/goog/base.js"&gt;&lt;/script&gt;
    &lt;script type="text/javascript" src="tosser.js"&gt;&lt;/script&gt;&lt;/strong&gt;
    &lt;script type="text/javascript" src="ui.js"&gt;&lt;/script&gt;
    &lt;strong&gt;&lt;script type="text/javascript"&gt;
      goog.require('tosser.main');
    &lt;/script&gt;&lt;/strong&gt;
  &lt;/head&gt;
  ...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The important bits have been highlighted in bold. I’m also using &lt;a href="http://www.jquery.com/"&gt;jQuery&lt;/a&gt; as part of the demo, but you can ignore that for now. The three script elements achieve the following: they load in the Google Closure JS library, load in the compiled ClojureScript program, and loads our program’s namespace plus any of its dependencies.&lt;/p&gt;
&lt;p&gt;This is where it gets a bit silly. ClojureScript &lt;a href="https://github.com/clojure/clojurescript/wiki/Google-Closure"&gt;uses the Google Closure&lt;/a&gt; JavaScript library as a substrate. Yes, “Closure” is pronounced the same as “Clojure”. Just smile politely and move on.&lt;/p&gt;
&lt;p&gt;The namespace &lt;em&gt;tosser.main&lt;/em&gt; refers to that defined in  &lt;a href="https://github.com/edumbill/coin-tosser/blob/master/clojurescript/src/tosser/main.cljs"&gt;main.cljs&lt;/a&gt;. Rather than have a “main” entry point as we did for the command-line version, I created a new file with the entry point I want for my web page version. It defines a function &lt;em&gt;chart&lt;/em&gt; that we can call from JavaScript to get the ASCII chart.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(ns tosser.main
  (:require [tosser.core :as toss]
            [clojure.string :as string]))
(defn ^:export chart [m n]
  (string/join "\n" (toss/chart-lines (toss/sample-scores m n))))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ClojureScript doesn’t yet support Clojure’s &lt;em&gt;use&lt;/em&gt;, so we import things we want from other namespaces as part of our &lt;em&gt;ns&lt;/em&gt; declaration.&lt;/p&gt;
&lt;p&gt;To run the coin-tossing experiment from JavaScript, it’s as simple as calling &lt;em&gt;tosser.main.chart()&lt;/em&gt;. If we put the parameters into a form, as seen &lt;a href="http://media.tumblr.com/tumblr_lwj30qIgFZ1qz4vbw.png"&gt;in the screenshot&lt;/a&gt;, we can use jQuery to call the experiment when the user hits the submit button, and then write the results back into the page.&lt;/p&gt;
&lt;p&gt;Here’s what the &lt;a href="https://github.com/edumbill/coin-tosser/blob/master/clojurescript/ui.js"&gt;jQuery code to do that looks like&lt;/a&gt;, with the invocation to our ClojureScript highlighted. Note that we needed to convert string input to integers.  I could equally well have done that in ClojureScript in the definition of &lt;em&gt;chart&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$(document).ready(function(){
    $("form").submit(function(){
	var tosses = parseInt($("#tosses").val());
	var runs = parseInt($("#runs").val());
	$("#results").text(&lt;strong&gt;tosser.main.chart(runs, tosses)&lt;/strong&gt;);
	return(false);
    });
});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For a peek at how the ClojureScript program appears to JavaScript, pop open the JavaScript console from your web browser and evaluate a few things. Try this, for example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&gt; tosser.main.chart(20,5)
"-4	
-3	**
-2	
-1	*******
0	
1	*********
2	
3	**
4	"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When it comes to putting your web page live, you obviously don’t want a million little JavaScript files. Instead, you can recompile with optimizations to end up with just one file, &lt;em&gt;tosser.js&lt;/em&gt;. You then don’t have to load Google Closure or perform the &lt;code&gt;goog.require&lt;/code&gt; instruction either, as in &lt;a href="https://github.com/edumbill/coin-tosser/blob/master/clojurescript/tosser.html"&gt;tosser.html&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ lein compile '{:optimizations :simple}'
Compiling clojurescript in src ... compiled 2 files to out/ and 'tosser.js' (took 40979 ms)
$ ls -l tosser.js
-rw-r--r--  1 edd  staff  383078 Dec 21 16:13 tosser.js&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However, 380k is hardly a small filesize for a simple program. Fortunately, we can specify &lt;code&gt;:advanced&lt;/code&gt; for optimizations too, which also minifies the resulting JavaScript. That makes it pretty useless for debugging, but gets the filesize down to 55k. If you use advanced optimization and you want to use jQuery, you’ll need to remember to use &lt;em&gt;&lt;a href="http://docs.jquery.com/Using_jQuery_with_Other_Libraries"&gt;jQuery.noConflict()&lt;/a&gt;&lt;/em&gt; for things to still work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So, that’s a bit messy!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There’s not actually any reason that I should have complicated my demonstration by using jQuery, except for that I’ve spent the last three years exclusively using jQuery for my JavaScript and it felt a comfortable place to be.&lt;/p&gt;
&lt;p&gt;In fact, ClojureScript has enough in it for you to do all the things that jQuery can do using just ClosureScript and the Google Closure libraries. In that case, you may want to keep the &lt;a href="http://closure-library.googlecode.com/svn/docs/index.html"&gt;Closure Library API Documentation&lt;/a&gt; to hand.&lt;/p&gt;
&lt;p&gt;In keeping with the rather fluid nature of JavaScript, there’s also a third way. Instead of keeping your jQuery with your HTML files, you can call jQuery directly from your ClojureScript via the &lt;code&gt;js&lt;/code&gt; namespace. For example, the jQuery statement&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$("body").append("&lt;div&gt;hello&lt;/div&gt;");&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;could be rendered like this in ClojureScript&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(.append (js/jQuery "body") "&lt;div&gt;hello&lt;/div&gt;")&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;More idiomatically, we can use the &lt;code&gt;-&gt;&lt;/code&gt; (thread macro) from Clojure to chain functions in the same way jQuery does.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(-&gt; (js/jQuery "body")
    (.append "&lt;div&gt;hello&lt;/div&gt;")
    (.css "background-color" "red"))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So, pick your poison. For a new application, I’m inclined to try and stick with Google Closure and ClojureScript throughout, but jQuery has many riches that it would be a shame to ignore.&lt;/p&gt;
&lt;h3&gt;In conclusion&lt;/h3&gt;
&lt;p&gt;I hope you’ve enjoyed the high-speed romp through Clojure and ClojureScript. I find Clojure to be an enjoyable and natural way of programming.&lt;/p&gt;
&lt;p&gt;There’s plenty more to explore, but if you’ve followed along with this project you’ll have a decent grounding.  Feel free to use the comments on this article to send questions, bug reports and improvements.&lt;/p&gt;
&lt;p&gt;Finally, I recommend picking up a copy of &lt;a href="http://joyofclojure.com/"&gt;The Joy of Clojure&lt;/a&gt; as well. It’s a good read, quite often challenging, but written by people who really enjoy the language.&lt;/p&gt;
&lt;p&gt;All the source code for programs developed in this article is &lt;a href="https://github.com/edumbill/coin-tosser"&gt;available on GitHub&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/oJutf4LbIqo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/oJutf4LbIqo/14592579289</link><guid isPermaLink="false">http://eddology.com/post/14592579289</guid><pubDate>Wed, 21 Dec 2011 17:37:00 -0800</pubDate><category>clojure</category><category>programming</category><category>clojurescript</category><category>jquery</category><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/14592579289</feedburner:origLink></item><item><title>The key to being a data-driven organization</title><description>&lt;p&gt;Let’s talk about being a data-driven organization. Becoming data-driven requires systemic change, where the data science is part of the feedback and decision loop of a business.&lt;/p&gt;
&lt;p&gt;However, many fewer people than we’d hope know how to use and understand data. Even simple concepts such as the difference between mean and median, or causation and correlation, can be hard to convey.&lt;/p&gt;
&lt;p&gt;So, maybe we should teach everyone about numbers? It worked for Google.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Abacus, from ansik on flickr" src="http://media.tumblr.com/tumblr_lw9x3nZgDJ1qz4vbw.jpg"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(photo credit: &lt;a href="http://www.flickr.com/photos/ansik/304526237/" target="_blank"&gt;ansik on flickr&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Numeracy’s not enough&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Even if it were possible, making everyone speak the language of numbers is not a recipe for success. Financial crashes tell us numeracy alone won’t save us. The wonderful thing about numbers is that we can use them to back up whatever plan we already decided to embark upon.&lt;/p&gt;
&lt;p&gt;It’s still the case that to achieve a data-driven organization, one where data science drives real product and business benefit, the organizational culture needs to be more quantitatively oriented. But we cannot pursue a “you must go away and understand numbers, then we can talk” approach. Unless rigorously enforced from the top-down, that’s not going to fly—nor is it sufficient.&lt;/p&gt;
&lt;p&gt;Something more collaborative is required, allowing communication across disciplinary boundaries. I’ve found that in software, the best way of having others understand what can be done is to have them work alongside you. You get domain expertise, and they get a feel for the medium.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Collaboration and exploration&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A practical and feasible way to achieve a goal of organizational numeracy is to create social, collaborative and exploratory tools and processes, which people can use to get the fingertip feel for the data without having too learn much ahead of time. This is advantageous in two main ways:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;em&gt;social and collaborative systems&lt;/em&gt; facilitate the two-way flow of domain and business expertise and feel for the data&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;em&gt;exploratory systems&lt;/em&gt; are able to constrain the tool to reduce the need for numeric expertise. We can create systems that guide exploration. It’s important not just to give bland reports, but to engage business users with the data by permitting experimentation and interactivity&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Batteries included—and humans are too&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Though useful, the phrase “data-driven” is an overstatement—it implies humans aren’t required. The ideal situation is when the data science &lt;em&gt;enables and augments human capability&lt;/em&gt;, and there’s a collaboration between the business owners and the number crunchers.&lt;/p&gt;
&lt;p&gt;The data-literate need not be frustrated that business doesn’t understand their language, but instead build directed tools to allow business to engage in their world. In turn, they will understand more about the business and be better able to meet its needs.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/zkBUkT3KHV0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/zkBUkT3KHV0/14288316193</link><guid isPermaLink="false">http://eddology.com/post/14288316193</guid><pubDate>Thu, 15 Dec 2011 17:41:00 -0800</pubDate><category>data science</category><category>business</category><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/14288316193</feedburner:origLink></item><item><title>Big data and data science: it's about the who and the how</title><description>&lt;p&gt;&lt;em&gt;(This post &lt;a href="https://plus.google.com/u/0/114723964985237592593/posts/1EzKzz9USVo"&gt;first published on Google+&lt;/a&gt;).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Two areas that I work in, “big data” and “data science”, both have somewhat nebulous definitions. As with many technology trends, they are neither wholly novel or well-defined. Many business analysts or statistical programmers will lay claim to doing what is characterized as data science, and managers of large BI (business intelligence) deployments will assert they’re handling big data.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is the point of such labels?&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;&lt;span&gt;The utility of the terms big data and data science does not lie in their watertight definition. Though many, including me, seek to both educate others and profit by defining labels, a clear ontology of a developing phenomenon is incorrect as soon as you publish it.&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span&gt;Beware the vaunted four Vs of big data (volume, velocity, variety and variability) for they will have little practical use outside of a consultant’s white paper. You do not buy a cow by specifying that you wish for a bovine ungulate that consumes monocotyledonous herbaceous plants. You want something that will produce milk and that will live on your farm.&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span&gt;Instead, the value of the terms is in highlighting a change in the &lt;/span&gt;&lt;strong&gt;who&lt;/strong&gt;&lt;span&gt; and &lt;/span&gt;&lt;strong&gt;how&lt;/strong&gt;&lt;span&gt;, a migration of technologies and practice into broader applicability.&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span&gt;In the case of &lt;/span&gt;&lt;em&gt;big data&lt;/em&gt;&lt;span&gt;, the web and social software mean that even modest businesses have large and expanding datasets on their hands. This was the sort of problem that only larger retailers or search engines found it profitable to face previously. Now—the change in “who”—anybody can use technology to process these large and messy datasets. This is thanks to commodity hardware, the open sourcing of projects like Hadoop, and on-demand cloud computing resource—the change in “how”.&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span&gt;For &lt;/span&gt;&lt;em&gt;data science&lt;/em&gt;&lt;span&gt;, the chance in “who” is in the spread of exploratory and entrepreneurial analysis, historically performed for example by physicists or investment industry quants, into a business and product context. Data scientists (or data science teams) embody domain knowledge, programming ability and mathematical aptitude. Rather than sectioning them behind the IT firewall, they are brought into the conversation of the business as a whole—a change in “how”.&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Feeding on themselves&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;&lt;span&gt;Another interesting aspect of both big data and data science is that, once started, they exhibit positive self-reinforcement. Organizations find that once Hadoop, for example, is in an organization it can be used in an increasing number of contexts. Such scalable computation is enabling many mobile and sensor applications that would previously have been impractical.&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span&gt;Likewise, data science as a phenomenon is self-reinforcing. Its existence and value within companies is causing its recognition not just as a compound skillset and job title, but also as a leading edge of the transformation of corporate culture. To be driven by data necessitates much cultural change: successful data science teams provide an example and learning ground for effecting such changes.&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Craze 2.0&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;&lt;span&gt;Inevitably, the terms &lt;/span&gt;&lt;em&gt;big data&lt;/em&gt;&lt;span&gt; and &lt;/span&gt;&lt;em&gt;data science&lt;/em&gt;&lt;span&gt; will be used by anybody wanting to jump on the bandwagon, for there is considerable financial value in these trends. Cloud, social software, web 2.0 all suffered a similar fate.&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span&gt;But behind the labels lie important changes in the way that we think about both computing and its place within organizations. Just don’t let anybody tell you they know exactly what big data or data science means!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;===&lt;/span&gt;&lt;/p&gt;
&lt;div class="io SD"&gt;
&lt;div class="vg"&gt;And to conclude, always be prepared for the data to show you that you’re not in the business you thought you were.&lt;/div&gt;
&lt;div class="vg"&gt;&lt;/div&gt;
&lt;div class="vg"&gt;&lt;a class="ot-anchor" href="http://xkcd.com/539/"&gt;&lt;a href="http://xkcd.com/539/"&gt;http://xkcd.com/539/&lt;/a&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="vg"&gt;&lt;/div&gt;
&lt;div class="vg"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;a href="http://xkcd.com/539/"&gt;&lt;img alt="Thanks XKCD" src="http://imgs.xkcd.com/comics/boyfriend.png" width="600"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="Jm"&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/m74TeLBupf8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/m74TeLBupf8/14173980788</link><guid isPermaLink="false">http://eddology.com/post/14173980788</guid><pubDate>Tue, 13 Dec 2011 10:48:00 -0800</pubDate><category>big data</category><category>data science</category><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/14173980788</feedburner:origLink></item><item><title>"The first problem for all of us, men and women, is not to learn, but to unlearn"</title><description>“The first problem for all of us, men and women, is not to learn, but to unlearn”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="http://womenshistory.about.com/cs/quotes/a/qu_g_steinem.htm"&gt;Gloria Steinem&lt;/a&gt;&lt;/em&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/u3K1UHZujo8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/u3K1UHZujo8/10334186969</link><guid isPermaLink="false">http://eddology.com/post/10334186969</guid><pubDate>Sat, 17 Sep 2011 15:59:00 -0700</pubDate><category>learning</category><category>wisdom</category><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/10334186969</feedburner:origLink></item><item><title>Webapp review: Checkvist outliner and checklist editor</title><description>&lt;p&gt;&lt;a href="http://checkvist.com/"&gt;Checkvist&lt;/a&gt; is an online outliner, similar to applications such as OmniOutliner on the Mac.&lt;/p&gt;
&lt;p&gt;Fundamentally, you can use it to create hierarchical outlines. Checkvist has a lot of extra bells and whistles that facilitate its use for basic project management. Items can be assigned to other users, given due dates, and have annotations from members of your team. You can also tag an item with a hashtag.&lt;/p&gt;
&lt;p&gt;None of those fetaures get in the way of straightforward outlining, however. Plentiful keyboard shortcuts mean you can use Checkvist to quickly set down your thoughts without having to pause to hunt and click with the mouse. The use of shortcuts is so extensive in fact that users of the &lt;em&gt;vi&lt;/em&gt; editor will feel quite at home!&lt;/p&gt;
&lt;p&gt;Crucially for a web app, Checkvist speaks the standard file format of its genre, in this case OPML. You can both import and export OPML. Other import formats include plain text and Confluence Wiki syntax. Those formats are supported for export, along with simple HTML.&lt;/p&gt;
&lt;p&gt;Printing is also well supported through an HTML view that gives you the options of hiding or showing the checkboxes and notes.&lt;/p&gt;
&lt;p&gt;Most of the functionality is available for free, but you need a Pro account to unlock the groupware features and advanced tag management. Along with that, Pro gives you HTTPS access, backups and UI customization. The Pro subscription is $15 for 6 months.&lt;/p&gt;
&lt;p&gt;Checkvist’s UI is clean and functional, though a little ugly to my eye. A Pro subscription lets you tweak the UI some, or you could install a browser extension similar to &lt;a href="https://chrome.google.com/webstore/detail/oiaejidbmkiecgbjeifoejpgmdaleoha"&gt;Stylebot&lt;/a&gt; and do it yourself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The low-down&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Checkvist is a capable outliner program. You may or may not want to use it for project management in addition, but it’s worth a look as a entry-level groupware. If you’re just a casual maker of lists, then look no further.&lt;/p&gt;
&lt;p&gt;Checkvist is also available &lt;a href="https://chrome.google.com/webstore/detail/apklolmmlgeokkgagnijjfcciliijmoh"&gt;in the Chrome web store&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lr1digDu081qz4vbw.png"/&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/ujYR9PBJ3es" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/ujYR9PBJ3es/9825527764</link><guid isPermaLink="false">http://eddology.com/post/9825527764</guid><pubDate>Sun, 04 Sep 2011 23:32:00 -0700</pubDate><category>review</category><category>webapp</category><category>checkvist</category><category>outliner</category><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/9825527764</feedburner:origLink></item><item><title>Two business book reviews: Blueprint to a Billion and the Five Dysfunctions of a Team</title><description>&lt;p&gt;I’ve been able to do a fair bit of reading this holiday weekend. I posted a couple of mini-book reviews up on my Google+ feed. Click through to the reviews below.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://plus.google.com/u/0/114723964985237592593/posts/79b6TA34N43"&gt;Blueprint to a Billion&lt;/a&gt; — by observation of successful companies, David Thomson has distilled seven practices that all of them had in common. Great reminder of good business sense.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://plus.google.com/u/0/114723964985237592593/posts/ZPyQtf3VBA4"&gt;The Five Dysfunctions of a Team&lt;/a&gt; — through the telling of a story, Patrick Lencioni illustrates the ways in which teams need to function to all work together to a common goal.&lt;/p&gt;
&lt;p&gt;Picking business books can be hard, there are so many, but both of these are easy to read and will leave you with some principles to learn from.&lt;/p&gt;
&lt;p&gt;&lt;a title="View this book on Google Books" href="http://books.google.com/books?id=naFYAA4Vi9YC"&gt;&lt;img src="http://media.tumblr.com/tumblr_lr0yvyY8LW1qz4vbw.jpg"/&gt;&lt;/a&gt; &lt;a title="View this book on Google Books" href="http://books.google.com/books/about/The_Five_Dysfunctions_of_a_Team.html?id=iC-NUBtuGeQC"&gt;&lt;img src="http://media.tumblr.com/tumblr_lr0yw8eoQ51qz4vbw.jpg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/7FX_b-lZ-C0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/7FX_b-lZ-C0/9813716931</link><guid isPermaLink="false">http://eddology.com/post/9813716931</guid><pubDate>Sun, 04 Sep 2011 18:03:00 -0700</pubDate><category>book</category><category>review</category><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/9813716931</feedburner:origLink></item><item><title>Software development completely in the cloud</title><description>&lt;p&gt;We’ve passed an important landmark in software development. Using only a browser, it’s now possible to develop, debug and deploy software in the cloud.&lt;/p&gt;
&lt;p&gt;To prove it, I spent a few hours today teaching myself how. Using just my Chromebook I wrote, tested and deployed a simple Node.js program using Cloud 9 IDE, Heroku and github.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://cloud9ide.com/"&gt;Cloud 9&lt;/a&gt;, based in Amsterdam and San Francisco, just received their Series A funding and are growing fast. Their product is maturing quickly: the Heroku support was just added, for example. Cloud 9 is available as both a hosted service and an open source project.&lt;/p&gt;
&lt;p&gt;If you wish to use Cloud9’s debugger, then at the moment you must restrict yourself to JavaScript applications using Node.js. The IDE supports host of other languages though, including Ruby, PHP and Python.&lt;/p&gt;
&lt;p&gt;I was able to set up a one-click deploy to Heroku. You can also deploy to Joyent’s servers.&lt;/p&gt;
&lt;p&gt;To find out more about Cloud 9, read this excellent article about &lt;a href="http://net.tutsplus.com/articles/why-cloud9-deserves-your-attention/"&gt;Why Cloud 9 Deserves Your Attention&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Below is a screenshot of Cloud 9 running on my Chromebook. It’s a little rough around the edges yet: documentation is a little lacking and at times it got confused making new files.&lt;/p&gt;
&lt;p&gt;This is seriously impressive work, though. I wouldn’t be surprised to see an acquisition by one of the larger cloud companies soon: Salesforce, Joyent or VMware seem obvious candidates.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lqz5zc5kRO1qz4vbw.png"/&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/8xS9mkT_4-U" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/8xS9mkT_4-U/9770768330</link><guid isPermaLink="false">http://eddology.com/post/9770768330</guid><pubDate>Sat, 03 Sep 2011 18:57:00 -0700</pubDate><category>cloud</category><category>programming</category><category>node</category><category>cloud9</category><category>ide</category><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/9770768330</feedburner:origLink></item><item><title>The Cloud9 web IDE running on my Chromebook</title><description>&lt;img src="http://30.media.tumblr.com/tumblr_lqz5u0t4Kp1qhrj4qo1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;The Cloud9 web IDE running on my Chromebook&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/dDk0O8k7YSk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/dDk0O8k7YSk/9769919337</link><guid isPermaLink="false">http://eddology.com/post/9769919337</guid><pubDate>Sat, 03 Sep 2011 18:37:12 -0700</pubDate><category>cloud9</category><category>node</category><category>ide</category><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/9769919337</feedburner:origLink></item><item><title>Are You A Victim Of Phantom Vibration Syndrome?</title><description>&lt;a href="http://www.fastcompany.com/1770237/are-you-a-victim-of-phantom-vibration-syndrome"&gt;Are You A Victim Of Phantom Vibration Syndrome?&lt;/a&gt;: &lt;blockquote&gt;
&lt;p&gt;Apart from habit, Phantom Vibration Syndrome is also about not being fully present. As much as we all believe we’re skilled multi-taskers, for the record, we’re not. Quite simply, we’re no longer fully present. By this I mean emotionally as opposed to physically. We think we are, we think we’re participating in the conversation, but in reality, we’re not.&lt;/p&gt;
&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/zwpTVOqUJJA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/zwpTVOqUJJA/8634174094</link><guid isPermaLink="false">http://eddology.com/post/8634174094</guid><pubDate>Sun, 07 Aug 2011 22:29:41 -0700</pubDate><category>enslaved</category><category>technology</category><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/8634174094</feedburner:origLink></item><item><title>AwayFind</title><description>&lt;a href="http://www.awayfind.com/index.php"&gt;AwayFind&lt;/a&gt;: &lt;p&gt;Interesting service&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Let us find your urgent messages. When you receive an urgent message, AwayFind will notify you via your mobile device, a voice call, IM, or even delegate the message to someone you specify.&lt;/p&gt;
&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/OrTDPbJ6gMo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/OrTDPbJ6gMo/8620884070</link><guid isPermaLink="false">http://eddology.com/post/8620884070</guid><pubDate>Sun, 07 Aug 2011 16:56:14 -0700</pubDate><category>email</category><category>productivity</category><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/8620884070</feedburner:origLink></item><item><title>"Just as cats have evolved to imitate the cries of newborn babies to insinuate their way into our..."</title><description>“Just as cats have evolved to imitate the cries of newborn babies to insinuate their way into our homes, so corporations have learned to affect the trappings of personhood to reach deeper into our social lives and conversations”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;A comment from &lt;a href="http://matt.me63.com/"&gt;Matt Edgar&lt;/a&gt; on a recent &lt;a href="https://plus.google.com/u/0/114723964985237592593/posts/BnEspZPUFJ3"&gt;Google+ post of mine&lt;/a&gt;&lt;/em&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/typ0YcK9lcI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/typ0YcK9lcI/7726344485</link><guid isPermaLink="false">http://eddology.com/post/7726344485</guid><pubDate>Sun, 17 Jul 2011 09:14:57 -0700</pubDate><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/7726344485</feedburner:origLink></item><item><title>Being a data-driven person</title><description>&lt;p&gt;I’m intrigued by the idea of being data-driven. Even more so by the frequent times that I fail to achieve it.&lt;/p&gt;
&lt;p&gt;If you read Steven Levy’s excellent history of Google, &lt;a href="http://www.stevenlevy.com/index.php/books/in-the-plex"&gt;In the Plex&lt;/a&gt;, you get the idea that few decisions are made in Google without data to back it up. As a geek, that had me shouting “Yes, I want that!” — here is a company that has apparently made good by the relentless application of analysis, combined with a clear basic mission.&lt;/p&gt;
&lt;p&gt;We are frequently exasperated by the decisions of others that defy what seems clear evidence: by governments, companies, our family members. As a nation and as a race, we remain stubborn in the face of stark medical research that smoking and drinking are harmful to us, that obesity places a burden on the national purse.&lt;/p&gt;
&lt;p&gt;Being data-driven sounds practical in a geek utopia like Google, but in real life even the most obvious of discoveries seems to have a minimal impact on our behavior. Public opinion and subjectivity can and do trump the evidence.&lt;/p&gt;
&lt;p&gt;All is not lost. The situation isn’t binary. Most people know smoking could kill them and steer clear. Data and its interpretation can help push the needle toward making better decisions, especially in closed systems such as companies.&lt;/p&gt;
&lt;p&gt;I will leave a discussion of becoming a data-driven company for another time. It’s going to form a big part of September’s &lt;a href="http://strataconf.com/"&gt;Strata&lt;/a&gt; conference. And it’s probably more easily done in a company than in the unconstrained wilds of our personal existence. But what about us as people?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Can a person be data-driven?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As humans we have the impulse to learn, to know. We’re &lt;a href="http://quantifiedself.com/"&gt;curious about ourselves&lt;/a&gt;, each other. We understand that knowing more can help us make better decisions. Looking at Google as a company, and how its products have contributed to our lives, we wonder whether we can ever be like that ourselves: finding our way through the distractions to achieving our goals.&lt;/p&gt;
&lt;p&gt;For me as a person, I now have a large amount of data which I did not have before. Thanks to my &lt;a href="http://www.fitbit.com/"&gt;Fitbit&lt;/a&gt;, I understand how active I’ve been, and I regularly track my weight. My inbox statistics, thanks to &lt;a href="http://www.sanebox.com/"&gt;SaneBox&lt;/a&gt;, let me understand my backlog, and &lt;a href="http://rescuetime.com/"&gt;RescueTime&lt;/a&gt; lets me know what I’ve been doing on my computer.&lt;/p&gt;
&lt;p&gt;Yet, with apologies to St. Paul, I still do not do the things I want to do, and I do the things I do not want to do.&lt;/p&gt;
&lt;p&gt;Just knowing isn’t enough. The whole self-improvement book market is testament to this fact. We need support, external motivators and coaching to attain our goals. In the corporate world, we call such things “consultants”, whose real role is in overcoming internal inertia, not in pointing out anything new.&lt;/p&gt;
&lt;p&gt;If knowing isn’t enough, it makes me wonder if we are truly happier and better off for knowing more. Ignorance is bliss, yet we are hard-wired with an instinct for discovery and self-analysis.&lt;/p&gt;
&lt;p&gt;I’ll close with what I think is the “secret” to it all. Our lives are steered by a crooked and crazy rudder. We have control, but the currents and tides are strong. The combination of our goals and data give us a course, but we still have to practice and learn to steer.&lt;/p&gt;
&lt;p&gt;By acclaiming and romanticizing our heroes, who make it all look so natural, we often miss the years of failure and practice it took them to achieve their goals.&lt;/p&gt;
&lt;p&gt;In this sense, knowing more isn’t enough. Failing more, and so learning more, is.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“If a thing is worth doing, it is worth doing badly.”&lt;/p&gt;
&lt;p&gt;— G.K. Chesterton&lt;/p&gt;
&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/Fd6KjNREG7M" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/Fd6KjNREG7M/7246753393</link><guid isPermaLink="false">http://eddology.com/post/7246753393</guid><pubDate>Mon, 04 Jul 2011 17:49:18 -0700</pubDate><category>data</category><category>productivity</category><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/7246753393</feedburner:origLink></item><item><title>"If Google offered a WordPress comment integration, I would give G  my comments in a heartbeat."</title><description>“If Google offered a WordPress comment integration, I would give G  my comments in a heartbeat.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;p&gt;&lt;strong&gt;+1&lt;/strong&gt; from me!&lt;/p&gt;
&lt;p&gt;More from Chris Brogan in &lt;a href="http://www.chrisbrogan.com/googleplus50/"&gt;The Google Plus 50&lt;/a&gt;&lt;/p&gt;&lt;/em&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/WAgdBisHMtc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/WAgdBisHMtc/7192171799</link><guid isPermaLink="false">http://eddology.com/post/7192171799</guid><pubDate>Sun, 03 Jul 2011 08:01:46 -0700</pubDate><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/7192171799</feedburner:origLink></item><item><title>R ecosystem continues to grow: CRdata is a web service for R</title><description>&lt;a href="http://crdata.org/"&gt;R ecosystem continues to grow: CRdata is a web service for R&lt;/a&gt;: &lt;p&gt;&lt;img height="272" width="372" src="http://crdata.org/images/_intro.jpg?1298446315"/&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddology/~4/gNgdZK0LaG0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/eddology/~3/gNgdZK0LaG0/7191908304</link><guid isPermaLink="false">http://eddology.com/post/7191908304</guid><pubDate>Sun, 03 Jul 2011 07:49:43 -0700</pubDate><author>edd@me.com (Edd Dumbill)</author><feedburner:origLink>http://eddology.com/post/7191908304</feedburner:origLink></item><language>en-us</language><copyright>Copyright Edd Dumbill</copyright><media:credit role="author">Edd Dumbill</media:credit><media:rating>nonadult</media:rating><media:description type="plain">Telling the story of our future, where technology is headed, and what we need to know now.</media:description></channel></rss>

