<?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:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C08DSHoycCp7ImA9WhNVEU8.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984</id><updated>2012-12-21T15:31:19.498-05:00</updated><category term="firefox" /><category term="test" /><category term="extensions" /><category term="blogging virgin" /><category term="blackberry" /><category term="java" /><category term="backpacking" /><category term="unittest" /><category term="nexj" /><category term="OOP344" /><category term="sqlite" /><category term="berrysync" /><category term="github" /><category term="project" /><category term="cdot" /><category term="thread" /><category term="opera" /><category term="sync" /><category term="c" /><title>Carlin Desautels</title><subtitle type="html">Current projects and Open Source happenings</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://cwdesautels.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>39</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/CarlinDesautels" /><feedburner:info uri="carlindesautels" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DE8BRH0zfyp7ImA9WhNWGEQ.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-2542194784716747319</id><published>2012-06-20T16:42:00.001-04:00</published><updated>2012-12-19T01:00:55.387-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-19T01:00:55.387-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="extensions" /><category scheme="http://www.blogger.com/atom/ns#" term="sqlite" /><category scheme="http://www.blogger.com/atom/ns#" term="c" /><category scheme="http://www.blogger.com/atom/ns#" term="project" /><category scheme="http://www.blogger.com/atom/ns#" term="nexj" /><category scheme="http://www.blogger.com/atom/ns#" term="cdot" /><title>SQLite: how to get started with extensions</title><content type="html">&lt;h3&gt;






Preface&lt;/h3&gt;
&lt;br /&gt;
As part of a series of blogs I need to release detailing my work at CDOT, this will focus on how to build your own c extension to the hugely popular tiny and fast database engine.&lt;br /&gt;
&lt;br /&gt;
As part of my project to build an &lt;a href="http://www.sqlite.org/"&gt;SQLite &lt;/a&gt;adapter for &lt;a href="https://www.projects.openhealthtools.org/sf/projects/oht_aip/"&gt;NexJ's open health framework&lt;/a&gt;. We've needed to extend the out of the box functionality for SQLite, this ranges from hacking at java code to hacking at our JDBC to hacking SQLite extensions to hacking the SQLite source itself.&lt;br /&gt;
&lt;br /&gt;
So this post will go over what you need to do to write your C extension and more importantly how to load it.&lt;br /&gt;
&lt;h3&gt;





&lt;/h3&gt;
&lt;h3&gt;

&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;

The Minimum&lt;/h3&gt;
&lt;h3&gt;

&amp;nbsp;&lt;/h3&gt;
Let's lay down the groundwork at a minimum you need to refer to SQLite's &lt;a href="http://www.sqlite.org/c3ref/create_function.html"&gt;C api&lt;/a&gt;, there you'll see the publically visible utilities you'll use for your extension.&lt;br /&gt;
&lt;br /&gt;
Specifically lets look at creating our own SQL function, this means that it will be usable during queries and other activities. For this you'll need to take a look at: &lt;a href="http://www.sqlite.org/c3ref/create_function.html"&gt;create function&lt;/a&gt;, the rest of the green code should be the boilerplate code for loadable extensions where "sqlite_extension_init()" is the entry point that the SQLite api knows about.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/2966108.js"&gt;
 
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
This is the most basic loadable extension you can make, now to tackle the problem of loading it:&lt;br /&gt;
&lt;br /&gt;
First compile this c file into a dll for your current system, I suggest you look up how to do this based on what compiler you're using.&lt;br /&gt;
&lt;br /&gt;
Second assuming we have binary.{dll | so | ... }, there are two ways to load your extension inside an SQLite shell you can call .load filename OR using SQL you can run this query select load_extension('filename').&lt;br /&gt;
&lt;br /&gt;
And its that easy! Reference this page for SQLite's loadable extension &lt;a href="http://www2.sqlite.org/cvstrac/wiki?p=LoadableExtensions"&gt;documentation&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Lastly there is a third way to include your extensions, this will be detailed more when I release a blog post about our build system. However the very basics are to add&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/2966160.js"&gt;
 
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
during SQLite's initialization, in our version of SQLite this is added after SQLite loads its internal functions in main.c by putting this line in addition to adding the extension location to the existing build system.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/2966168.js"&gt;
 
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;

An Example&lt;/h3&gt;
&lt;br /&gt;
Finally here is example source for our extension that creats the SQL function binary, that works with the existing SQLite function hex(). Binary converts hex string input into blob output.&lt;br /&gt;
&lt;br /&gt;
Take not of the how to handle input errors and other unexpected errors&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://bitbucket.org/gbatumbya/sqlite/src/9cc68159218e/ext/nexj/sqlitext.c#cl-29"&gt;https://bitbucket.org/gbatumbya/sqlite/src/9cc68159218e/ext/nexj/sqlitext.c#cl-29&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/aMUwCKhKhEA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/2542194784716747319/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2012/06/sqlite-how-to-get-started-with.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/2542194784716747319?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/2542194784716747319?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/aMUwCKhKhEA/sqlite-how-to-get-started-with.html" title="SQLite: how to get started with extensions" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2012/06/sqlite-how-to-get-started-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcHR387cSp7ImA9WhJTE00.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-9207987496640530224</id><published>2012-06-20T14:32:00.000-04:00</published><updated>2012-06-21T14:23:56.109-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-21T14:23:56.109-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="backpacking" /><category scheme="http://www.blogger.com/atom/ns#" term="project" /><category scheme="http://www.blogger.com/atom/ns#" term="nexj" /><category scheme="http://www.blogger.com/atom/ns#" term="cdot" /><title>Back To CDOT - My trip and my goals</title><content type="html">&lt;h3&gt;


The Trip &lt;/h3&gt;
&lt;h3&gt;


&lt;/h3&gt;
So I've been gone for the month of May, I took advantage of the opportunity of being able to get a month off of my coop and CDOT work. I left with 3 long time friends for a backpacking trip across as many countries as I could and to see as many things as I could. &lt;br /&gt;
&lt;br /&gt;
While I was gone I visited 5 countries around western europe, a brief itenary or the trip went as follows:&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;London&lt;/span&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;London -&amp;gt; Paris via train&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;Paris&lt;/span&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;Paris -&amp;gt; Lisbon via plane&lt;/span&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;Lisbon -&amp;gt; Lagos via train&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Lagos&lt;/span&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;Lagos -&amp;gt; Lisbon via train&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Lisbon&lt;/span&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;Lisbon -&amp;gt; Madrid via plane&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Madrid&lt;/span&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;Madrid -&amp;gt; Barcelona via train&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Barcelona&lt;/span&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;Barcelona -&amp;gt; Nice via car&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Nice&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;Nice -&amp;gt; Paris via train&lt;/span&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;Paris -&amp;gt; Home&amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;br /&gt;
I cannot say enough good things about this trip, I also cannot say enough good things about staying in hostels. While an entire blog post can be written on how to choose the right hostile at the very least take advantage of sites dedicated to finding and reviewing hostels. This one in particular was our favourite &lt;a href="http://www.hostelbookers.com/"&gt;HostelBookers&lt;/a&gt;.&lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-9EQvI9-tDXc/T-IRF3n3AmI/AAAAAAAAAF0/0Aaw0XYv0G4/s1600/DSC_0439_1.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="212" src="http://4.bp.blogspot.com/-9EQvI9-tDXc/T-IRF3n3AmI/AAAAAAAAAF0/0Aaw0XYv0G4/s320/DSC_0439_1.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Lagos, Portugal&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
I'm not going to go into detail about the trip, I could go on forever, there are 32gb of pictures and videos to go through so here is one of my favourites to the left.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;


&amp;nbsp;&lt;/h4&gt;
&lt;h4&gt;


CDOT&lt;/h4&gt;
&lt;h4&gt;


&amp;nbsp;&lt;/h4&gt;
I've been back for 2 weeks now, and its taken a while to get my barrings back. Getting back to CDOT has put three projects in front of me.&lt;br /&gt;
&lt;br /&gt;
To change topics a bit, some of my personal goals upon coming back have been to refocus on the tasks I have at hand and become better at time management by more strictly budgetting myself. Additionally, alot of pressure is mounting on Grace's exit and I will have some large shoes to fill. Coming back has re ignited my focus, trying to learn everything that Grace knows is a challenge of knowing the right things to ask and recording all the things that happen during our pair programming.&lt;br /&gt;
&lt;br /&gt;
On the topic of projects, we are currently working on a &lt;a href="http://www.sqlite.org/"&gt;SQLite &lt;/a&gt;database adapter for &lt;a href="https://www.projects.openhealthtools.org/sf/projects/oht_aip/"&gt;NexJ's open health framework&lt;/a&gt;. Since I've come back it has gone in for code review and we are still in talks with NexJ about making a final deliverable. I hope to have this done in the following month, the final deliverable should have a multi-platform build system for our driver in adapter to the adapter code.&lt;br /&gt;
&lt;br /&gt;
Another project is for NexJ and it is something that no one really knows anything about, I have tried my best to research the components that seem relevant. Really though, the final step is for me to compile my prelim research of limitations in the proposed software until more defined specs come in.&lt;br /&gt;
&lt;br /&gt;
Finally my old friend &lt;a href="http://appworld.blackberry.com/webstore/content/56903/?lang=en"&gt;BerrySync &lt;/a&gt;or Sync for the Blackberry. While it was amazing that we finished it so quickly last year, it is not a perfect product and it is littered with problems. I should have some time to focus on certain performance and caching issues, hopefully people will stop hating on the app in BlackBerry's market. Additionally I might need to look into Blackberry OS capabilities. I'm budgeting 2 - 3 weeks of full time work to solve these issues if time allows.&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/PRW8YBGHf20" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/9207987496640530224/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2012/06/back-to-cdot-my-trip-and-my-goals.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/9207987496640530224?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/9207987496640530224?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/PRW8YBGHf20/back-to-cdot-my-trip-and-my-goals.html" title="Back To CDOT - My trip and my goals" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-9EQvI9-tDXc/T-IRF3n3AmI/AAAAAAAAAF0/0Aaw0XYv0G4/s72-c/DSC_0439_1.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2012/06/back-to-cdot-my-trip-and-my-goals.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYCSXczfSp7ImA9WhJTE00.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-1412266442696938434</id><published>2011-08-04T17:20:00.000-04:00</published><updated>2012-06-21T14:26:08.985-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-21T14:26:08.985-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="firefox" /><category scheme="http://www.blogger.com/atom/ns#" term="sync" /><category scheme="http://www.blogger.com/atom/ns#" term="blackberry" /><category scheme="http://www.blogger.com/atom/ns#" term="github" /><category scheme="http://www.blogger.com/atom/ns#" term="project" /><category scheme="http://www.blogger.com/atom/ns#" term="cdot" /><category scheme="http://www.blogger.com/atom/ns#" term="berrysync" /><title>BerrySync: Fetcher.java, now with more github</title><content type="html">after a little bit of work ironing out the BerrySync app. Ive shlapped together my synchronization service library. I've dubbed it fetcher.java, &lt;a href="https://github.com/cwdesautels/fetcher.java"&gt;now on github.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;My Design&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I created the library to be as modular as I could, I'm not happy with the results yet but this is the first step after all.&lt;br /&gt;
&lt;b&gt; &lt;/b&gt;&lt;br /&gt;
The Fetcher class is a singleton and in order to be used it requires a service to be set, this service must be of the iFetcher interface. That allows me to hotswap or customize the service that I'm using.&lt;br /&gt;
&lt;br /&gt;
On top of that each service can have a different structure or set of needs, so attached to the iFetcher interface are setters for the seperate modules:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Encryption module&lt;/li&gt;
&lt;li&gt;Json decoding module&lt;/li&gt;
&lt;li&gt;Network connector module &lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;This Release&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;I've implemented the bare minimum required steps for FireFox's &lt;a href="http://www.mozilla.com/en-US/mobile/sync/"&gt;Sync service&lt;/a&gt;. My chosen platform was BlackBerry(obviously), and as a result the modules contain platform specific code. Meaning that different modules will need to be created to port this service to different platforms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What Can I Do?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Fetcher.getInstance().setLogin("asdf","asdf","asdf").pull();&lt;br /&gt;
&amp;lt; This screenshot is the alpha visual representation of data pulled by Fetcher &amp;gt;&lt;br /&gt;
&lt;a href="http://farm7.static.flickr.com/6124/6009342703_5fbe1d571b_b.jpg"&gt;1,&amp;nbsp; &lt;/a&gt;&lt;a href="http://farm7.static.flickr.com/6127/6009342683_6502bc5f44_b.jpg"&gt;2.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-tMH2itPkJfY/TjsNC3l7TDI/AAAAAAAAADY/IoGrauwofQM/s1600/bbsync_.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="248" src="http://2.bp.blogspot.com/-tMH2itPkJfY/TjsNC3l7TDI/AAAAAAAAADY/IoGrauwofQM/s320/bbsync_.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/fVO-d_ciKZc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/1412266442696938434/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/08/berrysync-fetcherjava-now-with-more.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/1412266442696938434?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/1412266442696938434?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/fVO-d_ciKZc/berrysync-fetcherjava-now-with-more.html" title="BerrySync: Fetcher.java, now with more github" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-tMH2itPkJfY/TjsNC3l7TDI/AAAAAAAAADY/IoGrauwofQM/s72-c/bbsync_.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/08/berrysync-fetcherjava-now-with-more.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQAQn48fyp7ImA9WhJTE00.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-7291753832091890256</id><published>2011-07-21T16:32:00.001-04:00</published><updated>2012-06-21T14:29:03.077-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-21T14:29:03.077-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="firefox" /><category scheme="http://www.blogger.com/atom/ns#" term="unittest" /><category scheme="http://www.blogger.com/atom/ns#" term="sync" /><category scheme="http://www.blogger.com/atom/ns#" term="blackberry" /><category scheme="http://www.blogger.com/atom/ns#" term="test" /><category scheme="http://www.blogger.com/atom/ns#" term="project" /><category scheme="http://www.blogger.com/atom/ns#" term="cdot" /><category scheme="http://www.blogger.com/atom/ns#" term="berrysync" /><title>BerrySync: Untested code is broken code</title><content type="html">&lt;b&gt;TLDR - What did I learn?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
In the irc channels I  lurk, a phrase reigns true. "Untested code is broken code". I overlooked  this bug because my tests didn't keep up with the code. Don't be lazy,  you will not remember you took short cuts a month ago.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;BerrySync's Show Stopper&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt; &lt;br /&gt;
So I'm very quick to point fingers, So naturally when our program stops decrypting 75% of the I went straight to &lt;a href="http://bit.ly/r9vKFS"&gt;http://bit.ly/r9vKFS&lt;/a&gt;. You should note RIM is abiding by this document &lt;a href="http://bit.ly/ey4Fg"&gt;http://bit.ly/ey4Fg&lt;/a&gt; and if you read further down you'll note that this algorithm padding standard does not mention AES encryption which is tragic because its the only symmetric key unformatter engine that RIM supplies, meaning you'll need it for AES encryption! For example BerrySync's crypto module sans error control:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;AESKey key = new AESKey(keyData);
InitializationVector iv = new InitializationVector(ivData);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
BlockEncryptor encryptor = new BlockEncryptor(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new PKCS5FormatterEngine(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new AESCBCEncryptorEngine(key, iv)), outputStream);
encryptor.write(plainText);
encryptor.close();
outputStream.close();
return outputStream.toByteArray(); 
&lt;/pre&gt;
&lt;br /&gt;
I And you should check out &lt;a href="http://bit.ly/rplM0s"&gt;http://bit.ly/rplM0s&lt;/a&gt;. Here you'll see that Mozilla is abiding to &lt;a href="http://bit.ly/piPqcJ"&gt;http://bit.ly/piPqcJ&lt;/a&gt;. The 2.1 standard includes AES encryption in the spec, hold on a minute. RIM must be doing something totally off the wall here. All of that combined with the knowledge that using third party and unlicensed encryption and getting your app into AppWorld would involve many headaches and much money ala &lt;a href="http://1.usa.gov/rpjY7y"&gt;ECCN&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Wrong&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
As with most things my finger pointing was wrong, the bug actually lived on this line &lt;br /&gt;
&lt;pre&gt;data = data.replace('-', '\0'); &lt;/pre&gt;
Where my lazy attempt at removing characters from a string totally backfired. The interesting thing is that during rare cases, my sync account and about 25% of others tested it didn't actually make a difference and everything worked as intended. Where the other 75% of accounts saw a Bad Padding Exception during decryption.&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/vBiT2crhjU4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/7291753832091890256/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/07/berrysync-untested-code-is-broken-code.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/7291753832091890256?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/7291753832091890256?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/vBiT2crhjU4/berrysync-untested-code-is-broken-code.html" title="BerrySync: Untested code is broken code" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/07/berrysync-untested-code-is-broken-code.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcDQ3w6fyp7ImA9WhJTE00.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-7549530726656881071</id><published>2011-07-06T19:58:00.000-04:00</published><updated>2012-06-21T14:24:32.217-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-21T14:24:32.217-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="blackberry" /><category scheme="http://www.blogger.com/atom/ns#" term="thread" /><category scheme="http://www.blogger.com/atom/ns#" term="project" /><category scheme="http://www.blogger.com/atom/ns#" term="cdot" /><category scheme="http://www.blogger.com/atom/ns#" term="berrysync" /><title>BerrySync: How fetcher gets it done, thread pooling</title><content type="html">&lt;b&gt;A Little Bit Of Background&lt;/b&gt;&lt;br /&gt;
I designed My fetcher library to have modules, these house the logic for the various steps I would need to perform. The fetcher itself links up the modules and goes from a url to a usable object for BerrySync.&lt;br /&gt;
&lt;br /&gt;
One of the more troublesome modules was the Smuggler, I originally designed smuggler to do the network scheduling for fetcher then Smugglers worker thread would perform the actual connections, making the operation non-blocking(which is important for a good user experience!).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Now&lt;/b&gt;&lt;br /&gt;
I was forced to change the design, because the data parsing and decryption had to moved off the main thread. To facilitate this I gave Fetcher its own internal work Queue, with the smuggler still scheduling the network connections this time using Fetchers new and improved .invokeLater(runnable r) method!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;public void invokeLater(Runnable work){
_queue.enQueue(work);
}
private final class WorkQueue {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private Node _head;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private Node _tail;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private QueueWorker[] _worker;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public WorkQueue(){...} 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public synchronized void enQueue(Runnable data) {...}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private synchronized Runnable deQueue()&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;throws InterruptedException{...}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private final class QueueWorker extends Thread {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void run() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Runnable work = null;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (true) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; work = deQueue();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; work.run();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (InterruptedException ignored) {}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;/pre&gt;
&lt;br /&gt;
I'm using the runnable interface to formalize how this thread can 'run' your work. The commented out methods just show a simple queue linked list data structure.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Tune In Next Time&lt;/b&gt;&lt;br /&gt;
In the next instalment I'll tell you all about how I'm tracking down an elusive decryption bug with sync data on the BlackBerry!&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/C_O1RQIN_rI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/7549530726656881071/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/07/berrysync-how-fetcher-gets-it-done.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/7549530726656881071?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/7549530726656881071?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/C_O1RQIN_rI/berrysync-how-fetcher-gets-it-done.html" title="BerrySync: How fetcher gets it done, thread pooling" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/07/berrysync-how-fetcher-gets-it-done.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcBSHwzeCp7ImA9WhJTE00.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-5713311419009759655</id><published>2011-06-22T17:29:00.000-04:00</published><updated>2012-06-21T14:24:19.280-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-21T14:24:19.280-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="blackberry" /><category scheme="http://www.blogger.com/atom/ns#" term="project" /><category scheme="http://www.blogger.com/atom/ns#" term="opera" /><category scheme="http://www.blogger.com/atom/ns#" term="cdot" /><category scheme="http://www.blogger.com/atom/ns#" term="berrysync" /><title>BerrySync: Launching Opera mini xor BlackBerry's Native Browser</title><content type="html">An important part of BerrySync will be actually opening up URLs in the browser(s) on your BlackBerry.&lt;br /&gt;
After doing a little research I worked out how to not only open the native browser but third party browsers as well.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Opening Native Browser&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;browserSession = Browser.getDefaultSession();
browserSession.displayPage("&lt;a class="ext-link" href="http://www.blackberry.com/"&gt;&lt;span class="icon"&gt;&lt;/span&gt;http://www.BlackBerry.com&lt;/a&gt;");
browserSession.showBrowser(); 
&lt;/pre&gt;
&lt;br /&gt;
Wasn't that painless and easy?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Opening 3rd Party Browsers, Opera Mini in this case&lt;/b&gt;&lt;br /&gt;
Also worthy of note is that fact that this block of code doesn't stop at  just browser, you can invoke any third party app by replacing "Opera  Mini" or making another if clause. See below or &lt;a href="http://pastebin.com/RZNDdq2e"&gt;Pastebin&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;int[] apps = CodeModuleManager.getModuleHandles();
ApplicationDescriptor[] ad;
ApplicationDescriptor holder;
String[] args = {"google.com"};
for(int i = 0, len = apps.length; i &amp;lt; len; i ++){
&amp;nbsp;&amp;nbsp;&amp;nbsp; ad = CodeModuleManager.getApplicationDescriptors(apps[i]);
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(ad != null){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int j = 0, adlen = ad.length; j &amp;lt; adlen; j++){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(ad[j].getName().equals("Opera Mini")){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; holder = new ApplicationDescriptor(ad[j], args);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ApplicationManager.getApplicationManager().runApplication(holder);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Needed
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (ApplicationManagerException failedToOpen) {}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
} 
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Code Walkthrough&lt;/b&gt;&lt;br /&gt;
This code scans through all installed modules on a BlackBerry, it tries  to get the application descriptor on each and verifies it against the  name of the app you wish to run. The args step is optional, but for our  purposes we want to open Opera and goto the specified URL. Lastly the  break is needed to stop multiple instances of the app opening since I  found that many apps had more then one matching application descriptor&lt;b&gt; &lt;/b&gt;&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/Yxqwh6ZGbDA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/5713311419009759655/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/06/berrysync-launching-opera-mini-xor.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/5713311419009759655?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/5713311419009759655?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/Yxqwh6ZGbDA/berrysync-launching-opera-mini-xor.html" title="BerrySync: Launching Opera mini xor BlackBerry's Native Browser" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/06/berrysync-launching-opera-mini-xor.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYNQn8zcSp7ImA9WhJTE00.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-8847091157578608394</id><published>2011-06-15T13:14:00.002-04:00</published><updated>2012-06-21T14:26:33.189-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-21T14:26:33.189-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="firefox" /><category scheme="http://www.blogger.com/atom/ns#" term="sync" /><category scheme="http://www.blogger.com/atom/ns#" term="blackberry" /><category scheme="http://www.blogger.com/atom/ns#" term="project" /><category scheme="http://www.blogger.com/atom/ns#" term="cdot" /><category scheme="http://www.blogger.com/atom/ns#" term="berrysync" /><title>BerrySync: How does Firefox Sync use cryptography</title><content type="html">I have a blog post explaining how to get &lt;a href="http://cwd89.blogspot.com/2011/06/berrysync-firefox-syncs-json-urls.html"&gt;FireFox Sync JSON&lt;/a&gt;, just having that encrypted JSON isn't enough. So what now? &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Sync's Cryptography&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
When we started work, I used&lt;a href="http://bit.ly/fOs5jW"&gt; this blog &lt;/a&gt;to identify and determine how sync was using expecting it's clients to implement cryptography.&lt;br /&gt;
&lt;br /&gt;
However some issues come along with not understanding cryptography and having never had to use it before, Sync updated and simplified their model in &lt;a href="https://wiki.mozilla.org/Firefox_Sync/Releases/1.6"&gt;1.6&lt;/a&gt; and only today with a lot of help from moznet's #sync channel I got a usable understanding of the implementation. Here goes it:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Decrypting the Sync JSON:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
There are a few assumptions in you should expect to handle Sync's data.&lt;br /&gt;
&lt;br /&gt;
All of the keys are symmetric which means, one key that can perform both encryption and decryption. These keys are  256 Bit AESKeys used in a mode that requires Initialization Vectors.&lt;br /&gt;
&lt;br /&gt;
Additionally all of Sync's keys  have a paired hmac and this is used to verify what you're decrypting is  what was encrypted so you should verify each object before decrypting  it.&lt;br /&gt;
&lt;br /&gt;
And lastly all JSON received from the server is Base64 encoded and needs to be  decoded to be used.&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Generate the decryption key's bytes and its hmac bytes from the account's &lt;a href="https://wiki.mozilla.org/Labs/Weave/Developer/StorageFormat#Payload:_crypto.2Fkeys"&gt;sync key&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Create a 256 bit AES Key from the bytes in step 1, along with the Initialization Vector on the crypto/keys object&lt;/li&gt;
&lt;li&gt;Decrypt the crypto/keys cipher with the key made in step 2. This reveals a base64 encoded key and hmac pair&lt;/li&gt;
&lt;li&gt;Assuming you have a users tab collection object&lt;a href="http://cwd89.blogspot.com/2011/06/berrysync-firefox-syncs-json-urls.html"&gt; (from a previous post)&lt;/a&gt;, use the key bytes from step 3. and the specific tab object's Initialization  Vector to create another 256 bit AES Key&lt;/li&gt;
&lt;li&gt;Decrypt the tab objects payload with the key made in step 4.&lt;/li&gt;
&lt;li&gt;Profit!&lt;/li&gt;
&lt;/ol&gt;&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/Tx-aKQfhyqA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/8847091157578608394/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/06/berrysync-how-does-firefox-sync-use.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/8847091157578608394?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/8847091157578608394?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/Tx-aKQfhyqA/berrysync-how-does-firefox-sync-use.html" title="BerrySync: How does Firefox Sync use cryptography" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/06/berrysync-how-does-firefox-sync-use.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUHQHk_cSp7ImA9WhJTE00.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-8379730332091639162</id><published>2011-06-15T13:07:00.003-04:00</published><updated>2012-06-21T14:27:11.749-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-21T14:27:11.749-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="firefox" /><category scheme="http://www.blogger.com/atom/ns#" term="sync" /><category scheme="http://www.blogger.com/atom/ns#" term="blackberry" /><category scheme="http://www.blogger.com/atom/ns#" term="project" /><category scheme="http://www.blogger.com/atom/ns#" term="cdot" /><category scheme="http://www.blogger.com/atom/ns#" term="berrysync" /><title>BerrySync: Firefox Sync's JSON urls</title><content type="html">I've been working on BerrySync for just over a month now. We've gotten a lot closer to obtaining usable &lt;a href="https://services.mozilla.com/"&gt;Firefox Sync&lt;/a&gt; data, just an update: yesterday I implemented Sync's credential expectations, and last week we determined the &lt;a href="https://wiki.mozilla.org/Labs/Weave/Sync/1.1/API"&gt;url semantics&lt;/a&gt; and got a trivial HTTP connector with a work queue implemented on the BlackBerry.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Getting the Sync JSON:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;With the user's account info, create their sync username: &lt;a href="http://bit.ly/mkoeRx"&gt;http://bit.ly/mkoeRx&lt;/a&gt;&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;&amp;nbsp;If it's an old sync account there account name becomes the username&lt;/li&gt;
&lt;li&gt;New accounts are emails, which need:&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;Lowercase it&lt;/li&gt;
&lt;li&gt;SHA1 digest it&lt;/li&gt;
&lt;li&gt;Base32 encode it&lt;/li&gt;
&lt;li&gt;Lowercase it again&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;li&gt;GET request http://auth.services.mozilla.com/user/1.0/syncUsername/node/weave&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;This returns your weave server's address.&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;GET request weaveServer/1.1/syncUsername/storage/crypto/keys&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Example Url from &lt;a href="https://wiki.mozilla.org/Labs/Weave/Sync/1.1/API"&gt;Sync 1.1 API&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;All weave node requests will require your syncUsername and account password for authentication &lt;/li&gt;
&lt;li&gt;This returns a JSON specified &lt;a href="https://wiki.mozilla.org/Labs/Weave/Developer/StorageFormat#Payload:_crypto.2Fkeys"&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ol&gt;
So I have this implemented in our application BerrySync, currently it's encrusted with RIM libraries and not a library itself, just a workable class that contains a stack of url's which a worker thread plows through returning the results asynchronously.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Giving Back&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I intend to package this HTTP connector built in Java as an open source library, hopefully it will contribute to Firefox Sync's third party ecosystem!&lt;b&gt;&lt;/b&gt;&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/MCCEr3PFbzo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/8379730332091639162/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/06/berrysync-firefox-syncs-json-urls.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/8379730332091639162?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/8379730332091639162?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/MCCEr3PFbzo/berrysync-firefox-syncs-json-urls.html" title="BerrySync: Firefox Sync's JSON urls" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/06/berrysync-firefox-syncs-json-urls.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUBRX04fCp7ImA9WhJTE00.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-1614506215844047481</id><published>2011-06-07T14:43:00.001-04:00</published><updated>2012-06-21T14:27:34.334-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-21T14:27:34.334-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="unittest" /><category scheme="http://www.blogger.com/atom/ns#" term="sync" /><category scheme="http://www.blogger.com/atom/ns#" term="blackberry" /><category scheme="http://www.blogger.com/atom/ns#" term="test" /><category scheme="http://www.blogger.com/atom/ns#" term="project" /><category scheme="http://www.blogger.com/atom/ns#" term="cdot" /><category scheme="http://www.blogger.com/atom/ns#" term="berrysync" /><title>BerrySync - Unit Testing in Blackberry Apps</title><content type="html">&lt;b&gt;Pains&lt;/b&gt; &lt;br /&gt;
Building Berrysync from the ground up hasn't come without it's challenges. Most notably as of recent has been our incorporation of test driven development, for many people that brings &lt;a href="http://www.junit.org/"&gt;JUnit &lt;/a&gt;to mind. To my surprise JUnit without including its dependencies will not natively run on the BlackBerry Java core, and even more interesting is the fact that JUnit comes bundled in the BlackBerry Developer Eclipse!&lt;br /&gt;
&lt;br /&gt;
Thanks to some googling and blog posts lost in my browser history I came across this awesome tool called &lt;a href="http://sourceforge.net/projects/b-unittesting/"&gt;BUnit&lt;/a&gt;. It seems to be the only reliable way to unit test inside a BlackBerry app.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Using BUnit in Your Project&lt;/b&gt;&lt;br /&gt;
You'll need to define an alternate entry point to your application and add some logic to the App's entry point, here are the steps:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt; In BlackBerry_App_Descriptor.xml&lt;b&gt; -&amp;gt; &lt;/b&gt;click &lt;i&gt;Alternate entry points&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;i&gt;add&lt;/i&gt; provide a name, click &lt;i&gt;ok&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Click on what you just added and provide an &lt;i&gt;Application Argument &lt;/i&gt;and/or an icon&lt;/li&gt;
&lt;li&gt;Open MyApp, and provide this logic (eg. &lt;i&gt;Application Argument&lt;/i&gt; = bunit)&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void main(String[] args){
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (args != null &amp;amp;&amp;amp; args.length &amp;gt; 0 &amp;amp;&amp;amp; args[0].equals("bunit")){
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TestRunner tester = new TestRunner();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tester.enterEventDispatcher();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }else{
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyApp theApp = new MyApp();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; theApp.enterEventDispatcher();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Two entry points allows this, where BerrySync is our application and B-unit is the unit tester&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/-4cnCpKwC4Xg/Te5wvcGAovI/AAAAAAAAABs/dLoDrF-dAKs/s1600/Two_Entry_points.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-4cnCpKwC4Xg/Te5wvcGAovI/AAAAAAAAABs/dLoDrF-dAKs/s320/Two_Entry_points.png" width="161" /&gt;&lt;/a&gt;&lt;b&gt;Tips On Usage&lt;/b&gt;&lt;br /&gt;
Now I assume the limitations of BUnit and the major benefits of JUnit come from java Reflection. Which you guessed it, isn't included in the BlackBerry JRE. Sooo much to my disappointment in each test suite you need to manually specify the number of tests, and later on invoke them in a switch. On top of that you'll need to add your suites to runner manually.&lt;br /&gt;
&lt;br /&gt;
A snippet of my test suite: &lt;a href="http://pastebin.com/mq9QzpkW"&gt;http://pastebin.com/mq9QzpkW&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I also had to add a few Assertion functions, graciously BUnit provided the file to place them in.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;assertEquals(String test, byte[] expected, byte[] actual)
assertNotEquals(String test, byte[] expected, byte[] actual)
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/-rYMwRagfrL0/Te5wxicmCgI/AAAAAAAAABw/6yOxvj7WkR8/s1600/BUnit_running.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-rYMwRagfrL0/Te5wxicmCgI/AAAAAAAAABw/6yOxvj7WkR8/s320/BUnit_running.png" width="162" /&gt;&lt;/a&gt;here they are too! &lt;a href="http://pastebin.com/H3R69XC6"&gt;http://pastebin.com/H3R69XC6&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;ScreenShot&lt;/b&gt;&lt;br /&gt;
&amp;lt;- Berrysync's unit tester running as is&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/9wBCEPNGXB4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/1614506215844047481/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/06/berrysync-unit-testing-in-blackberry.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/1614506215844047481?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/1614506215844047481?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/9wBCEPNGXB4/berrysync-unit-testing-in-blackberry.html" title="BerrySync - Unit Testing in Blackberry Apps" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-4cnCpKwC4Xg/Te5wvcGAovI/AAAAAAAAABs/dLoDrF-dAKs/s72-c/Two_Entry_points.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/06/berrysync-unit-testing-in-blackberry.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUDSXg-eip7ImA9WhJTE00.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-216189358728541170</id><published>2011-05-13T16:54:00.001-04:00</published><updated>2012-06-21T14:27:58.652-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-21T14:27:58.652-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="firefox" /><category scheme="http://www.blogger.com/atom/ns#" term="sync" /><category scheme="http://www.blogger.com/atom/ns#" term="blackberry" /><category scheme="http://www.blogger.com/atom/ns#" term="project" /><category scheme="http://www.blogger.com/atom/ns#" term="cdot" /><category scheme="http://www.blogger.com/atom/ns#" term="berrysync" /><title>BerrySync - Fifefox sync crypto, a step closer</title><content type="html">&lt;b&gt;BerrySync&lt;/b&gt;&lt;br /&gt;
To make a BerrySync compatible with &lt;a href="https://addons.mozilla.org/en-us/firefox/addon/firefox-sync/"&gt;FireFox Sync &lt;/a&gt;we need understand how sync connects to its servers. There are two challenges for me so far. First I opted to emulate sync's encryption steps&amp;nbsp; on the BlackBerry in Java, next I need to make a make a custom sync server and start talking to it before I start talking to the real thing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;FireFox Sync Crypto&lt;/b&gt;&lt;br /&gt;
So in order to even make sense of the data I'm getting back from the Sync Server I need to know what to do with it! I'm going to break down how I've understand Sync is expecting this to be handled.&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;When you sign up Sync makes a RSA 2048 bit key pair, that's whats used to encrypt during travel, I've been doing my reading &lt;a href="https://wiki.mozilla.org/Services/Sync"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Decrypting&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;Decrypt Weave Object with your private key&lt;/li&gt;
&lt;li&gt;Decode Base64 Weave payload to binary &lt;/li&gt;
&lt;li&gt;Decrypt payload binary with AES 256 bit key and 16 bit Initialization Vector, these are found in the Weave object&lt;/li&gt;
&lt;li&gt;Profit from here&lt;/li&gt;
&lt;/ol&gt;
&lt;/ul&gt;
Normally you would use Sync's client JavaScript to take care of this, however I attempted to port this to Java on the BlackBerry. Check out my encryption equivalent attempt of &lt;a href="http://pastebin.com/ZW5Zk9bV"&gt;steps 2 and 3 here&lt;/a&gt;.Thankfully these algorithms are standardized and RIM's crypto library has had exactly what I've needed to far. I still need to confirm how BerrySync is going to handle the RSA keypair.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;FireFox Sync Server&lt;/b&gt;&lt;br /&gt;
I'm at the point where I should start looking for my own custom firefox sync server, Seneca may have one. I was also going to set up one on my laptop this weekend using these:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://tobyelliott.wordpress.com/2009/09/11/weave-minimal-server/"&gt;http://tobyelliott.wordpress.com/2009/09/11/weave-minimal-server/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://annasob.wordpress.com/2011/02/07/sync-server/%20"&gt;http://annasob.wordpress.com/2011/02/07/sync-server/ &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
So basically my goal for next Friday is to have access to a custom FireFox Sync Server and to iron out how BerrySync is going to handle the RSA key pairs. I want to be able to talk to a production Firefox server during the coming week!&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/38Z_nmVV7tY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/216189358728541170/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/05/berrysync-fifefox-sync-crypto-step.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/216189358728541170?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/216189358728541170?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/38Z_nmVV7tY/berrysync-fifefox-sync-crypto-step.html" title="BerrySync - Fifefox sync crypto, a step closer" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/05/berrysync-fifefox-sync-crypto-step.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUNSX4zeyp7ImA9WhJTE00.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-7587526436671976957</id><published>2011-05-06T16:31:00.000-04:00</published><updated>2012-06-21T14:28:18.083-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-21T14:28:18.083-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="firefox" /><category scheme="http://www.blogger.com/atom/ns#" term="blackberry" /><category scheme="http://www.blogger.com/atom/ns#" term="project" /><category scheme="http://www.blogger.com/atom/ns#" term="cdot" /><category scheme="http://www.blogger.com/atom/ns#" term="berrysync" /><title>hello cdot! - BerrySync</title><content type="html">My first week at CDOT, Seneca's Center for Developing Open Technology is coming to a close and there have been some wicked developments.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The Atmosphere&lt;/b&gt;&lt;br /&gt;
I'm really enjoying working here as a summer student. The orientation was welcoming, bundling in breakfast and lunch. That day all of the summer researchers were gathered together and given the history of &lt;a href="http://zenit.senecac.on.ca/%7Echris.tyler/planet/"&gt;CDOT&lt;/a&gt; as well as their expectations for the summer.&lt;br /&gt;
&lt;b&gt; &lt;/b&gt;&lt;br /&gt;
Respective project heads gave brief speeches about what their teams would be working on this summer, my project in particular ill mention farther down.&lt;br /&gt;
&lt;br /&gt;
Every morning teams meet up for scrums where you briefly talk about what you didn't yesterday and your goals for today. I'm really enjoying these, it helps everyone keep in touch with the cool projects going on here and it also allows people to offer advice before it even hits IRC.&lt;br /&gt;
&lt;br /&gt;
Speaking of IRC, we are all expected to be there. The name of the game is, be involved. Your knowledge can help people and the knowledge of your community is at your figure tips.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;My Project&lt;/b&gt;&lt;br /&gt;
Creatively named &lt;a href="http://zenit.senecac.on.ca/wiki/index.php/BerrySync"&gt;BerrySync &lt;/a&gt;the short description is that, we aim to develop a enterprise product roughly equivalent to &lt;a href="http://www.mozilla.com/en-US/mobile/home/"&gt;Firefox Home&lt;/a&gt; for the iPhone, except for the BlackBerry.We aren't promising a copy of the feature set nor are we limiting ourselves to Home's feature set, Home is a guideline. Similarly were investigating the interaction of &lt;a href="https://addons.mozilla.org/en-us/firefox/addon/firefox-sync/"&gt;FireFox Sync&lt;/a&gt; for integration and perhaps in the near future customization.&lt;br /&gt;
&lt;br /&gt;
So this first week, I've been setting up my environment and figuring out what I need research in depth. I just got my computer and my dual boot is installing as we speak. I'll post again with updates on my current task / demo / I'm a learner by doing.&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/KBAAvlMZHCk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/7587526436671976957/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/05/hello-cdot-berrysync.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/7587526436671976957?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/7587526436671976957?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/KBAAvlMZHCk/hello-cdot-berrysync.html" title="hello cdot! - BerrySync" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/05/hello-cdot-berrysync.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcBQHg8fyp7ImA9WhZQFUo.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-6966931823943855074</id><published>2011-04-22T22:06:00.001-04:00</published><updated>2011-04-23T12:44:11.677-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-23T12:44:11.677-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="project" /><title>Sundae - 1.0 - XB-pointstream and other unfinished business</title><content type="html">My usual rant: Sundae is a canvas reference tester library built in Javascript. My goal is get &lt;a href="http://processingjs.org/"&gt;Processing.js&lt;/a&gt;,&lt;a href="http://www.c3dl.org/"&gt; c3dl&lt;/a&gt;, and &lt;a href="https://github.com/asalga/XB-PointStream"&gt;XB-pointstream&lt;/a&gt; to use this tool, but that's just the start who knows what else.&lt;br /&gt;
&lt;br /&gt;
Since we only care about links, eat your hearts out.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/cwdesautels/sundae.js/tree/1.0"&gt;Download 1.0 Here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://matrix.senecac.on.ca/%7Ecwdesautels/sundae/index.html"&gt;See it in action Here with XB-Pointstream!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Xxi3ITXDl_k/TbIvBiJGO9I/AAAAAAAAABg/SMKfrAcfqrU/s1600/sundae_1.0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://1.bp.blogspot.com/-Xxi3ITXDl_k/TbIvBiJGO9I/AAAAAAAAABg/SMKfrAcfqrU/s320/sundae_1.0.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Sundae&lt;/b&gt;&lt;br /&gt;
&lt;b&gt; &lt;/b&gt;&lt;br /&gt;
1.0 is done I guess I can breathe a sigh of relief, not.&lt;br /&gt;
&lt;br /&gt;
In my last post I went on and on about this thread pool manager, it wasn't until yesterday I found a major bug, where finished workers were never set to available. The answer was more closures! I needed to keep a local reference of itself, within its onmessage, &lt;a href="http://pastebin.com/pDcmLW2H"&gt;see it here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;XB-PointStream&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
After a few stressful hours before I moved out of my house @ York university. &lt;a href="http://asalga.wordpress.com/"&gt;Andor Salga&lt;/a&gt; and I were hard at work debugging &lt;a href="https://github.com/cwdesautels/sundae.js/blob/master/sundae.js"&gt;Sundae&lt;/a&gt; to work with &lt;a href="https://github.com/asalga/XB-PointStream/tree/staged"&gt;XB-PointStream&lt;/a&gt;. Eventually there was a light at the end of the tunnel, things clicked, my threads lined up and THAT round of bugs was ironed out. Library goal 1, reached. 2 more at Seneca to go.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Whats new with Sundae?&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Error messages displayed in console on malformed test cases&lt;/li&gt;
&lt;li&gt;Thread pooler actually works now!&lt;/li&gt;
&lt;li&gt;Added known fail, counts as a pass&lt;/li&gt;
&lt;li&gt;Added a progress counter&lt;/li&gt;
&lt;li&gt;Added some pretty buttons on the page&lt;/li&gt;
&lt;li&gt;Blurring doesn't cause strange artifacting anymore&lt;/li&gt;
&lt;li&gt;3D canvases compared properly, this one was a doozy&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;OSD700 comes to an end&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
This has been my favourite and most challenging course to date, the concept of open source technology to a student was so foreign. We're encouraged to take what others have done before us and put our spin on it, in a world where you hear the doom and gloom of academic dishonesty every semester. &lt;a href="http://vocamus.net/dave/"&gt;David Humphrey&lt;/a&gt;, Seneca's resident open source teaching bad-ass was inspirational and insightful as ever throughout my experiences in this course. I don't think I'll ever part from open source development after being introduced to the its world. Even if programming stops being a career it's now always a hobby.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Contribute Input&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://sundae.lighthouseapp.com/projects/68207-sundaejs/overview"&gt;http://sundae.lighthouseapp.com/projects/68207-sundaejs/overview&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt; &lt;a href="https://github.com/cwdesautels/sundae.js"&gt;https://github.com/cwdesautels/sundae.js&lt;/a&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/VBHkbtRNMtA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/6966931823943855074/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/04/sundae-10-xb-pointstream-and-other.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/6966931823943855074?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/6966931823943855074?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/VBHkbtRNMtA/sundae-10-xb-pointstream-and-other.html" title="Sundae - 1.0 - XB-pointstream and other unfinished business" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-Xxi3ITXDl_k/TbIvBiJGO9I/AAAAAAAAABg/SMKfrAcfqrU/s72-c/sundae_1.0.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/04/sundae-10-xb-pointstream-and-other.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUAQH85eip7ImA9WhZQEUs.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-3496185492327361696</id><published>2011-04-18T18:02:00.003-04:00</published><updated>2011-04-18T18:04:01.122-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-18T18:04:01.122-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="project" /><title>0.9 - Sundae - Gets buff - threadpool</title><content type="html">For anyone who doesn't know Sundae, is a canvas reference tester library built in Javascript. My goal is get &lt;a href="http://processingjs.org/"&gt;Processing.js&lt;/a&gt;,&lt;a href="http://www.c3dl.org/"&gt; c3dl&lt;/a&gt;, and &lt;a href="https://github.com/asalga/XB-PointStream"&gt;XB-pointstream&lt;/a&gt; to use this tool.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Skip the blog:&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;See it in action if you have html5 compliant browser&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://matrix.senecac.on.ca/%7Ecwdesautels/sundae/index.html"&gt;http://matrix.senecac.on.ca/~cwdesautels/sundae/index.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;b&gt;&lt;a href="https://github.com/cwdesautels/sundae.js/tree/0.9"&gt;Get 0.9 Here! &lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-D-1zh5o2ivQ/TaytSCXT9rI/AAAAAAAAABc/Ho0vON-gHWg/s1600/Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-D-1zh5o2ivQ/TaytSCXT9rI/AAAAAAAAABc/Ho0vON-gHWg/s320/Screenshot.png" width="228" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The bulk&lt;/b&gt;&lt;br /&gt;
After my initial &lt;a href="http://cwd89.blogspot.com/2011/04/07-and-08-dual-release-now-with-moar.html"&gt;0.8 release&lt;/a&gt; where I dabbled into the world of web workers, Sundae still had massive performance hogs.&lt;br /&gt;
&lt;br /&gt;
What did I do about it? I went on IRC and spoke to the community! &lt;a href="http://vocamus.net/dave/"&gt;David Humphrey&lt;/a&gt; provided some interesting insights on my issue. My problem was that although I was now using web workers my code was STILL synchronous. The solution became, remodel the workers to grab work items from a queue.&lt;br /&gt;
&lt;br /&gt;
So including edge cases, my workflow became:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;queue.push called, is there a available worker?&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;Yes -&amp;gt; use it&lt;/li&gt;
&lt;li&gt;No -&amp;gt; add to queue&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;worker.onmessage, are there more items to work on?&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;Yes -&amp;gt; do it&lt;/li&gt;
&lt;li&gt;No -&amp;gt; make worker available&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;I so happy when not only did this code work, the runtime when down to 1s from 5s on my calibration tests on a Quad core machine! Although on my much slower aging laptop the performance gain was less dramatic still halving the runtime.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://pastebin.com/0ztJ0EeT"&gt;&lt;b&gt;Get the threadpool&lt;/b&gt; &lt;b&gt;code here&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;
and use it like this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;_queue.push(stuffForWorker);
&lt;/pre&gt;&lt;br /&gt;
But from the pastebin you'll need to change onnmessage &lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;onmessage = function(data){
...Does something meaningful with your returned data...
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Help me out!&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://sundae.lighthouseapp.com/projects/68207-sundaejs/overview"&gt;http://sundae.lighthouseapp.com/projects/68207-sundaejs/overview&lt;/a&gt;&lt;b&gt; &lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/DxjCOsJxkPk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/3496185492327361696/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/04/09-sundae-gets-buff-threadpool.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/3496185492327361696?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/3496185492327361696?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/DxjCOsJxkPk/09-sundae-gets-buff-threadpool.html" title="0.9 - Sundae - Gets buff - threadpool" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-D-1zh5o2ivQ/TaytSCXT9rI/AAAAAAAAABc/Ho0vON-gHWg/s72-c/Screenshot.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/04/09-sundae-gets-buff-threadpool.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEENRnsycCp7ImA9WhZRFEQ.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-5743444113490702100</id><published>2011-04-11T00:38:00.000-04:00</published><updated>2011-04-11T00:38:17.598-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-11T00:38:17.598-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="project" /><title>0.7 and 0.8 - Dual release, now with moar web workers</title><content type="html">For anyone who doesn't know Sundae, is a canvas reference tester library built in Javascript. My goal is get &lt;a href="http://processingjs.org/"&gt;Processing.js&lt;/a&gt;,&lt;a href="http://www.c3dl.org/"&gt; c3dl&lt;/a&gt;, and &lt;a href="https://github.com/asalga/XB-PointStream"&gt;XB-pointstream&lt;/a&gt; to use this tool. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What's new?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Blurring is. Blurring is the basically smudging the image, the reason any tester needs this is because colours will render differently on different browsers. So if you took a reference screen shot and compare it to a real time render often times during an exact pixel comparison there will be slight variations. So in order to remove these useless errors I added two things. I stole all of my blurring logic from the Kraken javascript benchmarker &lt;a href="http://krakenbenchmark.mozilla.org/explanations/gaussian-blur.html"&gt;here&lt;/a&gt;. Then I happily thrifted through the code that birthed Sundae, the &lt;a href="http://krakenbenchmark.mozilla.org/explanations/gaussian-blur.html"&gt;Pjs ref tester&lt;/a&gt; and took their comparison logic.&lt;br /&gt;
&lt;br /&gt;
So in short what's new is that a majority of the heavy lifting and work in the libraries engine is done. Now that compare and blurring are working I can take a sigh of relief.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The Unsung Hero's&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Finally this project has web workers, why are they good? because it's the equivalent of putting something on the back burning and forgetting about it until you remember and its perfectly cooked the next time you look at it. Having the ability to throw the work into a background process is great. The best part is you don't lose control of your browser.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;Using web workers is pretty simple to boot, I setup a worker pool in my main thread and each worker roughly looks like this.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&amp;nbsp;var worker = new Worker("blah.js");
worker.onmessage = function (event) {
...
};
worker.postMessage("meaningful data"); 
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Meanwhile in blah.js&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;onmessage = function (event) {
event.data //the data throw in during mains postmessage 
...
postMessage("throwing back response"); 
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So main posts data to the worker, the worker gets it in it's onmessage and the original data is accessed by looking at event.data. When the worker is done is throws data back to main by calling postMessage, where the onmessage is main catches it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Really Unsung Hero's&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The other features I put in for these releases such as finally making the test tags working. Marking the end in an era where I had options on the front page of index.html that never did anything. Additionally getting to features that my one user so far wanted! Notes per test to display additional text during run time. Lastly, this option I spent a better part of Friday afternoon hacking together. Allowing the user to see the blurred pixel results on their original canvases as seen below.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-hjICtnEUGBc/TaKEjMOOBaI/AAAAAAAAABY/vI7zKWL29lY/s1600/Untitled.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-hjICtnEUGBc/TaKEjMOOBaI/AAAAAAAAABY/vI7zKWL29lY/s320/Untitled.png" width="189" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Some Problems&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I need help!&lt;b&gt; &lt;/b&gt;Look at my thread pool in &lt;a href="https://github.com/cwdesautels/sundae.js/blob/develop/sundae.js#L20"&gt;Sundae.js&lt;b&gt;&amp;nbsp; &lt;/b&gt;&lt;/a&gt;I want each blurring to use its own worker thread. Right now the blur worker is blurring both canvases. I cannot not figure out how to get both of these threads running asynchronously and actually blurring the right canvases. If anyone has design advice drop a bug at &lt;a href="http://sundae.lighthouseapp.com/projects/68207-sundaejs/overview"&gt;lighthouse&lt;/a&gt; or comment below.&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/iHI5bsV5fCs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/5743444113490702100/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/04/07-and-08-dual-release-now-with-moar.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/5743444113490702100?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/5743444113490702100?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/iHI5bsV5fCs/07-and-08-dual-release-now-with-moar.html" title="0.7 and 0.8 - Dual release, now with moar web workers" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-hjICtnEUGBc/TaKEjMOOBaI/AAAAAAAAABY/vI7zKWL29lY/s72-c/Untitled.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/04/07-and-08-dual-release-now-with-moar.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUHSX84cCp7ImA9WhZRE08.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-4358678280796261365</id><published>2011-04-08T19:27:00.003-04:00</published><updated>2011-04-09T00:10:38.138-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-09T00:10:38.138-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="project" /><title>ECL500 - Drawsy</title><content type="html">&lt;a href="http://dseifried.wordpress.com/2011/04/08/ecl500-blackberry-app-drawsy/"&gt;Dave Seifried&lt;/a&gt; and I created a simple paint application for the Blackberry. We made this application to be our culminating project in ECL500, the purpose of the course was to explore Eclipse as a development environment and ultimately use its tools to make something cool!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The Problems&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt; &lt;br /&gt;
An on going problem is combating the low frame rate environment. Since our draw function is called every frame often times a long sweeping motion leaves gaps because the motion took place between screen refreshes. Unfortunately this problem only gets worst the deeper our &lt;a href="http://www.blackberry.com/developers/docs/4.7.0api/net/rim/device/api/ui/UiApplication.html"&gt;stack depth&lt;/a&gt; gets.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The Evolution&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt; &lt;br /&gt;
Originally we were going to port &lt;a href="http://processing.org/"&gt;Processing &lt;/a&gt;to use RIM's awt implementation this proved to be quite the hassle, then we thought of using &lt;a href="http://processingjs.org/"&gt;Processing.js&lt;/a&gt;, which was the reason I made &lt;a href="http://cwd89.blogspot.com/2011/03/pjs-fun-playing-with-demo.html"&gt;this demo&lt;/a&gt; but the in ability to open local .html files and not wanting to rely on a network connection cut that dream short.&lt;br /&gt;
&lt;br /&gt;
Either way here's your exclusive sneak peak at our demo. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://1.gvt0.com/vi/YH7tTBwM1fE/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/YH7tTBwM1fE&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266" src="http://www.youtube.com/v/YH7tTBwM1fE&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Optimizations in the Works &lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Swipe the draw from the previous screen to the current&lt;/li&gt;
&lt;li&gt;Draw on a back buffer&lt;/li&gt;
&lt;li&gt;Better control of the screen stack&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/fdvfUbLiXn0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/4358678280796261365/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/04/ecl500-drawsy.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/4358678280796261365?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/4358678280796261365?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/fdvfUbLiXn0/ecl500-drawsy.html" title="ECL500 - Drawsy" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/04/ecl500-drawsy.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08GQXoyfSp7ImA9WhZSEkQ.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-5902987560105336327</id><published>2011-03-27T23:50:00.003-04:00</published><updated>2011-03-28T01:57:00.495-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-28T01:57:00.495-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="project" /><title>pjs - fun - playing with a demo</title><content type="html">&lt;b&gt;The Demo&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
A few days ago, David Sefried linked me this &lt;a href="http://curransoft.com/code/2011/03/hello-ipad/"&gt;demo.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The Hack&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Because I don't own an IPad I ported over the demo to use with my mouse and my shiny new browser, Firefox 4!&lt;br /&gt;
&lt;br /&gt;
I simply changed the touch event handling to mouse events, and where the multiple touch aspect became relevant I was forced to omit it. The code is available &lt;a href="https://github.com/cwdesautels/pjs-fun"&gt;here&lt;/a&gt; on github. Just like the demo I used minified Processing.js, and both rewriting the code and fully understanding it was a breeze.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;(function (w, undef) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; var c, p, t, touches, go, 
&amp;nbsp;&amp;nbsp;&amp;nbsp; resize = function () {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p.size(w.innerWidth, w.innerHeight);
&amp;nbsp;&amp;nbsp;&amp;nbsp; };
&amp;nbsp;&amp;nbsp;&amp;nbsp; w.touchStart = function (e) { touches = e; go = true; };
&amp;nbsp;&amp;nbsp;&amp;nbsp; w.touchMove = function (e) { if (go) touches = e; };
&amp;nbsp;&amp;nbsp;&amp;nbsp; w.touchEnd = function () { touches = go = undef; };
&amp;nbsp;&amp;nbsp;&amp;nbsp; w.orientationChange = resize;
&amp;nbsp;&amp;nbsp;&amp;nbsp; w.onload = function () {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = w.document.getElementById("art");
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p = new Processing(c, function (p) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p.setup = function () { p.background(255, 255, 230); }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p.draw = function () {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (touches != undef) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var r = (Math.sin(t) / 2.0 + 0.5) * 255;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var g = (Math.sin(t * 1.3) / 2.0 + 0.5) * 255;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var b = (Math.sin(t * 1.4) / 2.0 + 0.5) * 255;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p.noStroke();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p.fill(r, g, b);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t += 0.1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p.ellipse(touches.pageX, touches.pageY, 300, 300);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resize();
&amp;nbsp;&amp;nbsp;&amp;nbsp; };
})(window);
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;In Action&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
Click inside the canvas, and move your mouse around. The math that I do not understand takes care of the colour changing.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-xQPRgnTOXnE/TZAD53Vu3fI/AAAAAAAAABQ/NE3yRuxQHDI/s1600/Untitled.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://1.bp.blogspot.com/-xQPRgnTOXnE/TZAD53Vu3fI/AAAAAAAAABQ/NE3yRuxQHDI/s400/Untitled.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;The Link&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Here's the link to the hosted code, if you didn't read it off the URL.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&amp;nbsp;&lt;a href="http://matrix.senecac.on.ca/%7Ecwdesautels/pjs/drawer.html"&gt;http://matrix.senecac.on.ca/~cwdesautels/pjs/drawer.html &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;Whats Next&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt; &lt;br /&gt;
I attempted to convert the code to generate a Mandelbrot fractals instead of just ellipses'. After no success so far I opted to upload working code. Thanks to Pomax in Pjs' irc channel for this link&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://processing.org/learning/topics/mandelbrot.html"&gt;http://processing.org/learning/topics/mandelbrot.html &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/7gCVhyEmE5A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/5902987560105336327/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/03/pjs-fun-playing-with-demo.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/5902987560105336327?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/5902987560105336327?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/7gCVhyEmE5A/pjs-fun-playing-with-demo.html" title="pjs - fun - playing with a demo" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-xQPRgnTOXnE/TZAD53Vu3fI/AAAAAAAAABQ/NE3yRuxQHDI/s72-c/Untitled.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/03/pjs-fun-playing-with-demo.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEAQXg8fyp7ImA9Wx9aFEo.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-2170555336989035110</id><published>2011-03-07T01:00:00.001-05:00</published><updated>2011-03-07T01:00:40.677-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-07T01:00:40.677-05:00</app:edited><title>ClassNamer</title><content type="html">A change of pace from the usual javascript talk. A friend linked me this the other day, I thought it was genius at the time and its hilarity is now also&amp;nbsp;heightened because of the fact that I didn't sleep last night thanks to work.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Behold:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;a href="http://www.classnamer.com/"&gt;http://www.classnamer.com/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Can't think of a class name sometimes? This is the link for YOU. it artfully selects arbitrary programming terms and commonly used words to make the most descriptive and utterly useless class names ever! I love it. This will surely benefit the community.&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/GtwUQvDh-qY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/2170555336989035110/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/03/classnamer.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/2170555336989035110?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/2170555336989035110?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/GtwUQvDh-qY/classnamer.html" title="ClassNamer" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/03/classnamer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEMRHg5fSp7ImA9Wx9aFEo.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-3369045075744589546</id><published>2011-03-07T00:41:00.002-05:00</published><updated>2011-03-07T00:44:45.625-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-07T00:44:45.625-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="project" /><title>Sundae.js - 0.6 release</title><content type="html">It seems like just last week I was coming at you with a release, well, I was. Just a little bit of recap.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What is it?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Sundae is a Canvas reference tester, for more information see my previous &lt;a href="http://cwd89.blogspot.com/2011/02/sundaejs-05-release.html"&gt;release&lt;/a&gt;. I want to provide the power and functionality for you to easily compare test cases of your Canvas using library! In preparation for this release I hosted the code on a web server graciously provided by Seneca to each student. To use this you need a WebGL compatible and enabled browser. Such as my personal favourite, Firefox's &lt;a href="http://nightly.mozilla.org/"&gt;nightly&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt; Check it out&lt;/b&gt;&lt;br /&gt;
&lt;div&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;After you've obtained a browser got to &lt;a href="http://matrix.senecac.on.ca/~cwdesautels/sundae/index.html"&gt;my hosted page&lt;/a&gt;. If getting a whole new browser is a tall order, don't fret check out this screenshot!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://farm6.static.flickr.com/5260/5504757681_9156e028c8_b.jpg"&gt;&lt;img border="0" height="320" src="http://farm6.static.flickr.com/5260/5504757681_9156e028c8_b.jpg" width="299" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Encouraging work:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Check out&lt;a href="http://asalga.wordpress.com/2011/03/02/hacking-sundae-js/"&gt; this blog&lt;/a&gt; for a sample of what type of library would use this testing framework. Andor has since helped by submitting tickets to improve the framework.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Available here:&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/cwdesautels/sundae.js/tree/0.6"&gt;sundae.js 0.6&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;How can you help?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt; Have a feature to add? Found a bug? Submit tickets at:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://sundae.lighthouseapp.com/projects/68207-sundaejs/overview"&gt;Sundae.js Lighthouse&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;ul style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 1.4; list-style-image: initial; list-style-position: initial; list-style-type: disc; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 2.5em; padding-right: 2.5em; padding-top: 0px;"&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/KS6LFTriPuE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/3369045075744589546/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/03/sundaejs-06-release.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/3369045075744589546?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/3369045075744589546?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/KS6LFTriPuE/sundaejs-06-release.html" title="Sundae.js - 0.6 release" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm6.static.flickr.com/5260/5504757681_9156e028c8_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/03/sundaejs-06-release.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0AARnk8fSp7ImA9Wx9bFUQ.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-1387463202494991631</id><published>2011-02-24T18:51:00.003-05:00</published><updated>2011-02-24T18:55:47.775-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-24T18:55:47.775-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="project" /><title>Sundae.js - 0.5 release</title><content type="html">Another installation of the budding Canvas reference tester is out!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What is it?&lt;/b&gt;&lt;br /&gt;
Sundae is framework built to provide a visual pixel difference of rendered images in Html5 canvases. The focus was on providing the functionality to load an known good render result and a render result from your library.&lt;br /&gt;
&lt;br /&gt;
That way when changes are made to your rendering library you can see what the results are. The results come in the form of an exact pixel comparison, plus everything is rendered beside each other for easy visual discernment.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Available here:&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/cwdesautels/sundae.js/tree/0.5"&gt;sundae.js 0.5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;b&gt;How can you help?&lt;/b&gt;&lt;br /&gt;
Have a feature to add? Found a bug? Submit tickets at:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://sundae.lighthouseapp.com/projects/68207-sundaejs/overview"&gt;Sundae.js Lighthouse&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Changes in 0.5:&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;asynchronous reference canvas filling&lt;/li&gt;
&lt;li&gt;JSON loading&lt;/li&gt;
&lt;li&gt;Script loading&lt;/li&gt;
&lt;li&gt;Basic use test suite&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Changes to come:&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Asynchronous library loading&lt;/li&gt;
&lt;li&gt;No loading of duplicate library URL's&lt;/li&gt;
&lt;li&gt;Updated API&lt;/li&gt;
&lt;li&gt;Pixel Blurring&lt;/li&gt;
&lt;li&gt;Less rigid test case requirements&lt;/li&gt;
&lt;li&gt;Calibration test suite&lt;/li&gt;
&lt;li&gt;Worker thread support&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/xqmRLxU3uLo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/1387463202494991631/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/02/sundaejs-05-release.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/1387463202494991631?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/1387463202494991631?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/xqmRLxU3uLo/sundaejs-05-release.html" title="Sundae.js - 0.5 release" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/02/sundaejs-05-release.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EEQnkzeyp7ImA9Wx9UE0w.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-1589648686760504869</id><published>2011-02-10T00:26:00.000-05:00</published><updated>2011-02-10T00:26:43.783-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-10T00:26:43.783-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="project" /><title>Sundae.js - getting JSON files</title><content type="html">As with my previous post,&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://github.com/cwdesautels/sundae.js"&gt;Sundae.js&lt;/a&gt;&amp;nbsp;uses a &lt;a href="http://www.json.org/"&gt;JSON&lt;/a&gt; file to control its test cases. I define a rigid API with the expected&amp;nbsp;test case&amp;nbsp;format, and a user fills out a JSON file&amp;nbsp;at least&amp;nbsp;suppling the required field. A sample of my valid JSON file can be found &lt;a href="https://github.com/cwdesautels/sundae.js/blob/master/resources/tests.json"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
So in order to get a JSON file, or the contents of any file as a string you need to create a &lt;a href="https://developer.mozilla.org/en/xmlhttprequest"&gt;XMLHttpRequest()&lt;/a&gt; object. The &lt;a href="https://developer.mozilla.org/en/xmlhttprequest"&gt;Mozilla MDC&lt;/a&gt; provides detailed&amp;nbsp;explanations&amp;nbsp;of its attributes and expected uses and cautions.&lt;br /&gt;
&lt;br /&gt;
Here are the steps I followed to get this done for &lt;a href="https://github.com/cwdesautels/sundae.js/blob/develop/sundae.js#L128"&gt;Sundae.js&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Make a XMLHttpRequest() object.&lt;/li&gt;
&lt;li&gt;Set its open parameters&lt;/li&gt;
&lt;li&gt;Set its onload()&lt;/li&gt;
&lt;ol&gt;&lt;li&gt;Very handy for managing callback functions&lt;/li&gt;
&lt;li&gt;Also handy for using the objects responseText&lt;/li&gt;
&lt;/ol&gt;&lt;li&gt;Set its send to null&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;As usual here is a &lt;a href="http://pastebin.com/pX8vgg8X"&gt;pastebin of getJSON&lt;/a&gt;, and there you have it. Alternatively if you aren't using valid JSON for JSON.parse(responseText) of your file, you should use eval("(" + responseText + ")").&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/bKAurAEtIxs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/1589648686760504869/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/02/sundaejs-getting-json-files.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/1589648686760504869?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/1589648686760504869?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/bKAurAEtIxs/sundaejs-getting-json-files.html" title="Sundae.js - getting JSON files" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/02/sundaejs-getting-json-files.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMBSXs9eSp7ImA9Wx9UE0w.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-5958082001826664276</id><published>2011-02-09T23:27:00.002-05:00</published><updated>2011-02-09T23:34:18.561-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-09T23:34:18.561-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="project" /><title>Sundae.js - script tag injecting</title><content type="html">Have you ever wanted to add in a&amp;nbsp;Javascript&amp;nbsp;file to your page? The answer is&amp;nbsp;surprisingly simple. I was faced with this problem in one of my current projects &lt;a href="https://github.com/cwdesautels/sundae.js"&gt;Sundae.js&lt;/a&gt;, however the problem requires a little bit of&amp;nbsp;explanation. Sundae is supposed to render canvases and display them on the page for your visual comparison, it also generates a pixel difference based on exact pixel values.&amp;nbsp;So in order to let your test function render to the browser I needed to dynamically load&amp;nbsp;Javascript&amp;nbsp;libraries and Javascript files containing your test functions.&lt;br /&gt;
&lt;br /&gt;
As with most things Javascript, you can do anything including creating a script element in the parent window. Here's how:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Make your script object&lt;/li&gt;
&lt;li&gt;Set its onload(), very handy for utilizing callback functions&lt;/li&gt;
&lt;li&gt;Set the scripts source&lt;/li&gt;
&lt;li&gt;Attach the script to the document&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;The code I use is&amp;nbsp;available&amp;nbsp;here:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://pastebin.com/45ZfA8cp"&gt;Pastebin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cwdesautels/sundae.js/blob/develop/sundae.js#L145"&gt;Sundae.js' code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;a href="http://pastebin.com/45ZfA8cp"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;The script tag's type is defaulted to Javascript thanks to HTML5. Lastly you can remove the script tag from the window by calling "removeChild(scriptObj);" if your worried about such things.&lt;br /&gt;
&lt;br /&gt;
You're done now! Global attributes from the included Javascript are now within your current global scope.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/NsHnFlVlmM4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/5958082001826664276/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/02/sundaejs-script-tag-injecting.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/5958082001826664276?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/5958082001826664276?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/NsHnFlVlmM4/sundaejs-script-tag-injecting.html" title="Sundae.js - script tag injecting" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/02/sundaejs-script-tag-injecting.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4EQXg-cCp7ImA9Wx9WGU4.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-133251099414477358</id><published>2011-01-25T00:55:00.000-05:00</published><updated>2011-01-25T00:55:00.658-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-25T00:55:00.658-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="project" /><title>0.4 Release: setting up the scaffolding</title><content type="html">The first scheduled release of my project &lt;a href="http://sundae.lighthouseapp.com/projects/68207-sundaejs/milestones"&gt;sundae.js&lt;/a&gt; for OSD700 will be released for Sunday January 30. In case this is your first time reading my blog, &lt;a href="http://zenit.senecac.on.ca/wiki/index.php/User:Cwdesautels/sundae"&gt;my project&lt;/a&gt; is a automated testing framework designed to test WebGL&amp;nbsp;dependencies&amp;nbsp;and functionality in addition to YOUR library using those very WebGL functionalities, that is&lt;a href="https://github.com/cwdesautels/sundae.js"&gt; sundae.js&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;0.4&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;&lt;/span&gt;There are main 3 goals for the first major release of sundae.js:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #0b5394; font-size: large;"&gt;Re-factor framework&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The original outline of the project was largely taken from &lt;a href="http://processingjs.org/"&gt;processing.js&lt;/a&gt;'s developer tools reference tester. However as the scope of my project expanded a similar change had to be reflected in the way the code was designed. In order to facilitate this change the old reference tester has to be ripped into key sections, The test building process has to be clearly defined:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Select the tests&lt;/li&gt;
&lt;li&gt;Load the tests dependencies&lt;/li&gt;
&lt;li&gt;Build test div and canvases&lt;/li&gt;
&lt;li&gt;Load test into canvas&lt;/li&gt;
&lt;li&gt;Load know good into canvas&lt;/li&gt;
&lt;li&gt;Blur both canvases&lt;/li&gt;
&lt;li&gt;Pixel by pixel compare each canvas&lt;/li&gt;
&lt;li&gt;Generate test result into canvas&lt;/li&gt;
&lt;li&gt;Load next test&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Compile results&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
What needs to be learned for this process is how to dynamically load Javascript libraries, and then a method of how to recognize when a&amp;nbsp;dependency&amp;nbsp;is already loaded.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #0b5394; font-size: large;"&gt;Define API&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
As the project expands a clearly defined programming interface is necessary to maintain workflow. This design needs to have scalability at the forefront of the decision making process. We know each test case should be treated as its own object, an example of what to expect would be: dependencies, known good, error message, test. Additional standards will be that tests will load into a canvas as will their respective last known good result, from there the rest of the test process is built in.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #0b5394; font-size: large;"&gt;Define test case structure&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The thought process behind this goal is to allow for an easy to implement and expandable way to get your test cases working with sundae as fast as possible. The goal is to use a JSON object structured by my API design to clearly define everything optional and required for each test. Further additions include characterize tests by a directory structure. An obvious skill gap of JSON methodology will need to be bridged, however the benefits will be far reaching.&lt;br /&gt;
&lt;br /&gt;
That is everything set up for the 0.4 release of sundae.js!&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://sundae.lighthouseapp.com/projects/68207-sundaejs/tickets/bins/262946"&gt;Bug tracking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cwdesautels/sundae.js"&gt;Repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://zenit.senecac.on.ca/wiki/index.php/User:Cwdesautels/sundae"&gt;Wiki&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/GIFY4OJDUPM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/133251099414477358/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/01/04-release-setting-up-scaffolding.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/133251099414477358?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/133251099414477358?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/GIFY4OJDUPM/04-release-setting-up-scaffolding.html" title="0.4 Release: setting up the scaffolding" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/01/04-release-setting-up-scaffolding.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8EQH47fSp7ImA9Wx9WEU4.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-2245849822107272621</id><published>2011-01-12T23:03:00.003-05:00</published><updated>2011-01-15T18:23:21.005-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-15T18:23:21.005-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="project" /><title>Continuing with OSD: The rematch</title><content type="html">&lt;div style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; direction: ltr; display: block; height: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 100%; overflow-x: auto; overflow-y: auto; padding-bottom: 0px; padding-left: 0.25em; padding-right: 0px; padding-top: 0px; text-shadow: white -1px -1px 0px, white -1px 0px 0px, white -1px 1px 0px, white 0px -1px 0px, white 0px 1px 0px, white 1px -1px 0px, white 1px 0px 0px, white 1px 1px 0px; width: auto;"&gt;&lt;span class="wikEdHeading" style="color: black; font-family: monospace; font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Goal&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Create an easy to implement multi platform framework with the intent to compare webGL canvases and/or webGL buffers with known good or known bad results. Additionally the focus will be on webGL functionality relevant to c3dl, and c3dl rendered canvases.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="wikEdHeading" style="color: black; font-family: monospace; font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;What is it&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;The goal of this reference tester is to provide a reliable and extend&lt;span class="wikEdhyphenDash" style="font-size: 13px;" title="Standard hyphen"&gt;-&lt;/span&gt;able framework to isolate and test webGL functionality in addition to the libraries which use webGL. From the libraries point of view the aim is to isolate what really broke, to point blame on either specific test cases: using small pieces of unique code or isolated internal functionality of webGL. Reasons for a failure are expected to be broken code or a change specifications in the latest implementation.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="wikEdHeading" style="color: black; font-family: monospace; font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;The Plan&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Initial Steps&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Rebuild the framework with modularity in mind. Clearly define and separate the entire process for sanity and easy of use purposes. Areas of focus: test case import, framework setup, specific test case setup, building test case, building reference, generate result of comparison, compile test results. Using that assumption each of the resources being tested will need its on own builder function to generate a testable piece of data. My current idea is to compare all rendered objects using a canvas checking its pixels against a known solution on the other hand I'm unsure how ill approach comparing buffer objects. Additional work will need to be done to confirm how to isolate and test webGL functionality.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="wikEdHeading" style="color: black; font-family: monospace; font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Direction Afterwards&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;After rewriting the code into a workable framework and developing the methodology of how the tests are being conducted. The work changes pace and focuses more on rounding out the test case base. The focus should primarily be on isolating webGL, particularly the webGL relevant to the c3dl rendering process. In addition to that attention must be paid to breaking down the c3dl rending components and testing them individually.&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="wikEdHeading" style="color: black; font-family: monospace; font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Fine Tuning&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Once a working test base has been established and the framework defined the task becomes fine tuning and optimizing the reference tester. Improving the test case input and organization for scalability eg. after selecting the desired test cases the tester should include directories containing those tests and import them in. This allows the test cases to be separated into files and also be organized by directories. Other necessary improvements would be implementing worker threads to enhance run time of the entire ordeal and especially important the tester should be fully multi platform compatible. Having more platforms under the testers umbrella allows known fails created by build bugs on the part of webGL to because better recognized to the library being tested or Mozilla itself.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="wikEdHeading" style="color: black; font-family: monospace; font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Releases&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;0.4&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Clearly identify the test process, and approach&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Rewrite framework defining and separating the testing sequence &amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Update readPixels()&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Confirm pixel comparison and blur() actually work&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;0.5&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Implement howto test webGL fundamentals. Both rendered and buffered objects.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Develop relevant webGL test cases&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Break c3dl tests into more fundamental tests. Isolating very specific objects.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;0.6&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Port test cases into their own files&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Implement importing test case files&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Define rigid organizational structure, directory and tag based import system.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;0.7&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Enhance optimization with worker threads&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Identify locations for multiple threads and strategy of use&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Implement multi thread support&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;0.8&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Implement Windows operating system support with all browsers&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Implement relevant webGL test cases for Windows and specific browsers, including known fails.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;0.9&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Implement Apple operating system support with all browsers&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Implement relevant webGL test cases for Apple and specific browsers, including known fails.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;1.0&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Implement Linux operating system support with all browsers&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Implement relevant webGL test cases for Linux and specific browser, including known fails.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Polish code logic: remove unnecessary runtime&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;And of course the important link to my &lt;a href="http://zenit.senecac.on.ca/wiki/index.php/OSD700_Ref_Tester#Discussion"&gt;Project Wiki!&lt;/a&gt;&lt;br /&gt;
Annnnnd the &lt;a href="https://github.com/cwdesautels/c3dl"&gt;project Github&lt;/a&gt;&lt;br /&gt;
&lt;b style="font-family: monospace; font-size: 13px;"&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/ioVgN5SU4j8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/2245849822107272621/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2011/01/continuing-with-osd-rematch.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/2245849822107272621?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/2245849822107272621?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/ioVgN5SU4j8/continuing-with-osd-rematch.html" title="Continuing with OSD: The rematch" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2011/01/continuing-with-osd-rematch.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4BQ3k7fip7ImA9Wx9REU0.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-4115201687045092771</id><published>2010-12-11T16:19:00.002-05:00</published><updated>2010-12-11T17:02:32.706-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-11T17:02:32.706-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="project" /><title>c3dl Ref Tester 0.3</title><content type="html">Closing out OSD before&amp;nbsp;extracurricular work sets in. Let me break done the work and the problems I encountered.&lt;br /&gt;
&lt;br /&gt;
Before I begin let me explain what &lt;a href="http://www.c3dl.org/"&gt;c3dl&lt;/a&gt;&amp;nbsp;is. C3dl is a javascript library used to make writing 3D applications easier. Most notably it utilizing &lt;a href="http://en.wikipedia.org/wiki/WebGL"&gt;webGL&lt;/a&gt; for graphic accelerated rendering in your browser which is all the rage now.&lt;br /&gt;
&lt;br /&gt;
Structure&amp;nbsp;(before my upcoming rework) was taken from &lt;a href="https://github.com/annasob/processing-js"&gt;Processing.js&lt;/a&gt;. My goal was to take that test structure rip all signs of processing out of it and mash c3dl in. I've adjusted my scope a bit, currently my goal is to rework the tester so that it simply tests 2 canvases and spits the result into a third canvas. That way any method of rendering into a canvas can be used because a pixel by pixel&amp;nbsp;comparison&amp;nbsp;won't care how the pixels got there. Of course my contribution will inject c3dl into one canvas and an image into the other.&lt;br /&gt;
&lt;br /&gt;
The purpose behind putting an image and a c3dl rendered scene is this. The reference images were taken at a point of time where that particular scene rendered properly. Comparing that to the same scene rendered now as you load the test. The idea is any changes that broke or changed the result of c3dl rendering would be apparent.&lt;br /&gt;
&lt;br /&gt;
Some problems I encountered were:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Wasted 2 weeks trying to generate the reference images. Until I realized you can either canvas.getPNG or even better right click "save as" and get a png.&lt;/li&gt;
&lt;li&gt;Learning c3dl, adding multiple canvases and multiple callback mains for each test case revealed many bugs, learning not to test everyone else code was a huge hurtle.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
Future problems and goals:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Break apart the tester and make it focus more on just the pixel arrays of canvases, not how the canvases were filled.&lt;/li&gt;
&lt;li&gt;Change the test case library to something friendly of a larger scale, based on feedback from David Humphrey. That I have no clue.&lt;/li&gt;
&lt;li&gt;Confirm that the pixel&amp;nbsp;comparison&amp;nbsp;and blurring actually work, so I can trust there results. It seems a bit questionable at the moment but it's out of my current abilities.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Links:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Matrix hosting&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://matrix.senecac.on.ca/~cwdesautels/osd600/"&gt;http://matrix.senecac.on.ca/~cwdesautels/osd600/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Github Repo&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/cwdesautels/c3dl/tree/0.2"&gt;https://github.com/cwdesautels/c3dl/tree/0.2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/oS0J4XDrkpE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/4115201687045092771/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2010/12/c3dl-ref-tester-03.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/4115201687045092771?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/4115201687045092771?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/oS0J4XDrkpE/c3dl-ref-tester-03.html" title="c3dl Ref Tester 0.3" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2010/12/c3dl-ref-tester-03.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIMQns7eCp7ImA9Wx9SEEo.&quot;"><id>tag:blogger.com,1999:blog-7425569978306392984.post-5897760871841661701</id><published>2010-11-29T19:23:00.000-05:00</published><updated>2010-11-29T19:23:03.500-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-29T19:23:03.500-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="project" /><title>c3dl Ref Tester 0.1</title><content type="html">&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;What is C3DL?&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;
&lt;/span&gt;The Canvas 3D JS Libary (C3DL) is a JavaScript library that will make it easier to write 3D applications using WebGL. It provides a set of math, scene, and 3d object classes that makes WebGL more accessible for developers that want to develop 3D content in browser but do not want to have to deal in depth with the 3D math needed to make it work.&amp;nbsp;Website found &lt;a href="http://www.c3dl.org/"&gt;here&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;
&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;b&gt;Ref Tester&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Largely ported from David Humphreys &lt;a href="http://processingjs.org/"&gt;Processing.js&lt;/a&gt;&amp;nbsp;ref tester found &lt;a href="https://github.com/jeresig/processing-js"&gt;here&lt;/a&gt;. I attempted strip out processing and replace it with c3dl to do similar pixel comparisons between canvas's. This proved far more complicated then I anticipated, i had a lot of trouble interpreting all open source projects I encountered. This was solved through exhaustive scanning of&amp;nbsp;&lt;a href="https://developer.mozilla.org/en-US/"&gt;Mozilla Development Network&lt;/a&gt;&amp;nbsp;and project specific documentation, in addition to asking the pros on #moznet!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;b&gt;0.1&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Numerous errors in implementation can be found &lt;a href="http://zenit.senecac.on.ca/wiki/index.php/User:Cwdesautels/OSD600"&gt;here&lt;/a&gt;, however 0.1 contains:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;ported Processing.js ref tester&lt;/li&gt;
&lt;li&gt;integration of a single c3dl demo&lt;/li&gt;
&lt;li&gt;blurring and&amp;nbsp;comparison of the canvas's&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;b&gt;Beyond&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;look forward to a fast 0.2 release pending the reviews requested on current release, future goals include:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;exhaustive still tests&lt;/li&gt;
&lt;li&gt;modularization of tests&lt;/li&gt;
&lt;/ul&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;b&gt;Links&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://zenit.senecac.on.ca/wiki/index.php/User:Cwdesautels/OSD600"&gt;Wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cwdesautels/c3dl"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://c3dl.lighthouseapp.com/projects/42081-c3dl/overview"&gt;Lighthouse&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CarlinDesautels/~4/xiwtk5M42tU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://cwdesautels.blogspot.com/feeds/5897760871841661701/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://cwdesautels.blogspot.com/2010/11/c3dl-ref-tester-01.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/5897760871841661701?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7425569978306392984/posts/default/5897760871841661701?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CarlinDesautels/~3/xiwtk5M42tU/c3dl-ref-tester-01.html" title="c3dl Ref Tester 0.1" /><author><name>Carl Desautels</name><uri>http://www.blogger.com/profile/11543609680764346044</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-0pMTcdjsYiM/UNTHDnKIP8I/AAAAAAAAAME/t1idkfT4w0s/s1600/270237_10150357833132977_566057976_10099729_1389740_n.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://cwdesautels.blogspot.com/2010/11/c3dl-ref-tester-01.html</feedburner:origLink></entry></feed>
