<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8675770049730349526</id><updated>2012-01-02T12:20:07.130-08:00</updated><category term='natenberg'/><category term='qcon'/><category term='atomic java'/><category term='TDD JSF apache jboss jsfunit myfaces shale apachecon mocks stubs'/><category term='finance'/><category term='javascript'/><category term='java closures closure dolphin'/><category term='erlang'/><category term='trie tree javascript bag'/><category term='trading'/><category term='junit'/><category term='jsf junit jboss'/><category term='erlang java jinterface OTP erlang_exchange jmeter'/><category term='membars'/><category term='jsf jsfunit jboss java'/><category term='jinterface java erlang &quot;erlang exchange&quot; &quot;google video&quot;'/><category term='jsfunit jboss java asp.net rails jsf struts facelets'/><category term='youtube'/><category term='fences'/><category term='myfaces'/><category term='memory barriers'/><category term='dzone'/><category term='facelets'/><category term='agile'/><category term='speakerconf'/><category term='chicago'/><category term='erlang dsl functional_programming finance'/><category term='erlang ruby'/><category term='java erlang russia'/><category term='tdd'/><category term='myfaces facelets apress book java jsf apache'/><category term='erlang unification threadlocal'/><category term='xp'/><category term='speakerconf erlang software conference'/><category term='jsf tss java myfaces conference anti-pattern design-pattern apache apachecon'/><category term='drw'/><category term='apache'/><category term='dependency injection'/><category term='activemq rails ruby java ajax rest a13g activemessaging apache'/><category term='erlang functional_programming function_evaluation'/><category term='jsf'/><category term='java'/><category term='polyglot programming'/><category term='JavaOne JSF AJAX'/><category term='jsunit'/><category term='junit java Calendar tdd'/><category term='erlang process'/><category term='thoughtworks'/><category term='apache incubator erlang jinterface java thoughtworks'/><category term='jsf tss anti-pattern'/><category term='jvm'/><category term='jsmock'/><category term='concurrency'/><category term='australia'/><category term='options'/><category term='erlang java jinterface OTP grid'/><category term='jsf guice java ioc di dependency injection'/><category term='derivatives'/><category term='infoq'/><category term='list comprehensions'/><category term='functional programming'/><category term='dsl'/><category term='erlang java theserverside tss concurrency vegas'/><category term='scala java applet'/><category term='agile software &quot;open source&quot;'/><category term='testing'/><category term='jsf el guice myfaces apache'/><category term='designe patterns'/><category term='shark'/><category term='&quot;erlang exchange&quot; erlang'/><title type='text'>Not Dennis Byrne</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>44</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-4349636285080862033</id><published>2012-01-02T12:17:00.000-08:00</published><updated>2012-01-02T12:19:16.286-08:00</updated><title type='text'>Crocodile Cage Diving - Darwin, Australia</title><content type='html'>Crocodile cage diving in Darwin, Australia ...&lt;br /&gt;&lt;br /&gt;&lt;iframe width="640" height="360" src="http://www.youtube.com/embed/R0uFk3mS_9Q" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-4349636285080862033?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/4349636285080862033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=4349636285080862033' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/4349636285080862033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/4349636285080862033'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2012/01/crocodile-cage-diving-darwin-australia.html' title='Crocodile Cage Diving - Darwin, Australia'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/R0uFk3mS_9Q/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-8155194837524468247</id><published>2012-01-02T11:56:00.000-08:00</published><updated>2012-01-02T12:17:27.025-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='australia'/><category scheme='http://www.blogger.com/atom/ns#' term='shark'/><title type='text'>Cage Diving with Great White Sharks - Neptune Islands, Australia</title><content type='html'>My favorite shots from cage diving ... &lt;br /&gt;&lt;br /&gt;&lt;iframe width="640" height="360" src="http://www.youtube.com/embed/z1OJlzKERCg" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-8155194837524468247?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/8155194837524468247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=8155194837524468247' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/8155194837524468247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/8155194837524468247'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2012/01/cage-diving-with-great-white-sharks.html' title='Cage Diving with Great White Sharks - Neptune Islands, Australia'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/z1OJlzKERCg/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-1986933887035179383</id><published>2010-03-05T14:14:00.000-08:00</published><updated>2010-03-08T08:09:23.523-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='memory barriers'/><category scheme='http://www.blogger.com/atom/ns#' term='infoq'/><category scheme='http://www.blogger.com/atom/ns#' term='jvm'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Memory Barriers article published by InfoQ</title><content type='html'>InfoQ has published an article I wrote about memory barriers and the JVM.  Here's an excerpt:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;"A trip to main memory costs hundreds of clock cycles on commodity hardware. Processors use caching to decrease the costs of memory latency by orders of magnitude. These caches re-order pending memory operations for the sake of performance. In other words, the reads and writes of a program are not necessarily performed in the order in which they are given to the processor. When data is immutable and/or confined to the scope of one thread these optimizations are harmless. Combining these optimizations with symmetric multi-processing and shared mutable state on the other hand can be a nightmare. A program can behave non-deterministically when memory operations on shared mutable state are re-ordered. It is possible for a thread to write values that become visible to another thread in ways that are inconsistent with the order in which they were written. A properly placed memory barrier prevents this problem by forcing the processor to serialize pending memory operations."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can &lt;a target="new" href="http://www.infoq.com/articles/memory_barriers_jvm_concurrency"&gt;read the rest&lt;/a&gt; over at InfoQ ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-1986933887035179383?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/1986933887035179383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=1986933887035179383' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/1986933887035179383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/1986933887035179383'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2010/03/memory-barriers-article-published-by.html' title='Memory Barriers article published by InfoQ'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-4005274244914028454</id><published>2010-01-01T07:25:00.000-08:00</published><updated>2010-01-03T12:35:11.405-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='membars'/><category scheme='http://www.blogger.com/atom/ns#' term='speakerconf'/><category scheme='http://www.blogger.com/atom/ns#' term='fences'/><category scheme='http://www.blogger.com/atom/ns#' term='memory barriers'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Presenting Memory Barriers at SpeakerConf 2010</title><content type='html'>The one thing I'd like to see more of on conference circuits are the basics.  I often find myself more interested in concepts that have been around for decades more than the latest and greatest framework.  This year at SpeakerConf I'll be doing another talk on concurrency and I'll be getting closer to the metal.  Memory barriers, or fences, are a set of processor instructions used to apply ordering limitations on memory operations.  Without memory barriers every mutex, actor or synchronization point in your application is broken; so consider this talk to be relevant to all languages.   Looking forward to another great lineup this year:  &lt;br /&gt;&lt;br /&gt;Steve Vinoski, Neal Ford, Stuart Halloway, Obie Fernandez, Brian Marick, Philippe Hanrigou, Dave Hoover, Pramod Sadalage, Oren Eini, George Malamidis, Matt Deiters, Amanda Laucher, Michael Nygard, Freg George, Dave Thomas, Aslak Hellesoy, Pat Farley, Eric Yew and Robert Martin&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_2813450"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/dennisbyrne/memory-barriers" title="Memory Barriers"&gt;Memory Barriers&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=dbyrnedrwmembar-100101115645-phpapp02&amp;stripped_title=memory-barriers" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=dbyrnedrwmembar-100101115645-phpapp02&amp;stripped_title=memory-barriers" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/dennisbyrne"&gt;Dennis Byrne&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-4005274244914028454?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/4005274244914028454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=4005274244914028454' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/4005274244914028454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/4005274244914028454'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2010/01/presenting-memory-barriers-at.html' title='Presenting Memory Barriers at SpeakerConf 2010'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-5851516723757528277</id><published>2009-09-05T08:45:00.000-07:00</published><updated>2009-09-26T16:44:40.385-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chicago'/><category scheme='http://www.blogger.com/atom/ns#' term='polyglot programming'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Presenting Erlang at the Polyglot Programmers of Chicago meetup on September 23rd</title><content type='html'>&lt;i&gt;Update ... this talk has been moved from the 24th to the 23rd&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I'll be visiting Obtiva later this month to present Erlang, &lt;a href="http://polyglotprogrammers.com/usa/illinois/chicago/" target="new"&gt;here are the details&lt;/a&gt;.  I'm probably going to gloss over plain vanilla functional programming principles in order to focus more on concurrency, as well as another equally important and overlooked core feature ... reliability.  We'll cover the basics of what an Erlang process is, runtime code swapping, and a brief intro to a few Erlang OTP behaviours.  Attendees should walk away from this presentation with a few new ideas in their heads and enough information to be dangerous.  My &lt;a href="http://www.slideshare.net/dennisbyrne/the-erlang-programming-language"&gt;slides&lt;/a&gt; are on SlideShare.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-5851516723757528277?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/5851516723757528277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=5851516723757528277' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/5851516723757528277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/5851516723757528277'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2009/09/presenting-erlang-at-polyglot.html' title='Presenting Erlang at the Polyglot Programmers of Chicago meetup on September 23rd'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-1968566813055067701</id><published>2009-08-18T20:04:00.000-07:00</published><updated>2009-08-18T20:37:23.128-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='options'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='finance'/><category scheme='http://www.blogger.com/atom/ns#' term='natenberg'/><title type='text'>Option Volatility &amp; Pricing in Erlang, Java and JavaScript</title><content type='html'>I wrote an application as I read Sheldon Natenberg's excellent "Option Volatility &amp; Pricing".  You can play around with it &lt;a target="new" href="http://natenberg.dbyrne.net:8080/"&gt;here&lt;/a&gt;.  Here's a few screenshots ...&lt;br /&gt;&lt;br /&gt;&lt;img src="http://people.apache.org/~dennisbyrne/blog/pnl/short_calls.png"/&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://people.apache.org/~dennisbyrne/blog/pnl/synthetic.png"/&gt;&lt;br /&gt;&lt;br /&gt;You can view the source code &lt;a target="new" href="http://code.google.com/p/natenberg/"&gt;here&lt;/a&gt; if you want to in take a look under the hood.  In a nutshell I used Erlang to model a #position{}, composed of long and short #side{} records.  Each #side{} is composed of #option{} and #underlying{} records.  The PNL of a #position{} is calculated and graphed.  The data is serialized as JSON to any browser where it is rendered with a Java applet and JQuery event handlers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-1968566813055067701?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/1968566813055067701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=1968566813055067701' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/1968566813055067701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/1968566813055067701'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2009/08/option-volatility-pricing-in-erlang.html' title='Option Volatility &amp; Pricing in Erlang, Java and JavaScript'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-3416325245830004633</id><published>2009-08-17T16:00:00.001-07:00</published><updated>2009-11-20T17:43:01.322-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scala java applet'/><title type='text'>My first impressions of the Scala programming language</title><content type='html'>&lt;i&gt;update: The bug I describe below has &lt;/i&gt;&lt;a href="https://lampsvn.epfl.ch/trac/scala/changeset/17583" target="new"&gt;since been fixed&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Is Scala the new Java?  I'd bet money on it for two reasons.  First, Scala excels at several things that are not available in Java.  The type system and closures have effectively grabbed the attention of language enthusiasts and fad followers.  But to replace an institution like Java you need more.  You need the average Joe to vote for you.  This is the second reason: the cost of switching is low.  Java developers won't have trouble with a transition like this.  Idiomatic Scala might take a little effort ... but at a bare minimum, there is a one to one conceptual match up across the two languages.  I dusted off a Java applet and ported it to Scala, &lt;a target="new" href="http://people.apache.org/~dennisbyrne/java2scala/java2scala.htm"&gt;see for yourself&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;After playing with Scala a little bit I found my first problem with it.  I could not have picked a worse way to get my feet wet.  I'm not fond of applets but I had one laying around and thought I'd make things interesting by porting it.  Then I fired up my web server and browser to find that my applet no longer worked.  After a little while I traced the failure to a class loader problem in the browser.  It turns out that everything that passes through scalac has a dependency on scala.ScalaObject and a host of other things in the Scala runtime.  This means my applet gains 3.5 MB .  Not a show stopper, but I think it's safe to say this is one thing Scala will &lt;i&gt;not&lt;/i&gt; excel at.  &lt;br /&gt;&lt;br /&gt;And finally, I have no idea what's wrong with scala.collection.mutable.PriorityQueue .  This REPL session says it all ... &lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight:bold;"&gt;scala&gt;&lt;/span&gt; val q = new scala.collection.mutable.PriorityQueue[Int]&lt;br /&gt;q: scala.collection.mutable.PriorityQueue[Int] = PriorityQueue()&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;scala&gt;&lt;/span&gt; q.isEmpty&lt;br /&gt;res0: Boolean = true&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;scala&gt;&lt;/span&gt; q.size&lt;br /&gt;res1: Int = 1 &lt;span style="font-weight:bold;color:red"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;- This has got to be a bug?&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-3416325245830004633?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/3416325245830004633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=3416325245830004633' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/3416325245830004633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/3416325245830004633'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2009/08/my-first-impressions-of-scala.html' title='My first impressions of the Scala programming language'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-6102611349440205029</id><published>2009-07-22T15:28:00.000-07:00</published><updated>2009-07-22T15:33:32.320-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='infoq'/><category scheme='http://www.blogger.com/atom/ns#' term='qcon'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><title type='text'>QCon Presentation Published by InfoQ</title><content type='html'>Last year I did a presentation on DSLs in Erlang at QCon.  InfoQ &lt;a href="http://www.infoq.com/presentations/dsl-erlang-dennis-byrne"&gt;has released it&lt;/a&gt; ... knock yourselves out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-6102611349440205029?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/6102611349440205029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=6102611349440205029' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/6102611349440205029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/6102611349440205029'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2009/07/qcon-presentation-published-by-infoq.html' title='QCon Presentation Published by InfoQ'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-3375844612547200186</id><published>2009-06-14T09:07:00.000-07:00</published><updated>2009-06-14T09:19:17.844-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='speakerconf'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang process'/><category scheme='http://www.blogger.com/atom/ns#' term='youtube'/><title type='text'>Erlang at SpeakerConf: What is an Erlang process?</title><content type='html'>I've taken a segment of my &lt;a target="new" href="http://speakerconf.com/"&gt;SpeakerConf&lt;/a&gt; presentation and put it on YouTube.  If you are new to Erlang, this is the most important concept of the platform.  Enjoy,&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/Vlfzjzqdzsw&amp;hl=en&amp;fs=1&amp;rel=0&amp;color1=0x006699&amp;color2=0x54abd6"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/Vlfzjzqdzsw&amp;hl=en&amp;fs=1&amp;rel=0&amp;color1=0x006699&amp;color2=0x54abd6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-3375844612547200186?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/3375844612547200186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=3375844612547200186' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/3375844612547200186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/3375844612547200186'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2009/06/erlang-at-speakerconf-what-is-erlang.html' title='Erlang at SpeakerConf: What is an Erlang process?'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-6022790192505369622</id><published>2009-06-04T15:26:00.000-07:00</published><updated>2009-06-04T22:04:25.253-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='options'/><category scheme='http://www.blogger.com/atom/ns#' term='derivatives'/><category scheme='http://www.blogger.com/atom/ns#' term='list comprehensions'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='finance'/><title type='text'>Option Profit and Loss in Erlang</title><content type='html'>&lt;p&gt;Options are a complex game.  I was quite surprised at how many of the rules can be expressed in a dozen lines of code.  This function calculates the PNL of an options position at the market price of the underlying.&lt;/p&gt;&lt;span style="z-index: 100;color:white;" &gt;&lt;pre style="color:black;"&gt;pnl(&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt;, #position{long = &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;, short = &lt;span style="font-weight: bold; color: rgb(0, 102, 0);"&gt;Short&lt;/span&gt;}) -&amp;gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;  Pnl&lt;/span&gt; = &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;U&lt;/span&gt;#underlying.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; U &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.underlyings &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;U&lt;/span&gt;#underlying.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; U &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.underlyings &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.calls,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; =&amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.calls, &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; =&amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.puts,   &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt;= &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.puts,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt;= &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.calls,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.calls, &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.puts,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.puts,   &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;,&lt;br /&gt;  lists:sum(&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Pnl&lt;/span&gt;).&lt;/pre&gt;&lt;/span&gt;&lt;p&gt;Before we dive into the nuts and bolts of this function let's first discuss list comprehensions and how they are written in Erlang.  A list comprehension is a way of composing a list from another list.  For example, the following line of code creates a list of four integers and doubles every element greater than two.&lt;/p&gt;&lt;pre&gt;[ &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;X&lt;/span&gt; * 2 || &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;X&lt;/span&gt; &amp;lt;- [1,2,3,4], &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;X&lt;/span&gt; &gt; 2 ]&lt;br/&gt;% yields [6,8]&lt;/pre&gt;&lt;p&gt;This expression can be read as &lt;i&gt;"Double every X taken from [1,2,3,4] where X is greater than 2"&lt;/i&gt;.  Everything to the left of "||" is known as the expression template while everything to the right is known as the generator.  The pnl/0 function sums the concatenated results of ten list comprehensions.  Each list comprehension is an expression of how the business works.  Let's walk through these expressions, one by one.  Keep symmetry in your mind along the way ...&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Line 1: Long underlyings&lt;/h3&gt;&lt;pre&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;U&lt;/span&gt;#underlying.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; U &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.underlyings &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&lt;/pre&gt;You gain(lose) the market price less the underlying price for every underlying instrument you buy.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Line 2: Short underlyings&lt;/h3&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;U&lt;/span&gt;#underlying.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; U &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.underlyings &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; &lt;/pre&gt;You gain(lose) the underlying price less the market price for every underlying instrument you sell.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Line 3: Out of the money long calls&lt;/h3&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.calls,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; =&amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; &lt;/pre&gt;You lose the premium for every call you buy if it expires worthless.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Line 4: Out of the money short calls&lt;/h3&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.calls, &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; =&amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; &lt;/pre&gt;You keep the premium for every call you sell if it expires worthless.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Line 5: Out of the money long puts&lt;/h3&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.puts,   &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt;= &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; &lt;/pre&gt;You lose the premium for every put you buy if it expires worthless.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Line 6: Out of the money short puts&lt;/h3&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.puts,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt;= &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; &lt;/pre&gt;You keep the premium for every put you sell that expires worthless.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Line 7: In the money long calls&lt;/h3&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.calls,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; &lt;/pre&gt;You keep the market price less the strike price and premium for every call you buy when the market price exceeds strike price.  Bonus points to anyone who has noticed that by this point the function begins a second traversal of the options.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Line 8: In the money short calls&lt;/h3&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.calls, &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; &lt;/pre&gt;You lose the strike price and the premium less the market price for every call you sell when you are assigned.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Line 9: In the money short puts&lt;/h3&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.puts,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&lt;/pre&gt;You lose market price plus the premium less the strike price for every put you sell when you are assigned.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Line 10: In the money long calls&lt;/h3&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.puts,   &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&lt;/pre&gt; You keep the strike price less the market price and premium when strike price exceeds market price.&lt;br /&gt;&lt;br /&gt;Now let's look at some trends.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Big Risks&lt;/h3&gt;&lt;span style="z-index: 100;color:white;" &gt;&lt;pre style="color:black;"&gt;pnl(&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt;, #position{long = &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;, short = &lt;span style="font-weight: bold; color: rgb(0, 102, 0);"&gt;Short&lt;/span&gt;}) -&amp;gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;  Pnl&lt;/span&gt; = &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;U&lt;/span&gt;#underlying.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; U &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.underlyings &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;U&lt;/span&gt;#underlying.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; U &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.underlyings &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.calls,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; =&amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.calls, &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; =&amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.puts,   &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt;= &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.puts,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt;= &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.calls,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="border-style: solid; border-width: 2px; border-color:red;"&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.calls, &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;/span&gt;&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.puts,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="border-style: solid; border-width: 2px; border-color:red;"&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.puts,   &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&lt;/span&gt;,&lt;br /&gt;  lists:sum(&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Pnl&lt;/span&gt;).&lt;/pre&gt;&lt;/span&gt;&lt;h3&gt;Big Rewards&lt;/h3&gt;&lt;span style="z-index: 100;color:white;" &gt;&lt;pre style="color:black;"&gt;pnl(&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt;, #position{long = &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;, short = &lt;span style="font-weight: bold; color: rgb(0, 102, 0);"&gt;Short&lt;/span&gt;}) -&amp;gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;  Pnl&lt;/span&gt; = &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;U&lt;/span&gt;#underlying.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; U &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.underlyings &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;U&lt;/span&gt;#underlying.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; U &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.underlyings &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.calls,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; =&amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.calls, &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; =&amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.puts,   &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt;= &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.puts,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt;= &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="border-style: solid; border-width: 2px; border-color:red;"&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.calls,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;/span&gt;&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.calls, &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="border-style: solid; border-width: 2px; border-color:red;"&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.puts,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;/span&gt;&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.puts,   &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;,&lt;br /&gt;  lists:sum(&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Pnl&lt;/span&gt;).&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;h3&gt;Out of or at the money&lt;/h3&gt;&lt;span style="z-index: 100;color:white;" &gt;&lt;pre style="color:black;"&gt;pnl(&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt;, #position{long = &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;, short = &lt;span style="font-weight: bold; color: rgb(0, 102, 0);"&gt;Short&lt;/span&gt;}) -&amp;gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;  Pnl&lt;/span&gt; = &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;U&lt;/span&gt;#underlying.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; U &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.underlyings &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;U&lt;/span&gt;#underlying.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; U &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.underlyings &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="BORDER-TOP: red 2px solid;BORDER-RIGHT: red 2px solid;BORDER-LEFT: red 2px solid;"&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.calls,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; =&amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="BORDER-RIGHT: red 2px solid;BORDER-LEFT: red 2px solid;"&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.calls, &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; =&amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="BORDER-RIGHT: red 2px solid;BORDER-LEFT: red 2px solid;"&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.puts,   &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt;= &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="BORDER-BOTTOM: red 2px solid;BORDER-RIGHT: red 2px solid;BORDER-LEFT: red 2px solid;"&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.puts,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt;= &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&lt;/span&gt; ++ &lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.calls,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.calls, &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.puts,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.puts,   &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;,&lt;br /&gt;  lists:sum(&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Pnl&lt;/span&gt;).&lt;/pre&gt;&lt;/span&gt;&lt;h3&gt;In the money options&lt;/h3&gt;&lt;span style="z-index: 100;color:white;" &gt;&lt;pre style="color:black;"&gt;pnl(&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt;, #position{long = &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;, short = &lt;span style="font-weight: bold; color: rgb(0, 102, 0);"&gt;Short&lt;/span&gt;}) -&amp;gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;  Pnl&lt;/span&gt; = &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;U&lt;/span&gt;#underlying.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; U &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.underlyings &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;U&lt;/span&gt;#underlying.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; U &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.underlyings &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.calls,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; =&amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.calls, &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; =&amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.puts,   &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt;= &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.puts,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt;= &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="BORDER-TOP: red 2px solid;BORDER-RIGHT: red 2px solid;BORDER-LEFT: red 2px solid;"&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.calls,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="BORDER-RIGHT: red 2px solid;BORDER-LEFT: red 2px solid;"&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; C &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.calls, &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="BORDER-RIGHT: red 2px solid;BORDER-LEFT: red 2px solid;"&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Short&lt;/span&gt;#side.puts,  &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&lt;/span&gt; ++&lt;br /&gt;        &lt;span style="BORDER-BOTTOM: red 2px solid;BORDER-RIGHT: red 2px solid;BORDER-LEFT: red 2px solid;"&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt;-&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; + &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike - &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;px&lt;/span&gt; ||&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt; P &lt;/span&gt;&amp;lt;- &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Long&lt;/span&gt;#side.puts,   &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Px&lt;/span&gt; &amp;lt; &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;P&lt;/span&gt;#option.strike &lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&lt;/span&gt;,&lt;br /&gt;  lists:sum(&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Pnl&lt;/span&gt;).&lt;/pre&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-6022790192505369622?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/6022790192505369622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=6022790192505369622' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/6022790192505369622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/6022790192505369622'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2009/06/option-profit-and-loss-in-erlang.html' title='Option Profit and Loss in Erlang'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-933852252992900727</id><published>2009-03-10T06:35:00.000-07:00</published><updated>2009-03-10T06:38:05.575-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speakerconf erlang software conference'/><title type='text'>Erlang at SpeakerConf</title><content type='html'>I'll be in Aruba at &lt;a href="http://speakerconf.com/" target="new"&gt;SpeakerConf&lt;/a&gt; next week covering Erlang.  I'm especially excited about SpeakerConf for a number of reasons.  First, most attendees will be speakers.  So there will be lots of people to preach to, learn from, and argue with.  Second, I'll get the opportunity to catch up with so many folks I've met through consulting.  And finally ... check out this lineup!&lt;br /&gt;&lt;br /&gt;Aslak Hellesoy, Amanda Laucher, Dave Hoover, Dennis Byrne, Fred George, George Malamidis, Jay Fields, Josh Graham, Justin Gehtland, Michael Feathers, Mike Roberts, Obie Fernandez, Philippe Hanrigou, Stuart Halloway and Venkat Subramaniam.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-933852252992900727?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/933852252992900727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=933852252992900727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/933852252992900727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/933852252992900727'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2009/03/erlang-at-speakerconf.html' title='Erlang at SpeakerConf'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-7830344848173330145</id><published>2009-02-09T06:31:00.000-08:00</published><updated>2009-02-09T06:38:35.152-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='jsmock'/><category scheme='http://www.blogger.com/atom/ns#' term='dependency injection'/><category scheme='http://www.blogger.com/atom/ns#' term='jsunit'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='xp'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='junit'/><title type='text'>Article published on JsUnit and JsMock</title><content type='html'>InfoQ has published an article of mine on Test Driven Development in JavaScript.  Here's my favorite part ...&lt;br /&gt;&lt;blockquote&gt;Hold on, wait a minute ... the test function has more than one assertion. Is this OK? There is a small group of people in the Agile community who think it's a sin to put more than one assertion per test. Test suites written for real applications making real money however are rarely written this way. Many of these people are astounded when they see how many assertions per test are found within &lt;a target="new" href="http://junit.cvs.sourceforge.net/viewvc/junit/junit/src/test/java/org/junit/tests/"&gt;the actual test suite&lt;/a&gt; for the JUnit framework itself.&lt;/blockquote&gt;&lt;br /&gt;You can &lt;a target="new" href="http://www.infoq.com/articles/javascript-tdd"&gt;read the rest of it here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-7830344848173330145?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/7830344848173330145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=7830344848173330145' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/7830344848173330145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/7830344848173330145'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2009/02/article-published-on-jsunit-and-jsmock.html' title='Article published on JsUnit and JsMock'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-5185107670014177311</id><published>2009-02-01T05:53:00.000-08:00</published><updated>2009-12-27T15:04:34.943-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chicago'/><category scheme='http://www.blogger.com/atom/ns#' term='trading'/><category scheme='http://www.blogger.com/atom/ns#' term='drw'/><category scheme='http://www.blogger.com/atom/ns#' term='thoughtworks'/><title type='text'>I Join DRW Trading</title><content type='html'>Well I'm back in Chicago to work for &lt;a href="http://drwholdings.com/" target="new"&gt;DRW Trading&lt;/a&gt;.  It was tough leaving ThoughtWorks but this was an opportunity I just couldn't pass up.&lt;br /&gt;&lt;br /&gt;The interview process at DRW is the toughest I've seen in my career.  It's the only company that has ever put me through eight interviews (six technical).  I love interviewing.  One of my dream jobs is to be a professional interviewer.  It's also why I like presenting.  I love the last ten minutes of a presentation because I never know what someone is going to shoot at me.&lt;br /&gt;&lt;br /&gt;When I interview I'm not just there to do my best at answering questions and asking questions.  I also want to see if the interviewers are asking the right questions.  If I get an offer after getting through the interviews without being quizzed on unit testing, iterative delivery or continuous integration ... I know I'm probably going to regret taking the offer.  &lt;br /&gt;&lt;br /&gt;Other bonus points for me were the catered breakfast and lunch, a lot of health benefits I'll never use, and an iPhone.  I don't like working in structured environments with a lot of rules, so I was very relieved by the fact that there is no dress code at DRW. Still very impressed at the compensation package they put together for me right in the middle of a global recession.  I'm also looking forward to working with fellow ThoughtQuitters Jay Fields, Mike Ward, Mike Rettig, Bobby Norton, Peter Ryan, etc.  I'm also excited to get more opportunity to work in a heavy math environment with tools like &lt;a href="http://code.google.com/p/retlang/" target="new"&gt;Retlang&lt;/a&gt; or &lt;a href="http://code.google.com/p/jetlang/" target="new"&gt;Jetlang&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Anyways, tomorrow I start a new job and boy do I have a lot to learn about trading.  I'll be investing a lot less in my technical knowledge portfolio and lot more in the domain, at least for the short term.  Besides, software is about to enter a pretty boring period.  Concurrency and mobile are obviously going to matter more, but I keep telling people "the next big thing in software is going to be a little thing in hardware".  I've got my eye on &lt;a href="http://www.gumstix.com/" target="new"&gt;gumstix&lt;/a&gt; and &lt;a href="http://www.nvidia.com/object/cuda_get.html" target="new"&gt;GPU development&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I am certainly missing San Francisco though.  I spent a little more than a year at my last two clients out in the bay area and I sure will miss the weather.  I'll also miss the travel opportunities I got with consulting.  Living on the road always fit well with me.  Relocating back to Chicago was pretty easy this time because everything I own fits into a single trunk and a single piece of luggage.  Now that I will have a permanent address, or at least a permanent city, I have to go buy things like dishes and chairs.&lt;br /&gt;&lt;br /&gt;Well, that's about it for me.  If any of you are in Chicago and you want to meet up just to talk about technology or trading, shoot me an email.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-5185107670014177311?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/5185107670014177311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=5185107670014177311' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/5185107670014177311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/5185107670014177311'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2009/02/i-join-drw-trading.html' title='I Join DRW Trading'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-3083273249754702521</id><published>2008-12-28T14:35:00.000-08:00</published><updated>2008-12-28T15:03:43.677-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='trie tree javascript bag'/><title type='text'>JavaScript Trie Implementation</title><content type='html'>I've been laying around the house this weekend hacking away at little side projects.  Here is one of my tangents.  Perhaps someone out there will give this little guy a nice home, maybe a Bag implementation or a drop down list for an auto suggest enabled form field.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The Test (and how to use it)&lt;/h3&gt;&lt;pre&gt;function testThoughtWorks() { &lt;br /&gt;  var trie = new byrne.TrieNode(&lt;span style="color: rgb(51, 204, 0);"&gt;/* root */&lt;/span&gt;);&lt;br /&gt;  trie.add('thought');&lt;br /&gt;&lt;br /&gt;  assertEquals(1, trie.getWordCount('thought'));&lt;br /&gt;  assertEquals(0, trie.getPrefixCount('thought'));&lt;br /&gt;&lt;br /&gt;  trie.add('thoughtworks');&lt;br /&gt;&lt;br /&gt;  assertEquals(1, trie.getWordCount('thought'));&lt;br /&gt;  assertEquals(1, trie.getPrefixCount('thought'));&lt;br /&gt;  assertEquals(1, trie.getWordCount('thoughtworks')); &lt;br /&gt;  assertEquals(0, trie.getPrefixCount('thoughtworks'));&lt;br /&gt;  assertEquals(0, trie.getWordCount('foo'));&lt;br /&gt;  assertEquals(0, trie.getPrefixCount('foo'));&lt;br /&gt;}&lt;/pre&gt;&lt;h3&gt;The Implementation&lt;/h3&gt;&lt;pre&gt;byrne = {}; &lt;span style="color: rgb(51, 204, 0);"&gt;// create the namespace&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; * @see http://en.wikipedia.org/wiki/Trie&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; * @author Dennis Byrne&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; * @constructor &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; */&lt;/span&gt;&lt;br /&gt;byrne.TrieNode = function(){&lt;br /&gt;  this.wordCount = 0;&lt;br /&gt;  this.prefixCount = 0;&lt;br /&gt;  this.children = [];&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;byrne.TrieNode.prototype.add = function(word) {&lt;br /&gt;  if(word){&lt;br /&gt;    this.prefixCount++;&lt;br /&gt;    var k = word.charAt(0);&lt;br /&gt;    (this.children[k] || (this.children[k] = new byrne.TrieNode()))&lt;br /&gt;      .add(word.substring(1));&lt;br /&gt;  }else&lt;br /&gt;    this.wordCount++;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; * Re&lt;/span&gt;&lt;i style="color: rgb(51, 204, 0);"&gt;trie&lt;/i&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;ve the prefix count of the applied argument w/ recursion.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; */&lt;/span&gt;&lt;br /&gt;byrne.TrieNode.prototype.getPrefixCount = function(word){&lt;br /&gt;  return word ?&lt;br /&gt;    this.getCount(word, arguments.callee) : this.prefixCount;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; * Re&lt;/span&gt;&lt;i style="color: rgb(51, 204, 0);"&gt;trieve&lt;/i&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; the word count of the applied argument w/ recursion.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; */&lt;/span&gt;&lt;br /&gt;byrne.TrieNode.prototype.getWordCount = function(word){&lt;br /&gt;  return word ?&lt;br /&gt;    this.getCount(word, arguments.callee) : this.wordCount;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; * @private&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; */&lt;/span&gt;&lt;br /&gt;byrne.TrieNode.prototype.getCount = function(word, method){&lt;br /&gt;  var k = word.charAt(0);&lt;br /&gt;  return this.children[k] ?&lt;br /&gt;    method.call(this.children[k], word.substring(1)) : 0;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-3083273249754702521?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/3083273249754702521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=3083273249754702521' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/3083273249754702521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/3083273249754702521'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2008/12/javascript-trie-implementation.html' title='JavaScript Trie Implementation'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-1465862330309247525</id><published>2008-11-14T22:02:00.000-08:00</published><updated>2008-11-14T22:09:39.830-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='facelets'/><category scheme='http://www.blogger.com/atom/ns#' term='dzone'/><category scheme='http://www.blogger.com/atom/ns#' term='myfaces'/><category scheme='http://www.blogger.com/atom/ns#' term='designe patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf'/><title type='text'>Book excerpt published by DZone</title><content type='html'>DZone has &lt;a href="http://java.dzone.com/articles/apache-myfaces-antipatterns-an"&gt;published a book excerpt&lt;/a&gt; from &lt;a href="http://apress.com/book/view/1590597370"&gt;The Definitive Guide to Apache MyFaces and Facelets&lt;/a&gt;.  Chapter 7, authored by yours truly, can be downloaded &lt;a href="http://java.dzone.com/sites/all/files/The%20Definitive%20Guide%20to%20Apache%20MyFaces%20and%20Facelets_Ch%207.pdf"&gt;here&lt;/a&gt;.  Enjoy.&lt;a href="http://java.dzone.com/articles/apache-myfaces-antipatterns-an"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-1465862330309247525?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/1465862330309247525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=1465862330309247525' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/1465862330309247525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/1465862330309247525'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2008/11/book-excerpt-published-by-dzone.html' title='Book excerpt published by DZone'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-8216125652006681931</id><published>2008-10-11T22:44:00.001-07:00</published><updated>2008-10-13T22:37:40.774-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='qcon'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><title type='text'>Erlang DSL session at QCon San Francisco</title><content type='html'>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="http://people.apache.org/~dennisbyrne/infoq/QCon_1.png"/&gt;&lt;/td&gt;&lt;td&gt;I'll be presenting &lt;a href="http://qconsf.com/sf2008/speaker/Dennis+Byrne"&gt;"Domain Specific Languages in Erlang"&lt;/a&gt; at &lt;a href="http://qconsf.com/"&gt;QCon&lt;/a&gt; this November.  Hope to see many of you there.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Here's the abstract:&lt;br /&gt;&lt;blockquote&gt;This is the only Erlang presentation you've ever seen that does not begin and end with concurrency.&lt;br /&gt;&lt;br /&gt;Erlang turns out to have a number of properties that make it great for building Domain Specific Languages. - powerful parsing capabilities, runtime evaluation, and pattern matching are a few covered in this session. Along the way you may learn a thing or two about functional and concurrent programming.&lt;br /&gt;&lt;br /&gt;Be prepared to get a little out of your comfort zone with a new syntax ... and a new way to beat your competition.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-8216125652006681931?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/8216125652006681931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=8216125652006681931' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/8216125652006681931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/8216125652006681931'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2008/10/erlang-dsl-session-at-qcon-san.html' title='Erlang DSL session at QCon San Francisco'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-896412456133824770</id><published>2008-09-22T22:49:00.000-07:00</published><updated>2008-09-26T21:37:05.059-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='myfaces facelets apress book java jsf apache'/><title type='text'>Published ... The Definitive Guide to Apache MyFaces and Facelets</title><content type='html'>&lt;a href="http://www.apress.com/book/view/9781590597378" target="_blank"&gt;&lt;img style="float:left" src="http://ecx.images-amazon.com/images/I/51SuoTS1F5L._SL500_AA240_.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;It's finished.  Me and a handful of others from the MyFaces community have collaborated on the &lt;a target="_blank" href="http://www.apress.com/book/view/9781590597378"&gt;"Definitive Guide to Apache MyFaces and Facelets"&lt;/a&gt;.  Some old timers, some new faces ... it was a team effort.  You can purchase a copy directly from &lt;a href="http://www.apress.com/book/view/9781590597378" target="_blank"&gt;Apress &lt;/a&gt;or &lt;a target="_blank" href="http://www.amazon.com/Definitive-Guide-Apache-MyFaces-Facelets/dp/1590597370"&gt;Amazon&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-896412456133824770?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/896412456133824770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=896412456133824770' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/896412456133824770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/896412456133824770'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2008/09/published-definitive-guide-apache.html' title='Published ... The Definitive Guide to Apache MyFaces and Facelets'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-5424319431388881645</id><published>2008-09-09T15:35:00.000-07:00</published><updated>2008-09-09T15:39:57.501-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java erlang russia'/><title type='text'>Integrating Java and Erlang, Russian translation</title><content type='html'>A while back TheServerSide published an article of mine, titled &lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=IntegratingJavaandErlang"&gt;Integrating Java and Erlang&lt;/a&gt;.  Евгений Юрьевич Чувпило has &lt;a href="http://echkrd.blogspot.com/2008/09/integrating-java-and-erlang-java-erlang.html "&gt;translated it&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;Thanks Eugene!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-5424319431388881645?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/5424319431388881645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=5424319431388881645' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/5424319431388881645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/5424319431388881645'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2008/09/integrating-java-and-erlang-russian.html' title='Integrating Java and Erlang, Russian translation'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-4816893196061768014</id><published>2008-07-31T18:31:00.000-07:00</published><updated>2008-07-31T18:48:43.758-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile software &quot;open source&quot;'/><title type='text'>Agile2008 Conference Panel Next Week</title><content type='html'>&lt;table cellspacing=10 style="margin:0"&gt;&lt;tr&gt;&lt;td&gt;I'll be in Toronto next week for the &lt;a href="http://www.agile2008.org/"&gt;Agile2008 &lt;/a&gt;conference.  I'll be a moderator/panelist with &lt;a href="http://agilefaqs.com/nareshjain.html"&gt;Naresh Jain&lt;/a&gt;, &lt;a href="http://www.async.com.br/~kiko/"&gt;Christian Robottom Reis&lt;/a&gt;, &lt;a href="http://www.riehle.org/"&gt;Dirk Riehle&lt;/a&gt; and anyone else that wants to join the fishbowl.  Our session is titled &lt;a href="http://submissions.agile2008.org/node/3292"&gt;Successful Open Source, with little or no Agile&lt;/a&gt;, in the "Challenging Agile" track.  The following week I'll be doing some work in New York City, so if anyone wants to meet up just shoot me an email.  &lt;br /&gt;&lt;/td&gt;&lt;td style="vertical-align:top"&gt;&lt;img src="http://www.agile2008.org/images/Agile2008button.gif"/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-4816893196061768014?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/4816893196061768014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=4816893196061768014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/4816893196061768014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/4816893196061768014'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2008/07/agile2008-conference-panel-next-week.html' title='Agile2008 Conference Panel Next Week'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-4800905125828496244</id><published>2008-07-10T06:49:00.000-07:00</published><updated>2008-07-10T07:12:23.450-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jinterface java erlang &quot;erlang exchange&quot; &quot;google video&quot;'/><title type='text'>Using Jinterface to Bridge Erlang and Java - via Google Video</title><content type='html'>Here is my talk from London a few weeks back.  Special thanks to Skills Matter for making this available.&lt;br /&gt;&lt;br /&gt;&lt;embed id="VideoPlayback" style="width:400px;height:326px" allowFullScreen="true" src="http://video.google.com/googleplayer.swf?docid=4444181616023101263&amp;hl=en&amp;fs=true" type="application/x-shockwave-flash"&gt; &lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://video.google.com/videoplay?docid=4444181616023101263&amp;q=erlang+exchange+2008&amp;ei=JvlvSNPcA5zaqAKqoqGVDw"&gt;Using Jinterface to Bridge Erlang and Java&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-4800905125828496244?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/4800905125828496244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=4800905125828496244' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/4800905125828496244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/4800905125828496244'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2008/07/using-jinterface-to-bridge-erlang-and.html' title='Using Jinterface to Bridge Erlang and Java - via Google Video'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-3495502200034637377</id><published>2008-06-27T22:58:00.000-07:00</published><updated>2008-06-28T00:15:05.403-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='&quot;erlang exchange&quot; erlang'/><title type='text'>Wrap up for the Erlang eXchange</title><content type='html'>The Erlang eXchange is over and I have to say this was a fantastic conference.  Wendy and team deserve a lot of credit for making all of this happen.&lt;br /&gt;&lt;br /&gt;Here's the highlights.  Of the 140+ participants, one third were from the financial sector.  I don't think that surprised anyone.  Finance is the next domain (after telco of course) to start making money with Erlang.  Joe Armstrong was there with all kinds of answers to all kinds of questions.  As Erlang grows in popularity I suspect Erlang enthusiasts won't have this opportunity much longer.  Soon folks will begin to complain about how easy it used to be to get direction from the horse's mouth.  Even the mailing list is getting a little too noisy lately in my opinion.  My advice?  Stop asking Joe.  He deserves all of the recognition he's got right now but I think some folks overlook people like Klacke Wikström.  This guy has cranked out a compiler, a garbage collector, YAWS and the bit syntax for Erlang!  Finally, a big thanks to Steve Vinoski for a great keynote speech.  Ted Neward would have loved it!&lt;br /&gt;&lt;br /&gt;In a show of  hands, about half of all participants described themselves as full time professional Erlang developers, while the other half described themselves as language enthusiasts working with Erlang on their own spare time.  Most folks at the conference seemed to agree that the Erlang community needed a killer app and more libraries.  I agree with this for the most part, but a lot of folks seem to forget that a large number of libraries and third party APIs is not always a sign of a thriving ecosystem - sometimes a library exists entirely because of limitations of the underlying platform/language, or to solve an impedance mismatch problem that you simply shouldn't have.&lt;br /&gt;&lt;br /&gt;I've been asked to make my slides available, so &lt;a href="http://people.apache.org/~dennisbyrne/erlang_exchange/erlang_exchange_jinterface.ppt"&gt;here they are&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-3495502200034637377?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/3495502200034637377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=3495502200034637377' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/3495502200034637377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/3495502200034637377'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2008/06/wrap-up-for-erlang-exchange.html' title='Wrap up for the Erlang eXchange'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-3026321705820373369</id><published>2008-06-20T08:05:00.000-07:00</published><updated>2008-06-20T08:12:21.922-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang dsl functional_programming finance'/><title type='text'>Erlang/DSL article published on InfoQ</title><content type='html'>InfoQ has published an &lt;a href="http://www.infoq.com/articles/erlang-dsl"&gt;article&lt;/a&gt; of mine.  This article challenges the idea that Erlang is only good at concurrency.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-3026321705820373369?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/3026321705820373369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=3026321705820373369' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/3026321705820373369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/3026321705820373369'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2008/06/erlangdsl-article-published-on-infoq.html' title='Erlang/DSL article published on InfoQ'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-8854219585177070322</id><published>2008-06-15T10:58:00.000-07:00</published><updated>2008-06-15T12:08:41.978-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java closures closure dolphin'/><title type='text'>Yet another reason for why Java needs Closures</title><content type='html'>Ever try to unit test code with static method calls?  That's right.  You know how this feels.&lt;pre&gt;class  Untestable{&lt;br /&gt;    public void doSomething(){&lt;br /&gt;        ...&lt;br /&gt;        if ( Util.openSocketAndThenGoToFileSystem() ) &lt;br /&gt;        ...&lt;br /&gt;    }  &lt;br /&gt;}&lt;/pre&gt;Unit testing doSomething is often impossible because unit tests simply don't do things like talk to networks or file systems.    It's even more "fun" when someone puts code like this in a constructor - that way you can't even instantiate an instance of Untestable outside the production environment.&lt;br /&gt;&lt;br /&gt;This is particularly painful in Java (as it stands today) for two reasons.  First, there are no open classes.  Sure, there is conditional compilation or cglib but at the end of the day, it's never going to be as easy as it is in JavaScript, Python, etc.&lt;br /&gt;&lt;br /&gt;Second, it calls a &lt;i&gt;static method&lt;/i&gt;.  If you haven't read &lt;a href="http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html"&gt;Steve Yegge's post&lt;/a&gt; on this matter, verbs are second class citizens in Java.  Because each verb must be escorted by a noun at all times, methods cannot be stubbed out or mocked.  This limitation has profound side effects on the maintainability (and profitability) of every large Java code base.  &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Enter Closures ...&lt;/h3&gt;&lt;br /&gt;We can refactor the Untestable class to a Testable class.  &lt;pre&gt;class Testable{&lt;br /&gt;&lt;br /&gt;    private final { =&gt; boolean } collaborator;&lt;br /&gt;&lt;br /&gt;    Testable({ =&gt; boolean } collaborator){&lt;br /&gt;       this.collaborator = collaborator;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void doSomething(){&lt;br /&gt;        ...&lt;br /&gt;        if ( collaborator.invoke() )&lt;br /&gt;        ...&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;By declaring a closure instance variable we can use Dependency Injection to exercise the functionality of Testable without doing something expensive.  This is a lot easier than retrofitting an interface or inner class.  Our test methods now look like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public void testDoSomething(){&lt;br /&gt;     Testable testable = new Testable({ =&gt; true });&lt;br /&gt;     testable.doSomething();&lt;br /&gt;     assertTrue(true, testable.someSideEffect());&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Neal Gafter tells me the chances of closures making it into the next version of Java is getting smaller and smaller.  I'm keeping my fingers crossed, time will tell.  Keep up the good work Neal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-8854219585177070322?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/8854219585177070322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=8854219585177070322' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/8854219585177070322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/8854219585177070322'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2008/06/yet-another-reason-for-why-java-needs.html' title='Yet another reason for why Java needs Closures'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-8834244787668587509</id><published>2008-06-08T22:08:00.000-07:00</published><updated>2008-06-14T09:51:41.283-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang ruby'/><title type='text'>Ruby and Erlang</title><content type='html'>There just can't be a pair of programming languages that are more different than these two.  About the only thing Erlang and Ruby have in common is the whole unicode issue.&lt;table style="width: 550px; border-collapse: collapse;padding: 0"&gt;&lt;br /&gt;&lt;tr&gt;&lt;th style="border-bottom: solid black 1px"&gt;&lt;/th&gt;&lt;th style="border-bottom: solid black 1px"&gt;&lt;div align=left&gt;Erlang&lt;/div&gt;&lt;/th&gt;&lt;th style="border-bottom: solid black 1px"&gt;&lt;div align=left&gt;Ruby&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right: solid black 1px;"&gt;&lt;b&gt;Concurrency &lt;/b&gt;&lt;/td&gt;&lt;td style="padding-left: 15px"&gt;&lt;img src="http://people.apache.org/~dennisbyrne/e_and_r/up.jpg"&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="http://people.apache.org/~dennisbyrne/e_and_r/down.jpg"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:100px;"&gt;&lt;td style="border-right: solid black 1px"&gt;&lt;b&gt;Orientation&lt;/b&gt;&lt;/td&gt;&lt;td style="padding-left: 15px"&gt;Functional&lt;/td&gt;&lt;td&gt;Object&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right: solid black 1px"&gt;&lt;b&gt;Syntax      &lt;/b&gt;&lt;/td&gt;&lt;td style="padding-left: 15px"&gt;&lt;img src="http://people.apache.org/~dennisbyrne/e_and_r/shrek.jpg"&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="http://people.apache.org/~dennisbyrne/e_and_r/uma.jpg"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:100px;"&gt;&lt;td style="border-right: solid black 1px"&gt;&lt;b&gt;Track record&lt;/b&gt;&lt;/td&gt;&lt;td style="padding-left: 15px"&gt;Back end&lt;/td&gt;&lt;td &gt;Front end&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-8834244787668587509?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/8834244787668587509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=8834244787668587509' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/8834244787668587509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/8834244787668587509'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2008/06/ruby-and-erlang.html' title='Ruby and Erlang'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-1961167282407724972</id><published>2008-06-04T19:25:00.000-07:00</published><updated>2008-06-04T19:37:29.412-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apache incubator erlang jinterface java thoughtworks'/><title type='text'>ThoughtWorks Geek Night in London</title><content type='html'>I'll be presenting Erlang/JInterface at a ThoughtWorks London Geek Night later this month along side &lt;a href="http://jan.prima.de/"&gt;Jan Lehnardt&lt;/a&gt;.  Jan will be talking about &lt;a href="http://incubator.apache.org/couchdb/"&gt;CouchDB&lt;/a&gt;, a database written in Erlang.    There is a rumor out that CouchDB scales well ... &lt;br /&gt;&lt;br /&gt;Click &lt;a href="http://upcoming.yahoo.com/event/753224/"&gt;here &lt;/a&gt;or &lt;a href="http://londongeeknights.wetpaint.com/page/Erlang+Evening"&gt;here &lt;/a&gt;for location and time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-1961167282407724972?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/1961167282407724972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=1961167282407724972' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/1961167282407724972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/1961167282407724972'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2008/06/thoughtworks-geek-night-in-london.html' title='ThoughtWorks Geek Night in London'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-6850936750847099521</id><published>2008-04-29T07:40:00.000-07:00</published><updated>2008-04-29T07:44:06.276-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jsf jsfunit jboss java'/><title type='text'>JSFUnit Beta 2 Released</title><content type='html'>Stan's &lt;a href="http://www.jboss.com/index.html?module=bb&amp;op=viewtopic&amp;p=4147406#4147406"&gt;announcement&lt;/a&gt; says it all.  Please beat it up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-6850936750847099521?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/6850936750847099521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=6850936750847099521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/6850936750847099521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/6850936750847099521'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2008/04/jsfunit-beta-2-released.html' title='JSFUnit Beta 2 Released'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-7946402428553196109</id><published>2008-04-20T09:45:00.000-07:00</published><updated>2008-04-20T13:14:44.994-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang functional_programming function_evaluation'/><title type='text'>Sequence and Order in Erlang</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;I’ll be at ThoughtWorks Chicago headquarters for this weeks’ Away Day gathering.  One of my slides is about the order of evaluation and message sequencing in Erlang.  I like to think of it as an "Erlang Puzzler".  For anyone who won’t be there, take a look at this 'contrived' module.  It is composed of three functions: sequence/0, maketuple/0 and echo/0.&lt;span style="font-family:Verdana;"&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;-module(contrived).&lt;br /&gt;-export([sequence/0]).&lt;br /&gt;&lt;br /&gt;sequence() -&gt;&lt;br /&gt; &lt;span style="color: rgb(204, 153, 51);"&gt;Pid &lt;/span&gt;= spawn(fun echo/0),&lt;br /&gt; register(echoprocess, &lt;span style="color: rgb(204, 153, 51);"&gt;Pid&lt;/span&gt;),&lt;br /&gt; whereis(echoprocess) ! maketuple(self(), now()),&lt;br /&gt; whereis(echoprocess) ! maketuple(self(), now()).&lt;br /&gt;&lt;br /&gt;echo() -&gt;&lt;br /&gt;    receive&lt;br /&gt;       {&lt;span style="color: rgb(204, 153, 51);"&gt;From&lt;/span&gt;, {&lt;span style="color: rgb(204, 153, 51);"&gt;A&lt;/span&gt;,&lt;span style="color: rgb(204, 153, 51);"&gt;B&lt;/span&gt;,&lt;span style="color: rgb(204, 153, 51);"&gt;C&lt;/span&gt;}} -&gt;&lt;br /&gt;         &lt;span style="color: rgb(204, 153, 51);"&gt;From &lt;/span&gt;! {&lt;span style="color: rgb(204, 153, 51);"&gt;A&lt;/span&gt;,&lt;span style="color: rgb(204, 153, 51);"&gt;B&lt;/span&gt;,&lt;span style="color: rgb(204, 153, 51);"&gt;C&lt;/span&gt;},&lt;br /&gt;         echo()&lt;br /&gt;    end.&lt;br /&gt;&lt;br /&gt;maketuple(&lt;span style="color: rgb(204, 153, 51);"&gt;Self&lt;/span&gt;, &lt;span style="color: rgb(204, 153, 51);"&gt;Now&lt;/span&gt;) -&gt; {&lt;span style="color: rgb(204, 153, 51);"&gt;Self&lt;/span&gt;, &lt;span style="color: rgb(204, 153, 51);"&gt;Now&lt;/span&gt;}.&lt;/pre&gt;&lt;/blockquote&gt;&lt;/span&gt;What does this do?  The sole public sequence function spawns the self documented echo function as an Erlang process.  It then registers this process as “echoprocess” and sends it two messages.  Both messages are return values of maketuple, which simply yields its two arguments as a tuple.&lt;br /&gt;&lt;br /&gt;There are a few subtleties here.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Strict Evaluation&lt;/h3&gt;&lt;br /&gt;Pay attention to the two calls to maketuple.  The arguments applied to maketuple are calls to built-in functions self/0 and now/0.  Are these arguments evaluated before or after maketuple is evaluated?  In a functional programming language like Haskell the calls to self and now would be delayed until the value of the arguments were needed within maketuple.  This means self or now could start after the call to maketuple, finish before it, or possibly never be evaluated.  This is called lazy evaluation.  Function arguments in Erlang however are strictly evaluated, meaning self and now are evaluated before maketuple.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Referential Transparency&lt;/h3&gt;&lt;br /&gt;What is the order of evaluation for self and now?  It is natural for an experienced imperative programmer to assume self precedes now.  Some would say this is in observation of the principle of least astonishment.&lt;br /&gt;&lt;br /&gt;The order of evaluation for self and now is undefined.  In a deterministic world without side effects, the order of evaluation is inconsequential - just like the commutative property of addition in grade school.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Order of Evaluation for Send Operands&lt;/h3&gt;&lt;br /&gt;The operands of the send operator (!) are calls to the built-in function whereis/1 is and maketuple.  Which is called first, whereis or maketuple?  Left to right?  Right to left?  Again, the order is undefined.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Delivery Order of Asynchronous Messages&lt;/h3&gt;&lt;br /&gt;The sequence function sends two messages.  In which order are the received?  An undefined order would really complete the process/actor/mailbox metaphor.  When you send two letters in the mail, is the recipient guaranteed to read each letter in the order they were sent?  Of course not.  An undefined order of delivery would also sit well with many other asynchronous communication mediums.&lt;br /&gt;&lt;br /&gt;It turns out the order of message delivery is in fact guaranteed to be the order in which they were sent.  Despite the various possible execution paths of the sequence function, things are pretty static on the other side in the echoprocess.  This is not to say that the second message will be delivered immediately after the first message - there could in theory be messages from other processes in the mix.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-7946402428553196109?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/7946402428553196109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=7946402428553196109' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/7946402428553196109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/7946402428553196109'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2008/04/sequence-and-order-in-erlang.html' title='Sequence and Order in Erlang'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-5286217529101802230</id><published>2008-03-19T08:16:00.000-07:00</published><updated>2008-03-23T13:31:31.989-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang java jinterface OTP erlang_exchange jmeter'/><title type='text'>Session proposal accepted for the Erlang eXchange</title><content type='html'>I'll be in London this June at the &lt;a href="http://www.erlang-exchange.com/"&gt;Erlang eXchange&lt;/a&gt;.  My session will cover the jInterface API and a fair and unbiased comparison of Erlang and Java, regarding concurrent systems development of course.  Hope to see many of you there if you're in the area, June 26th to 27th.  You also want to keep an eye out for another session from one of my colleagues, Karthik Ramachandra. He has been invited to do a session on an Erlang rewrite of JMeter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-5286217529101802230?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/5286217529101802230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=5286217529101802230' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/5286217529101802230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/5286217529101802230'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2008/03/session-proposal-accepted-for-erlang.html' title='Session proposal accepted for the Erlang eXchange'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-2447645375774731367</id><published>2008-02-28T12:07:00.000-08:00</published><updated>2008-11-27T07:22:44.626-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jsf tss anti-pattern'/><title type='text'>Article published on TSS</title><content type='html'>&lt;a href="http://theserverside.com/"&gt;TheServerSide&lt;/a&gt; has &lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=JSFAnti-PatternsandPitfalls"&gt;published an article&lt;/a&gt; of mine on JSF Anti-Patterns.  Discussion is &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=48457"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Update: fixed broken link&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-2447645375774731367?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/2447645375774731367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=2447645375774731367' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/2447645375774731367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/2447645375774731367'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2008/02/article-published-on-tss.html' title='Article published on TSS'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-427769023369258671</id><published>2008-01-12T19:04:00.000-08:00</published><updated>2008-01-12T19:21:06.753-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jsf tss java myfaces conference anti-pattern design-pattern apache apachecon'/><title type='text'>Upcoming Talks</title><content type='html'>In addition to my &lt;a href="http://notdennisbyrne.blogspot.com/2007/12/java-erlang-proposal-accepted-for-tssjs.html"&gt;other session&lt;/a&gt; for TSSJS I'll be doing a case study on JSF anti-patterns. Here's my submitted abstract:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Anti-Patterns and Pitfalls in JSF&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;This session will cover a dozen war stories demonstrating what NOT to do with JavaServer Faces.  Patterns presented will touch on third party library integration, vendor lock-in, performance, tight coupling, cache management, thread safety, security, interoperability and test-driven development. Solutions to each anti-pattern will be discussed. &lt;/blockquote&gt;I'll also be in Amsterdam for ApacheCon 2008.  Me and a few other ThoughtWorkers have started an community blog for open source topics so I thought I'd publish the details &lt;a href="http://tw-oss.blogspot.com/"&gt;over there&lt;/a&gt;.  This link may break soon if Paul moves the site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-427769023369258671?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/427769023369258671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=427769023369258671' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/427769023369258671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/427769023369258671'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2008/01/upcoming-talks.html' title='Upcoming Talks'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-7630920706306881517</id><published>2007-12-22T18:00:00.000-08:00</published><updated>2007-12-22T18:13:28.146-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang java theserverside tss concurrency vegas'/><title type='text'>Java &amp; Erlang proposal accepted for TSSJS conference</title><content type='html'>Looks like I'll be in Vegas this March.  &lt;a href="http://www.theserverside.com/"&gt;TheServerSide &lt;/a&gt;conference committee has invited me to give a fireside chat at the 7th annual &lt;a href="http://javasymposium.techtarget.com"&gt;TSS Java Symposium&lt;/a&gt;.  Here's my submitted abstract:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Concurrent Programming with Java and Erlang &lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;The industry is going parallel.  This session will demonstrate how trivial it is to build highly scalable fault tolerant systems in Java with JInterface, an open source bridge for Java and Erlang.  Learn the differences between Java threads and Erlang processes.  See how to write software that can take advantage of multi-core processing without locks, keys, synchronization or shared memory.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-7630920706306881517?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/7630920706306881517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=7630920706306881517' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/7630920706306881517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/7630920706306881517'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2007/12/java-erlang-proposal-accepted-for-tssjs.html' title='Java &amp; Erlang proposal accepted for TSSJS conference'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-6291329803788903346</id><published>2007-12-02T12:05:00.000-08:00</published><updated>2007-12-02T12:10:08.808-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jsf junit jboss'/><title type='text'>JSFUnit Beta 1 Released</title><content type='html'>Check out the &lt;a href='http://www.jboss.com/index.html?module=bb&amp;op=viewtopic&amp;p=4109664#4109664'&gt;forum&lt;/a&gt; or &lt;a href="http://jsfunit.blogspot.com/2007/11/jsfunit-beta-1-is-released.html"&gt;Stan's blog&lt;/a&gt; for all the details.  Please beat it up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-6291329803788903346?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/6291329803788903346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=6291329803788903346' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/6291329803788903346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/6291329803788903346'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2007/12/jsfunit-beta-1-released.html' title='JSFUnit Beta 1 Released'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-9101319463639889697</id><published>2007-11-06T17:31:00.000-08:00</published><updated>2007-11-06T17:43:26.515-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TDD JSF apache jboss jsfunit myfaces shale apachecon mocks stubs'/><title type='text'>TDD + JSF BOF @ ApacheCon next week</title><content type='html'>&lt;img src='http://www.apache.org/ads/ApacheCon/2007-usa-234x60.png'/&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="https://javaserverfaces.dev.java.net/devs/ssilvert.html"&gt;Stan Silvert&lt;/a&gt; and I are doing a presentation on testing JavaServer Faces applications at ApacheCon US 2007 next week.  Swing by Room 4 on Thursday, November 14 to hear us cover the &lt;a href="http://shale.apache.org/"&gt;Apache Shale&lt;/a&gt; (soon to be Myfaces) and &lt;a href="http://labs.jboss.com/jsfunit/"&gt;JSFUnit&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-9101319463639889697?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/9101319463639889697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=9101319463639889697' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/9101319463639889697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/9101319463639889697'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2007/11/tdd-jsf-bof-apachecon-next-week.html' title='TDD + JSF BOF @ ApacheCon next week'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-637354207083920151</id><published>2007-10-19T18:20:00.000-07:00</published><updated>2007-10-20T05:32:53.241-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang unification threadlocal'/><title type='text'>Psst ... Erlang has mutable state</title><content type='html'>The first thing you learn when picking up Erlang is "What? you mean I can't change a variable?"  Example? The following fails.&lt;pre&gt;X = 1.&lt;br /&gt;X = 2.&lt;br /&gt;Error in process &lt;0.73.0&gt; on node 'a@byrned.thoughtworks.com' with exit value: {{badmatch,2},[{erl_eval,expr,3}]}&lt;br /&gt;&lt;/pre&gt;When runtime encounters the second line of code it tries to "unify" both sides of the equation.  The error is thrown because X is already bound to 1.  You can get around this whenever you &lt;i&gt;really&lt;/i&gt; need to by telling Erlang to forget the binding.  Whether or not you should is a separate matter.&lt;pre&gt;X = 1.&lt;br /&gt;f(X).&lt;br /&gt;X = 2.&lt;br /&gt;&lt;/pre&gt;Erlang is often described as a language with "no side effects" and no mutable state.  I don't mean to let the cat out of the bag, but, it DOES.  Check out built in functions get() and put().  Each Erlang process has a map that can be accessed via get and put, behaving much like &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ThreadLocal.html"&gt;ThreadLocal&lt;/a&gt;.      &lt;br /&gt;&lt;br /&gt;(node@byrned.thoughtworks.com)16&gt; put(foo, 8).&lt;br /&gt;undefined&lt;br /&gt;(node@byrned.thoughtworks.com)17&gt; get(foo).&lt;br /&gt;8&lt;br /&gt;(node@byrned.thoughtworks.com)18&gt; put(foo, 9).&lt;br /&gt;8&lt;br /&gt;(node@byrned.thoughtworks.com)19&gt; get(foo).&lt;br /&gt;9&lt;br /&gt;&lt;br /&gt;Use these at your own discretion, but try to forget where you learned it from.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-637354207083920151?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/637354207083920151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=637354207083920151' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/637354207083920151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/637354207083920151'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2007/10/psst-erlang-has-mutable-state.html' title='Psst ... Erlang has mutable state'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-4029059236071771546</id><published>2007-10-13T17:20:00.000-07:00</published><updated>2008-01-07T19:50:52.288-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang java jinterface OTP grid'/><title type='text'>Erlang from Java is easy with Jinterface</title><content type='html'>I am removing this content; most of it was a subset of an article I've written.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=IntegratingJavaandErlang"&gt;Integrating Java and Erlang&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-4029059236071771546?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/4029059236071771546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=4029059236071771546' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/4029059236071771546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/4029059236071771546'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2007/10/erlang-from-java-is-easy-with.html' title='Erlang from Java is easy with Jinterface'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-1753646804074140401</id><published>2007-10-03T19:40:00.000-07:00</published><updated>2007-10-03T21:01:19.963-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jsf el guice myfaces apache'/><title type='text'>Integrating Guice and JSF (Part 2)</title><content type='html'>&lt;a href="http://svn.apache.org/viewvc/myfaces/core/branches/1_2_1/impl/src/main/java/org/apache/myfaces/el/unified/resolver/GuiceResolver.java?revision=581762&amp;view=markup"&gt;Checked in&lt;/a&gt; an improvement to &lt;a href="http://notdennisbyrne.blogspot.com/2007/09/integrating-guice-and-jsf.html"&gt;the first pass&lt;/a&gt;.  Using a custom ELResolver you can take advantage of setter injection and constuctor injection now.&lt;pre&gt; &amp;lt;application&gt;&lt;br /&gt; &amp;lt;el-resolver&gt;&lt;br /&gt;  org.apache.myfaces.el.unified.resolver.GuiceResolver&lt;br /&gt; &amp;lt;/el-resolver&gt;&lt;br /&gt; &amp;lt;/application&gt;&lt;br /&gt;&lt;/pre&gt;Note: this will not work with the reference implementation and it requires JSF 1.2 .  Thanks to Jacob Hookom for introducing me to the ELResolver class.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-1753646804074140401?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/1753646804074140401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=1753646804074140401' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/1753646804074140401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/1753646804074140401'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2007/10/integrating-guice-and-jsf-part-2.html' title='Integrating Guice and JSF (Part 2)'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-3910851547468228867</id><published>2007-09-30T07:39:00.000-07:00</published><updated>2007-09-30T08:28:22.158-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jsf guice java ioc di dependency injection'/><title type='text'>Integrating Guice and JSF</title><content type='html'>Special thanks to my teammate Çağatay Çivici for &lt;a href="http://cagataycivici.wordpress.com/2007/03/26/integrating_guice_and_jsf/"&gt;inspiring&lt;/a&gt; me on this one.  I will never be able to pronounce his name correctly, but that certainly doesn't stop me from taking one of his good ideas and running with it.&lt;br /&gt;&lt;br /&gt;Çağatay approached JSF/Guice integration by using a ServletContextListener to initialize Guice while annotating each managed bean with @PostConstruct. For my spike, I have kept the ServletContextListener but replaced @PostConstruct with a custom VariableResolver.  It goes like this ...&lt;h3&gt;The Model&lt;/h3&gt;&lt;pre&gt;&lt;small&gt;public class ShoppingCart {&lt;br /&gt;  private Order order;&lt;br /&gt;  @Inject&lt;br /&gt;  public void setOrder(Order order) { this.order = order; }&lt;br /&gt;  public Order getOrder() { return order; }&lt;br /&gt;}&lt;br /&gt;public interface Order { }&lt;br /&gt;public class BulkOrder implements Order {&lt;br /&gt;  public String toString() { return "I am a Bulk Order"; }&lt;br /&gt;}&lt;/small&gt;&lt;/pre&gt;&lt;h3&gt;The View&lt;/h3&gt;&lt;pre&gt;&lt;small&gt;&amp;lt;html&gt;&lt;br /&gt;  &amp;lt;body&gt;&lt;br /&gt;  &amp;lt;f:view&gt;&lt;br /&gt;     &amp;lt;h:outputText value="#{shoppingCart.order}" /&gt;&lt;br /&gt;  &amp;lt;/f:view&gt;&lt;br /&gt;  &amp;lt;/body&gt;&lt;br /&gt;&amp;lt;/html&gt;&lt;/small&gt;&lt;/pre&gt;This page renders "I am a Bulk Order", even though the shopping cart has no notion of a bulk order. The bulk order is injected into the shopping cart instance, a regular managed bean.&lt;pre&gt;&lt;small&gt;&amp;lt;managed-bean&gt;&lt;br /&gt;   &amp;lt;managed-bean-name&gt;shoppingCart&amp;lt;/managed-bean-name&gt; &lt;br /&gt;   &amp;lt;managed-bean-class&gt;com.thoughtworks.guice.ShoppingCart&lt;br /&gt;   &amp;lt;/managed-bean-class&gt;&lt;br /&gt;   &amp;lt;managed-bean-scope&gt;request&amp;lt;/managed-bean-scope&gt;&lt;br /&gt;&amp;lt;/managed-bean&gt;&lt;/small&gt;&lt;/pre&gt;This isn't an escape from XML hell, but it will put your configuration files on a diet. You still have to "name" each managed bean, Guice handles everything else.&lt;h3&gt;How it Works&lt;/h3&gt;Once JSF has created the ShoppingCart instance, Guice is allowed to intercept before it is received by the view. (In faces-config.xml )&lt;pre&gt;&lt;small&gt;&amp;lt;application&gt;&lt;br /&gt;   &amp;lt;variable-resolver&gt;&lt;br /&gt;      com.thoughtworks.guice.GuiceVariableResolver&lt;br /&gt;   &amp;lt;/variable-resolver&gt;     &lt;br /&gt;&amp;lt;/application&gt;&lt;br /&gt;   &lt;br /&gt;public class GuiceVariableResolver extends VariableResolver {&lt;br /&gt;  private final VariableResolver wrapped;&lt;br /&gt;  public GuiceVariableResolver(VariableResolver wrapped) {&lt;br /&gt;    if(wrapped == null)&lt;br /&gt;      throw new NullPointerException("wrapped " &lt;br /&gt;        + VariableResolver.class.getName());&lt;br /&gt;    this.wrapped = wrapped;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public Object resolveVariable(FacesContext fctx, String name)&lt;br /&gt;    throws EvaluationException {&lt;br /&gt;    Object resolved = wrapped.resolveVariable(fctx, name);&lt;br /&gt;    if(resolved != null) {&lt;br /&gt;      Map&lt;String, Object&gt; map = fctx.getExternalContext().getApplicationMap();&lt;br /&gt;      Injector injector = (Injector) map.get(Injector.class.getName());&lt;br /&gt;      if(injector == null)&lt;br /&gt;        throw new NullPointerException("Could not locate " &lt;br /&gt;          + "Guice Injector in application scope using" &lt;br /&gt;          + " key '" + Injector.class.getName() + "'");&lt;br /&gt;      injector.injectMembers(resolved);&lt;br /&gt;    }&lt;br /&gt;    return resolved;&lt;br /&gt;  }&lt;br /&gt;}&lt;/small&gt;&lt;br /&gt;&lt;/pre&gt;The GuiceVariableResolver relies on the GuiceServletContextListener, which isn't any different from Çağatay's ServletContextListener (In web.xml)&lt;pre&gt;&lt;small&gt;&amp;lt;listener&gt;&lt;br /&gt;     &amp;lt;listener-class&gt;&lt;br /&gt;        com.thoughtworks.guice.GuiceServletContextListener&lt;br /&gt;     &amp;lt;/listener-class&gt;&lt;br /&gt;&amp;lt;/listener&gt;  &lt;br /&gt;&lt;br /&gt;public class GuiceServletContextListener &lt;br /&gt;  implements ServletContextListener {&lt;br /&gt;  public void contextInitialized(ServletContextEvent event) {&lt;br /&gt;    ServletContext ctx = event.getServletContext();&lt;br /&gt;    Injector inject = Guice.createInjector(new ShoppingModule());&lt;br /&gt;    ctx.setAttribute(Injector.class.getName(), inject);&lt;br /&gt;  }&lt;br /&gt;  public void contextDestroyed(ServletContextEvent event) {&lt;br /&gt;    ServletContext ctx = event.getServletContext();&lt;br /&gt;    ctx.removeAttribute(Injector.class.getName());&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class ShoppingModule implements Module {&lt;br /&gt;  public void configure(Binder binder) {&lt;br /&gt;    binder.bind(Order.class).to(BulkOrder.class);&lt;br /&gt;  }&lt;br /&gt;}&lt;/small&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-3910851547468228867?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/3910851547468228867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=3910851547468228867' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/3910851547468228867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/3910851547468228867'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2007/09/integrating-guice-and-jsf.html' title='Integrating Guice and JSF'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-457482089995196026</id><published>2007-09-28T22:41:00.000-07:00</published><updated>2007-09-28T23:05:42.078-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jsfunit jboss java asp.net rails jsf struts facelets'/><title type='text'>JBoss JSFUnit and Static Analysis</title><content type='html'>I have been teaming up with Stan Silvert on &lt;a href="http://labs.jboss.com/jsfunit/"&gt;JSFUnit&lt;/a&gt; lately.  Most of the work &lt;a href="http://wiki.jboss.org/wiki/Wiki.jsp?page=StaticAnalysis"&gt;I've completed&lt;/a&gt; centers around a few ideas I've had while writing code for the MyFaces project.  It may not the lightest weight solution, but after all these years, having worked with ASP.net, Struts, Tapestry and Rails - I have found JSF to be the most testing friendly MVC framework.  So much of the code base can be penetrated with plain unit tests - without a database connection, container or browser.  This lies in part to the fact that JSF managed beans do not have to "&lt;span style="font-style:italic;"&gt;implements SessionBean&lt;/span&gt;" or "&lt;span style="font-style:italic;"&gt;&lt; ActiveRecord::Base&lt;/span&gt;".  Trade offs.  Next up on my plate are a few static analysis tests for Facelets templates.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-457482089995196026?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/457482089995196026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=457482089995196026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/457482089995196026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/457482089995196026'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2007/09/jboss-jsfunit-and-static-analysis.html' title='JBoss JSFUnit and Static Analysis'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-5614329095417729746</id><published>2007-09-20T21:22:00.000-07:00</published><updated>2007-09-20T21:37:45.289-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='junit java Calendar tdd'/><title type='text'>Pop Quiz : JUnit Negative Testing</title><content type='html'>When will this fail?&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class NegativeTest extends TestCase{&lt;br /&gt;&lt;br /&gt; public void testCalendar() {&lt;br /&gt;   &lt;br /&gt;  try {&lt;br /&gt;&lt;br /&gt;       Calendar now = Calendar.getInstance();&lt;br /&gt;    &lt;br /&gt;       for(int i = 0 ; i &lt; 10000000; i++) ;&lt;br /&gt;    &lt;br /&gt;       if(! now.before(Calendar.getInstance()))&lt;br /&gt;           throw new RuntimeException();&lt;br /&gt;    &lt;br /&gt;       fail("Negative test failure");&lt;br /&gt;    &lt;br /&gt;  }catch(Throwable t) { }&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-5614329095417729746?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/5614329095417729746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=5614329095417729746' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/5614329095417729746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/5614329095417729746'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2007/09/pop-quiz-junit-negative-testing.html' title='Pop Quiz : JUnit Negative Testing'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-8393223759175931730</id><published>2007-09-16T14:56:00.000-07:00</published><updated>2007-09-16T15:06:15.590-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atomic java'/><title type='text'>Pop Quiz: AtomicInteger equals method</title><content type='html'>&lt;span style="font-style:italic;"&gt;What does this print?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;int i = 100;&lt;br /&gt;AtomicInteger one = new AtomicInteger(i);&lt;br /&gt;AtomicInteger two = new AtomicInteger(i);&lt;br /&gt;System.out.println( one.equals(two) );&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-8393223759175931730?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/8393223759175931730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=8393223759175931730' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/8393223759175931730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/8393223759175931730'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2007/09/pop-quiz-atomicinteger-equals-method.html' title='Pop Quiz: AtomicInteger equals method'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-5505086718153178416</id><published>2007-06-24T11:29:00.000-07:00</published><updated>2007-06-25T17:35:42.364-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='activemq rails ruby java ajax rest a13g activemessaging apache'/><title type='text'>Integrating Rails and ActiveMQ with ActiveMessaging/REST</title><content type='html'>ActiveMQ ships with a simple chat demo.  The chat demo uses a Servlet to relay AJAX requests to and from a JMS Topic (the source for this application is also a good place to start if you are interested in learning about Jetty Continuations).  Below are some instructions on how to build an alternate client with Rails for the chat demo.  This is done via activemessaging(AKA a13g), a plugin which relays/dispatches the messages to the Servlet (or any other "broker").&lt;br /&gt;&lt;h3&gt;Assuming Java, Ruby and Rails ...&lt;/h3&gt;&lt;pre&gt;  $rails -v&lt;br /&gt;    Rails 1.2.3 &lt;br /&gt;  $ruby -v &lt;br /&gt;    ruby 1.8.5 &lt;br /&gt;  $java -version&lt;br /&gt;    java version "1.6.0_01"&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Setting Up ActiveMQ&lt;/h3&gt;&lt;a href="http://people.apache.org/repo/m2-snapshot-repository/org/apache/activemq/apache-activemq/5.0-SNAPSHOT/apache-activemq-5.0-20070623.220505-6.tar.gz"&gt;Download&lt;/a&gt; and unzip the binary. Start the broker and demo application by running /apache-activemq-5.0-SNAPSHOT/bin/activemq . This only works with a 20070623 (or later) build of ActiveMQ. For an earlier build, see this &lt;a href="https://issues.apache.org/activemq/browse/AMQ-1270"&gt;patch&lt;/a&gt;.&lt;br /&gt;&lt;h3&gt;Create a Rails application&lt;/h3&gt;&lt;pre&gt;  $rails a13g &lt;br /&gt;    (output excluded)&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Generate a Controller and a View&lt;/h3&gt;&lt;pre&gt;  $cd a13g&lt;br /&gt;  $script/generate controller talk index&lt;br /&gt;     exists  app/controllers/&lt;br /&gt;     exists  app/helpers/&lt;br /&gt;     create  app/views/talk&lt;br /&gt;     exists  test/functional/&lt;br /&gt;     create  app/controllers/talk_controller.rb&lt;br /&gt;     create  test/functional/talk_controller_test.rb&lt;br /&gt;     create  app/helpers/talk_helper.rb&lt;br /&gt;     create  app/views/talk/index.rhtml&lt;/pre&gt;&lt;br /&gt;Make a13g/app/controllers/talk_controller.rb look like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  class TalkController &lt; ApplicationController&lt;br /&gt;&lt;br /&gt;    include ActiveMessaging::MessageSender&lt;br /&gt;    publishes_to :chat_client&lt;br /&gt;  &lt;br /&gt;    def new&lt;br /&gt;      @message = params[:message]&lt;br /&gt;      publish :chat_client, @message&lt;br /&gt;      render :action =&gt; 'index'&lt;br /&gt;    end&lt;br /&gt;  &lt;br /&gt;  end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Make a13g/app/views/talk/index.rhtml look like this:&lt;br /&gt;&lt;pre&gt;  &lt;%= start_form_tag :action =&gt; 'new' %&gt;&lt;br /&gt;    &lt;label&gt;Message&lt;/label&gt; &lt;%=text_field_tag :message %&gt;&lt;br /&gt;    &lt;%= submit_tag "submit" %&gt;&lt;br /&gt;  &lt;%= end_form_tag %&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Install the a13g plugin and it's dependencies&lt;/h3&gt;&lt;pre&gt;  $script/plugin install http://activemessaging.googlecode.com/&lt;br /&gt;svn/trunk/plugins/activemessaging&lt;br /&gt;    (output excluded)&lt;br /&gt;  $gem install daemons&lt;br /&gt;    (output excluded) &lt;br /&gt;  $gem install stomp&lt;br /&gt;    (output excluded)&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Create a Processor&lt;/h3&gt;&lt;pre&gt;  $script/generate processor ChatClient&lt;br /&gt;    create  app/processors&lt;br /&gt;    create  app/processors/chat_client_processor.rb&lt;br /&gt;    create  test/functional/chat_client_processor_test.rb&lt;br /&gt;    create  config/messaging.rb&lt;br /&gt;    create  config/broker.yml&lt;br /&gt;    create  app/processors/application.rb&lt;br /&gt;    create  script/poller&lt;/pre&gt;&lt;br /&gt;An a13g Processor is similar to a &lt;a href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/jms/MessageConsumer.html"&gt;MessageConsumer&lt;/a&gt;. Make the a13g/app/processors/chat_client_processor.rb look like this:&lt;br /&gt;&lt;pre&gt;  class ChatClientProcessor &lt; ApplicationProcessor&lt;br /&gt;&lt;br /&gt;    subscribes_to :chat_client&lt;br /&gt;&lt;br /&gt;    def on_message(message)&lt;br /&gt;      logger.debug "ChatClientProcessor received: " + message.to_s&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Configuring a13g&lt;/h3&gt;Destinations are mapped to symbols using messaging.rb (BTW, a13g committers - if you are reading this, please consider changing Gateway.queue to Gateway.destination, for reasons demonstrated in this post ).  Make a13g/config/messaging.rb look like this:&lt;br /&gt;&lt;pre&gt;  ActiveMessaging::Gateway.define do |s|    &lt;br /&gt;      s.queue :chat_client, 'topic://CHAT.DEMO'  &lt;br /&gt;  end  &lt;/pre&gt;&lt;br /&gt;Copy &lt;a href="http://people.apache.org/%7Edennisbyrne/a13g/rest.rb"&gt;this a13g adapter&lt;/a&gt; to a13g/vendor/plugins/activemessaging/&lt;br /&gt;lib/activemessaging/adapters/rest.rb .&lt;br /&gt;Tell a13g to use the adapter by making a13g/config/broker.yml look like this:&lt;br /&gt;&lt;pre&gt;  development: &lt;br /&gt;    adapter: rest &lt;br /&gt;    port: 8161 &lt;br /&gt;    app: "/demo/amq" &lt;br /&gt;    host: localhost&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Start Rails and a13g&lt;/h3&gt;&lt;pre&gt;  $script/server&lt;br /&gt;    (output excluded)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;  $script/poller run &lt;br /&gt;    (output excluded) &lt;br /&gt;    Subscribing to topic://CHAT.DEMO (processed by ChatClientProcessor) &lt;br /&gt;    Subscribed to topic://CHAT.DEMO, using session id of 1swb9sf6yi1ke&lt;/pre&gt;&lt;br /&gt;The rest adapter establishes an HTTP session.  The session id will be used for all subsequent communication (publishing and consuming).&lt;br /&gt;&lt;h3&gt;Let's Chat&lt;/h3&gt;In your browser go to the &lt;a href="http://127.0.0.1:8161/demo/chat.html"&gt;chat demo&lt;/a&gt; and start a conversation.&lt;br/&gt;&lt;br /&gt;&lt;img width="550" src="http://people.apache.org/~dennisbyrne/a13g/1.jpg"/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Looking at the console for the activemessaging poller process, we can see that this message was received by the ChatClientProcessor.&lt;br /&gt;&lt;pre&gt;  $script/poller run &lt;br /&gt;    (output excluded) &lt;br /&gt;    Subscribing to topic://CHAT.DEMO (processed by ChatClientProcessor) &lt;br /&gt;    Subscribed to topic://CHAT.DEMO, using session id of 1swb9sf6yi1ke&lt;br /&gt;    ChatClientProcessor received: I was thinking ... one day, &lt;br /&gt;    they are going to standardize DSLs&lt;/pre&gt;&lt;br /&gt;By pointing a &lt;a href="http://127.0.0.1:3000/talk/"&gt;different browser window&lt;/a&gt; (different cookie/session) we can start an argument via the talk view.&lt;br/&gt;&lt;br /&gt;&lt;img src="http://people.apache.org/~dennisbyrne/a13g/2.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;Back in the original browser, we can see that chat messages are dispatched both ways.&lt;br/&gt;&lt;br /&gt;&lt;img width="550" src="http://people.apache.org/~dennisbyrne/a13g/3.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;The chat continues ... &lt;br/&gt;&lt;br /&gt;&lt;img width="550" src="http://people.apache.org/~dennisbyrne/a13g/4.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;From the poller console ... &lt;br/&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  ChatClientProcessor received: I was thinking ... one day, &lt;br /&gt;  they are going to standardize DSLs&lt;br /&gt;  ChatClientProcessor received: No way.  Never.&lt;br /&gt;  ChatClientProcessor received: Think about it.&lt;br /&gt;  ChatClientProcessor received: Large conservative orgs will&lt;br /&gt;  not be open to it.&lt;br /&gt;  ChatClientProcessor received: True.&lt;br /&gt;  ChatClientProcessor received: And the only way they will &lt;br /&gt;  adopt DSLs is to go industry wide.&lt;br /&gt;  ChatClientProcessor received: Think JCP, WS-*  ... only &lt;br /&gt;  for *each* industry ....&lt;br /&gt;  ChatClientProcessor received: Accounting, Finance, &lt;br /&gt;  Logistics, etc.&lt;br /&gt;  ChatClientProcessor received: Interesting&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-5505086718153178416?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/5505086718153178416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=5505086718153178416' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/5505086718153178416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/5505086718153178416'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2007/06/integrating-rails-and-activemq-with.html' title='Integrating Rails and ActiveMQ with ActiveMessaging/REST'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-8428506449210649030</id><published>2007-05-24T16:54:00.000-07:00</published><updated>2007-09-16T13:19:39.827-07:00</updated><title type='text'>ApacheCon 2007 US ... JSF Anti-Patterns</title><content type='html'>&lt;img src="http://www.apache.org/ads/ApacheCon/2007-usa-234x60.png"/&gt;&lt;br /&gt;&lt;br /&gt;I'll be in &lt;a href="http://www.us.apachecon.com/"&gt;Atlanta&lt;/a&gt; this November with a presentation on JSF Anti-Patterns.  Here's the abstract:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Several years’ worth of &lt;a href="http://myfaces.apache.org"&gt;MyFaces&lt;/a&gt; mailing list activity and JIRA bugs have been condensed into an entertaining presentation.  Learn what NOT to do with JavaServer Faces.  Patterns presented will touch on performance, tight coupling, cache management, thread safety, security and interoperability.&lt;/blockquote&gt;&lt;br /&gt;See you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-8428506449210649030?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/8428506449210649030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=8428506449210649030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/8428506449210649030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/8428506449210649030'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2007/05/apachecon-2007-us-jsf-anti-patterns.html' title='ApacheCon 2007 US ... JSF Anti-Patterns'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-8078226535343489364</id><published>2007-05-02T19:54:00.000-07:00</published><updated>2007-05-02T19:57:50.611-07:00</updated><title type='text'>JavaOne 2007 BOF for Apache MyFaces</title><content type='html'>I will be joining teammates Martin Marinschek, Manfred Geiler and Matthias Wessendorf in a session for the &lt;a href="http://myfaces.apache.org/"&gt;Apache MyFaces&lt;/a&gt; project on Wednesday from 8:55 PM to 9:45 PM.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Apache MyFaces is a successful example of open-source community building, and this session is all about this community. It briefly presents what MyFaces is about and looks at the subprojects and modules of MyFaces. Then it discusses the community-building in MyFaces and what has worked (and what hasn't). &lt;/blockquote&gt;&lt;br /&gt;Don't miss this session or the after parties!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-8078226535343489364?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/8078226535343489364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=8078226535343489364' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/8078226535343489364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/8078226535343489364'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2007/05/javaone-2007-bof-for-apache-myfaces.html' title='JavaOne 2007 BOF for Apache MyFaces'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8675770049730349526.post-3969297205993721960</id><published>2007-05-02T19:42:00.000-07:00</published><updated>2007-05-02T19:58:51.071-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaOne JSF AJAX'/><title type='text'>JavaOne 2007 Panel Discussion on JSF &amp; AJAX</title><content type='html'>I'll be joining Stephen Maryka, Ed Burns, Gary Horen, Max Katz, and Mark Schiefelbein next week in San Fransisco to discuss JSF and AJAX.   Join us on Thursday May       10 from 1:30  to 2:30 PM.&lt;br /&gt;&lt;br /&gt;Here's a summary of the session:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The programming model for Ajax has recently shown signs of migrating from the client side of the connection to the server side. In the Java EE world, the form many Ajax runtime frameworks have chosen to take is JavaServer Faces technology-based. Come meet with some of the creators of these JavaServer Faces technology-based Ajax frameworks, and hear about why they think these two technologies are a good marriage and where they see this going in the future.&lt;br /&gt;&lt;br /&gt;Here is the agenda:&lt;br /&gt;• Why Ajax and JavaServer Faces technology are a good match&lt;br /&gt;• Some of the challenges involved in designing an Ajax web application with JavaServer Faces technology&lt;br /&gt;• How using JavaServer Faces technology compares to using more-client-centric programming models&lt;br /&gt;• Cost/benefit trade-offs of a JavaServer Faces technology model versus a pure client-side model (server resources and scalability versus functional advantages, and so on)&lt;br /&gt;• Some of the architectural challenges involved in creating a JavaServer Faces technology-based Ajax framework&lt;br /&gt;• Interoperability between different frameworks in the same web application&lt;br /&gt;• Possible future directions&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8675770049730349526-3969297205993721960?l=notdennisbyrne.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notdennisbyrne.blogspot.com/feeds/3969297205993721960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8675770049730349526&amp;postID=3969297205993721960' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/3969297205993721960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8675770049730349526/posts/default/3969297205993721960'/><link rel='alternate' type='text/html' href='http://notdennisbyrne.blogspot.com/2007/05/javaone-2007-panel-discussion-on-jsf.html' title='JavaOne 2007 Panel Discussion on JSF &amp; AJAX'/><author><name>Not Dennis Byrne</name><uri>http://www.blogger.com/profile/07791672871380037517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_YxhewqfVcgQ/TJAMleY3LiI/AAAAAAAAAEw/r49UhW4tDew/S220/dennis_byrne_drw_trading.jpg'/></author><thr:total>1</thr:total></entry></feed>
