<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en" xml:base="http://untyped.com/untyping/wp-atom.php">
	<title type="text">Untyping</title>
	<subtitle type="text">Weblog of Untyped, software developers for internet, desktop and mobile.</subtitle>

	<updated>2011-10-20T14:17:49Z</updated>

	<link rel="alternate" type="text/html" href="http://untyped.com/untyping" />
	<id>http://untyped.com/untyping/feed/atom/</id>
	

	<generator uri="http://wordpress.org/" version="3.0">WordPress</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Untyping" /><feedburner:info uri="untyping" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
		<author>
			<name>Dave G</name>
						<uri>http://www.untyped.com</uri>
					</author>
		<title type="html"><![CDATA[The Circus is in Town]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Untyping/~3/PYGDGIj3Dxs/" />
		<id>http://untyped.com/untyping/?p=460</id>
		<updated>2011-10-20T14:17:49Z</updated>
		<published>2011-10-20T14:16:33Z</published>
		<category scheme="http://untyped.com/untyping" term="Code" /><category scheme="http://untyped.com/untyping" term="Front page" /><category scheme="http://untyped.com/untyping" term="Functional Programming" /><category scheme="http://untyped.com/untyping" term="Scala" /><category scheme="http://untyped.com/untyping" term="Web development" />		<summary type="html"><![CDATA[Following a couple of late caffeinated nights, we are pleased to announce that our latest project, Bigtop, is finally set for beta release! Bigtop is a collection of libraries for web developers. Included in the first beta release are: Bigtop Routes &#8211; a library for creating type-safe bidirectional mappings between URLs and Scala code; Bigtop Core [...]]]></summary>
		<content type="html" xml:base="http://untyped.com/untyping/2011/10/20/the-circus-is-in-town/">&lt;p&gt;Following a couple of late caffeinated nights, we are pleased to announce that our latest project, &lt;a href="http://bigtopweb.com"&gt;Bigtop&lt;/a&gt;, is finally set for beta release!&lt;/p&gt;
&lt;p&gt;Bigtop is a collection of libraries for web developers. Included in the first beta release are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://bigtopweb.com/routes"&gt;Bigtop Routes&lt;/a&gt; &amp;#8211; a library for creating type-safe bidirectional mappings between URLs and Scala code;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bigtopweb.com/routes"&gt;Bigtop Core&lt;/a&gt; &amp;#8211; a library for generating and manipulating URLs and hyperlinks in a functional style.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Routes uses the &lt;em&gt;HList&lt;/em&gt;-based approach to bidirectional pattern matching that Dave &lt;a href="http://untyped.com/untyping/2011/10/10/reading-writing-and-the-rest/"&gt;presented&lt;/a&gt; at &lt;em&gt;Scala Lift-Off London 2011&lt;/em&gt;. There are versions of the library for use with &lt;a href="http://liftweb.net"&gt;Lift&lt;/a&gt;, &lt;a href="https://github.com/scalatra/scalatra"&gt;Scalatra&lt;/a&gt;, and plain old Java servlets.&lt;/p&gt;
&lt;p&gt;Check the &lt;a href="http://bigtopweb.com"&gt;Bigtop&lt;/a&gt; web site for a getting started guide, API documentation, and links to the code and Maven repository.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Untyping/~4/PYGDGIj3Dxs" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://untyped.com/untyping/2011/10/20/the-circus-is-in-town/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://untyped.com/untyping/2011/10/20/the-circus-is-in-town/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://untyped.com/untyping/2011/10/20/the-circus-is-in-town/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Dave G</name>
						<uri>http://www.untyped.com</uri>
					</author>
		<title type="html"><![CDATA[Reading, Writing, and the REST]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Untyping/~3/PtP1U8XhPzs/" />
		<id>http://untyped.com/untyping/?p=454</id>
		<updated>2011-10-17T09:58:18Z</updated>
		<published>2011-10-10T15:44:03Z</published>
		<category scheme="http://untyped.com/untyping" term="Code" /><category scheme="http://untyped.com/untyping" term="Front page" /><category scheme="http://untyped.com/untyping" term="Functional Programming" /><category scheme="http://untyped.com/untyping" term="Scala" /><category scheme="http://untyped.com/untyping" term="Web development" />		<summary type="html"><![CDATA[I’ve just finished preparing the slides for my talk at Scala Lift-Off London 2011 next week. The title of the talk is A Route to the Three ‘R’s: Reading, Writing, and the REST. Read on for the abstract and a link to the slides!]]></summary>
		<content type="html" xml:base="http://untyped.com/untyping/2011/10/10/reading-writing-and-the-rest/">&lt;p&gt;I’ve just finished preparing the slides for my talk at &lt;a href="http://skillsmatter.com/event/scala/scala-lift-off-london-2011"&gt;Scala Lift-Off London 2011&lt;/a&gt; next week. The title of the talk is &lt;em&gt;A Route to the Three ‘R’s: Reading, Writing, and the REST&lt;/em&gt;. Here’s the abstract:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The mappings between URLs and code form an integral part of any web application. Many web frameworks help map from URLs to code, but the reverse mapping is often neglected, leaving developers to construct URLs via haphazard string manipulation. Furthermore, many frameworks do not match URLs in a type-safe manner.&lt;/p&gt;
&lt;p&gt;Scala provides all the tools we need to address this problem in a more comprehensive manner. In this talk we will walk through the creation of &lt;a href="http://bigtopweb.com/routes"&gt;Bigtop Routes&lt;/a&gt;, a bidirectional mapping library that is both type-safe and developer-friendly. We will pay particular attention to the ways in which Scala language features, such as flexible syntax, implicit conversions, and a touch of type-level programming, help to simplify the task at hand.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The slides and code samples are all available from my &lt;a href="https://github.com/davegurnell/scalalol-2011-talk"&gt;Github page&lt;/a&gt;. &lt;span style="text-decoration: line-through;"&gt;With any luck, the nice folks at Skills Matter will record the talk and post a video. If/when they do, I&amp;#8217;ll post the link here.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Skills Matter have posted a &lt;a href="http://skillsmatter.com/podcast/scala/reading-writing-rest"&gt;video of the talk&lt;/a&gt; on their web site!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Untyping/~4/PtP1U8XhPzs" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://untyped.com/untyping/2011/10/10/reading-writing-and-the-rest/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://untyped.com/untyping/2011/10/10/reading-writing-and-the-rest/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://untyped.com/untyping/2011/10/10/reading-writing-and-the-rest/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Noel</name>
						<uri>http://www.untyped.com/</uri>
					</author>
		<title type="html"><![CDATA[UU and You: Learn Some Opa]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Untyping/~3/EYEJw59F_aU/" />
		<id>http://untyped.com/untyping/?p=449</id>
		<updated>2011-09-01T07:43:27Z</updated>
		<published>2011-09-01T07:43:27Z</published>
		<category scheme="http://untyped.com/untyping" term="Uncategorized" />		<summary type="html"><![CDATA[We want to try something a bit more interactive with Untyped University, our preteniously titled training program. Instead of just posting papers to Mendeley we&#8217;re going to hangout on G+. This should allow for easy discussion with our peers, which is to say: you. For this session we&#8217;re going to hack on Opa. Normally we [...]]]></summary>
		<content type="html" xml:base="http://untyped.com/untyping/2011/09/01/uu-and-you-learn-some-opa/">&lt;p&gt;We want to try something a bit more interactive with &lt;a href="http://untyped.com/untyping/2011/01/10/the-university-of-untyped/"&gt;Untyped University&lt;/a&gt;, our preteniously titled training program. Instead of just posting papers to &lt;a href="http://www.mendeley.com/groups/771021/untyped-university/"&gt;Mendeley&lt;/a&gt; we&amp;#8217;re going to hangout on G+. This should allow for easy discussion with our peers, which is to say: you. &lt;/p&gt;
&lt;p&gt;For this session we&amp;#8217;re going to hack on &lt;a href="http://opalang.org/"&gt;Opa&lt;/a&gt;. Normally we read through a paper, but we think hacking will work better over the medium. The goal is not (necessarily) to write something useful in Opa but rather to understand it&amp;#8217;s model for web development. We&amp;#8217;re not seeking to advocate Opa, nor are we experts on the language.&lt;/p&gt;
&lt;p&gt;As G+ doesn&amp;#8217;t yet support organisations, get in touch with me (email noel at untyped, or message Noel Welsh on G+) and ask to be my UU circle. We&amp;#8217;ll be online on Friday 9 Sept from 13:37PM (+1 GMT), and will invite everyone in the circle to the hangout. See you there!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Untyping/~4/EYEJw59F_aU" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://untyped.com/untyping/2011/09/01/uu-and-you-learn-some-opa/#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://untyped.com/untyping/2011/09/01/uu-and-you-learn-some-opa/feed/atom/" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:origLink>http://untyped.com/untyping/2011/09/01/uu-and-you-learn-some-opa/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Noel</name>
						<uri>http://www.untyped.com/</uri>
					</author>
		<title type="html"><![CDATA[What is Hacker News Worth?]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Untyping/~3/Wq3ThEcVqds/" />
		<id>http://untyped.com/untyping/?p=444</id>
		<updated>2011-08-30T16:02:47Z</updated>
		<published>2011-08-30T16:02:47Z</published>
		<category scheme="http://untyped.com/untyping" term="Uncategorized" />		<summary type="html"><![CDATA[Twelve thousand hits, some thirty emails, and over a dozen new beta testers. That&#8217;s what happened when a blog post of ours spent ten hours on the Hacker News frontpage. It was definitely fun getting all that attention, despite the rush of traffic taking our little server off the web for a while. (Installing WP-Cache [...]]]></summary>
		<content type="html" xml:base="http://untyped.com/untyping/2011/08/30/what-is-hacker-news-worth/">&lt;p&gt;Twelve thousand hits, some thirty emails, and over a dozen new beta testers. That&amp;#8217;s what happened when &lt;a href="http://untyped.com/untyping/2011/02/11/stop-ab-testing-and-make-out-like-a-bandit/"&gt;a blog post of ours&lt;/a&gt; spent ten hours on the &lt;a href="http://news.ycombinator.com/item?id=2831455"&gt;Hacker News&lt;/a&gt; frontpage. It was definitely fun getting all that attention, despite the rush of traffic taking our little server off the web for a while. (Installing &lt;a href="http://mnm.uib.es/gallir/wp-cache-2/"&gt;WP-Cache&lt;/a&gt; brought it back.) &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.mynaweb.com"&gt;Myna&lt;/a&gt; is the system described in the blog post, and we&amp;#8217;re accepting beta users right now. If you&amp;#8217;re interested in content optimisation on your website, and want better results than A/B testing will deliver, do take a look. Obviously getting this surge of traffic from HN is incredibly valuable to us. However I don&amp;#8217;t have any suggestions for repeating the event: when I submitted the blog post to HN some months ago it disappeared without a trace. Certainly being active answering questions on HN helped keep it on the front page, and that position netted us a fairly steady thousand hits an hour.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re one of the people who read our blog post, thanks for the interest! It&amp;#8217;s very exciting for us to know that our idea for improving content optimisation resonates with so many people, and we&amp;#8217;re looking forward to getting Myna out of beta and seeing where it takes us.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Untyping/~4/Wq3ThEcVqds" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://untyped.com/untyping/2011/08/30/what-is-hacker-news-worth/#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://untyped.com/untyping/2011/08/30/what-is-hacker-news-worth/feed/atom/" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:origLink>http://untyped.com/untyping/2011/08/30/what-is-hacker-news-worth/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Dave G</name>
						<uri>http://www.untyped.com</uri>
					</author>
		<title type="html"><![CDATA[Friday fun with Scala syntax]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Untyping/~3/RlfAK2IG7_4/" />
		<id>http://untyped.com/untyping/?p=440</id>
		<updated>2011-05-27T08:41:36Z</updated>
		<published>2011-05-27T08:41:36Z</published>
		<category scheme="http://untyped.com/untyping" term="Code" /><category scheme="http://untyped.com/untyping" term="Fun" /><category scheme="http://untyped.com/untyping" term="Scala" />		<summary type="html"><![CDATA[It’s Friday &#8211; time to kick back and relax with two fun Scala programs we put together for your amusement. Scala has a pretty flexible syntax (although not as flexible as Racket&#8217;s, of course) that makes it popular amongst proponents of DSLs. Not all DSLs have to be serious, however, as I’m about to prove. [...]]]></summary>
		<content type="html" xml:base="http://untyped.com/untyping/2011/05/27/friday-fun-with-scala-syntax/">&lt;p&gt;It’s Friday &amp;#8211; time to kick back and relax with two fun Scala programs we put together for your amusement.&lt;/p&gt;
&lt;p&gt;Scala has a pretty flexible syntax (although not as flexible as &lt;a href="http://www.ccs.neu.edu/scheme/pubs/scheme2007-ctf.pdf"&gt;Racket&amp;#8217;s&lt;/a&gt;, of course) that makes it popular amongst proponents of &lt;a href="http://www.scala-lang.org/node/1403"&gt;DSLs&lt;/a&gt;. Not all DSLs have to be serious, however, as I’m about to prove.&lt;/p&gt;
&lt;p&gt;First up is Noel’s original concept &amp;#8211; proof of his love for DSLs, expressed in purest code:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;code class="javascript"&gt;    &lt;span class="kr"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;def&lt;/span&gt; &lt;span class="nx"&gt;Scala&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"It's s"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"o"&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;" much fun!"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;object&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;def&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="nx"&gt;Scala&lt;/span&gt;
    &lt;span class="c1"&gt;// ==&amp;gt; "It's sooo much fun!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Second is a simpler work that I call “The Startled Lolcat”:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;code class="javascript"&gt;    &lt;span class="nx"&gt;object&lt;/span&gt; &lt;span class="nx"&gt;O&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;def&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"What has been seen, cannot be unseen."&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;O&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;
    &lt;span class="c1"&gt;// ==&amp;gt; "What has been seen, cannot be unseen."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/Untyping/~4/RlfAK2IG7_4" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://untyped.com/untyping/2011/05/27/friday-fun-with-scala-syntax/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://untyped.com/untyping/2011/05/27/friday-fun-with-scala-syntax/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://untyped.com/untyping/2011/05/27/friday-fun-with-scala-syntax/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Noel</name>
						<uri>http://www.untyped.com/</uri>
					</author>
		<title type="html"><![CDATA[Internship This Summer at Loho]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Untyping/~3/qPmG8ag6-48/" />
		<id>http://untyped.com/untyping/?p=432</id>
		<updated>2011-05-25T13:33:10Z</updated>
		<published>2011-05-23T12:57:00Z</published>
		<category scheme="http://untyped.com/untyping" term="General" />		<summary type="html"><![CDATA[Our friends at Loho are looking for an intern over summer. We&#8217;ve previously blogged about the (fun and interesting) work we&#8217;ve done for Loho: using Scala, Lift, and a heavy does of Javascript we&#8217;ve created a really simple interface for setting up complex VoIP services. (All credit goes to Alex for the great concept &#8212; [...]]]></summary>
		<content type="html" xml:base="http://untyped.com/untyping/2011/05/23/internship-this-summer-at-loho/">&lt;p&gt;Our friends at &lt;a href="http://www.loho.co.uk/"&gt;Loho&lt;/a&gt; are looking for an &lt;a href="http://loho.co.uk/careers/"&gt;intern over summer&lt;/a&gt;. We&amp;#8217;ve &lt;a href="http://untyped.com/untyping/2011/05/23/the-future-of-voip-phone-configuration-interfaces/"&gt;previously blogged&lt;/a&gt; about the (fun and interesting) work we&amp;#8217;ve done for Loho: using &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;, &lt;a href="http://www.liftweb.net/"&gt;Lift&lt;/a&gt;, and a heavy does of Javascript we&amp;#8217;ve created a really simple interface for setting up complex VoIP services. (All credit goes to Alex for the great concept &amp;mdash; our work is simply implementing his vision.) The internship could extend this work, or address other parts of the stack right down to mucking around with VoIP hardware. It&amp;#8217;s an awesome chance to play with a lot of exciting technology. If you fit the bill (student, free for 8-10 weeks over summer, can relocate to Cambridge) get in touch with Alex at Loho. If you get the internship and decide to focus on the Scala/Lift parts we&amp;#8217;ll certainly help you get to grips with the code base.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Untyping/~4/qPmG8ag6-48" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://untyped.com/untyping/2011/05/23/internship-this-summer-at-loho/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://untyped.com/untyping/2011/05/23/internship-this-summer-at-loho/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://untyped.com/untyping/2011/05/23/internship-this-summer-at-loho/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Noel</name>
						<uri>http://www.untyped.com/</uri>
					</author>
		<title type="html"><![CDATA[The Future of VoIP Phone Configuration Interfaces]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Untyping/~3/4lOADgB9ywg/" />
		<id>http://untyped.com/untyping/?p=425</id>
		<updated>2011-08-30T12:28:46Z</updated>
		<published>2011-05-23T12:32:46Z</published>
		<category scheme="http://untyped.com/untyping" term="Business" /><category scheme="http://untyped.com/untyping" term="Code" /><category scheme="http://untyped.com/untyping" term="Design" /><category scheme="http://untyped.com/untyping" term="Functional Programming" /><category scheme="http://untyped.com/untyping" term="Scala" /><category scheme="http://untyped.com/untyping" term="Uncategorized" /><category scheme="http://untyped.com/untyping" term="Web development" />		<summary type="html"><![CDATA[We&#8217;ve recently completed a very fun and interesting job working on a new interface for managing VoIP phone systems. We have a VoIP phone, provided by Loho, who were also our client for this project. It&#8217;s great &#8212; we can forward calls to our mobiles, cart the phone around with us (plug it into a [...]]]></summary>
		<content type="html" xml:base="http://untyped.com/untyping/2011/05/23/the-future-of-voip-phone-configuration-interfaces/">&lt;p&gt;We&amp;#8217;ve recently completed a very fun and interesting job working on a new interface for managing &lt;a href="http://en.wikipedia.org/wiki/Voice_over_IP"&gt;VoIP&lt;/a&gt; phone systems. We have a VoIP phone, provided by &lt;a href="http://loho.co.uk/"&gt;Loho&lt;/a&gt;, who were also our client for this project. It&amp;#8217;s great &amp;#8212; we can forward calls to our mobiles, cart the phone around with us (plug it into a network connections and it just works), and it even emails us our voice messages. The only thing not great about our phone is the configuration interface. Luckily, that&amp;#8217;s what this project set out to solve.&lt;/p&gt;
&lt;p&gt;The brief was to implement an elegant online phone configuration system. Alex, Director at Loho, provided the vision. We provided two weeks of development time, which was enough to create a working prototype. Alex has asked us to not give away too many details about the system, but I can show you a few screenshots. First up, here&amp;#8217;s the main screen:&lt;/p&gt;
&lt;div id="attachment_426" class="wp-caption aligncenter" style="width: 430px"&gt;&lt;a href="http://untyped.com/untyping/wp-content/uploads/2011/05/loho-main-menu-sml.png"&gt;&lt;img src="http://untyped.com/untyping/wp-content/uploads/2011/05/loho-main-menu-sml.png" alt="The very stylish main menu of the VoIP administration tool we&amp;#039;ve built for Loho." title="loho-main-menu-sml" width="420" height="197" class="size-full wp-image-426" /&gt;&lt;/a&gt;&lt;p class="wp-caption-text"&gt;The very stylish main menu of the VoIP administration tool we've built for Loho.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Doesn&amp;#8217;t give away much, does it? A bit more interesting is a detail of editing a configuration:&lt;/p&gt;
&lt;div id="attachment_427" class="wp-caption aligncenter" style="width: 430px"&gt;&lt;a href="http://untyped.com/untyping/wp-content/uploads/2011/05/loho-editor-sml.png"&gt;&lt;img src="http://untyped.com/untyping/wp-content/uploads/2011/05/loho-editor-sml.png" alt="Also very stylish: editing the configuration of a voice menu" title="loho-editor-sml" width="420" height="366" class="size-full wp-image-427" /&gt;&lt;/a&gt;&lt;p class="wp-caption-text"&gt;Also very stylish: editing the configuration of a voice menu&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Here I&amp;#8217;m editing a voice menu &amp;#8212; one of those &amp;#8220;Press 1 if you&amp;#8217;re interested in giving us all your money&amp;#8221; type things.&lt;/p&gt;
&lt;p&gt;We think we&amp;#8217;ve created a very nice system. Loho tell us they were overwhelmed with interest at a recent tradefair, suggesting we&amp;#8217;re not alone in our opinion. While the interface is an important aspect of the work, the backend (which I can talk about!) is just as important. The main task was defining a data model to capture the rich feature set that Loho provide. This turned out to be very similar to designing a programming language and its intermediate representation. For example, we use a &lt;a href="http://en.wikipedia.org/wiki/Continuation-passing_style"&gt;continuation-passing style&lt;/a&gt; representation to avoid maintaining a stack on the server side. Our representation distinguishes between tail calls and normal function calls to avoid excessive resource consumption on the VoIP side. Relational databases don&amp;#8217;t do a very good job of storing recursive datastructures, like the &lt;a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree"&gt;AST&lt;/a&gt; of a programming language, so we used Mongo for the data store. In addition to its flexible data model, &lt;a href="http://www.youtube.com/watch?v=b2F-DItXtZs"&gt;Mongo is web scale&lt;/a&gt; which has given us an immediate status boost at local programmer meetups.&lt;/p&gt;
&lt;p&gt;The backend code is implemented in Scala and Lift. There are actually two interfaces to the service. One is the nice interface the users see, and the other is a REST interface that is called by the Asterisk AGI scripts that implement the VoIP functionality. The Asterisk system doesn&amp;#8217;t handle all the functionality we represent internally, so the REST interface includes a small interpreter that executes intermediate steps till we arrive at something Asterisk deals with.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Untyping/~4/4lOADgB9ywg" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://untyped.com/untyping/2011/05/23/the-future-of-voip-phone-configuration-interfaces/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://untyped.com/untyping/2011/05/23/the-future-of-voip-phone-configuration-interfaces/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://untyped.com/untyping/2011/05/23/the-future-of-voip-phone-configuration-interfaces/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Dave G</name>
						<uri>http://www.untyped.com</uri>
					</author>
		<title type="html"><![CDATA[Javascript compilation for SBT]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Untyping/~3/iH44ZsZKIM4/" />
		<id>http://untyped.com/untyping/?p=405</id>
		<updated>2011-03-07T10:53:31Z</updated>
		<published>2011-03-06T18:35:18Z</published>
		<category scheme="http://untyped.com/untyping" term="Code" /><category scheme="http://untyped.com/untyping" term="Front page" /><category scheme="http://untyped.com/untyping" term="Javascript" /><category scheme="http://untyped.com/untyping" term="Scala" /><category scheme="http://untyped.com/untyping" term="Web development" />		<summary type="html"><![CDATA[<p>Over the weekend I knocked up a little <a href="https://github.com/davegurnell/sbt-closure">SBT plugin</a> to wrap up the Javascript resources in our <a href="http://liftweb.net">Lift</a> projects and deploy them as one big minified file. Read on to find out how it works, then grab yourself a copy and take it for a spin.</p>]]></summary>
		<content type="html" xml:base="http://untyped.com/untyping/2011/03/06/javascript-compilation-for-sbt/">&lt;p&gt;Over the weekend I knocked up a little &lt;a href="https://github.com/davegurnell/sbt-closure"&gt;SBT plugin&lt;/a&gt; to wrap up the Javascript resources in our &lt;a href="http://liftweb.net"&gt;Lift&lt;/a&gt; projects and deploy them as one big minified file. Read on to find out how it works, then grab yourself a copy and take it for a spin.&lt;/p&gt;
&lt;p&gt;The plugin scans your &lt;tt&gt;webapps&lt;/tt&gt; directory and looks for files with the extensions &lt;tt&gt;.jsm&lt;/tt&gt; or &lt;tt&gt;.jsmanifest&lt;/tt&gt;. These files, called &lt;em&gt;Javascript Manifests&lt;/em&gt;, describe lists of Javascript sources that should be combined into a single file. For example:&lt;/p&gt;
&lt;pre&gt;# You can specify remote files using URLs...

http://code.jquery.com/jquery-1.5.1.js

# ...and local files using regular paths
#    (relative to the location of the manifest):

lib/foo.js
bar.js

# Blank lines and bash-style comments are also supported
&lt;/pre&gt;
&lt;p&gt;Manifest compilation happens in two phases: first, the plugin downloads and caches any remote scripts specified using URLs. Second, it feeds all of the sources (remote and local) into Google&amp;#8217;s &lt;a href="http://code.google.com/closure/compiler/"&gt;Closure Compiler&lt;/a&gt;, which concatenates them and minifies everything (and provides excellent services like static type checking to boot). The output from the compiler is a &lt;tt&gt;.js&lt;/tt&gt; file with the same base name and relative path as the original manifest.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s not a lot more to it than that. The plugin hooks into SBT&amp;#8217;s standard compile and package phases, so your Javascript gets rebuilt automatically alongside your Scala code. If this sounds useful to you, please feel free to grab a copy and take it for a spin. Full details are available in the README on &lt;a href="https://github.com/davegurnell/sbt-closure"&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I should point out that there are other useful SBT plugins that do a similar job. For example, I plagiarised extensively from Jon Hoffman&amp;#8217;s &lt;a href="https://github.com/hoffrocket/sbt-yui"&gt;YUI Compressor plugin&lt;/a&gt; and Luke Amdor&amp;#8217;s &lt;a href="https://github.com/rubbish/coffee-script-sbt-plugin"&gt;Coffee Script plugin&lt;/a&gt; when writing my code. These two particular examples don&amp;#8217;t do file combination, though, and that was an important feature for our specific use case.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Untyping/~4/iH44ZsZKIM4" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://untyped.com/untyping/2011/03/06/javascript-compilation-for-sbt/#comments" thr:count="3" />
		<link rel="replies" type="application/atom+xml" href="http://untyped.com/untyping/2011/03/06/javascript-compilation-for-sbt/feed/atom/" thr:count="3" />
		<thr:total>3</thr:total>
	<feedburner:origLink>http://untyped.com/untyping/2011/03/06/javascript-compilation-for-sbt/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Noel</name>
						<uri>http://www.untyped.com/</uri>
					</author>
		<title type="html"><![CDATA[Setting the run.mode for Lift applications running in Jetty]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Untyping/~3/DokwVnt-D2o/" />
		<id>http://untyped.com/untyping/2011/03/02/setting-the-run-mode-for-lift-applications-running-in-jetty/</id>
		<updated>2011-03-02T14:58:02Z</updated>
		<published>2011-03-02T14:53:01Z</published>
		<category scheme="http://untyped.com/untyping" term="Code" /><category scheme="http://untyped.com/untyping" term="Scala" /><category scheme="http://untyped.com/untyping" term="Web development" />		<summary type="html"><![CDATA[Setting the run.mode in Lift applications is the source of a surprising number of questions. The documentation recommends passing it as a parameter when the JVM is invoked. This can be hard to achieve for various reasons. In our case our deployment is automated using Chef, and scripts to start and stop the Jetty web [...]]]></summary>
		<content type="html" xml:base="http://untyped.com/untyping/2011/03/02/setting-the-run-mode-for-lift-applications-running-in-jetty/">&lt;div class='posterous_autopost'&gt;
&lt;p&gt;Setting the &lt;a href="http://www.assembla.com/wiki/show/liftweb/Run_Modes"&gt;&lt;code&gt;run.mode&lt;/code&gt;&lt;/a&gt; in Lift applications is the source of a surprising number of questions. The documentation recommends passing it as a parameter when the JVM is invoked. This can be hard to achieve for various reasons. In our case our deployment is automated using &lt;a href="http://www.opscode.com/"&gt;Chef&lt;/a&gt;, and scripts to start and stop the Jetty web server are installed by the package manager. We don&amp;rsquo;t really want to monkey around with these scripts, so we had to find another way. Jetty is written in Java, which means it must have a ridiculously complex XML configuration language. The Jetty developers turned it up to 11 by making their configuration language Turing complete, so we can actually set the system properties in a configuration file. The file we want to create is &lt;code&gt;WEB-INF/jetty-web.xml&lt;/code&gt; and we want it to contain this:&lt;/p&gt;
&lt;p&gt;&lt;script src="https://gist.github.com/851037.js?file=jetty-web.xml"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;If we leave this around then our application will always run in production mode. We don&amp;rsquo;t want this when we&amp;rsquo;re developing as we won&amp;rsquo;t, for instance, get stack traces printed to the browser. Thus we should copy this file in when we package up the project, and remove it when the packaging step completes. Assuming you&amp;rsquo;re using SBT, store the above text in &lt;code&gt;project/jetty-web.xml&lt;/code&gt; and add the following to your SBT project file to get this functionality:&lt;/p&gt;
&lt;p&gt;&lt;script src="https://gist.github.com/851037.js?file=Project.scala"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;This is pretty simple code. Basically it redefines the &lt;code&gt;package&lt;/code&gt; action to first copy in the &lt;code&gt;jetty-web.xml&lt;/code&gt; file, then it runs the original package action, and finally it deletes the &lt;code&gt;jetty-web.xml&lt;/code&gt;. Now any &lt;code&gt;WAR&lt;/code&gt;files you run under Jetty will automatically be in production mode, but calling &lt;code&gt;sbt jetty-run&lt;/code&gt; will still give you development mode.&lt;/p&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/Untyping/~4/DokwVnt-D2o" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://untyped.com/untyping/2011/03/02/setting-the-run-mode-for-lift-applications-running-in-jetty/#comments" thr:count="3" />
		<link rel="replies" type="application/atom+xml" href="http://untyped.com/untyping/2011/03/02/setting-the-run-mode-for-lift-applications-running-in-jetty/feed/atom/" thr:count="3" />
		<thr:total>3</thr:total>
	<feedburner:origLink>http://untyped.com/untyping/2011/03/02/setting-the-run-mode-for-lift-applications-running-in-jetty/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Noel</name>
						<uri>http://www.untyped.com/</uri>
					</author>
		<title type="html"><![CDATA[Stop A/B Testing and Make Out Like a Bandit]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Untyping/~3/8TUIu-OR4V8/" />
		<id>http://untyped.com/untyping/2011/02/11/stop-ab-testing-and-make-out-like-a-bandit/</id>
		<updated>2011-09-23T08:44:39Z</updated>
		<published>2011-02-11T12:52:37Z</published>
		<category scheme="http://untyped.com/untyping" term="Business" /><category scheme="http://untyped.com/untyping" term="Code" /><category scheme="http://untyped.com/untyping" term="Design" /><category scheme="http://untyped.com/untyping" term="Front page" /><category scheme="http://untyped.com/untyping" term="General" /><category scheme="http://untyped.com/untyping" term="Web development" />		<summary type="html"><![CDATA[Update: The system described below is now live, and we&#8217;re accepting beta users! Were I a betting man, I would wager this: the supermarket nearest to you is laid out with fresh fruit and vegetables near the entrance, and dairy and bread towards the back of the shop. I’m quite certain I’d win this bet [...]]]></summary>
		<content type="html" xml:base="http://untyped.com/untyping/2011/02/11/stop-ab-testing-and-make-out-like-a-bandit/">&lt;div class="posterous_autopost"&gt;
&lt;p&gt;&lt;strong&gt;Update: &lt;a href="http://www.mynaweb.com/"&gt;The system&lt;/a&gt; described below is now live, and we&amp;#8217;re accepting beta users!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Were I a betting man, I would wager this: the supermarket nearest to you is laid out with fresh fruit and vegetables near the entrance, and dairy and bread towards the back of the shop. I’m quite certain I’d win this bet enough times to make it worthwhile. This layout is, of course, no accident. By placing essentials in the corners, the store forces shoppers to traverse the entire floor to get their weekly shop. This increases the chance of an impulse purchase and hence the store’s revenue.&lt;/p&gt;
&lt;p&gt;I don’t know who developed this layout, but at some point someone must have tested it and it obviously worked. The same idea applies online, where it is incredibly easy to change the “layout” of a store. Where the supermarket might shuffle around displays or change the lighting, the online retailer might change the navigational structure or wording of their landing page. I call this process &lt;em&gt;content optimisation&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Any prospective change should be tested to ensure it has a positive effect on revenue (or some other measure, such as clickthroughs). The industry standard method for doing this is &lt;a href="http://untyped.com/untyping/2010/07/22/epistemology-and-ab-testing/"&gt;A/B testing&lt;/a&gt;. However, it is well known in the academic community that &lt;em&gt;A/B testing is significantly suboptimal&lt;/em&gt;. In this post I’m going to explain why, and how you can do better.&lt;/p&gt;
&lt;p&gt;There are several problems with A/B testing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; A/B testing is suboptimal. It simply doesn’t increase revenue as much as better methods.&lt;/li&gt;
&lt;li&gt; A/B testing is inflexible. You can’t, for example, add a new choice to an already running test.&lt;/li&gt;
&lt;li&gt; A/B testing has a tedious workflow. To do it correctly, you have to make lots of seemingly arbitrary choices (p-value, experiment size) to run an experiment.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The methods I’m going to describe, which are known as &lt;a href="http://en.wikipedia.org/wiki/Multi-armed_bandit"&gt;bandit algorithms&lt;/a&gt;, solve all these problems. But first, let’s look at the problems of A/B testing in more detail.&lt;/p&gt;
&lt;h2&gt;Suboptimal Performance&lt;/h2&gt;
&lt;p&gt;Explaining the suboptimal performance of A/B testing is tricky without getting into a bit of statistics. Instead of doing that, I’m going to describe the essence of the problem in a (hopefully) intuitive way. Let’s start by outlining the basic A/B testing scenario, so there is no confusion. In the simplest situation are two choices, A and B, under test. Normally one of them is already running on the site (let’s call that one A), and the other (B) is what we’re considering replacing A with. We run an experiment and then look for a significant difference, where I mean &lt;a href="http://en.wikipedia.org/wiki/Statistical_significance"&gt;significance&lt;/a&gt; in the statistical sense. If B is significantly better we replace A with B, otherwise we keep A on the site.&lt;/p&gt;
&lt;p&gt;The key problem with A/B testing is it doesn’t respect what the significance test is actually saying. When a test shows B is significantly better than A, it is right to throw out A. However, when there is no significant difference the test is &lt;em&gt;not&lt;/em&gt; saying that B is no better than A, but rather that the data does not support any conclusion. A might be better than B, B might be better than A, or they might be the same. We just can’t tell with the data that is available*. It might seem we could just run the test until a significant result appears, but that runs into the problem of &lt;a href="http://www.evanmiller.org/how-not-to-run-an-ab-test.html"&gt;repeated significance testing errors&lt;/a&gt;. Oh dear! Whatever we do, if we stick exclusively with A/B testing we’re going to make mistakes, and probably more than we realise.&lt;/p&gt;
&lt;p&gt;A/B testing is also suboptimal in another way — it doesn’t take advantage of information gained during the trial. Every time you display a choice you get information, such as a click, a purchase, or an indifferent user leaving your site. This information is really valuable, and you could make use of it in your test, but A/B testing simply discards it. There are good statistical reasons to not use information gained during a trial within the A/B testing framework, but if we step outside that framework we can.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: .8em;"&gt;* Technically, the reason for this is that the probability of a type II error increases as the probability of a type I error decreases. We control the probability of a type I error with the p-value, and this is typically set low. So if we drop option B when the test is not significant we have a high probability of making a type II error.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Inflexible&lt;/h2&gt;
&lt;p&gt;The A/B testing setup is very rigid. You can’t add new choices to the test, so you can’t, say, test the best news item to display on the front page of a site. You can’t dynamically adjust what you display based on information you have about the user — say, what they purchased last time they visited. You also can’t easily test more than two choices.&lt;/p&gt;
&lt;h2&gt;Workflow&lt;/h2&gt;
&lt;p&gt;To setup an A/B experiment you need to choose the significance level and the number of trials. These choices are often arbitrary, but they can have a major impact on results. You then need to monitor the experiment and, when it concludes, implement the results. There are a lot of manual steps in this workflow.&lt;/p&gt;
&lt;h2&gt;Make out like a Bandit&lt;/h2&gt;
&lt;p&gt;Algorithms for solving the so-called bandit problem address all the problems with A/B testing. To summarise, they give optimal results (to within constant factors), they are very flexible, and they have a fire-and-forget workflow.&lt;/p&gt;
&lt;p&gt;So, what is the bandit problem? You have a set of choices you can make. On the web these could be different images to display, or different wordings for a button, and so on. Each time you make a choice you get a reward. For example, you might get a reward of 1 if a button is clicked, and reward of 0 otherwise. Your goal is to maximise your total reward over time. This clearly fits the content optimisation problem.&lt;/p&gt;
&lt;p&gt;The bandit problem has been studied for over 50 years, but only in the last ten years have practical algorithms been developed. We studied one such &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.98.9211&amp;amp;rep=rep1&amp;amp;type=pdf"&gt;paper&lt;/a&gt; in &lt;a href="http://untyped.com/untyping/2011/01/10/the-university-of-untyped/"&gt;UU&lt;/a&gt;. The particular details of the algorithm we studied are not important (if you are interested, read the paper – it’s very simple); here I want to focus on the general principles of bandit algorithms.&lt;/p&gt;
&lt;p&gt;The first point is that the bandit problem explicitly includes the idea that we make use of information as it arrives. This leads to what is called the exploration-exploitation dilemma: do we try many different choices to gain a better estimate of their reward (exploration) or try the choices that have worked well in the past (exploitation)?&lt;/p&gt;
&lt;p&gt;The performance of an algorithm is typically measured by its &lt;a href="http://en.wikipedia.org/wiki/Regret_(decision_theory)"&gt;regret&lt;/a&gt;, which is the average difference between its actual performance and the best possible performance. &lt;a href="http://dx.doi.org/10.1016/0196-8858(85)90002-8"&gt;It has been shown&lt;/a&gt; that the best possible regret increases logarithmically with the number of choices made, and &lt;em&gt;modern bandit algorithms are optimal&lt;/em&gt; (see &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.98.9211&amp;amp;rep=rep1&amp;amp;type=pdf"&gt;the UU paper&lt;/a&gt;, for instance).&lt;/p&gt;
&lt;p&gt;Bandit algorithms are very flexible. They can deal with as many choices as necessary. Variants of the basic algorithms can handle addition and removal of choices, selection of the best &lt;em&gt;k&lt;/em&gt; choices, and exploitation of information known about the visitor.&lt;/p&gt;
&lt;p&gt;Bandits are also simple to use. Many of the algorithms have no parameters to set, and unlike A/B testing there is no need to monitor them — they will continue working indefinitely.&lt;/p&gt;
&lt;p&gt;Finally, we know bandits work on the web, as much of the current research on them is coming out of &lt;a href="http://www.cs.toronto.edu/~tl/papers/context-aistats.pdf"&gt;Google&lt;/a&gt;, &lt;a href="http://research.microsoft.com/en-us/projects/bandits/"&gt;Microsoft&lt;/a&gt;, &lt;a href="http://labs.yahoo.com/files/Explore-exploit-ICDM09.pdf"&gt;Yahoo!&lt;/a&gt;, and other big Internet companies.&lt;/p&gt;
&lt;p&gt;So there you have it. Stop wasting time on A/B testing and make out like a bandit!&lt;/p&gt;
&lt;h2&gt;Join Our Merry Band&lt;/h2&gt;
&lt;p&gt;Finally, you probably won’t be surprised to hear we are developing a content optimisation system based on bandit algorithms. I am giving a talk on this at the Multipack Show and Tell in Birmingham this Saturday.&lt;/p&gt;
&lt;p&gt;We are currently building a prototype, and are looking for people to help us evaluate it. If you want more information, or would like to get involved, &lt;a href="mailto:info@untyped.com"&gt;get in touch&lt;/a&gt; and we’ll let you know when we’re ready to go.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update: In case you missed it at the top, &lt;a href="http://www.mynaweb.com/"&gt;Myna&lt;/a&gt; is our content optimisation system based on bandit algorithms and we&amp;#8217;re accepting beta users right now!&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/Untyping/~4/8TUIu-OR4V8" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://untyped.com/untyping/2011/02/11/stop-ab-testing-and-make-out-like-a-bandit/#comments" thr:count="12" />
		<link rel="replies" type="application/atom+xml" href="http://untyped.com/untyping/2011/02/11/stop-ab-testing-and-make-out-like-a-bandit/feed/atom/" thr:count="12" />
		<thr:total>12</thr:total>
	<feedburner:origLink>http://untyped.com/untyping/2011/02/11/stop-ab-testing-and-make-out-like-a-bandit/</feedburner:origLink></entry>
	</feed><!-- Dynamic Page Served (once) in 0.357 seconds -->

