<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
 <title>Nicolas Garcia Belmonte</title>
 
 <link href="http://blog.thejit.org/" />
 <updated>2011-12-09T20:32:15-08:00</updated>
 <id>http://blog.thejit.org/</id>
 <author>
   <name>Nicolas Garcia Belmonte</name>
   <email>philogb@gmail.com</email>
 </author>

 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Noumena" /><feedburner:info uri="noumena" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
   <title>WebGL Camp</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/3tgOg4lW6EY/webglcamp" />
   <updated>2011-12-09T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2011/12/09/webglcamp</id>
   <content type="html">
    
      &lt;p&gt;I generally don&amp;#8217;t do write-ups of events I go to (now that I actually check my blog I&amp;#8217;ve never made one) but I had such a great time at &lt;a href='http://www.webglcamp.com/wiki/index.php?title=Main_Page'&gt;WebGL Camp&lt;/a&gt; today and learnt so many new things that I think that (especially for the sake of my bad long term memory) I&amp;#8217;ll do a write-up about my experience at WebGL Camp #4 at Mozilla HQs.&lt;/p&gt;

&lt;p&gt;This is not going to be a chronological review but more like stuff I learnt about state-of-the-art WebGL, and the incredible community that we have here in the Bay Area around this technology.&lt;/p&gt;

&lt;p&gt;On the things I learnt there&amp;#8217;s that WebGLCamp this year gathered people that make great products and apps using WebGL; it also gathers people who like to write great WebGL frameworks either for games, art or data visualization and it also gathers people who define and participate directly on the making of the actual WebGL API. All of these people are together in the same place, discussing about these three things, and since this is a small group of very knowledgeable people, the outcome of this event is extremely valuable for the people there.&lt;/p&gt;

&lt;p&gt;Just take a look at the &lt;a href='http://www.webglcamp.com/wiki/index.php?title=Agenda4'&gt;agenda&lt;/a&gt;. In one day you will see how a &lt;a href='http://www.myrobotnation.com/'&gt;profitable business like My Robot Nation&lt;/a&gt; uses WebGL as a core component of their product, you will also find out the technical aspects of &lt;a href='http://www.chromeexperiments.com/detail/mapsgl/'&gt;implementing MapsGL&lt;/a&gt; in one of the most visited applications on the Web; you will also hear about how WebGL is an integral part for &lt;a href='http://www.scer.rpi.edu/cemsim/'&gt;modeling and simulation&lt;/a&gt; in medical training applications and finally how the Department of Defense uses WebGL in their real time graphic simulation applications. Oh and yes, &lt;a href='http://usa.autodesk.com/'&gt;Autodesk&lt;/a&gt; also showcased their new WebGL applications.&lt;/p&gt;

&lt;p&gt;So much changed since last year at WebGL Camp. While WebGL was still &amp;#8220;alpha&amp;#8221; and people built ideas on top of the thought that in the future it&amp;#8217;ll become a solid and robust foundation, WebGL is now massively used in products/businesses that span to any possible field you could imagine!&lt;/p&gt;

&lt;p&gt;Another very interesting aspect on this is that not only cool ideas around businesses show up, there&amp;#8217;s a lot of discussion on technical stuff, on three different levels I would say: the standards body, the framework API designer/developer group and finally the consumers of these frameworks/APIs that create compelling demos, products and apps.&lt;/p&gt;

&lt;p&gt;Just to name a few frameworks, &lt;a href='http://aerotwist.com/'&gt;Paul Lewis&lt;/a&gt; presented about &lt;a href='http://aerotwist.com/a3/'&gt;A3&lt;/a&gt; and &lt;a href='http://www.everyday3d.com/'&gt;Bartek Drozdz&lt;/a&gt; presented about &lt;a href='http://www.everyday3d.com/j3d/'&gt;J3D&lt;/a&gt;. Oh, and the Department of Defense said they were using &lt;a href='http://www.glge.org/'&gt;GLGE&lt;/a&gt; for their applications. There was also a very interesting presentation of an Audio/Kinect/WebGL mashup that used &lt;a href='http://www.cubicvr.org/'&gt;CubicVR.js&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href='http://glslunit.appspot.com/'&gt;GLSLUnit&lt;/a&gt; was also presented by Google devs and a very interesting idea of using it to feature detect that a visitor to your site has an adecuate graphics card to run your WebGL application was suggested.&lt;/p&gt;

&lt;p&gt;Another very interesting idea from the J3D framework was to design a special templating language that would render to proper glsl code to reuse shaders properly. Although J3D&amp;#8217;s glsl language is pretty simple (only has a few special annotations), I would love to see something more like the &lt;a href='https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs'&gt;Django templates&lt;/a&gt; in which inheritance, filters and include statements could be added in an easy way to reuse shaders.&lt;/p&gt;

&lt;p&gt;Also, I really enjoyed &lt;a href='http://blog.tojicode.com/'&gt;Brandon Jones&lt;/a&gt; talk on texture (up and down)loading performance.&lt;/p&gt;

&lt;p&gt;But what about me? I presented about &lt;a href='http://senchalabs.github.com/philogl/'&gt;PhiloGL&lt;/a&gt; last year at &lt;a href='http://www.youtube.com/watch?v=aWTVbS8ruzw'&gt;Google HQ&amp;#8217;s for WebGLCamp #3&lt;/a&gt;, so this time it was all about meeting the people and not having any pressure on presenting anything :)&lt;/p&gt;

&lt;p&gt;I also met today a couple of developers for &lt;a href='http://one.laptop.org/'&gt;OLPC&lt;/a&gt; that have been using and contributing code back to &lt;a href='https://github.com/philogb/v8-gl'&gt;V8-GL&lt;/a&gt; for OpenGL/WebGL integration in the OLPC project. Can you believe it? V8-GL helps OLPC devs!&lt;/p&gt;

&lt;p&gt;&lt;img src='/assets/webglcamp/1.png' alt='WebGL Camp image get involved' /&gt;&lt;/p&gt;

&lt;p&gt;Finally there&amp;#8217;s also the people who will talk to you about the future of the APIs you&amp;#8217;re using. People working on the standard, who will actually listen to your experiences using the WebGL API and probably at the next iteration of WebGL Camp they will present some standard improvement that will include at least part of your ideas in it. And I&amp;#8217;m not lying about this. You can witness that in &lt;a href='http://www.youtube.com/watch?v=aWTVbS8ruzw#t=19m40s'&gt;the WebGLCamp #3 video&lt;/a&gt; (right towards the end) I was complaining about the fact that simple JSON was not enough as an interprocess/worker format, that it would be nice to be able to move &lt;a href='http://www.khronos.org/registry/typedarray/specs/latest/'&gt;typed arrays&lt;/a&gt; from one place to the other. This change was being added as I spoke and this year happened the exact same thing again. I talked two minutes to &lt;a href='http://www.linkedin.com/profile/view?id=5648748'&gt;Ken Russell&lt;/a&gt; from Google about the &lt;a href='http://www.w3.org/TR/html5/common-dom-interfaces.html#safe-passing-of-structured-data'&gt;structured cloning algorithm&lt;/a&gt; used for worker communication and how typed arrays still had to be cloned from here to there and he told me that &lt;a href='http://updates.html5rocks.com/2011/12/Transferable-Objects-Lightning-Fast'&gt;transferable objects&lt;/a&gt; were just added to Chrome. Yay!&lt;/p&gt;

&lt;p&gt;I really enjoyed this event and hope to see the community again for the next WebGL Camp. I had a great time and I think that there aren&amp;#8217;t so many ocasions in which you can gather a group of people like this that have so many different backgrounds and ideas on such different topics related to WebGL like standards, products and frameworks.&lt;/p&gt;

&lt;p&gt;A big props to &lt;a href='http://mozilla.org/'&gt;Mozilla&lt;/a&gt; and Henrik Bennetsen from &lt;a href='http://www.katalabs.com/'&gt;Katalabs&lt;/a&gt; for organising the event! Until the next WebGL Camp!&lt;/p&gt;

&lt;p&gt;&lt;img src='/assets/webglcamp/2.png' alt='WebGL Camp image' /&gt;&lt;/p&gt;
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/3tgOg4lW6EY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2011/12/09/webglcamp</feedburner:origLink></entry>
 
 <entry>
   <title>PhiloGL 1.4.0</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/_STkaEez50Y/philogl-1.4.0" />
   <updated>2011-10-14T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2011/10/14/philogl-1.4.0</id>
   <content type="html">
    
      &lt;p&gt;I&amp;#8217;m very excited to announce that &lt;a href='http://senchalabs.github.com/philogl'&gt;PhiloGL&lt;/a&gt; version 1.4.0 has been released!&lt;/p&gt;

&lt;p&gt;This release focuses on two main things: a better picking algorithm that caches scene rendering and a simple image post-processing chain to add some nice fragment shader effects when rendering a scene.&lt;/p&gt;

&lt;p&gt;Both these features are implemented in a revamped &lt;a href='http://senchalabs.github.com/philogl/PhiloGL/examples/worldFlights2/'&gt;World Flights&lt;/a&gt; example I just released, so let&amp;#8217;s take a look at how these things are implemented in the example.&lt;/p&gt;

&lt;h3 id='world_flights_revisited'&gt;World Flights (revisited)&lt;/h3&gt;

&lt;p&gt;&lt;img src='http://senchalabs.github.com/philogl/img/marquee/worldflights2.png' alt='World Flights Image' /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href='http://senchalabs.github.com/philogl/PhiloGL/examples/worldFlights2/'&gt;World Flights&lt;/a&gt; is a data visualization that shows flying routes information for various airlines around the world. For 200 airlines, more than 57.000 flights and 6.000 destinations are displayed. You can find more information on the example &lt;a href='http://philogb.github.com/world-flights/'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can access the example &lt;a href='http://senchalabs.github.com/philogl/PhiloGL/examples/worldFlights2/'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id='image_post_processing'&gt;Image post processing&lt;/h3&gt;

&lt;p&gt;There&amp;#8217;s a nice neon effect in the airline routes as well as in the cities displayed in this example. This is done by rendering two different scenes; one with a &amp;#8220;black&amp;#8221; planet:&lt;/p&gt;

&lt;p&gt;&lt;img src='/assets/worldflights/1.png' alt='World Flights Image' /&gt;&lt;/p&gt;

&lt;p&gt;&amp;#8230;and another one with the current texture for the planet:&lt;/p&gt;

&lt;p&gt;&lt;img src='/assets/worldflights/2.png' alt='World Flights Image' /&gt;&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s the code that renders them to a &lt;code&gt;world&lt;/code&gt; and &lt;code&gt;world2&lt;/code&gt; FBOs and their associated &lt;code&gt;world-texture&lt;/code&gt; and &lt;code&gt;world2-texture&lt;/code&gt; textures:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;  &lt;span class='nx'&gt;app&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;setFrameBuffer&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;world&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kc'&gt;true&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
  &lt;span class='nx'&gt;program&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;earth&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;use&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
  &lt;span class='nx'&gt;gl&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;clear&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;clearOpt&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
  &lt;span class='nx'&gt;gl&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;viewport&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;1024&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;1024&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
  &lt;span class='c1'&gt;//do not use a texture but paint it black&lt;/span&gt;
  &lt;span class='nx'&gt;program&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;earth&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;setUniform&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;renderType&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;  &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
  &lt;span class='nx'&gt;scene&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;renderToTexture&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;world&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
  &lt;span class='nx'&gt;app&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;setFrameBuffer&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;world&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kc'&gt;false&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

  &lt;span class='nx'&gt;app&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;setFrameBuffer&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;world2&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kc'&gt;true&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
  &lt;span class='nx'&gt;program&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;earth&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;use&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
  &lt;span class='nx'&gt;gl&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;clear&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;clearOpt&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
  &lt;span class='nx'&gt;gl&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;viewport&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;1024&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;1024&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
  &lt;span class='c1'&gt;//use a regular planet texture&lt;/span&gt;
  &lt;span class='nx'&gt;program&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;earth&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;setUniform&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;renderType&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;  &lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
  &lt;span class='nx'&gt;scene&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;renderToTexture&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;world2&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
  &lt;span class='nx'&gt;app&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;setFrameBuffer&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;world2&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kc'&gt;false&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;These two textures are then combined to generate the screen image:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;  &lt;span class='nx'&gt;Media&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;Image&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;postProcess&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt;
    &lt;span class='nx'&gt;fromTexture&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;world-texture&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;world2-texture&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;],&lt;/span&gt;
    &lt;span class='nx'&gt;toScreen&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kc'&gt;true&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;program&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;glow&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;width&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;1024&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;height&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;1024&lt;/span&gt;
  &lt;span class='p'&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;glow&lt;/code&gt; fragment shader will take these two generated textures, create a bloom filter for the one with the black planet, and add it to the one that has the regular textured planet and provide a result for that:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='err'&gt;#&lt;/span&gt;&lt;span class='nx'&gt;ifdef&lt;/span&gt; &lt;span class='nx'&gt;GL_ES&lt;/span&gt;
&lt;span class='nx'&gt;precision&lt;/span&gt; &lt;span class='nx'&gt;highp&lt;/span&gt; &lt;span class='kr'&gt;float&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='err'&gt;#&lt;/span&gt;&lt;span class='nx'&gt;endif&lt;/span&gt;

&lt;span class='err'&gt;#&lt;/span&gt;&lt;span class='nx'&gt;define&lt;/span&gt; &lt;span class='nx'&gt;BLUR_LIMIT&lt;/span&gt; &lt;span class='mi'&gt;4&lt;/span&gt; 
&lt;span class='err'&gt;#&lt;/span&gt;&lt;span class='nx'&gt;define&lt;/span&gt; &lt;span class='nx'&gt;BLUR_LIMIT_SQ&lt;/span&gt; &lt;span class='mf'&gt;64.0&lt;/span&gt;

&lt;span class='nx'&gt;varying&lt;/span&gt; &lt;span class='nx'&gt;vec2&lt;/span&gt; &lt;span class='nx'&gt;vTexCoord1&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='nx'&gt;uniform&lt;/span&gt; &lt;span class='nx'&gt;bool&lt;/span&gt; &lt;span class='nx'&gt;hasTexture1&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='nx'&gt;uniform&lt;/span&gt; &lt;span class='nx'&gt;sampler2D&lt;/span&gt; &lt;span class='nx'&gt;sampler1&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='nx'&gt;uniform&lt;/span&gt; &lt;span class='nx'&gt;bool&lt;/span&gt; &lt;span class='nx'&gt;hasTexture2&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='nx'&gt;uniform&lt;/span&gt; &lt;span class='nx'&gt;sampler2D&lt;/span&gt; &lt;span class='nx'&gt;sampler2&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='k'&gt;void&lt;/span&gt; &lt;span class='nx'&gt;main&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;void&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='nx'&gt;vec4&lt;/span&gt; &lt;span class='nx'&gt;fragmentColor&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;vec4&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mf'&gt;0.0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mf'&gt;0.0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mf'&gt;0.0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mf'&gt;0.0&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
  &lt;span class='kr'&gt;float&lt;/span&gt; &lt;span class='nx'&gt;dx&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='kr'&gt;float&lt;/span&gt; &lt;span class='nx'&gt;dy&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

  &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;hasTexture1&lt;/span&gt; &lt;span class='o'&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class='nx'&gt;hasTexture2&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='c1'&gt;//Add glow&lt;/span&gt;
    &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kr'&gt;int&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='o'&gt;-&lt;/span&gt; &lt;span class='nx'&gt;BLUR_LIMIT&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='nx'&gt;BLUR_LIMIT&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='nx'&gt;dx&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kr'&gt;float&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt; &lt;span class='mf'&gt;512.0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
      &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kr'&gt;int&lt;/span&gt; &lt;span class='nx'&gt;j&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='o'&gt;-&lt;/span&gt; &lt;span class='nx'&gt;BLUR_LIMIT&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;j&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='nx'&gt;BLUR_LIMIT&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;j&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nx'&gt;dy&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kr'&gt;float&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;j&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt; &lt;span class='mf'&gt;512.0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='nx'&gt;fragmentColor&lt;/span&gt; &lt;span class='o'&gt;+=&lt;/span&gt; &lt;span class='nx'&gt;texture2D&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;sampler1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;vec2&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;vTexCoord1&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;s&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;dx&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;vTexCoord1&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;t&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;dy&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt; &lt;span class='nx'&gt;BLUR_LIMIT_SQ&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
      &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='c1'&gt;//Add real image&lt;/span&gt;
    &lt;span class='nx'&gt;fragmentColor&lt;/span&gt; &lt;span class='o'&gt;+=&lt;/span&gt; &lt;span class='nx'&gt;texture2D&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;sampler2&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;vec2&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;vTexCoord1&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;s&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;vTexCoord1&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;t&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt;
  &lt;span class='p'&gt;}&lt;/span&gt;
  &lt;span class='nx'&gt;gl_FragColor&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;vec4&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;fragmentColor&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;rgb&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mf'&gt;1.0&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This is not the best way to make a bloom filter since it&amp;#8217;s &lt;code&gt;O(N * N)&lt;/code&gt;, but it could be easily transformed into a two-pass bloom filter with the &lt;code&gt;postProcess&lt;/code&gt; chaining API:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;  &lt;span class='c1'&gt;//Make a horizontal pass&lt;/span&gt;
  &lt;span class='nx'&gt;Media&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;Image&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;postProcess&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt;
    &lt;span class='nx'&gt;fromTexture&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;world2-texture&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;toFrameBuffer&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;bloom1&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;program&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;bloom&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;width&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;1024&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;height&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;1024&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;uniforms&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='s1'&gt;&amp;#39;orientation&amp;#39;&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
  &lt;span class='c1'&gt;//Make a vertical pass on the result&lt;/span&gt;
  &lt;span class='p'&gt;}).&lt;/span&gt;&lt;span class='nx'&gt;postProcess&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt;
    &lt;span class='nx'&gt;fromTexture&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;bloom1-texture&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;toFrameBuffer&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;bloom2&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;program&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;bloom&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;width&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;1024&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;height&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;1024&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;uniforms&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='s1'&gt;&amp;#39;orientation&amp;#39;&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
  &lt;span class='c1'&gt;//Combine the result to the original texture&lt;/span&gt;
  &lt;span class='p'&gt;}).&lt;/span&gt;&lt;span class='nx'&gt;postProcess&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt;
    &lt;span class='nx'&gt;fromTexture&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;world-texture&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;bloom2-texture&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;],&lt;/span&gt;
    &lt;span class='nx'&gt;toScreen&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kc'&gt;true&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;program&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;glow&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;width&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;1024&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;height&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;1024&lt;/span&gt;
  &lt;span class='p'&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The result is:&lt;/p&gt;

&lt;p&gt;&lt;img src='/assets/worldflights/3.png' alt='World Flights Image' /&gt;&lt;/p&gt;

&lt;h3 id='lazy_picking'&gt;Lazy Picking&lt;/h3&gt;

&lt;p&gt;The World Flights example displays around 6.000 cities served by the airlines. If you hover those cities a tooltip will display showing information about the city:&lt;/p&gt;

&lt;p&gt;&lt;img src='http://philogb.github.com/assets/img/worldflights.picking.png' alt='World Flights Picking' /&gt;&lt;/p&gt;

&lt;p&gt;As mentioned in older posts, I implemented the color picking algorithm which assigns a different &amp;#8220;picking color&amp;#8221; to each city, then renders all 6000 cities to a texture with those picking colors and retrieves the color of the pixel pointed by the mouse. From that color it&amp;#8217;s easy to identify which city has been hovered.&lt;/p&gt;

&lt;p&gt;The current algorithm though renders this alternate scene each time the mouse moves over the canvas. A better approach would be to only take a snapshot of the scene when it&amp;#8217;s updated in some way (the planet is dragged and dropped, a new airline is selected and the earth moves, etc.).&lt;/p&gt;

&lt;p&gt;This can now be done by setting &lt;code&gt;lazyPicking&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; and then using a &lt;code&gt;scene.resetPicking()&lt;/code&gt; method when the time is right to take a new snapshot. For all other cases a cache of the capture stored in a typed array will be used improving the performance of the algorithm:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='nx'&gt;events&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='c1'&gt;//enable picking and lazy picking&lt;/span&gt;
  &lt;span class='nx'&gt;picking&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kc'&gt;true&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;lazyPicking&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kc'&gt;true&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='c1'&gt;//remove the center origin option for picking&lt;/span&gt;
  &lt;span class='nx'&gt;centerOrigin&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kc'&gt;false&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;onDragStart&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;e&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='c1'&gt;//do stuff...&lt;/span&gt;
  &lt;span class='p'&gt;},&lt;/span&gt;
  &lt;span class='nx'&gt;onDragMove&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;e&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='c1'&gt;//do stuff to rotate the earth...&lt;/span&gt;
  &lt;span class='p'&gt;},&lt;/span&gt;
  &lt;span class='nx'&gt;onDragEnd&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;e&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='c1'&gt;//reset the picking by removing the cached image capture&lt;/span&gt;
    &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;scene&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;resetPicking&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
  &lt;span class='p'&gt;},&lt;/span&gt;
&lt;span class='c1'&gt;//more code here...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;You can find more information on both these features in the &lt;a href='http://senchalabs.github.com/philogl/doc/media.html'&gt;Media&lt;/a&gt; and &lt;a href='http://senchalabs.github.com/philogl/doc/scene.html#Scene:resetPicking'&gt;Scene&lt;/a&gt; APIs.&lt;/p&gt;

&lt;h3 id='thanks'&gt;Thanks&lt;/h3&gt;

&lt;p&gt;Thanks to &lt;a href='http://uxnerd.com/'&gt;Luz Caballero&lt;/a&gt; for helping me out with the design of World Flights!&lt;/p&gt;
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/_STkaEez50Y" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2011/10/14/philogl-1.4.0</feedburner:origLink></entry>
 
 <entry>
   <title>Upcoming Talks</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/3CD7ZrEawiU/upcoming-talks" />
   <updated>2011-09-06T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2011/09/06/upcoming-talks</id>
   <content type="html">
    
      &lt;p&gt;I thought I&amp;#8217;d put my schedule for the upcoming talks here so I can convince whoever is reading this blog to come and meet me at some of these events! :)&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ll be speaking at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href='http://www.meetup.com/VisualizeMyData/events/32382432/'&gt;Data Visualization Group in Bay Area&lt;/a&gt; on New Tools for Visualization in JavaScript.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;a href='http://www.meetup.com/The-Visual-ly-Data-Visualization-Meetup/events/30601541/'&gt;Visual.ly Data Visualization Meetup&lt;/a&gt; on The Ingredients of a Great Data Visualization.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;a href='http://functionsource.com/post/next-tech-talks-october-19-at-mozilla'&gt;Tech Talks at Mozilla&lt;/a&gt; on PhiloGL and its API.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;a href='http://secure.lenos.com/lenos/sencha/SenchaCon2011/sessions.htm'&gt;SenchaCon 2011 in Austin, TX&lt;/a&gt; on WebGL fundamentals.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope to see you there!&lt;/p&gt;
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/3CD7ZrEawiU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2011/09/06/upcoming-talks</feedburner:origLink></entry>
 
 <entry>
   <title>PhiloGL 1.3.0 released</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/7bS60YijQyE/philogl-1.3.0-released" />
   <updated>2011-08-07T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2011/08/07/philogl-1.3.0-released</id>
   <content type="html">
    
      &lt;p&gt;Just a quick post to announce that &lt;a href='http://senchalabs.github.com/philogl'&gt;PhiloGL&lt;/a&gt; version 1.3.0 has been released!&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve been working hard on this new release, which is mainly focused on many performance improvements and the ability to have reflection and refraction available in the default shaders.&lt;/p&gt;

&lt;h3 id='performance_improvements'&gt;Performance Improvements&lt;/h3&gt;

&lt;p&gt;Performance improvements happened on three different places of the framework:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Math functions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Math functions for Vector and Matrix operations are faster than ever. I changed the inner implementation of the math methods to use typed arrays whenever possible. The result is an amazing performance improvement that can be seen on the WebGL Matrix Benchmarks for &lt;a href='/assets/matrix-bench/safari.png'&gt;Safari&lt;/a&gt;, &lt;a href='/assets/matrix-bench/firefox.png'&gt;Firefox&lt;/a&gt; and &lt;a href='/assets/matrix-bench/chrome.png'&gt;Chrome&lt;/a&gt; (these tests were made on a 13-inch MacBook Pro Core 2 Duo).&lt;/p&gt;

&lt;p&gt;The API for the math module has changed a little bit. I explain most of the API changes &lt;a href='http://senchalabs.github.com/philogl/doc/math.html'&gt;in the documentation&lt;/a&gt; (look for &lt;em&gt;new from version 1.3&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deep typed array integration in O3D.Models&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I changed how attributes where handled by models in the &lt;a href='http://senchalabs.github.com/philogl/doc/o3d.html'&gt;O3D module&lt;/a&gt;, integrating typed arrays very deep and reusing them whenever possible. In order to do this I created getters and setters for most of the model attributes like &lt;code&gt;vertices&lt;/code&gt;, &lt;code&gt;normals&lt;/code&gt;, &lt;code&gt;color&lt;/code&gt;, etc. so you can feed to those properties either a typed array or a simple array of values and they will be converted internally into a typed array. The typed array will be reused whenever possible. When accessing some of these properties, you will always get a typed array too; even if you didn&amp;#8217;t assign one to that property.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Micro Optimizations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Did you know that using &lt;code&gt;forEach&lt;/code&gt; instead of a for-loop can be up to &lt;a href='http://jsperf.com/for-vs-foreach/9'&gt;50% slower in most browsers?&lt;/a&gt;. Some micro-optimizations take care of changing &lt;code&gt;forEach&lt;/code&gt; calls into regular for-loops in the main rendering loop code.&lt;/p&gt;

&lt;h3 id='reflection__refraction'&gt;Reflection / Refraction&lt;/h3&gt;

&lt;p&gt;I added the ability to have reflection and refraction in O3D. There are two new properties in &lt;a href='http://senchalabs.github.com/philogl/doc/o3d.html#O3D:Model:constructor'&gt;O3D.Model&lt;/a&gt;: &lt;code&gt;reflection&lt;/code&gt; and &lt;code&gt;refraction&lt;/code&gt; which indicate the reflection and refraction index correspondingly.&lt;/p&gt;

&lt;p&gt;I created two simple demos to demonstrate some of the new features in the framework.&lt;/p&gt;

&lt;p&gt;The first one uses the marching cubes algorithm and web-workers as a divide and conquer technique to render reflective metaballs. I also use cube map textures and the new reflection index. You can access the example &lt;a href='http://senchalabs.github.com/philogl/PhiloGL/examples/metaballs/'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://senchalabs.github.com/philogl/img/marquee/metaballs.png' alt='Reflective Metaballs image' /&gt;&lt;/p&gt;

&lt;p&gt;The second example displays an interesting technique to render quaternion julia sets. Quaternion julia sets are four dimensional fractals that are created by using the same formula than the one used with two dimensional fractals, &lt;code&gt;Zn+1 = Zn + C&lt;/code&gt;, but instead of using complex numbers as &lt;code&gt;Z&lt;/code&gt; we use hyper-complex numbers called &lt;a href='http://en.wikipedia.org/wiki/Quaternion'&gt;quaternions&lt;/a&gt;. Once we obtain the four-dimensional shape, what we do is project it into a three dimensional space to get &amp;#8220;the shadow&amp;#8221; of the four dimensional object. A very interesting article into how this works and also how this can be fully calculated via a fragment shader can be found &lt;a href='http://www.devmaster.net/forums/showthread.php?t=4448'&gt;here&lt;/a&gt;. I really enjoyed reading that article and recommend it to anyone interested in math :)&lt;/p&gt;

&lt;p&gt;Anyway, you can access the example &lt;a href='http://senchalabs.github.com/philogl/PhiloGL/examples/quaternion/'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://senchalabs.github.com/philogl/img/marquee/quaternion.png' alt='Quaternion Julia Set image' /&gt;&lt;/p&gt;

&lt;h3 id='siggraph_2011_webgl_bof'&gt;SIGGRAPH 2011 WebGL BOF&lt;/h3&gt;

&lt;p&gt;Last but not least, I&amp;#8217;ll be making a presentation on PhiloGL at &lt;a href='http://www.siggraph.org/s2011/'&gt;SIGGRAPH 2011&lt;/a&gt; in Vancouver on August 10th. If you&amp;#8217;re there, come say hello!&lt;/p&gt;
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/7bS60YijQyE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2011/08/07/philogl-1.3.0-released</feedburner:origLink></entry>
 
 <entry>
   <title>PhiloGL 1.2.0 released</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/XALNM3UAoMo/philogl-1.2.0-released" />
   <updated>2011-06-06T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2011/06/06/philogl-1.2.0-released</id>
   <content type="html">
    
      &lt;p&gt;I&amp;#8217;m very excited to announce that &lt;a href='http://senchalabs.github.com/philogl'&gt;PhiloGL&lt;/a&gt; version 1.2.0 has been released!&lt;/p&gt;

&lt;p&gt;This release adds a lot of goodies to the Framework, like a much better design for multiple program management, a better design for picking enabling us to have finer grain picking, a brand new &lt;code&gt;Quat&lt;/code&gt; class for quaternions and a couple of new primitives and improvements in O3D. All this with some &lt;a href='http://senchalabs.github.com/philogl/docs.html'&gt;updated documentation&lt;/a&gt; and a new &lt;a href='http://senchalabs.github.com/philogl/PhiloGL/examples/worldFlights/'&gt;demo&lt;/a&gt;!&lt;/p&gt;

&lt;h3 id='multiple_program_management'&gt;Multiple program management&lt;/h3&gt;

&lt;p&gt;We always had the possibility to create multiple programs and use them in a PhiloGL application (see &lt;a href='http://senchalabs.github.com/philogl/PhiloGL/examples/lessons/13/'&gt;lesson 13&lt;/a&gt;), but in a more object-oriented model of applications we might want to assign programs to objects themselves than manually managing programs here and there.&lt;/p&gt;

&lt;p&gt;You can define multiple programs right in the main &lt;a href='http://senchalabs.github.com/philogl/doc/index.html#PhiloGL:constructor'&gt;PhiloGL constructor function&lt;/a&gt; as an array of program configurations with a specified id:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='nx'&gt;PhiloGL&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt;
  &lt;span class='nx'&gt;program&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='p'&gt;[{&lt;/span&gt;
    &lt;span class='nx'&gt;id&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;program1&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;from&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;uris&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;vs&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;./vertex1.vs.glsl&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;fs&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;./fragment1.fs.glsl&amp;#39;&lt;/span&gt;
  &lt;span class='p'&gt;},&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='nx'&gt;id&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;program2&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;from&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;uris&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;vs&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;./vertex2.vs.glsl&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;fs&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;./fragment2.fs.glsl&amp;#39;&lt;/span&gt;
  &lt;span class='p'&gt;}]&lt;/span&gt;
  &lt;span class='c1'&gt;//other options here...&lt;/span&gt;
&lt;span class='p'&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Then you can set a program id to any model you like by instanciating a model with:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;myObject&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;O3D&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;Model&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt;
  &lt;span class='nx'&gt;program&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;program1&amp;#39;&lt;/span&gt;
  &lt;span class='c1'&gt;//other options here...&lt;/span&gt;
&lt;span class='p'&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;and then each model will have a program assigned and used before being rendered. Easy!&lt;/p&gt;

&lt;h3 id='finer_grain_picking'&gt;Finer grain picking&lt;/h3&gt;

&lt;p&gt;The picking algorithm used in PhiloGL is a color picking algorithm. Each model is assigned a different color and the scene is rendered to a texture. Then, the pixel pointed by the mouse position is retrieved from the texture and the color of that pixel is used to identify the model.&lt;/p&gt;

&lt;p&gt;Sometimes we want to know more than just which object has been picked. For example, we might want to know which face of that object has been picked. In that case the &lt;a href='(http://senchalabs.github.com/philogl/doc/o3d.html'&gt;O3D&lt;/a&gt; constructor options &lt;code&gt;pickingColors&lt;/code&gt; and &lt;code&gt;pick&lt;/code&gt; are useful. By defining your own set of per vertex colors and a method that given a pixel returns special information on what part of the object has been retrieved, then it is possible to have finer grain picking. For more information about how to use this you can take a look at the World Flights example or go to the &lt;a href='http://groups.google.com/group/philogl'&gt;Google group of the framework&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id='more_stuff'&gt;More stuff&lt;/h3&gt;

&lt;p&gt;A &lt;a href='(http://senchalabs.github.com/philogl/doc/math.html#Quat'&gt;Quat&lt;/a&gt; class has been added and also other interesting options in &lt;a href='http://senchalabs.github.com/philogl/doc/o3d.html#O3D:Model:constructor'&gt;O3D.Model&lt;/a&gt; constructors have been included, like an &lt;code&gt;attributes&lt;/code&gt; object to define buffers and attributes per model.&lt;/p&gt;

&lt;h3 id='world_flights'&gt;World Flights&lt;/h3&gt;

&lt;p&gt;&lt;a href='http://senchalabs.github.com/philogl/PhiloGL/examples/worldFlights/'&gt;World Flights&lt;/a&gt; is a data visualization powered by PhiloGL that displays the routes of all major airlines in the globe. Red markers indicate cities served by airports, and blue curves show the routes each airline makes and their destinations. You can drag and drop the globe, and also select new airlines from the controls on the right. The link to the application is &lt;a href='http://senchalabs.github.com/philogl/PhiloGL/examples/worldFlights/'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://senchalabs.github.com/philogl/img/marquee/worldflights.png' alt='World Flights image' /&gt;&lt;/p&gt;

&lt;h3 id='webgl_camp_3_at_google_hq'&gt;WebGL camp #3 at Google HQ&lt;/h3&gt;

&lt;p&gt;Last but not least, I&amp;#8217;ll be making a presentation on PhiloGL at &lt;a href='http://webglcamp.com/'&gt;WebGL camp&lt;/a&gt; this Friday. Regirstration is still open, so I hope to see you there!&lt;/p&gt;
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/XALNM3UAoMo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2011/06/06/philogl-1.2.0-released</feedburner:origLink></entry>
 
 <entry>
   <title>PhiloGL 1.1.1 and JavaScript InfoVis Toolkit 2.0.1 released</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/7ubaJlD5NqE/philogl-1.1.1-javascript-infovis-toolkit-2.0.1" />
   <updated>2011-05-05T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2011/05/05/philogl-1.1.1-javascript-infovis-toolkit-2.0.1</id>
   <content type="html">
    
      &lt;p&gt;Just a quick post to let you know about two patch releases for the &lt;a href='http://thejit.org/'&gt;JavaScript InfoVis Toolkit&lt;/a&gt; and &lt;a href='http://senchalabs.github.com/philogl/'&gt;PhiloGL&lt;/a&gt; respectively.&lt;/p&gt;

&lt;h3 id='javascript_infovis_toolkit_201'&gt;JavaScript InfoVis Toolkit 2.0.1&lt;/h3&gt;

&lt;p&gt;The new patch release for the &lt;a href='http://thejit.org/'&gt;JavaScript InfoVis Toolkit&lt;/a&gt; includes many bug fixes (that you can find &lt;a href='https://github.com/philogb/jit/commits/master'&gt;here&lt;/a&gt;) and new configuration options for Area, Pie and Bar charts.&lt;/p&gt;

&lt;p&gt;As I mentioned before I&amp;#8217;m very excited that the project has been selected for the &lt;a href='http://code.google.com/soc/'&gt;Google Summer of Code 2011 program&lt;/a&gt;, and that two student applications have been already accepted. The selected students will work on making the toolkit better by implementing new visualizations like Voronoi TreeMaps, Scatter Charts, Line Charts and other work related to code design and refactoring. Expect some interesting updates on the project in the next few months!&lt;/p&gt;

&lt;h3 id='philogl_111'&gt;PhiloGL 1.1.1&lt;/h3&gt;

&lt;p&gt;&lt;a href='http://senchalabs.github.com/philogl/'&gt;PhiloGL&lt;/a&gt; version 1.1.1 has been released with a bunch of bug fixes and improvements. Multiple point lights (up to 50) are supported now. You can check a complete changelog &lt;a href='https://github.com/senchalabs/philogl/commit/b74faf71a663f4be14618ff4721a66d8ca8b7af3'&gt;here&lt;/a&gt;.&lt;/p&gt;
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/7ubaJlD5NqE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2011/05/05/philogl-1.1.1-javascript-infovis-toolkit-2.0.1</feedburner:origLink></entry>
 
 <entry>
   <title>Our entry for Google's Data Visualization Challenge</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/Rbm2TnaxaY4/our-entry-for-the-google-dataviz-challenge" />
   <updated>2011-03-27T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2011/03/27/our-entry-for-the-google-dataviz-challenge</id>
   <content type="html">
    
      &lt;p&gt;&lt;em&gt;Launch the Visualization by clicking &lt;a href='/assets/dataviz/index.html'&gt;here&lt;/a&gt;!&lt;/em&gt; (browsers supported are the latest of Google Chrome, Firefox, Opera and Safari -not IE).&lt;/p&gt;

&lt;p&gt;&lt;a href='http://uxnerd.com/'&gt;Luz Caballero&lt;/a&gt; and I have been working together for a couple of weeks to create an interesting visualization for &lt;a href='http://datavizchallenge.org/'&gt;Google&amp;#8217;s Data Visualization Challenge&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Every year, Americans fill out income tax forms and make a payment to the IRS. Where does it all go? Using data provided by WhatWePayFor.com, we created a data visualization that will make it easier to understand how the government spends our tax money.&lt;/p&gt;

&lt;h2 id='the_visualization'&gt;The Visualization&lt;/h2&gt;

&lt;p&gt;We want to help people grasp what these millions and billions mean&amp;#8230; 43.03M on Federal aid to highways&amp;#8230; is that too much or too little? The Federal Budget is traditionally divided in 20 &lt;a href='http://en.wikipedia.org/wiki/United_States_budget_process#Structure_of_the_budget'&gt;&amp;#8220;functions&amp;#8221;&lt;/a&gt; that, under names like &amp;#8220;National Defense&amp;#8221; or &amp;#8220;Energy,&amp;#8221; show the purposes to which money is allocated. Our goal is to show not only &lt;strong&gt;how much money is spent for each function on a given year&lt;/strong&gt;, but also&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;How does that compare to other functions?&lt;/strong&gt; What are our priorities? Would cutting &lt;em&gt;this&lt;/em&gt; give us money enough to fund &lt;em&gt;that&lt;/em&gt;?&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;How has the amount spent on each function changed over the years?&lt;/strong&gt; Hopefully this should give us all an idea on what has traditionally been considered normal highway spending ;)&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Where does the money allocated to each function finally go?&lt;/strong&gt; (Because we would never have guessed that we would find a USD 150M bailout under &amp;#8220;Other advancement of commerce&amp;#8221;!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This visualization is made of two components. First, a tree layout shows, for each given year, how the budget (blue) is divided on each function (green), subfunction (yellow), and &amp;#8220;account&amp;#8221; (the most granular subdivision accounted for in the budget, which gives an idea of the use to which the money is put) (red):&lt;/p&gt;

&lt;p&gt;&lt;img src='/assets/dataviz/icicle.png' alt='Icicle Layout' /&gt;&lt;/p&gt;

&lt;p&gt;The hegiht of each node/section in the tree is proportional to the amount of the budget spent on that function, subfunction or &amp;#8220;account&amp;#8221;. &lt;strong&gt;You can click on the nodes to navigate and filter functions and subfunctions&lt;/strong&gt;. To go back you can right-click or click in the back arrow on the left of the visualization.&lt;/p&gt;

&lt;p&gt;The second component of the application is a timeline that puts the amounts you are visualizing in the tree in a temporal context, showing the evolution of that particular spending category through time. &lt;strong&gt;Click on the bars representing the different years to navigate through time&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src='/assets/dataviz/timeline.png' alt='Timeline' /&gt;&lt;/p&gt;

&lt;p&gt;We wanted to allow our users to compare today&amp;#8217;s spending to the 80s&amp;#8217; without artifacts caused by inflation, and changes in population and GDP. This is why our visualization shows inflation-adjusted USD, gives you the the option to see spending in USD, in USD per capita, or as a percentage of the time&amp;#8217;s GDP. Plus, we wanted to give our users a good shot at pinpointing if/when spending changes are a consequence of government policy or of the economic climate. This is why you can overlay indicators like debt, GDP, inflation and yr/yr population change, to give you an idea of how they affect and are influenced by spending trends.&lt;/p&gt;

&lt;p&gt;&lt;img src='/assets/dataviz/timeline-debt.png' alt='Timeline' /&gt;&lt;/p&gt;

&lt;h2 id='interaction'&gt;Interaction&lt;/h2&gt;

&lt;p&gt;What makes this application most interesting is the interaction between the components, which are tightly coupled.&lt;/p&gt;

&lt;p&gt;When a function is selected, the timeline will adapt to show the budget spending trend for that particular function over the years.&lt;/p&gt;

&lt;p&gt;&lt;img src='/assets/dataviz/timeline2.png' alt='Interacting with the Icicle tree' /&gt;&lt;/p&gt;

&lt;p&gt;When clicking on a timeline element, the tree will animate to show how the budget is spent on each function, subfunction and account, for the selected year.&lt;/p&gt;

&lt;p&gt;If you are interested in comparing how the budget changed between two different moments in time, there is an option to transition between years using colors, red and green, to highlight a decrease or increase of total budget spending for each item.&lt;/p&gt;

&lt;p&gt;&lt;img src='/assets/dataviz/icicle2.png' alt='Interacting with the Icicle tree' /&gt;&lt;/p&gt;

&lt;h2 id='demo_video'&gt;Demo Video&lt;/h2&gt;

&lt;p&gt;We created a video that shows how to navigate and filter data and some interesting finds we made using our visualization. &lt;a href='http://www.youtube.com/watch?v=WUtwn7wB9Hs&amp;amp;hd=1'&gt;Click here&lt;/a&gt; to see the video in HD.&lt;/p&gt;
&lt;object height='390' width='480'&gt;&lt;param name='movie' value='http://www.youtube.com/v/WUtwn7wB9Hs?fs=1&amp;amp;hl=en_US&amp;amp;rel=0' /&gt;&lt;param name='allowFullScreen' value='true' /&gt;&lt;param name='allowscriptaccess' value='always' /&gt;&lt;embed src='http://www.youtube.com/v/WUtwn7wB9Hs?fs=1&amp;amp;hl=en_US&amp;amp;rel=0' allowfullscreen='true' type='application/x-shockwave-flash' allowscriptaccess='always' height='390' width='480' /&gt;&lt;/object&gt;
&lt;h2 id='acknowledgements'&gt;Acknowledgements&lt;/h2&gt;

&lt;p&gt;We would like to thank the people who gave us feedback on this visualization and helped us to improve it. Thanks for your help!&lt;/p&gt;

&lt;p&gt;&lt;a href='/assets/dataviz/'&gt;Click here&lt;/a&gt; to access the visualization!&lt;/p&gt;
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/Rbm2TnaxaY4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2011/03/27/our-entry-for-the-google-dataviz-challenge</feedburner:origLink></entry>
 
 <entry>
   <title>Google Summer of Code and NASA</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/3Mdv68MrRCs/google-summer-of-code-and-nasa" />
   <updated>2011-03-22T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2011/03/22/google-summer-of-code-and-nasa</id>
   <content type="html">
    
      &lt;h2 id='the_javascript_infovis_toolkit_selected_for_google_soc_2011'&gt;The JavaScript InfoVis Toolkit selected for Google SoC 2011&lt;/h2&gt;

&lt;p&gt;The &lt;a href='http://thejit.org/'&gt;JavaScript InfoVis Toolkit&lt;/a&gt; has been accepted for the &lt;a href='http://www.google-melange.com/gsoc/homepage/google/gsoc2011'&gt;Google Summer of Code 2011&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;An &lt;a href='http://thejit.org/ideas/'&gt;ideas page&lt;/a&gt; with some interesting tasks to complete for the project has been posted, and also we already got some awesome feedback from highly motivated students wanting to participate. The feedback has been great so far!&lt;/p&gt;

&lt;p&gt;Being part of the Google Summer of Code 2011 is great not only for the JavaScript InfoVis Toolkit as a project, but also for our mentoring organization, &lt;a href='http://sencha.com/company/'&gt;Sencha Labs&lt;/a&gt;, to connect with students to promote Open Source activities and help build a new generation of JavaScript developers.&lt;/p&gt;

&lt;p&gt;If you like interesting challenges with JavaScript and visualization don’t hesitate to contact me at nicolas at sencha dot com.&lt;/p&gt;

&lt;h2 id='nasa'&gt;NASA&lt;/h2&gt;

&lt;p&gt;I have more exciting news: I’ve been invited by &lt;a href='http://www.nasa.gov/'&gt;NASA&lt;/a&gt; to the first NASA Open Source Summit!&lt;/p&gt;

&lt;p&gt;The summit will bring together 60 leaders from the open source community, NASA developers, and NASA policymakers to lay the foundation for improving how NASA develops, releases, and uses open source software.&lt;/p&gt;

&lt;p&gt;I’m really looking forward to meet everyone there!&lt;/p&gt;
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/3Mdv68MrRCs" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2011/03/22/google-summer-of-code-and-nasa</feedburner:origLink></entry>
 
 <entry>
   <title>PhiloGL version 1.1.0</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/uiRuYAI6rmo/philogl-1.1.0" />
   <updated>2011-03-11T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2011/03/11/philogl-1.1.0</id>
   <content type="html">
    
      &lt;p&gt;&lt;a href='http://senchalabs.github.com/philogl/'&gt;PhiloGL&lt;/a&gt; version 1.1.0 has been released! This version includes a couple of new features like improved WebGL detection, linear fog, picking, added primitives like Cylinder and Cone and some bug fixes with directional lighting.&lt;/p&gt;

&lt;h2 id='better_haswebgl'&gt;Better hasWebGL&lt;/h2&gt;

&lt;p&gt;Until now WebGL was currently detected via the existence of the &lt;code&gt;WebGLRenderingContext&lt;/code&gt; object in the &lt;code&gt;window&lt;/code&gt; object. This check is good to see if the browser we&amp;#8217;re using provides access to the WebGL API, but doesn&amp;#8217;t really check whether the hardware is capable to render WebGL - or at least create a WebGL rendering context.&lt;/p&gt;

&lt;p&gt;In other words, we could have Firefox 4 installed on a ventilation system and get &lt;code&gt;true&lt;/code&gt; for the check of &lt;code&gt;!!window.WebGLRenderingContext&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In order to go a little further on the check I transformed &lt;code&gt;hasWebGL&lt;/code&gt; into a static method that checks whether the &lt;code&gt;WebGLRenderingContext&lt;/code&gt; exists but also checks whether the 3D context can be created. This is a noticeable step forward to check for WebGL capable machines. It&amp;#8217;s worth a small API change (from static property to static method). You can check the documentation for this method &lt;a href='http://senchalabs.github.com/philogl/doc/core.html#PhiloGL:hasWebGL'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='picking'&gt;Picking&lt;/h2&gt;

&lt;p&gt;Picking is the ability to interact with 3D objects in the scene via events like &lt;em&gt;mouseenter&lt;/em&gt; or &lt;em&gt;click&lt;/em&gt;. Picking can be used by setting &lt;code&gt;pick&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; in the events configuration for the &lt;a href='http://senchalabs.github.com/philogl/doc/core.html#PhiloGL:constructor'&gt;PhiloGL constructor&lt;/a&gt;. Internally the &lt;a href='http://senchalabs.github.com/philogl/doc/event.html'&gt;Event&lt;/a&gt; object uses the &lt;a href='http://senchalabs.github.com/philogl/doc/scene.html#Scene:pick'&gt;Scene pick method&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;   &lt;span class='c1'&gt;//Create App&lt;/span&gt;
    &lt;span class='nx'&gt;PhiloGL&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;surface-explorer-canvas&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='nx'&gt;events&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='c1'&gt;//enable picking&lt;/span&gt;
        &lt;span class='nx'&gt;picking&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kc'&gt;true&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
        &lt;span class='c1'&gt;//now the model is returned as the target of&lt;/span&gt;
        &lt;span class='c1'&gt;//the event.&lt;/span&gt;
        &lt;span class='nx'&gt;onMouseEnter&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;e&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;model&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
          &lt;span class='nx'&gt;model&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;uniforms&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;colorUfm&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;];&lt;/span&gt;
        &lt;span class='p'&gt;},&lt;/span&gt;
        &lt;span class='nx'&gt;onMouseLeave&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;e&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;model&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
          &lt;span class='nx'&gt;model&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;uniforms&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;colorUfm&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mf'&gt;0.5&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mf'&gt;0.5&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mf'&gt;0.5&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;];&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
      &lt;span class='p'&gt;},&lt;/span&gt;
      &lt;span class='nx'&gt;onError&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nx'&gt;alert&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;There was an error while creating the WebGL application&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
      &lt;span class='p'&gt;},&lt;/span&gt;
      &lt;span class='nx'&gt;onLoad&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;app&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='cm'&gt;/* do stuff with app */&lt;/span&gt;
      &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='fog'&gt;Fog&lt;/h2&gt;

&lt;p&gt;Linear fog was added in version 1.0.2, but only now it&amp;#8217;s official. Fog can be selected as a scene &lt;em&gt;effect&lt;/em&gt; in the configuration object. You can find more information about how to configure linear fog &lt;a href='http://senchalabs.github.com/philogl/doc/scene.html'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='primitives'&gt;Primitives&lt;/h2&gt;

&lt;p&gt;I added Cone and Cylinder as new primitives. You can find documentation about them &lt;a href='http://senchalabs.github.com/philogl/doc/o3d.html'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='mini_demo'&gt;Mini Demo&lt;/h2&gt;

&lt;p&gt;I made a video featuring fog, picking and our new primitives. In this particular example I only set cones and spheres as pickable objects.&lt;/p&gt;
&lt;object height='390' width='480'&gt;&lt;param name='movie' value='http://www.youtube.com/v/_7Aeo70AEMU?fs=1&amp;amp;hl=en_US' /&gt;&lt;param name='allowFullScreen' value='true' /&gt;&lt;param name='allowscriptaccess' value='always' /&gt;&lt;embed src='http://www.youtube.com/v/_7Aeo70AEMU?fs=1&amp;amp;hl=en_US' allowfullscreen='true' type='application/x-shockwave-flash' allowscriptaccess='always' height='390' width='480' /&gt;&lt;/object&gt;
&lt;p&gt;I hope you enjoy the new features :) You can &lt;a href='http://senchalabs.github.com/philogl/'&gt;download the library here&lt;/a&gt;.&lt;/p&gt;
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/uiRuYAI6rmo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2011/03/11/philogl-1.1.0</feedburner:origLink></entry>
 
 <entry>
   <title>The White House uses the JavaScript InfoVis Toolkit</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/KNHFLTpSBLw/javascript-infovis-toolkit-featured-white-house" />
   <updated>2011-03-03T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2011/03/03/javascript-infovis-toolkit-featured-white-house</id>
   <content type="html">
    
      &lt;p&gt;I was surprised when I entered the main &lt;a href='http://whitehouse.gov/'&gt;White House website&lt;/a&gt; the other day to find out that this logo was showing a very familiar treemap. &lt;img src='/assets/WhiteHouse/budget1.jpg' alt='White House treemap logo' /&gt;&lt;/p&gt;

&lt;p&gt;Clicking on the logo took me to another page where this treemap was featured. The application / visualization showing the 2012 budget is made with a TreeMap, in JavaScript, using the &lt;a href='http://thejit.org/'&gt;JavaScript InfoVis Toolkit&lt;/a&gt;. Click &lt;a href='http://www.whitehouse.gov/winning-the-future/interactive-budget'&gt;on this link&lt;/a&gt; to go to the White House page that features the visualization.&lt;/p&gt;

&lt;p&gt;&lt;img src='/assets/WhiteHouse/budget2.jpg' alt='White House treemap logo' /&gt;&lt;/p&gt;
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/KNHFLTpSBLw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2011/03/03/javascript-infovis-toolkit-featured-white-house</feedburner:origLink></entry>
 
 <entry>
   <title>PhiloGL</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/87zoPxNGvkg/philogl-webgl-framework-data-visualization-creative-coding-game-development" />
   <updated>2011-02-22T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2011/02/22/philogl-webgl-framework-data-visualization-creative-coding-game-development</id>
   <content type="html">
    
      &lt;p&gt;For some time now I&amp;#8217;ve been working on a new project built around WebGL that today I&amp;#8217;m very proud to release: &lt;a href='http://senchalabs.github.com/philogl/'&gt;PhiloGL&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href='http://senchalabs.github.com/philogl/'&gt;PhiloGL&lt;/a&gt; is a WebGL Framework for advanced Data Visualization, Creative Coding and Game Development.&lt;/p&gt;

&lt;p&gt;&lt;a href='http://senchalabs.github.com/philogl/'&gt;PhiloGL&lt;/a&gt; uses cutting edge technology and JavaScript idioms and good practices to deliver elegantly coded WebGL applications that are focused on performance. &lt;a href='http://senchalabs.github.com/philogl/'&gt;PhiloGL&lt;/a&gt; also provides a rich module system covering Program and Shader management, IO, XHR, JSONP, Web Worker management, Effects and Tweening, and much more.&lt;/p&gt;

&lt;p&gt;&lt;a href='http://senchalabs.github.com/philogl/'&gt;PhiloGL&lt;/a&gt; is Open Source Software, licensed under the MIT license and owned by the &lt;a href='http://senchalabs.org/'&gt;SenchaLabs&lt;/a&gt; foundation.&lt;/p&gt;

&lt;p&gt;&lt;a href='http://senchalabs.github.com/philogl/'&gt;PhiloGL&lt;/a&gt; has a complete &lt;a href='http://senchalabs.github.com/philogl/docs.html'&gt;API documentation&lt;/a&gt; with a detailed description of all the modules and class methods. Another very cool thing is that all &lt;a href='http://learningwebgl.com/blog/?page_id=1217'&gt;Learning WebGL lessons&lt;/a&gt; have been ported into &lt;a href='http://senchalabs.github.com/philogl/'&gt;PhiloGL&lt;/a&gt; code so that you can easily learn &lt;a href='http://senchalabs.github.com/philogl/'&gt;PhiloGL&lt;/a&gt;, WebGL or both at the same time. You can find a list of the ported Learning WebGL lessons &lt;a href='http://senchalabs.github.com/philogl/lessons.html'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In order to show how &lt;a href='http://senchalabs.github.com/philogl/'&gt;PhiloGL&lt;/a&gt; applications are made I created three featured projects that deal with Data Visualization in different aspects. In order to see these examples you&amp;#8217;ll need the latest &lt;a href='http://google.com/chrome/'&gt;Google Chrome&lt;/a&gt; and/or &lt;a href='http://www.mozilla.com/en-US/firefox/beta/'&gt;Firefox 4&lt;/a&gt;. If you don&amp;#8217;t have a WebGL capable browser then you&amp;#8217;ll see a video showcasing the application.&lt;/p&gt;

&lt;h2 id='visualizing_temperature_anomalies'&gt;Visualizing Temperature Anomalies&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Access the example &lt;a href='http://senchalabs.github.com/philogl/PhiloGL/examples/temperatureAnomalies/'&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src='http://senchalabs.github.com/philogl/img/marquee/tanomalies.png' alt='Temperature Anomalies' /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=''&gt;NASA&lt;/a&gt; collects year by year data about temperature changes around the globe. This information has been collected since 1880 and tracks temperature anomalies (changes) in different points of the earth as a 2D heatmap. By loading these images into textures and then mapping them into a 3D histogram we are able to track the temperature changes around the globe interactively. Smooth animations between date ranges enable us to spot the overall differences in temperature across the years. Can you guess what the temperature changes will be for the next decade? Access the example &lt;a href='http://senchalabs.github.com/philogl/PhiloGL/examples/temperatureAnomalies/'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='real_time_3d_color_histogram_analysis'&gt;Real time 3D color Histogram Analysis&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Access the example &lt;a href='http://senchalabs.github.com/philogl/PhiloGL/examples/histogram/'&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src='http://senchalabs.github.com/philogl/img/marquee/histogram.png' alt='3D color Histogram Analysis' /&gt;&lt;/p&gt;

&lt;p&gt;Color decomposition on &lt;a href='http://en.wikipedia.org/wiki/RGB_color_model#Geometric_representation'&gt;RGB&lt;/a&gt; or &lt;a href='http://en.wikipedia.org/wiki/HSL_and_HSV'&gt;other color schemes&lt;/a&gt; takes a 3D form. In order to show the color decomposition of an image each dot on a 3D color histogram is assigned a different diameter. The following example renders fine grain and precise color decomposition schemes of each frame of a video in real time. Notice how color varies on each take, and feel free to change the color scheme or pause the video to have a closer look at the color decomposition. You can interact with the visualization by using drag and drop and zooming in/out with your mouse wheel. Access the example &lt;a href='http://senchalabs.github.com/philogl/PhiloGL/examples/histogram/'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='explore_3d_parametric_surfaces'&gt;Explore 3D Parametric Surfaces&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Access the example &lt;a href='http://senchalabs.github.com/philogl/PhiloGL/examples/explorer/'&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src='http://senchalabs.github.com/philogl/img/marquee/explorer.png' alt='3D Parametric Surfaces' /&gt;&lt;/p&gt;

&lt;p&gt;Exploring 3D surfaces is a fun way to learn about geometry, physical phenomena or even terrain modeling. Parametric surfaces are surfaces that also change their shape with an extra variable: &lt;em&gt;time&lt;/em&gt;. Explore 3D surfaces by using drag and drop and the mouse wheel to zoom in/out. You can enable the &lt;em&gt;t&lt;/em&gt; parameter (by clicking on the checkbox) and hit play to see it move. There are three predefined surfaces for you to explore or modify. Access the example &lt;a href='http://senchalabs.github.com/philogl/PhiloGL/examples/explorer/'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='go_get_it'&gt;Go get it!&lt;/h2&gt;

&lt;p&gt;I hope these examples show what you can do with the framework and interest you enough to explore the code. I&amp;#8217;ve had a lot of fun building and using &lt;a href='http://senchalabs.github.com/philogl/'&gt;PhiloGL&lt;/a&gt; and I can&amp;#8217;t wait to see what you&amp;#8217;re capable of doing with it, &lt;a href='http://senchalabs.github.com/philogl/'&gt;you can download it here&lt;/a&gt;!&lt;/p&gt;
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/87zoPxNGvkg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2011/02/22/philogl-webgl-framework-data-visualization-creative-coding-game-development</feedburner:origLink></entry>
 
 <entry>
   <title>Our entry for the Mozilla Open Data Visualization Challenge</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/4DtyaY_XMy0/our-entry-for-the-mozilla-open-data-visualization-challenge" />
   <updated>2010-12-14T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2010/12/14/our-entry-for-the-mozilla-open-data-visualization-challenge</id>
   <content type="html">
    
      &lt;p&gt;&lt;em&gt;Launch the Visualization by clicking &lt;a href='/assets/modvc/pilot/pilot.html'&gt;here&lt;/a&gt;!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href='http://uxnerd.com/'&gt;Maria Luz Caballero&lt;/a&gt; and me have been working together for a couple of weeks to create an interesting visualization for the &lt;a href='http://design-challenge.mozillalabs.com/open-data/OpenDataCompetition/'&gt;Mozilla Open Data Visualization Challenge&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mozilla is releasing a new version of Firefox, version 4. This new version introduces a new UI and they have been monitoring how users interact with the different UI components of Firefox 4. They gathered some interesting information about how UI components are accessed and other elements taken by a survey to the Firefox users describe their expertise level, age, place where Firefox is used, etc.&lt;/p&gt;

&lt;p&gt;We decided that this information could be visualized as a TreeMap in which the area of each node is proportional to the number of times a UI component has been accessed. For example in this image we can see that around 20% of UI interactions happen in the Navigation Toolbar, and it&amp;#8217;s possible to compare the area of this rectangle to others to give us a clue of the overall interactions:&lt;/p&gt;

&lt;p&gt;&lt;img src='/assets/modvc/tm1.png' alt='Navigation Toolbar access tooltip image' /&gt;&lt;/p&gt;

&lt;p&gt;Each node also has a color that spans from red to blue, indicating an average of the expertise level of the user interacting with this component.&lt;/p&gt;

&lt;p&gt;&lt;img src='/assets/modvc/tm2.png' alt='Color span gradient' /&gt;&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s interesting to note how some components are more often accessed by expert users than by beginners and viceversa. However since we provide an &lt;em&gt;average&lt;/em&gt; we lack the information about the &lt;em&gt;real distribution&lt;/em&gt; of user skills accessing the component. In order to avoid misleading results, when drilling down the TreeMap PieCharts indicate the real user skill distribution for each UI component interaction.&lt;/p&gt;

&lt;p&gt;&lt;img src='/assets/modvc/tm3.png' alt='PieCharts as nodes for skill distribution' /&gt;&lt;/p&gt;

&lt;p&gt;What I believe is by far the most interesting aspect of this visualization is the fact of using the ordinal and nominal information provided by the user survey to provide dynamic filtering for the TreeMap. Dynamic filtering (or morphing) enables an easy comparison between different categories of users on how they interact with these components. The filter panel we provide is shown below:&lt;/p&gt;

&lt;p&gt;&lt;img src='/assets/modvc/tm4.png' alt='Dynamic Filtering Panel' /&gt;&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re interested in taking a look at the visualization and playing with it please go to our &lt;a href='/assets/modvc/pilot/pilot.html'&gt;entry&lt;/a&gt;. Browsers supported are Firefox 4, Opera 10.6+ and the latest of the Webkit family.&lt;/p&gt;
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/4DtyaY_XMy0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/12/14/our-entry-for-the-mozilla-open-data-visualization-challenge</feedburner:origLink></entry>
 
 <entry>
   <title>Animating Isosurfaces with WebGL and Workers</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/hyCy8gS3DFU/animating-isosurfaces-with-webgl-and-workers" />
   <updated>2010-12-10T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2010/12/10/animating-isosurfaces-with-webgl-and-workers</id>
   <content type="html">
    
      &lt;p&gt;&lt;em&gt;If you just want to take a look at the JavaScript demos with WebGL and Workers you can &lt;a href='#result'&gt;click here&lt;/a&gt; or just go towards the bottom of the page&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For some time now I&amp;#8217;ve been considering rendering isosurfaces with JavaScript. Isosurfaces are 3D surfaces that can be defined with implicit 3D equations.&lt;/p&gt;

&lt;p&gt;While &amp;#8220;regular&amp;#8221; 3D surfaces are defined as:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;  &lt;span class='nx'&gt;z&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;f&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;x&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;y&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;isosurfaces can also be represented as:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;  &lt;span class='nx'&gt;c&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;f&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;x&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;y&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;z&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Some shapes that can be represented as implicit equations and that can&amp;#8217;t be rendered just as &amp;#8220;regular&amp;#8221; 3D surfaces include the Sphere. While with regular surfaces we can have either the top or bottom part of a Sphere:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;  &lt;span class='nx'&gt;z&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;f&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;x&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;y&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='c1'&gt;// -&amp;gt;&lt;/span&gt;
  
  &lt;span class='nx'&gt;z&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;+|-&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='nb'&gt;Math&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;sqrt&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='o'&gt;-&lt;/span&gt; &lt;span class='nx'&gt;x&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='nx'&gt;x&lt;/span&gt; &lt;span class='o'&gt;-&lt;/span&gt; &lt;span class='nx'&gt;y&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='nx'&gt;y&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='c1'&gt;//either + or -&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Implicit 3D equations can define the &lt;em&gt;whole&lt;/em&gt; shape:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;  &lt;span class='nx'&gt;c&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;f&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;x&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;y&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;z&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='c1'&gt;// -&amp;gt;&lt;/span&gt;
  
  &lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;x&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='nx'&gt;x&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;y&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='nx'&gt;y&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;z&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='nx'&gt;z&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Implicit 3D equations can be used to &lt;a href='http://en.wikipedia.org/wiki/Isosurface'&gt;model organs after taking a computed tomography&lt;/a&gt;, or to model other physical phenomena (like fluids), or even to do old-style OpenGL animated demos like &lt;a href='http://en.wikipedia.org/wiki/Metaballs'&gt;Metaballs&lt;/a&gt; :P&lt;/p&gt;

&lt;h2 id='how_do_i_render_an_isosurface'&gt;How do I render an Isosurface?&lt;/h2&gt;

&lt;p&gt;There&amp;#8217;s this very interesting &lt;a href='http://en.wikipedia.org/wiki/Marching_cubes'&gt;Marching Cubes&lt;/a&gt; algorithm that describes how to create primitives that can be later sent to an OpenGL renderer in order to plot Isosurfaces (the primitives are triangles in this case). The main principle of the algorithm is to create some sort of differentials by dividing the space in which the surface is defined into &amp;#8220;very small&amp;#8221; cubes within the main volume where the visualization is contained and study how the surface intersects these small cubes (when it does). We can identify in this way 256 different cases in which the surface can &amp;#8220;cut&amp;#8221; these small cubes:&lt;/p&gt;

&lt;p&gt;&lt;img src='/assets/marching-cubes2.png' alt='Marching Cubes Intersections' /&gt;&lt;/p&gt;

&lt;p&gt;For each of these cases we can obtain the group of triangles corresponding to the part of the surface that intersected the small cube. That way we can recreate the surface to be rendered.&lt;/p&gt;

&lt;p&gt;&lt;img src='/assets/marching-cubes.gif' alt='Marching Cubes Example' /&gt;&lt;/p&gt;

&lt;h2 id='approaching_the_problem_with_webgl'&gt;Approaching the Problem with WebGL&lt;/h2&gt;

&lt;p&gt;The power of WebGL lies in being able to compute these algorithms in some shader language. In the WebGL programable pipeline we can write shader code at two different stages: when processing a vertex (vertex shader) or when doing per pixel manipulation (fragment shader). Unfortunately this means that we are forced to send to the vertex shader an array of predefined vertices to render the surface before computing anything on the GPU. There is no way to send any other type of information through the shader that once arrived to the vertex shader would allow it to &amp;#8220;emit&amp;#8221; new vertices.&lt;/p&gt;

&lt;p&gt;For example, one approach I would have enjoyed doing is to send the grid details to the shaders and then calculate the triangles and emit new vertices to render the scene from the shader. However I haven&amp;#8217;t found a way to do this with WebGL because there&amp;#8217;s no &lt;a href='http://en.wikipedia.org/wiki/Geometry_shader'&gt;geometry shader&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So we&amp;#8217;re stuck on the client-side to calculate all vertices and then send the information to the vertex shader with WebGL. This proves to be a little bit slow.&lt;/p&gt;

&lt;h2 id='web_workers_to_the_rescue'&gt;Web Workers to the rescue!&lt;/h2&gt;

&lt;p&gt;The divide &amp;amp; conquer nature of the algorithm made me think that I could divide the computing space into an &lt;a href='http://en.wikipedia.org/wiki/Octree'&gt;octree&lt;/a&gt; and parallelize each octant with a &lt;a href='https://developer.mozilla.org/En/Using_web_workers'&gt;Worker&lt;/a&gt;. A worker is a JavaScript API that provides asynchronous threads of execution. One can post messages to the workers and add &lt;em&gt;onmessage&lt;/em&gt; listeners to them to do something in particular when they finish the computation or they send us some message. Workers can call other workers and also one can create multiple workers out of the same code. For more information about Workers read the link above ;).&lt;/p&gt;

&lt;p&gt;So now what I needed is something like a &lt;em&gt;WorkerGroup&lt;/em&gt; that would create a certain number of workers and map different configurations for each of them, and then reduce all workers responses into a single &amp;#8220;merged&amp;#8221; result of vertices to send to the shaders.&lt;/p&gt;

&lt;p&gt;A way to implement the WorkerGroup would be:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='c1'&gt;//Create an array of workers&lt;/span&gt;
&lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='nx'&gt;WorkerGroup&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;fileName&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;workers&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;workers&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;[];&lt;/span&gt;
  &lt;span class='k'&gt;while&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='o'&gt;--&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='nx'&gt;workers&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;push&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;Worker&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;fileName&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt;
  &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='nx'&gt;WorkerGroup&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;prototype&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='c1'&gt;//create a configuration array to post to each worker&lt;/span&gt;
  &lt;span class='c1'&gt;//when reduce is called&lt;/span&gt;
  &lt;span class='nx'&gt;map&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;callback&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;workers&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;workers&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;configs&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;configs&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;[];&lt;/span&gt;

    &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;l&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;workers&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;length&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='nx'&gt;l&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='nx'&gt;configs&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;push&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;callback&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
  &lt;span class='p'&gt;},&lt;/span&gt;
  &lt;span class='c1'&gt;//run all workers with their proper configuration and &lt;/span&gt;
  &lt;span class='c1'&gt;//define a group-callback to merge the results&lt;/span&gt;
  &lt;span class='nx'&gt;reduce&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;opt&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;fn&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;opt&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;reduceFn&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
        &lt;span class='nx'&gt;workers&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;workers&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
        &lt;span class='nx'&gt;configs&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;configs&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
        &lt;span class='nx'&gt;l&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;workers&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;length&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
        &lt;span class='nx'&gt;acum&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;opt&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;initialValue&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
        &lt;span class='nx'&gt;message&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;e&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
         &lt;span class='nx'&gt;l&lt;/span&gt;&lt;span class='o'&gt;--&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
         &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;acum&lt;/span&gt; &lt;span class='o'&gt;===&lt;/span&gt; &lt;span class='kc'&gt;undefined&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
          &lt;span class='nx'&gt;acum&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;e&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;data&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
         &lt;span class='p'&gt;}&lt;/span&gt; &lt;span class='k'&gt;else&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
          &lt;span class='nx'&gt;acum&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;fn&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;acum&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;e&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;data&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
         &lt;span class='p'&gt;}&lt;/span&gt;
         &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;l&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
          &lt;span class='nx'&gt;opt&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;onComplete&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;acum&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
         &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='p'&gt;};&lt;/span&gt;
    &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;ln&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;l&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='nx'&gt;ln&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;w&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;workers&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='p'&gt;];&lt;/span&gt;
      &lt;span class='nx'&gt;w&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;onmessage&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;message&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
      &lt;span class='nx'&gt;w&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;postMessage&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;configs&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='p'&gt;]);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
  &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The performance improvements of using Workers are very noticeable. The algorithm remains on the client-side though, so if you want fast performance I&amp;#8217;d recommend you to use some webkit nightly.&lt;/p&gt;
&lt;div id='result' /&gt;
&lt;h2 id='the_result'&gt;The Result&lt;/h2&gt;

&lt;p&gt;I made two demos, one is a Metaballs demo and the other one is an Isosurface visualizer. I really like the second example because you can specify your own formulas. There are predefined formulas like a Torus or Gyroid. To see these demos you&amp;#8217;ll need a WebGL enabled browser, I do encourage you to install a webkit nightly for this.&lt;/p&gt;

&lt;p&gt;&lt;a href='/assets/marching-cubes/1/index.html'&gt;Click here&lt;/a&gt; to take a look at the Metaballs demo, or you can watch a video here:&lt;/p&gt;
&lt;object height='463' width='500'&gt;&lt;param name='allowfullscreen' value='true' /&gt;&lt;param name='allowscriptaccess' value='always' /&gt;&lt;param name='movie' value='http://vimeo.com/moogaloop.swf?clip_id=17422087&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=1&amp;amp;color=00ADEF&amp;amp;fullscreen=1&amp;amp;autoplay=0&amp;amp;loop=0' /&gt;&lt;embed src='http://vimeo.com/moogaloop.swf?clip_id=17422087&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=1&amp;amp;color=00ADEF&amp;amp;fullscreen=1&amp;amp;autoplay=0&amp;amp;loop=0' allowfullscreen='true' type='application/x-shockwave-flash' allowscriptaccess='always' height='463' width='500' /&gt;&lt;/object&gt;
&lt;p&gt;For the Isosurface generator you can &lt;a href='/assets/marching-cubes/2/index.html'&gt;click here&lt;/a&gt; or take a look at the video below:&lt;/p&gt;
&lt;object height='300' width='500'&gt;&lt;param name='allowfullscreen' value='true' /&gt;&lt;param name='allowscriptaccess' value='always' /&gt;&lt;param name='movie' value='http://vimeo.com/moogaloop.swf?clip_id=17514838&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=1&amp;amp;color=00ADEF&amp;amp;fullscreen=1&amp;amp;autoplay=0&amp;amp;loop=0' /&gt;&lt;embed src='http://vimeo.com/moogaloop.swf?clip_id=17514838&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=1&amp;amp;color=00ADEF&amp;amp;fullscreen=1&amp;amp;autoplay=0&amp;amp;loop=0' allowfullscreen='true' type='application/x-shockwave-flash' allowscriptaccess='always' height='300' width='500' /&gt;&lt;/object&gt;
&lt;h2 id='github'&gt;GitHub&lt;/h2&gt;

&lt;p&gt;I&amp;#8217;m pushing all experiments from now on to a &lt;a href='http://github.com/philogb/Playground'&gt;Playground&lt;/a&gt; repo for you to check the code or improve. There&amp;#8217;s also some 2D Canvas, WebGL and Scala code from &lt;a href='/2010/09/04/three-ways-to-make-3d/'&gt;Three ways to make 3D&lt;/a&gt; there.&lt;/p&gt;
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/hyCy8gS3DFU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/12/10/animating-isosurfaces-with-webgl-and-workers</feedburner:origLink></entry>
 
 <entry>
   <title>My Talk at YOW! Developer Conferences</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/Ccpi0OKiXLo/my-talk-at-yow-developer-conferences" />
   <updated>2010-12-09T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2010/12/09/my-talk-at-yow-developer-conferences</id>
   <content type="html">
    
      &lt;p&gt;Last week I was in Melbourne and Brisbane, Australia, to speak about interactive data visualizations with JavaScript at the &lt;a href='http://yowconference.com.au/'&gt;YOW! Developer Conferences&lt;/a&gt;. My presentation was a one hour talk in which I covered some InfoVis Theory basics (some ideas from Jacques Bertin&amp;#8217;s Semiology of Graphics); also I spoke about the main things the JavaScript InfoVis Toolkit has to offer and finally I presented some future work involving WebGL, web workers and some cool algorithms I&amp;#8217;ll be presenting in a future post.&lt;/p&gt;

&lt;p&gt;I want to thank Dave Thomas and the entire team for giving me the opportunity to speak in Brisbane and Melbourne. I had the honour to speak right before Ben Fry&amp;#8217;s &lt;em&gt;Computational Design&lt;/em&gt; talk and Dan Ingalls &lt;em&gt;40 years of fun with computers&lt;/em&gt; - both amazing presentations.&lt;/p&gt;

&lt;p&gt;You can find the slides for my presentation here, the audience went wild with my presentation in Brisbane!&lt;/p&gt;
&lt;div id='__ss_6094862' style='width:425px'&gt;&lt;strong style='display:block;margin:12px 0 4px'&gt;&lt;a href='http://www.slideshare.net/philogb/creating-interactive-data-visualizations-for-the-web-yow-developer-conferences-australia' title='Creating Interactive Data Visualizations for the Web - YOW! Developer Conferences Australia'&gt;Creating Interactive Data Visualizations for the Web - YOW! Developer Conferences Australia&lt;/a&gt;&lt;/strong&gt;&lt;object id='__sse6094862' height='355' width='425'&gt;&lt;param name='movie' value='http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=yow-key-101209163254-phpapp02&amp;stripped_title=creating-interactive-data-visualizations-for-the-web-yow-developer-conferences-australia&amp;userName=philogb' /&gt;&lt;param name='allowFullScreen' value='true' /&gt;&lt;param name='allowScriptAccess' value='always' /&gt;&lt;embed name='__sse6094862' src='http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=yow-key-101209163254-phpapp02&amp;stripped_title=creating-interactive-data-visualizations-for-the-web-yow-developer-conferences-australia&amp;userName=philogb' allowfullscreen='true' type='application/x-shockwave-flash' allowscriptaccess='always' height='355' width='425' /&gt;&lt;/object&gt;&lt;div style='padding:5px 0 12px'&gt;View more &lt;a href='http://www.slideshare.net/'&gt;presentations&lt;/a&gt; from &lt;a href='http://www.slideshare.net/philogb'&gt;philogb&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;One of the highlights of YOW! for me was to see &lt;a href='http://en.wikipedia.org/wiki/Dan_Ingalls'&gt;Dan Ingalls&lt;/a&gt;, father of five generations of Smalltalk, winner of two ACM awards and now working with cutting-edge web technology as SAP fellow introduce bindings for the JavaScript InfoVis Toolkit in the &lt;a href='http://www.lively-kernel.org/'&gt;lively-kernel&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src='/assets/daningalls.png' alt='Dan Ingalls answering questions about the lively kernel with an InfoVis page at the end of his talk' /&gt;&lt;/p&gt;

&lt;p&gt;Being at YOW! Developer Conferences was a great experience.&lt;/p&gt;
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/Ccpi0OKiXLo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/12/09/my-talk-at-yow-developer-conferences</feedburner:origLink></entry>
 
 <entry>
   <title>Sencha Acquires the JavaScript InfoVis Toolkit</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/i_TwhSghQGc/sencha-acquires-the-javascript-infovis-toolkit" />
   <updated>2010-11-06T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2010/11/06/sencha-acquires-the-javascript-infovis-toolkit</id>
   <content type="html">
    
      &lt;img src='/assets/sencha-logo.png' alt='Sencha Logo' style='float: left;' /&gt;
&lt;p&gt;&lt;a href='http://sencha.com'&gt;Sencha Inc.&lt;/a&gt;, &lt;a href='http://www.crunchbase.com/company/sencha'&gt;a company that focuses on client-side technologies&lt;/a&gt; acquired this Friday the &lt;a href='http://thejit.org'&gt;JavaScript InfoVis Toolkit&lt;/a&gt;!&lt;/p&gt;

&lt;h2 id='what_does_it_mean'&gt;What does it mean?&lt;/h2&gt;

&lt;p&gt;Sencha now owns the toolkit. Following the &lt;a href='http://www.sencha.com/company/'&gt;Sencha Labs&lt;/a&gt; philosophy, the project will remain with an Open Source license (BSD), and will be part of the Sencha Labs foundation. This means that someone from Sencha will take some time to maintain and still develop the toolkit from now on. That person can be me, but I also encourage the Sencha Team to take a closer look at &lt;a href='http://thejit.org/'&gt;the project&lt;/a&gt;, there are many cool concepts in there that even trascend the fact that it&amp;#8217;s done in JavaScript, and I would love to get some help on the development of the toolkit. Oh, and yes I&amp;#8217;m looking at &lt;em&gt;you&lt;/em&gt; too reader, the project has been up for more than two years and you still haven&amp;#8217;t contributed? &lt;em&gt;Now&lt;/em&gt; is the time!&lt;/p&gt;

&lt;h2 id='what_does_it_mean_for_me'&gt;What does it mean&amp;#8230; for me?&lt;/h2&gt;

&lt;p&gt;I started this project all by myself three years ago. I still remember I was playing around with Hyperbolic Geometry when &lt;a href='http://ajaxian.com/archives/the-javascript-hyperbolic-browser'&gt;the experiment was featured for the first time in Ajaxian&lt;/a&gt;. My intention at first was far from building an Open Source project or gathering a small community of people interested in it, it was just about learning Data Visualization. After taking a look at &lt;a href='http://video.google.com/videoplay?docid=-6229232330597040086#'&gt;Tamara Munzner&amp;#8217;s Google Tech Talk&lt;/a&gt;, I was amazed by this field and tried to learn all I could about state of the art infovis.&lt;/p&gt;

&lt;p&gt;Then I moved to France to work for &lt;a href='http://exalead.com'&gt;Exalead&lt;/a&gt;. I was primarily working with the Java stack on enterprise products (not related to infovis). Then I would go home and spend more time learning infovis and putting into practice the things I learnt by hacking.&lt;/p&gt;

&lt;p&gt;One of the things I found interesting about infovis papers is that they generally provide an overview of some visualization technique, they provide a user study to show how the visual encodings presented are better in some situations, but there is little concrete talk about the implementation itself. Of course, the papers are about Data Visualization, not Computer Graphics. We&amp;#8217;re not supposed to be reading pseudo-code, but instead how a visualization provides new insights on data. That &amp;#8220;lack of information&amp;#8221; about a concrete implementation was very interesting to me at first: each visualization became a technical challenge. With the time I got to learn something very interesting though. The &lt;em&gt;real challenge&lt;/em&gt; lies in the creativity required to invent a visualization that actually helps the user and increases his/her overall productivity when browsing some dataset.&lt;/p&gt;

&lt;p&gt;At first the toolkit was&amp;#8230; WYSIWYG: I was just experimenting with infovis and since I was building everything from scratch design errors showed up. There were some early adopters though, like &lt;a href='http://www.opencrx.org/index.html'&gt;OpenCRX&lt;/a&gt; that included the toolkit as part of their mobile application. With time the toolkit got much better, and people from &lt;a href='http://googlewavedev.blogspot.com/2010/07/wave-visualizer-turning-trees-into.html'&gt;Google&lt;/a&gt;, &lt;a href='http://www.mozilla.org/community/'&gt;Mozilla&lt;/a&gt;, &lt;a href='http://www.guardian.co.uk/news/datablog/2010/jun/14/coins-data-results-10-things#infovis'&gt;The Guardian&lt;/a&gt;, &lt;a href='http://root.cern.ch/drupal/content/documentation'&gt;CERN&lt;/a&gt;, &lt;a href='http://www.ubs.com/'&gt;UBS&lt;/a&gt;, &lt;a href='http://www.platform.com/'&gt;Platform Computing&lt;/a&gt; and more started using it.&lt;/p&gt;

&lt;p&gt;Along with &lt;a href='http://vis.stanford.edu/protovis/'&gt;Protovis&lt;/a&gt;, I believe that the &lt;a href='http://thejit.org/'&gt;JavaScript InfoVis Toolkit&lt;/a&gt; became the most robust solution to provide Web based interactive Data Visualizations.&lt;/p&gt;

&lt;p&gt;Thanks to the toolkit I got the chance to meet the InfoVis community in Paris by speaking at the &lt;a href='http://www.lri.fr/~chevalie/seminarhcivisu/home.php?n=Main.SeminarNicoGarcia'&gt;Parisian Seminar on InfoVis and HCI&lt;/a&gt;, and to present the toolkit at &lt;a href='http://jsconf.eu/2010/speaker/creating_interactive_data_visu.html'&gt;JSConf&lt;/a&gt; in Berlin. I also began working on building visualizations at &lt;a href='http://labs.exalead.com/'&gt;Exalead Labs&lt;/a&gt;, and the toolkit was also one of the reasons I moved from France to California to work for &lt;a href='http://sencha.com/'&gt;Sencha&lt;/a&gt;. Also I&amp;#8217;ll be presenting the toolkit at the &lt;a href='http://www.yowconference.com.au/'&gt;YOW! Developer Conferences&lt;/a&gt; in Australia this year.&lt;/p&gt;

&lt;p&gt;Within this three years I also learnt how to create, license, develop and maintain an Open Source project and its community by &lt;a href='http://thejit.org/'&gt;hosting the project&lt;/a&gt;, accepting collaborations through &lt;a href='https://github.com/philogb/jit'&gt;GitHub&lt;/a&gt;, answering questions at the &lt;a href='http://groups.google.com/group/javascript-information-visualization-toolkit'&gt;Google Group&lt;/a&gt;, etc. This might seem silly to some of you, but maintaining an Open Source project requires some hard work and dedication.&lt;/p&gt;

&lt;p&gt;The project has reached a maturity I&amp;#8217;m very proud of. And there are still much things to work on. Exploring new visualization techniques and robust WebGL support are just a few things that come to my mind.&lt;/p&gt;
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/i_TwhSghQGc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/11/06/sencha-acquires-the-javascript-infovis-toolkit</feedburner:origLink></entry>
 
 <entry>
   <title>Analyzing JavaScript Class Patterns Performance</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/UJC9HbGyNp8/javascript-class-performance" />
   <updated>2010-10-10T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2010/10/10/javascript-class-performance</id>
   <content type="html">
    
      &lt;p&gt;For a while now I&amp;#8217;ve been considering different JavaScript class patterns and their performance when initializing and calling methods from them. Depending on the use-case some class patterns can show considerable performance improvements over the typical pseudo-classical patterns. In some cases, the use of closures and private member initializers in function constructors, as opposed to &lt;a href='https://developer.mozilla.org/en/JavaScript/Guide/Closures#Performance_considerations'&gt;what&amp;#8217;s stated by the MDC&lt;/a&gt;, can also show performance improvements over classical approaches.&lt;/p&gt;

&lt;p&gt;JavaScript class performance can be analyzed by altering two variables: the &lt;em&gt;JavaScript class&lt;/em&gt; can have public/private properties and/or&lt;br /&gt;public/private methods. On the other hand, &lt;em&gt;code performance&lt;/em&gt; can be measured on &lt;em&gt;class definition&lt;/em&gt;, &lt;em&gt;class constructors&lt;/em&gt;, or &lt;em&gt;instance methods&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ll just state the conclusion before making the analysis: there&amp;#8217;s not a unique class pattern that will make your code faster in all cases. Most of the time it just depends on your use-case. In most cases people try to delegate all computations at &lt;em&gt;class definition&lt;/em&gt;, since this generally happens only once. When this is not possible there&amp;#8217;s a tradeoff between having computations in the &lt;em&gt;class constructor&lt;/em&gt; or performing these computations when a &lt;em&gt;method is called&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The premise for this analysis is that the extra-computations can&amp;#8217;t be avoided, and their complexity can&amp;#8217;t be simplified. In some sense, they&amp;#8217;re just like a black box.&lt;/p&gt;

&lt;p&gt;In the next section I&amp;#8217;ll show how you can use &lt;em&gt;closures&lt;/em&gt;, &lt;em&gt;variable scope&lt;/em&gt; and a &lt;em&gt;class prototype&lt;/em&gt; to delegate computations at &lt;em&gt;class definition&lt;/em&gt;, &lt;em&gt;class constructor&lt;/em&gt; or to just keep the computations when &lt;em&gt;calling a method&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id='classprototype_101'&gt;Class.prototype 101&lt;/h2&gt;

&lt;p&gt;Any JavaScript object, (String, Object, RegExp, etc), generally has two type of properties: the &lt;em&gt;own&lt;/em&gt; properties and the properties found in the &lt;em&gt;prototype chain&lt;/em&gt;. Each object has a special property &lt;em&gt;proto&lt;/em&gt; that actually points to another object (or is null).&lt;/p&gt;

&lt;p&gt;When we try to access a property in an object:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;propertyValue&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;object&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;myProperty&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;it will first try to see if it&amp;#8217;s an &lt;em&gt;own property&lt;/em&gt;, something that can be checked by doing:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='nb'&gt;Object&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;prototype&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;hasOwnProperty&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;call&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;object&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;myProperty&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;and use that property if it exists. If it doesn&amp;#8217;t exist then it will try to find that property inside the object pointed by the &lt;em&gt;proto&lt;/em&gt; property:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='nx'&gt;object&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;__proto__&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;myProperty&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;If the property isn&amp;#8217;t found in the object pointed by &lt;em&gt;proto&lt;/em&gt; then it will try to find it recursively in the prototype chain (object.proto.proto, etc) until it gets to the top of it.&lt;/p&gt;

&lt;p&gt;When we create a Class with a prototype:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt; &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='nx'&gt;Person&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='c1'&gt;//constructor&lt;/span&gt;
 &lt;span class='p'&gt;}&lt;/span&gt;

 &lt;span class='nx'&gt;Person&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;prototype&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;sayHi&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='nx'&gt;alert&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;hi&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
 &lt;span class='p'&gt;};&lt;/span&gt;

 &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;p&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;Person&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
 &lt;span class='nx'&gt;p&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;sayHi&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt; &lt;span class='c1'&gt;//&amp;quot;hi&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Internally JavaScript will assign to any Person instance &lt;em&gt;proto&lt;/em&gt; property the Person.prototype object we defined above. This means that we actually define an object with methods only once, and any instance of Person will have a &lt;em&gt;proto&lt;/em&gt; property pointing to those methods. Since all Person instances point to the same Person.prototype people usually say they share those methods, and so they&amp;#8217;re shared properties across instances.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;p&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;Person&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='nx'&gt;p&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;__proto__&lt;/span&gt; &lt;span class='o'&gt;===&lt;/span&gt; &lt;span class='nx'&gt;Person&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;prototype&lt;/span&gt; &lt;span class='c1'&gt;//true&lt;/span&gt;
&lt;span class='nx'&gt;p&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;sayHi&lt;/span&gt; &lt;span class='o'&gt;===&lt;/span&gt; &lt;span class='nx'&gt;p&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;__proto__&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;sayHi&lt;/span&gt; &lt;span class='c1'&gt;//true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The convenience about this is that we don&amp;#8217;t have to execute an entire code that actually re-creates methods and assigns them to a newly created object in the function constructor. Since each time new Person is called the Person function is executed, it would be better to just define the methods in the prototype object for once and not execute code for augmenting an object with new methods each time we call Person.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s see how this could be used to increase the performance of certain class patterns.&lt;/p&gt;

&lt;h2 id='public_properties'&gt;Public Properties&lt;/h2&gt;

&lt;p&gt;In the public properties class definition we just move all properties definitions from the &lt;em&gt;class constructor&lt;/em&gt; to the &lt;em&gt;prototype&lt;/em&gt; object. By moving these computations we can see that there are some interesting performance improvements on constructor calls.&lt;/p&gt;

&lt;p&gt;The code preparations are:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='nx'&gt;ConstructorPublicProperties&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;publicProperty1&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;publicProperty2&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;publicProperty3&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;publicProperty4&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;4&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;publicProperty5&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;publicProperty6&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;6&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;publicProperty7&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;7&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;publicProperty8&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;8&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;publicProperty9&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;9&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;publicProperty10&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;100&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
   &lt;span class='k'&gt;while&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='o'&gt;--&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='mi'&gt;10&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='p'&gt;})();&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='nx'&gt;PrototypePublicProperties&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{}&lt;/span&gt;
 
&lt;span class='nx'&gt;PrototypePublicProperties&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;prototype&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='nx'&gt;publicProperty1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;publicProperty2&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;publicProperty3&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;publicProperty4&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;4&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;publicProperty5&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;publicProperty6&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;6&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;publicProperty7&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;7&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;publicProperty8&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;8&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;publicProperty9&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;9&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;publicProperty10&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;100&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
   &lt;span class='k'&gt;while&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='o'&gt;--&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='mi'&gt;10&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='p'&gt;})()&lt;/span&gt;
&lt;span class='p'&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The code we actually compare is:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='mi'&gt;1000&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
 &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;ConstructorPublicProperties&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;vs.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='mi'&gt;1000&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
 &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;PrototypePublicProperties&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;As you can see by the &lt;a href='http://jsperf.com/constructor-public-properties2/2'&gt;test case that you can run yourself&lt;/a&gt; moving computations to the &lt;em&gt;prototype&lt;/em&gt; object can lead to considerable performance improvements in class constructors.&lt;/p&gt;

&lt;h2 id='public_methods'&gt;Public Methods&lt;/h2&gt;

&lt;p&gt;For public methods the case is just the same than with public properties. Moving all definitions and initializations to the &lt;em&gt;prototype&lt;/em&gt; object leads to performance improvements in class constructors.&lt;/p&gt;

&lt;p&gt;The preparation code for this is:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='nx'&gt;ConstructorPublicMethods&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;publicMethod1&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='p'&gt;};&lt;/span&gt;
 
  &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;publicMethod2&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='p'&gt;};&lt;/span&gt;
 &lt;span class='p'&gt;}&lt;/span&gt;
 
 &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='nx'&gt;PrototypePublicMethods&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{}&lt;/span&gt;
 
 &lt;span class='nx'&gt;PrototypePublicMethods&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;prototype&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='nx'&gt;publicMethod1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='p'&gt;},&lt;/span&gt;
 
  &lt;span class='nx'&gt;publicMethod2&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='p'&gt;}&lt;/span&gt;
 &lt;span class='p'&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;a href='http://jsperf.com/constructor-public-methods'&gt;test&lt;/a&gt; code is:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='mi'&gt;1000&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
 &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;ConstructorPublicMethods&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;vs.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='mi'&gt;1000&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
 &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;PrototypePublicMethods&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;As &lt;a href='http://jsperf.com/constructor-public-methods'&gt;you can see&lt;/a&gt; constructors are also faster when public methods are defined inside the &lt;em&gt;prototype&lt;/em&gt; object.&lt;/p&gt;

&lt;h2 id='private_methods'&gt;Private Methods&lt;/h2&gt;

&lt;p&gt;Private methods can be defined in JavaScript by using the class constructor as encapsulation for other function definitions. This is a pattern I&amp;#8217;ve seen done by Douglas Crockford and is used in many other places:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='nx'&gt;ConstructorPrivateMethods&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='nx'&gt;privateMethod1&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='p'&gt;}&lt;/span&gt;
 
  &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='nx'&gt;privateMethod2&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='p'&gt;}&lt;/span&gt;
 
  &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;publicMethod1&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nx'&gt;privateMethod1&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;privateMethod2&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt;
  &lt;span class='p'&gt;};&lt;/span&gt;
 &lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;If you&amp;#8217;re only defining private methods (and not private properties) you can also augment the prototype object with public methods and use encapsulation for defining private methods around the prototype object. I&amp;#8217;ve seen this clever technique done by &lt;a href='http://twitter.com/webreflection'&gt;WebReflection&lt;/a&gt; some time ago:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='nx'&gt;PrototypePrivateMethods&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{}&lt;/span&gt;
 
 &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
 
  &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='nx'&gt;privateMethod1&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='p'&gt;}&lt;/span&gt;
 
  &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='nx'&gt;privateMethod2&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='p'&gt;}&lt;/span&gt;
 
  &lt;span class='nx'&gt;PrototypePrivateMethods&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;prototype&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='nx'&gt;publicMethod1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nx'&gt;privateMethod1&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;privateMethod2&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;n&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt;
   &lt;span class='p'&gt;}&lt;/span&gt;
  &lt;span class='p'&gt;};&lt;/span&gt;
 
 &lt;span class='p'&gt;})();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The code tested is the same as in the previous sections:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='mi'&gt;1000&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
 &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;ConstructorPrivateMethods&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;vs.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='mi'&gt;1000&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
 &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;PrototypePrivateMethods&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href='http://jsperf.com/constructor-private-methods'&gt;As you can see for yourself&lt;/a&gt; the prototype version has the fastest constructor. The performance improvements are considerable with this pattern which is interesting in use-cases such as when defining some helper functions to be used with a class.&lt;/p&gt;

&lt;h2 id='private_properties'&gt;Private Properties&lt;/h2&gt;

&lt;p&gt;The examples above are kind of simple to analyze: moving the computations from the class constructor to the prototype object can lead to faster constructors, and more generally can increase performance since the code is computed once at the &lt;em&gt;class definition&lt;/em&gt; and not once per each &lt;em&gt;constructor call&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;With private properties there&amp;#8217;s a tradeoff. Since private properties are generally accessed and/or modified by public methods, defining a private property inside the &lt;em&gt;constructor&lt;/em&gt; forces the definition of the public method into the &lt;em&gt;class constructor&lt;/em&gt; too, decreasing the overall performance of the class constructor. Another interesting technique could be to just use an underscore prefix for private members:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='nx'&gt;ConstructorPrivateProperties&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;privateProperty1&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
      &lt;span class='nx'&gt;privateProperty2&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
      &lt;span class='nx'&gt;privateProperty3&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
      &lt;span class='nx'&gt;privateProperty4&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;4&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
      &lt;span class='nx'&gt;privateProperty5&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
      &lt;span class='nx'&gt;privateProperty6&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;6&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
      &lt;span class='nx'&gt;privateProperty7&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;7&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
      &lt;span class='nx'&gt;privateProperty8&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;8&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
      &lt;span class='nx'&gt;privateProperty9&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;9&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
      &lt;span class='nx'&gt;privateProperty10&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;10&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
 
  &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;publicMethod1&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nx'&gt;privateProperty1&lt;/span&gt; 
        &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;privateProperty2&lt;/span&gt; 
        &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;privateProperty3&lt;/span&gt; 
        &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;privateProperty4&lt;/span&gt; 
        &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;privateProperty5&lt;/span&gt; 
        &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;privateProperty6&lt;/span&gt; 
        &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;privateProperty7&lt;/span&gt; 
        &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;privateProperty8&lt;/span&gt; 
        &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;privateProperty9&lt;/span&gt; 
        &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;privateProperty10&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='p'&gt;};&lt;/span&gt;
 &lt;span class='p'&gt;}&lt;/span&gt;
 
 &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='nx'&gt;PrototypePrivateProperties&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{}&lt;/span&gt;
 
 &lt;span class='nx'&gt;PrototypePrivateProperties&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;prototype&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='nx'&gt;_privateProperty1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;_privateProperty2&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;_privateProperty3&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;_privateProperty4&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;4&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;_privateProperty5&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;_privateProperty6&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;6&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;_privateProperty7&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;7&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;_privateProperty8&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;8&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;_privateProperty9&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;9&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='nx'&gt;_privateProperty10&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;10&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
 
  &lt;span class='nx'&gt;publicMethod1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;_privateProperty1&lt;/span&gt; 
        &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;_privateProperty2&lt;/span&gt; 
        &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;_privateProperty3&lt;/span&gt; 
        &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;_privateProperty4&lt;/span&gt; 
        &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;_privateProperty5&lt;/span&gt; 
        &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;_privateProperty6&lt;/span&gt; 
        &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;_privateProperty7&lt;/span&gt; 
        &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;_privateProperty8&lt;/span&gt; 
        &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;_privateProperty9&lt;/span&gt; 
        &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;_privateProperty10&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='p'&gt;}&lt;/span&gt;
 &lt;span class='p'&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;a href='http://jsperf.com/constructor-and-method-private-vars'&gt;code we&amp;#8217;re testing is&lt;/a&gt;:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='mi'&gt;1000&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
 &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;ConstructorPrivateProperties&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;vs.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='mi'&gt;1000&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
 &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;PrototypePrivateProperties&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href='http://jsperf.com/constructor-and-method-private-vars'&gt;As you can see for yourself&lt;/a&gt; using the prototype object yields faster constructors again. &lt;strong&gt;But there&amp;#8217;s a catch&lt;/strong&gt;: the public method for the augmented prototype object class access &lt;em&gt;this.something&lt;/em&gt; instead of just accessing a local variable, which drops the overall method call performance considerably. &lt;a href='http://jsperf.com/calling-public-methods-accessing-private-vars'&gt;You can see this for yourself by testing this code:&lt;/a&gt;&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;instance&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;ConstructorPrivateProperties&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;

&lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='mi'&gt;1000&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
 &lt;span class='nx'&gt;instance&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;publicMethod1&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;vs.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;instance&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;PrototypePrivateProperties&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;

&lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='mi'&gt;1000&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
 &lt;span class='nx'&gt;instance&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;publicMethod1&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The augmented prototype object version is the slowest. What&amp;#8217;s also interesting is that using private properties defined in the function constructor can increase the overall performance of the methods called in your class (if they access instance properties).&lt;/p&gt;

&lt;p&gt;So are you targeting faster constructors, class definitions or methods? The fact is that any of these three stages can be optimized, but generally with a tradeoff.&lt;/p&gt;
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/UJC9HbGyNp8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/10/10/javascript-class-performance</feedburner:origLink></entry>
 
 <entry>
   <title>JSConf</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/bJkPx72MY_s/jsconf" />
   <updated>2010-09-28T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2010/09/28/jsconf</id>
   <content type="html">
    
      &lt;p&gt;&lt;a href='http://jsconf.eu/'&gt;JSConf&lt;/a&gt; just finished. It was a great experience: I got to meet a lot of interesting people and attend awesome talks, and I even got the chance to &lt;a href='http://jsconf.eu/2010/speaker/creating_interactive_data_visu.html'&gt;speak about the toolkit!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The slides from my talk are here:&lt;/p&gt;
&lt;div id='__ss_5284231' style='width:425px'&gt;&lt;strong style='display:block;margin:12px 0 4px'&gt;&lt;a href='http://www.slideshare.net/philogb/javascript-infovis-toolkit-create-interactive-data-visualizations-for-the-web' title='JavaScript InfoVis Toolkit - Create interactive data visualizations for the web'&gt;JavaScript InfoVis Toolkit - Create interactive data visualizations for the web&lt;/a&gt;&lt;/strong&gt;&lt;object id='__sse5284231' height='355' width='425'&gt;&lt;param name='movie' value='http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=jsconfeushort-100925070735-phpapp01&amp;stripped_title=javascript-infovis-toolkit-create-interactive-data-visualizations-for-the-web&amp;userName=philogb' /&gt;&lt;param name='allowFullScreen' value='true' /&gt;&lt;param name='allowScriptAccess' value='always' /&gt;&lt;embed name='__sse5284231' src='http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=jsconfeushort-100925070735-phpapp01&amp;stripped_title=javascript-infovis-toolkit-create-interactive-data-visualizations-for-the-web&amp;userName=philogb' allowfullscreen='true' type='application/x-shockwave-flash' allowscriptaccess='always' height='355' width='425' /&gt;&lt;/object&gt;&lt;div style='padding:5px 0 12px'&gt;View more &lt;a href='http://www.slideshare.net/'&gt;presentations&lt;/a&gt; from &lt;a href='http://www.slideshare.net/philogb'&gt;philogb&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;All talks were great, some of the talks I really enjoyed were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://jsconf.eu/2010/speaker/be_proxy_objects.html'&gt;Proxy Objects by Brendan Eich&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://jsconf.eu/2010/speaker/getting_functional_with_fab.html'&gt;Getting functional with (fab) by Jed Schmidt&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://jsconf.eu/2010/speaker/loopage_by_douglas_crockford.html'&gt;Loopage by Douglas Crockford&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&amp;#8230;and &lt;a href='http://jsconf.eu/2010/speakers.html'&gt;more&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can follow &lt;a href='http://twitter.com/jsconfeu'&gt;JSConf&lt;/a&gt; for updates about when the videos will be released.&lt;/p&gt;

&lt;p&gt;Finally I want to thank &lt;a href='http://twitter.com/janl/'&gt;janl&lt;/a&gt;, &lt;a href='http://twitter.com/cramforce/'&gt;cramforce&lt;/a&gt; and &lt;a href='http://twitter.com/hblank'&gt;hblank&lt;/a&gt; for gathering all javascripters in Berlin, making an excellent event, and giving me the chance to introduce &lt;a href='http://thejit.org/'&gt;the toolkit&lt;/a&gt; to the JS crowd. You guys are awesome!&lt;/p&gt;
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/bJkPx72MY_s" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/09/28/jsconf</feedburner:origLink></entry>
 
 <entry>
   <title>Jekyll</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/wf2-Z_Cn9VE/jekyll" />
   <updated>2010-09-20T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2010/09/20/jekyll</id>
   <content type="html">
    
      &lt;p&gt;So I just moved from WordPress to &lt;a href='http://github.com/mojombo/jekyll'&gt;Jekyll&lt;/a&gt;, a Ruby based static site generator. Moving from WordPress wasn&amp;#8217;t as pleasant as I thought, and the site might have some &amp;#8220;bugs&amp;#8221; (let me know if you find one!) but I&amp;#8217;m much more happy to be writing this post in my favorite editor, and not having to rely on WordPress, PHP or MySQL to run the blog.&lt;/p&gt;

&lt;p&gt;While moving stuff from WordPress I found a few interesting old posts, I hope you find them interesting too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='/2008/09/05/memoization-in-javascript/'&gt;Memoization in JavaScript&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='/2009/02/08/generic-functions-and-javascript/'&gt;Generic functions and JavaScript&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='/2009/03/24/sharp-variables/'&gt;Sharp Variables&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='/2009/05/11/interactive-visualization-of-genealogical-graphs/'&gt;Interactive Visualization of genealogical graphs video&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&amp;#8230;oh well, there are more interesting posts, so I recommend you to go to the &lt;a href='/'&gt;main page&lt;/a&gt; to see a list of them.&lt;/p&gt;

&lt;p&gt;If you find some bugs please let me know!&lt;/p&gt;
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/wf2-Z_Cn9VE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/09/20/jekyll</feedburner:origLink></entry>
 
 <entry>
   <title>JavaScript InfoVis Toolkit + WebGL</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/tiCwUaiYnUk/javascript-infovis-toolkit-webgl" />
   <updated>2010-09-17T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2010/09/17/javascript-infovis-toolkit-webgl</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/tiCwUaiYnUk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/09/17/javascript-infovis-toolkit-webgl</feedburner:origLink></entry>
 
 <entry>
   <title>Three ways to make 3D</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/sUzeT5LZ6GM/three-ways-to-make-3d" />
   <updated>2010-09-04T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2010/09/04/three-ways-to-make-3d</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/sUzeT5LZ6GM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/09/04/three-ways-to-make-3d</feedburner:origLink></entry>
 
 <entry>
   <title>JavaScript InfoVis Toolkit 2.0.0 beta released</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/mif7ynX_9WQ/javascript-infovis-toolkit-2-0-0-beta-released" />
   <updated>2010-08-10T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2010/08/10/javascript-infovis-toolkit-2-0-0-beta-released</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/mif7ynX_9WQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/08/10/javascript-infovis-toolkit-2-0-0-beta-released</feedburner:origLink></entry>
 
 <entry>
   <title>Doctor Who villains from 1963 to 2010 visualized</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/Pmmw2ACaFmk/doctor-who-villains-from-1963-to-2010-visualized" />
   <updated>2010-07-17T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2010/07/17/doctor-who-villains-from-1963-to-2010-visualized</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/Pmmw2ACaFmk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/07/17/doctor-who-villains-from-1963-to-2010-visualized</feedburner:origLink></entry>
 
 <entry>
   <title>Speaker at JSConf.eu 2010</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/j9cAu2FZlhk/speaker-at-jsconf-eu-2010" />
   <updated>2010-07-08T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2010/07/08/speaker-at-jsconf-eu-2010</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/j9cAu2FZlhk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/07/08/speaker-at-jsconf-eu-2010</feedburner:origLink></entry>
 
 <entry>
   <title>The JavaScript InfoVis Toolkit 2.0 is out!</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/ojZi4ochp-w/the-javascript-infovis-toolkit-2-0-is-out" />
   <updated>2010-06-28T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2010/06/28/the-javascript-infovis-toolkit-2-0-is-out</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/ojZi4ochp-w" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/06/28/the-javascript-infovis-toolkit-2-0-is-out</feedburner:origLink></entry>
 
 <entry>
   <title>News from the JavaScript InfoVis Toolkit 2.0 World</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/QlCeEbJAKXM/news-from-the-javascript-infovis-toolkit-2-0-world" />
   <updated>2010-05-30T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2010/05/30/news-from-the-javascript-infovis-toolkit-2-0-world</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/QlCeEbJAKXM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/05/30/news-from-the-javascript-infovis-toolkit-2-0-world</feedburner:origLink></entry>
 
 <entry>
   <title>Browser Photo Mosaics</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/93QLNEvDUaI/browser-photo-mosaics" />
   <updated>2010-05-20T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2010/05/20/browser-photo-mosaics</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/93QLNEvDUaI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/05/20/browser-photo-mosaics</feedburner:origLink></entry>
 
 <entry>
   <title>Speaker at YOW! Australia 2010</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/9pxPXRQWH_E/speaker-at-yow-australia-2010" />
   <updated>2010-05-03T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2010/05/03/speaker-at-yow-australia-2010</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/9pxPXRQWH_E" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/05/03/speaker-at-yow-australia-2010</feedburner:origLink></entry>
 
 <entry>
   <title>New JavaScript InfoVis Toolkit Visualizations</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/GzOPzAfbK9s/new-javascript-infovis-toolkit-visualizations" />
   <updated>2010-04-24T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2010/04/24/new-javascript-infovis-toolkit-visualizations</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/GzOPzAfbK9s" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/04/24/new-javascript-infovis-toolkit-visualizations</feedburner:origLink></entry>
 
 <entry>
   <title>JavaScript Animations</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/D2wGWd4Gzm4/javascript-animations" />
   <updated>2010-03-25T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2010/03/25/javascript-animations</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/D2wGWd4Gzm4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/03/25/javascript-animations</feedburner:origLink></entry>
 
 <entry>
   <title>JavaScript InfoVis Toolkit Customizations</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/i3MColzjeO0/javascript-infovis-toolkit-customizations" />
   <updated>2010-02-24T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2010/02/24/javascript-infovis-toolkit-customizations</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/i3MColzjeO0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/02/24/javascript-infovis-toolkit-customizations</feedburner:origLink></entry>
 
 <entry>
   <title>Voronoi Tessellation</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/U3UmnXep3tk/voronoi-tessellation" />
   <updated>2010-02-12T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2010/02/12/voronoi-tessellation</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/U3UmnXep3tk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/02/12/voronoi-tessellation</feedburner:origLink></entry>
 
 <entry>
   <title>DOM vs. Canvas TreeMaps</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/UtOfXATHCY8/dom-vs-canvas-treemaps" />
   <updated>2010-01-24T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2010/01/24/dom-vs-canvas-treemaps</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/UtOfXATHCY8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2010/01/24/dom-vs-canvas-treemaps</feedburner:origLink></entry>
 
 <entry>
   <title>Past Talk(s)</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/opaMiUto_Tc/past-talks" />
   <updated>2009-12-07T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2009/12/07/past-talks</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/opaMiUto_Tc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/12/07/past-talks</feedburner:origLink></entry>
 
 <entry>
   <title>Speaker at the Parisian Seminar on InfoVis and HCI</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/7LnQXsfxLdA/speaker-at-the-parisian-seminar-on-infovis-and-hci" />
   <updated>2009-11-30T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2009/11/30/speaker-at-the-parisian-seminar-on-infovis-and-hci</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/7LnQXsfxLdA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/11/30/speaker-at-the-parisian-seminar-on-infovis-and-hci</feedburner:origLink></entry>
 
 <entry>
   <title>ECMA Harmony and the Future of JavaScript</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/nTCBOxNSE0Q/ecma-harmony-and-the-future-of-javascript" />
   <updated>2009-11-08T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2009/11/08/ecma-harmony-and-the-future-of-javascript</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/nTCBOxNSE0Q" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/11/08/ecma-harmony-and-the-future-of-javascript</feedburner:origLink></entry>
 
 <entry>
   <title>1000 Messages, yay!</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/fxpLU981tOQ/1000-messages-yay" />
   <updated>2009-10-15T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2009/10/15/1000-messages-yay</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/fxpLU981tOQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/10/15/1000-messages-yay</feedburner:origLink></entry>
 
 <entry>
   <title>Sunburst Visualization</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/UuWFFf8L-vs/sunburst-visualization" />
   <updated>2009-10-05T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2009/10/05/sunburst-visualization</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/UuWFFf8L-vs" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/10/05/sunburst-visualization</feedburner:origLink></entry>
 
 <entry>
   <title>Force Directed Layouts</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/2Uz-Y4pxV9U/force-directed-layouts" />
   <updated>2009-09-30T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2009/09/30/force-directed-layouts</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/2Uz-Y4pxV9U" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/09/30/force-directed-layouts</feedburner:origLink></entry>
 
 <entry>
   <title>HTML, SVG or Canvas Labels?</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/rkx_WG-08aU/html-svg-or-canvas-labels" />
   <updated>2009-08-30T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2009/08/30/html-svg-or-canvas-labels</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/rkx_WG-08aU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/08/30/html-svg-or-canvas-labels</feedburner:origLink></entry>
 
 <entry>
   <title>Version 1.1.3</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/kNF3WVknFas/version-113" />
   <updated>2009-08-24T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2009/08/24/version-113</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/kNF3WVknFas" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/08/24/version-113</feedburner:origLink></entry>
 
 <entry>
   <title>Back to Basics</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/LUNB6EUIUh4/back-to-basics" />
   <updated>2009-08-22T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2009/08/22/back-to-basics</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/LUNB6EUIUh4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/08/22/back-to-basics</feedburner:origLink></entry>
 
 <entry>
   <title>MultiTrees (Part 1)</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/qIjwlEpeSrA/multitrees-part-1" />
   <updated>2009-08-16T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2009/08/16/multitrees-part-1</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/qIjwlEpeSrA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/08/16/multitrees-part-1</feedburner:origLink></entry>
 
 <entry>
   <title>Outside In</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/FMSgokMTpcw/outside-in" />
   <updated>2009-08-07T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2009/08/07/outside-in</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/FMSgokMTpcw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/08/07/outside-in</feedburner:origLink></entry>
 
 <entry>
   <title>Drawing Trees</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/893i9ugqdvQ/drawing-trees" />
   <updated>2009-08-05T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2009/08/05/drawing-trees</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/893i9ugqdvQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/08/05/drawing-trees</feedburner:origLink></entry>
 
 <entry>
   <title>V8-GL Update</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/zR2BODWxs34/v8-gl-update" />
   <updated>2009-07-13T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2009/07/13/v8-gl-update</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/zR2BODWxs34" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/07/13/v8-gl-update</feedburner:origLink></entry>
 
 <entry>
   <title>V8-GL</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/h1u3512IKjo/v8-gl" />
   <updated>2009-06-21T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2009/06/21/v8-gl</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/h1u3512IKjo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/06/21/v8-gl</feedburner:origLink></entry>
 
 <entry>
   <title>The JavaScript InfoVis Toolkit 1.1 is Out!</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/57_QhGXhzIE/the-javascript-infovis-toolkit-11-is-out" />
   <updated>2009-06-02T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2009/06/02/the-javascript-infovis-toolkit-11-is-out</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/57_QhGXhzIE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/06/02/the-javascript-infovis-toolkit-11-is-out</feedburner:origLink></entry>
 
 <entry>
   <title>More about the JavaScript InfoVis Toolkit 1.1</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/lhqEZDuENDk/more-about-the-javascript-infovis-toolkit-11" />
   <updated>2009-05-21T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2009/05/21/more-about-the-javascript-infovis-toolkit-11</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/lhqEZDuENDk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/05/21/more-about-the-javascript-infovis-toolkit-11</feedburner:origLink></entry>
 
 <entry>
   <title>Interactive Visualization of Genealogical Graphs</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/-QJzuyCDvZM/interactive-visualization-of-genealogical-graphs" />
   <updated>2009-05-11T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2009/05/11/interactive-visualization-of-genealogical-graphs</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/-QJzuyCDvZM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/05/11/interactive-visualization-of-genealogical-graphs</feedburner:origLink></entry>
 
 <entry>
   <title>Taking a look at Groovy</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/_Qe5VQt-0sQ/taking-a-look-at-groovy" />
   <updated>2009-04-21T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2009/04/21/taking-a-look-at-groovy</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/_Qe5VQt-0sQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/04/21/taking-a-look-at-groovy</feedburner:origLink></entry>
 
 <entry>
   <title>JavaScript InfoVis Toolkit 1.1 Preview</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/0hsoqZp9PKQ/javascript-infovis-toolkit-11-preview" />
   <updated>2009-03-31T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2009/03/31/javascript-infovis-toolkit-11-preview</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/0hsoqZp9PKQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/03/31/javascript-infovis-toolkit-11-preview</feedburner:origLink></entry>
 
 <entry>
   <title>Sharp Variables</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/k8t3AlFP9F8/sharp-variables" />
   <updated>2009-03-24T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2009/03/24/sharp-variables</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/k8t3AlFP9F8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/03/24/sharp-variables</feedburner:origLink></entry>
 
 <entry>
   <title>Generic Functions and JavaScript</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/CskzDg76XgM/generic-functions-and-javascript" />
   <updated>2009-02-08T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2009/02/08/generic-functions-and-javascript</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/CskzDg76XgM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/02/08/generic-functions-and-javascript</feedburner:origLink></entry>
 
 <entry>
   <title>Cushion Treemaps</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/wE38iUS7xcw/cushion-treemaps" />
   <updated>2009-02-05T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2009/02/05/cushion-treemaps</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/wE38iUS7xcw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/02/05/cushion-treemaps</feedburner:origLink></entry>
 
 <entry>
   <title>Why not Operator Overloading in JavaScript?</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/12TIh6hzOrw/why-not-operator-overloading-in-javascript" />
   <updated>2009-01-27T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2009/01/27/why-not-operator-overloading-in-javascript</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/12TIh6hzOrw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/01/27/why-not-operator-overloading-in-javascript</feedburner:origLink></entry>
 
 <entry>
   <title>A new Canvas Element</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/HB2r0ouFTOE/a-new-canvas-element" />
   <updated>2009-01-12T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2009/01/12/a-new-canvas-element</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/HB2r0ouFTOE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2009/01/12/a-new-canvas-element</feedburner:origLink></entry>
 
 <entry>
   <title>Anonymous Recursive Functions</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/HcdRGNJsN4w/anonymous-recursive-functions" />
   <updated>2008-12-27T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2008/12/27/anonymous-recursive-functions</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/HcdRGNJsN4w" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/12/27/anonymous-recursive-functions</feedburner:origLink></entry>
 
 <entry>
   <title>Using OCaml to visualize Radiohead's HoC music video (part 3)</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/wmXUqFWZG7U/using-ocaml-to-visualize-radioheads-hoc-music-video-part-3" />
   <updated>2008-12-06T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2008/12/06/using-ocaml-to-visualize-radioheads-hoc-music-video-part-3</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/wmXUqFWZG7U" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/12/06/using-ocaml-to-visualize-radioheads-hoc-music-video-part-3</feedburner:origLink></entry>
 
 <entry>
   <title>Using OCaml to visualize Radiohead's HoC music video (part 2)</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/YAOq5isE6c8/using-ocaml-to-visualize-radioheads-hoc-music-video-part-2" />
   <updated>2008-12-02T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2008/12/02/using-ocaml-to-visualize-radioheads-hoc-music-video-part-2</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/YAOq5isE6c8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/12/02/using-ocaml-to-visualize-radioheads-hoc-music-video-part-2</feedburner:origLink></entry>
 
 <entry>
   <title>Using OCaml to visualize Radiohead's HoC music video (part 1)</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/YymzgO-E0q4/using-ocaml-to-visualize-radioheads-hoc-music-video-part-1" />
   <updated>2008-11-27T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2008/11/27/using-ocaml-to-visualize-radioheads-hoc-music-video-part-1</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/YymzgO-E0q4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/11/27/using-ocaml-to-visualize-radioheads-hoc-music-video-part-1</feedburner:origLink></entry>
 
 <entry>
   <title>Thank you Platform Computing!</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/wMWkjuZPL18/thank-you-platform-computing" />
   <updated>2008-11-12T00:00:00-08:00</updated>
   <id>http://blog.thejit.org/2008/11/12/thank-you-platform-computing</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/wMWkjuZPL18" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/11/12/thank-you-platform-computing</feedburner:origLink></entry>
 
 <entry>
   <title>Visualizing Linux package dependencies</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/sxc6xAwRB1Q/visualizing-linux-module-dependencies" />
   <updated>2008-11-02T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2008/11/02/visualizing-linux-module-dependencies</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/sxc6xAwRB1Q" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/11/02/visualizing-linux-module-dependencies</feedburner:origLink></entry>
 
 <entry>
   <title>Graph Operations</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/0g3DCKtZEAw/graph-operations" />
   <updated>2008-10-31T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2008/10/31/graph-operations</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/0g3DCKtZEAw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/10/31/graph-operations</feedburner:origLink></entry>
 
 <entry>
   <title>The Moebius Transformation</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/adkhEeMLxVA/the-moebius-transformation" />
   <updated>2008-10-14T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2008/10/14/the-moebius-transformation</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/adkhEeMLxVA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/10/14/the-moebius-transformation</feedburner:origLink></entry>
 
 <entry>
   <title>Memoization in JavaScript</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/Iv4O0YClveU/memoization-in-javascript" />
   <updated>2008-09-05T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2008/09/05/memoization-in-javascript</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/Iv4O0YClveU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/09/05/memoization-in-javascript</feedburner:origLink></entry>
 
 <entry>
   <title>Pattern matching in OCaml (and JavaScript?)</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/2A_XfGTQtvw/pattern-matching-in-ocaml-and-javascript" />
   <updated>2008-08-11T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2008/08/11/pattern-matching-in-ocaml-and-javascript</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/2A_XfGTQtvw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/08/11/pattern-matching-in-ocaml-and-javascript</feedburner:origLink></entry>
 
 <entry>
   <title>Weighted nodes, weighted edges</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/qYcV-DrP6PI/weighted-nodes-weighted-edges" />
   <updated>2008-08-05T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2008/08/05/weighted-nodes-weighted-edges</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/qYcV-DrP6PI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/08/05/weighted-nodes-weighted-edges</feedburner:origLink></entry>
 
 <entry>
   <title>Feeding JSON graph structures to the JIT</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/bLrxm6grtNA/feeding-json-graph-structures-to-the-jit" />
   <updated>2008-07-02T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2008/07/02/feeding-json-graph-structures-to-the-jit</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/bLrxm6grtNA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/07/02/feeding-json-graph-structures-to-the-jit</feedburner:origLink></entry>
 
 <entry>
   <title>JIT version 1.0.2a</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/iSvNNSbUvno/jit-version-102a" />
   <updated>2008-06-08T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2008/06/08/jit-version-102a</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/iSvNNSbUvno" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/06/08/jit-version-102a</feedburner:origLink></entry>
 
 <entry>
   <title>Animated exploration of Graphs with radial layout video</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/FC_Ybji6wPU/animated-exploration-of-graphs-with-radial-layout-video" />
   <updated>2008-06-02T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2008/06/02/animated-exploration-of-graphs-with-radial-layout-video</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/FC_Ybji6wPU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/06/02/animated-exploration-of-graphs-with-radial-layout-video</feedburner:origLink></entry>
 
 <entry>
   <title>Further work on JIT</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/fl6ZIdVpWj0/further-work-on-jit-10a" />
   <updated>2008-05-20T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2008/05/20/further-work-on-jit-10a</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/fl6ZIdVpWj0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/05/20/further-work-on-jit-10a</feedburner:origLink></entry>
 
 <entry>
   <title>Treemap quick tutorial</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/2FQpWWIL8fw/treemap-quick-tutorial" />
   <updated>2008-05-07T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2008/05/07/treemap-quick-tutorial</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/2FQpWWIL8fw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/05/07/treemap-quick-tutorial</feedburner:origLink></entry>
 
 <entry>
   <title>ST quick tutorial</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/LmQPB1tKIS0/st-quick-tutorial" />
   <updated>2008-05-07T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2008/05/07/st-quick-tutorial</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/LmQPB1tKIS0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/05/07/st-quick-tutorial</feedburner:origLink></entry>
 
 <entry>
   <title>RGraph quick tutorial</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/MViNv68uvMw/rgraph-quick-tutorial" />
   <updated>2008-05-07T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2008/05/07/rgraph-quick-tutorial</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/MViNv68uvMw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/05/07/rgraph-quick-tutorial</feedburner:origLink></entry>
 
 <entry>
   <title>Hypertree quick tutorial</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/bWs0yhpyPbs/hypertree-quick-tutorial" />
   <updated>2008-05-07T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2008/05/07/hypertree-quick-tutorial</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/bWs0yhpyPbs" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/05/07/hypertree-quick-tutorial</feedburner:origLink></entry>
 
 <entry>
   <title>On controllers</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/m3LyjdtWPy8/on-controllers" />
   <updated>2008-04-27T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2008/04/27/on-controllers</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/m3LyjdtWPy8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/04/27/on-controllers</feedburner:origLink></entry>
 
 <entry>
   <title>Feeding JSON tree structures to the JIT</title>
   <link href="http://feedproxy.google.com/~r/Noumena/~3/f3m9sx4QO2I/feeding-json-tree-structures-to-the-jit" />
   <updated>2008-04-27T00:00:00-07:00</updated>
   <id>http://blog.thejit.org/2008/04/27/feeding-json-tree-structures-to-the-jit</id>
   <content type="html">
    
      Sorry, the contents of this post are not available in the RSS. 
    
   &lt;img src="http://feeds.feedburner.com/~r/Noumena/~4/f3m9sx4QO2I" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://blog.thejit.org/2008/04/27/feeding-json-tree-structures-to-the-jit</feedburner:origLink></entry>
 
 
</feed>

