<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Dojo: The Definitive Guide</title>
	<atom:link href="http://dojotdg.zaffra.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://dojotdg.zaffra.com</link>
	<description>The online compendium to the popular O'Reilly book</description>
	<pubDate>Wed, 10 Mar 2010 14:04:40 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<item>
		<title>USAID Data Charted with Dojo</title>
		<link>http://dojotdg.zaffra.com/2010/03/usaid-data-charted-with-dojo/</link>
		<comments>http://dojotdg.zaffra.com/2010/03/usaid-data-charted-with-dojo/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 21:06:31 +0000</pubDate>
		<dc:creator>Matthew Russell</dc:creator>
		
		<category><![CDATA[Articles]]></category>

		<category><![CDATA[data.gov]]></category>

		<category><![CDATA[dojox]]></category>

		<category><![CDATA[dojox.charting]]></category>

		<category><![CDATA[USAID]]></category>

		<guid isPermaLink="false">http://dojotdg.zaffra.com/?p=208</guid>
		<description><![CDATA[Dojo&#8217;s charting infrastructure has come quite a long way since I&#8217;ve looked at it several months ago, and since the first edition of Dojo: TDG didn&#8217;t include coverage of charting, I thought it might be fun to pick up an interesting data set from data.gov and wire together a modest demo. (And yes, the next [...]]]></description>
			<content:encoded><![CDATA[<p>Dojo&#8217;s <a href="http://docs.dojocampus.org/dojox/charting" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.dojocampus.org');" target="_blank">charting infrastructure</a> has come quite a long way since I&#8217;ve looked at it several months ago, and since the first edition of <a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fproduct%2F0596516487%2F&amp;tag=oreonbl-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.amazon.com');" target="_blank">Dojo: TDG</a> didn&#8217;t include coverage of charting, I thought it might be fun to pick up an interesting data set from data.gov and wire together <a href="http://zaffra.com/static/~matthew/usaid_demo/usaid/usaid.html"  target="_blank">a modest demo</a>. (And yes, the next edition of the book will definitely include coverage of charting and many other subprojects in DojoX.)</p>
<div id="attachment_213" class="wp-caption aligncenter" style="width: 310px"><a href="http://zaffra.com/static/~matthew/usaid_demo/usaid/usaid.html"  target="_blank"><img class="size-medium wp-image-213 " title="Afghanistan Title II USAID " src="http://dojotdg.zaffra.com/wp-content/uploads/2010/03/picture-1-300x222.png" alt="Click to view the demo" width="300" height="222" /></a><p class="wp-caption-text">Click to view the demo</p></div>
<p>The <a href="http://www.data.gov/raw/1596" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.data.gov');" target="_blank">data set I settled on</a> is what appears to be a simple csv file of all <a href="http://www.usaid.gov/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.usaid.gov');" target="_blank">USAID</a> distributions. Since the spreadsheet was quite large, I coded up a small Python program to slice and dice the numbers in order to get familiar with the data. One of the first things I noticed is that the dollar figures all appear to be in &#8220;raw&#8221; form &#8212; meaning, that if there was a distribution in 1946 for $1,000 that figure is obviously not adjusted for inflation; it&#8217;s in &#8220;1946 dollars.&#8221; So, I harvested some <a href="http://www.data.gov/raw/1596" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.data.gov');" target="_blank">CPI data</a> from the <a href="http://www.bls.gov/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.bls.gov');" target="_blank">Bureau of Labor Statistics</a> and attempted to create a minimal inflation calculator so that I could get a better sense of the overall trends.</p>
<p>You can <a href="http://zaffra.com/static/~matthew/USAIDPyDevProject.tgz" onclick="javascript:pageTracker._trackPageview('/downloads/static/~matthew/USAIDPyDevProject.tgz');" target="_blank">download my PyDev project</a> if you are interesting in hacking on the data a little bit yourself. The one thing I&#8217;ll warn you about if you use the PyDev project in Eclipse is that you&#8217;ll probably need to change the project properties to point to your own modules, which may be installed into different locations. If you&#8217;re not familiar with PyDev, you may be better off just using <a href="http://peak.telecommunity.com/DevCenter/EasyInstall" onclick="javascript:pageTracker._trackPageview('/outbound/article/peak.telecommunity.com');" target="_blank">easy_install</a> to pick up any missing modules and run from the command line.</p>
<p>After I was satisfied that I understood the data reasonably well, I added a couple of functions to emit the CPI and USAID data as JSON for easy consumption by the <a href="http://docs.dojocampus.org/dijit/form/ComboBox" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.dojocampus.org');" target="_blank">ComboBox</a> widgets that drive the chart.</p>
<p>It turns out that most of the <a href="http://zaffra.com/static/~matthew/usaid_demo/usaid/usaid.html"  target="_blank">demo</a> is related to getting the proper data structures hacked out and managing the events that reload the chart. The code snippet to actually build the chart is pretty self-explanatory:</p>
<pre>// create and configure the chart
chart = new dojox.charting.Chart2D("chart");
chart.setTheme(dojox.charting.themes.Minty);
chart.addAxis("x", {
    natural: true,
    includeZero: true,
    fixUpper: "minor",
    labelFunc : function(o) {
        return parseInt(o) + usaid.getMinYear()-1;
    }
});
chart.addAxis("y", {
    vertical: true,
    natural: true,
    includeZero: true,
    fixUpper: "minor",
    labelFunc : function(o) {
        return dojo.currency.format(o, {currency : "USD", places : 0});
    }
});
chart.addPlot("default", {type: "Columns", gap: 2});
//chart.addPlot("grid", {type: "Grid", hMinorLines: true, vMinorLines: true});
legend = new dojox.charting.widget.Legend({chart: chart}, "legend");

// add some nice action for the chart when you hover over columns
new dojox.charting.action2d.Highlight(chart, "default", {
    highlight: "green"
});
new dojox.charting.action2d.Tooltip(chart, "default", {
    text : function(o) {
        return ("FY" + (parseInt(o.x)+usaid.getMinYear()) + " : " +
               dojo.currency.format(o.y, {currency : "USD", places : 0}));
    }
});</pre>
<p>The event-driven logic <a href="http://zaffra.com/static/~matthew/usaid_demo/usaid/usaid.html"  target="_blank">demo</a> simply uses a couple of additional functions to remove and load a series into the chart though the Chart2D&#8217;s addSeries and removeSeries functions like so:</p>
<pre>/* Add a series to the chart */
chart.addSeries("Afghanistan/Title II" 10000, {stroke: {color: "black", width: 1}});

/* Remove a series from the chart */
chart.removeSeries("Afghanistan/Title II");</pre>
<p>The rest is of the work in putting this together really is just non-charting-related-book-keeping-cruft.</p>
<p>On a data related note, the one thing that kept coming to mind as I hacked this out is that it would be nice if there were a way to annotate the <a href="http://data.gov" onclick="javascript:pageTracker._trackPageview('/outbound/article/data.gov');" target="_blank">data.gov</a> catalog with links to projects that slice and dice the data, transform the data into more useful forms, provide visualization tools for the data, etc. After all, the next logical step once you have the data is actually building stuff with the data. For example, if you wanted to hack on the USAID data too, you would probably benefit from the work I&#8217;ve already done in converting it to a useful JSON format, coding up an inflation calculator (that is driven by the CPI data I had to go find), and you might even want to improve upon the interactive chart that plots it all out.</p>
<p>If there is interest, I&#8217;m considering a series of follow-on posts where I&#8217;ll add some improvements to the chart like plotting multiple series, viewing normalized dollar totals by country, etc.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=USAID+Data+Charted+with+Dojo+http://xht6g.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/twitter.com');" title="Post to Twitter"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="[Post to Twitter]" border="0" /></a>&nbsp; <a class="tt" href="http://plurk.com/?status=USAID+Data+Charted+with+Dojo+http://xht6g.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/plurk.com');" title="Post to Plurk"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-plurk.png" alt="[Post to Plurk]" border="0" /></a>&nbsp; <a class="tt" href="http://buzz.yahoo.com/submit?submitUrl=http://dojotdg.zaffra.com/2010/03/usaid-data-charted-with-dojo/&amp;submitHeadline=USAID+Data+Charted+with+Dojo" onclick="javascript:pageTracker._trackPageview('/outbound/article/buzz.yahoo.com');" title="Post to Yahoo Buzz"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-buzz.png" alt="[Post to Yahoo Buzz]" border="0" /></a>&nbsp; <a class="tt" href="http://delicious.com/post?url=http://dojotdg.zaffra.com/2010/03/usaid-data-charted-with-dojo/&amp;title=USAID+Data+Charted+with+Dojo" onclick="javascript:pageTracker._trackPageview('/outbound/article/delicious.com');" title="Post to Delicious"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="[Post to Delicious]" border="0" /></a>&nbsp; <a class="tt" href="http://digg.com/submit?url=http://dojotdg.zaffra.com/2010/03/usaid-data-charted-with-dojo/&amp;title=USAID+Data+Charted+with+Dojo" onclick="javascript:pageTracker._trackPageview('/outbound/article/digg.com');" title="Post to Digg"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="[Post to Digg]" border="0" /></a>&nbsp; <a class="tt" href="http://ping.fm/ref/?method=microblog&amp;title=USAID+Data+Charted+with+Dojo&amp;link=http://dojotdg.zaffra.com/2010/03/usaid-data-charted-with-dojo/" onclick="javascript:pageTracker._trackPageview('/outbound/article/ping.fm');" title="Post to Ping.fm"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-ping.png" alt="[Post to Ping.fm]" border="0" /></a>&nbsp; <a class="tt" href="http://reddit.com/submit?url=http://dojotdg.zaffra.com/2010/03/usaid-data-charted-with-dojo/&amp;title=USAID+Data+Charted+with+Dojo" onclick="javascript:pageTracker._trackPageview('/outbound/article/reddit.com');" title="Post to Reddit"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="[Post to Reddit]" border="0" /></a>&nbsp; <a class="tt" href="http://stumbleupon.com/submit?url=http://dojotdg.zaffra.com/2010/03/usaid-data-charted-with-dojo/&amp;title=USAID+Data+Charted+with+Dojo" onclick="javascript:pageTracker._trackPageview('/outbound/article/stumbleupon.com');" title="Post to StumbleUpon"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-su.png" alt="[Post to StumbleUpon]" border="0" /></a>&nbsp; </p>]]></content:encoded>
			<wfw:commentRss>http://dojotdg.zaffra.com/2010/03/usaid-data-charted-with-dojo/feed/</wfw:commentRss>
		</item>
		<item>
		<title>OSCON 2009 Materials Now Available</title>
		<link>http://dojotdg.zaffra.com/2009/07/oscon-2009-materials-now-available/</link>
		<comments>http://dojotdg.zaffra.com/2009/07/oscon-2009-materials-now-available/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 23:29:39 +0000</pubDate>
		<dc:creator>Matthew Russell</dc:creator>
		
		<category><![CDATA[Articles]]></category>

		<category><![CDATA[News]]></category>

		<category><![CDATA[Tips]]></category>

		<category><![CDATA[oscon]]></category>

		<category><![CDATA[slides]]></category>

		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://dojotdg.zaffra.com/?p=206</guid>
		<description><![CDATA[As promised this morning, I&#8217;ve made all of my materials for the 3 hour tutorial available under liberal licensing. All ~160 slides of them and accompanying code samples.
Also as promised, I removed the PHP dependencies for some of the server stuff and replaced it with a simple python server that uses cherrypy. You should hopefully [...]]]></description>
			<content:encoded><![CDATA[<p>As promised this morning, I&#8217;ve made all of my materials for the 3 hour tutorial available under liberal licensing. All ~160 slides of them and accompanying code samples.</p>
<p>Also as promised, I removed the PHP dependencies for some of the server stuff and replaced it with a simple python server that uses cherrypy. You should hopefully have no problems getting the sample server to run. You should have no problems finding stuff on the net to help you get that setup if you have problems, but feel free to comment here as well. Additionally be sure to skim the README in there.</p>
<p><a href="http://zaffra.com/static/~matthew/oscon2009.zip" onclick="javascript:pageTracker._trackPageview('/downloads/static/~matthew/oscon2009.zip');">You can get the materials here</a>.</p>
<p>Thanks again to everyone who attended. I hope that you were exposed to some of the great tools that Dojo can bring to the user experiences you are creating and that these slides are sufficiently succinct that they are a help to you. While they don&#8217;t cover everything in my book, they really do cover a lot of it&#8230;more than enough to get you pretty darn proficient.</p>
<p>Finally, remember that we&#8217;re having <a href="http://dojotdg.zaffra.com/2009/07/interest-count-for-dojobeer-event-at-oscon-next-week/"  target="_blank">the dojo.beer() tomorrow here in San Jose at 7pm</a>. Please don&#8217;t miss it.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=OSCON+2009+Materials+Now+Available+http://5d8ho.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/twitter.com');" title="Post to Twitter"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="[Post to Twitter]" border="0" /></a>&nbsp; <a class="tt" href="http://plurk.com/?status=OSCON+2009+Materials+Now+Available+http://5d8ho.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/plurk.com');" title="Post to Plurk"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-plurk.png" alt="[Post to Plurk]" border="0" /></a>&nbsp; <a class="tt" href="http://buzz.yahoo.com/submit?submitUrl=http://dojotdg.zaffra.com/2009/07/oscon-2009-materials-now-available/&amp;submitHeadline=OSCON+2009+Materials+Now+Available" onclick="javascript:pageTracker._trackPageview('/outbound/article/buzz.yahoo.com');" title="Post to Yahoo Buzz"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-buzz.png" alt="[Post to Yahoo Buzz]" border="0" /></a>&nbsp; <a class="tt" href="http://delicious.com/post?url=http://dojotdg.zaffra.com/2009/07/oscon-2009-materials-now-available/&amp;title=OSCON+2009+Materials+Now+Available" onclick="javascript:pageTracker._trackPageview('/outbound/article/delicious.com');" title="Post to Delicious"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="[Post to Delicious]" border="0" /></a>&nbsp; <a class="tt" href="http://digg.com/submit?url=http://dojotdg.zaffra.com/2009/07/oscon-2009-materials-now-available/&amp;title=OSCON+2009+Materials+Now+Available" onclick="javascript:pageTracker._trackPageview('/outbound/article/digg.com');" title="Post to Digg"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="[Post to Digg]" border="0" /></a>&nbsp; <a class="tt" href="http://ping.fm/ref/?method=microblog&amp;title=OSCON+2009+Materials+Now+Available&amp;link=http://dojotdg.zaffra.com/2009/07/oscon-2009-materials-now-available/" onclick="javascript:pageTracker._trackPageview('/outbound/article/ping.fm');" title="Post to Ping.fm"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-ping.png" alt="[Post to Ping.fm]" border="0" /></a>&nbsp; <a class="tt" href="http://reddit.com/submit?url=http://dojotdg.zaffra.com/2009/07/oscon-2009-materials-now-available/&amp;title=OSCON+2009+Materials+Now+Available" onclick="javascript:pageTracker._trackPageview('/outbound/article/reddit.com');" title="Post to Reddit"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="[Post to Reddit]" border="0" /></a>&nbsp; <a class="tt" href="http://stumbleupon.com/submit?url=http://dojotdg.zaffra.com/2009/07/oscon-2009-materials-now-available/&amp;title=OSCON+2009+Materials+Now+Available" onclick="javascript:pageTracker._trackPageview('/outbound/article/stumbleupon.com');" title="Post to StumbleUpon"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-su.png" alt="[Post to StumbleUpon]" border="0" /></a>&nbsp; </p>]]></content:encoded>
			<wfw:commentRss>http://dojotdg.zaffra.com/2009/07/oscon-2009-materials-now-available/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Dojo’s Industrial-Strength Grid Widget (Linux Journal Reprint)</title>
		<link>http://dojotdg.zaffra.com/2009/07/dojo%e2%80%99s-industrial-strength-grid-widget-linux-journal-reprint/</link>
		<comments>http://dojotdg.zaffra.com/2009/07/dojo%e2%80%99s-industrial-strength-grid-widget-linux-journal-reprint/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 23:37:26 +0000</pubDate>
		<dc:creator>Matthew Russell</dc:creator>
		
		<category><![CDATA[Articles]]></category>

		<category><![CDATA[Vetted Links]]></category>

		<category><![CDATA[grid]]></category>

		<category><![CDATA[linux journal]]></category>

		<guid isPermaLink="false">http://dojotdg.zaffra.com/?p=204</guid>
		<description><![CDATA[
As I was finishing up my slides for the 3 hour Dojo tutorial at OSCON tomorrow, I remembered that I hadn&#8217;t posted the source for the Linux Journal article on Dojo&#8217;s fab DataGrid that ran in the June 2009 issue. Fortunately for me, Linux Journal posted the source online for this one, so I&#8217;ll just [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.linuxjournal.com/article/10380" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.linuxjournal.com');"><img class="size-medium wp-image-190 alignright" title="cover182small" src="http://dojotdg.zaffra.com/wp-content/uploads/2009/05/cover182small.jpg" alt="" width="125" height="167" /></a></p>
<p>As I was finishing up my slides for the <a href="http://en.oreilly.com/oscon2009/public/schedule/detail/8210" onclick="javascript:pageTracker._trackPageview('/outbound/article/en.oreilly.com');" target="_blank">3 hour Dojo tutorial at OSCON tomorrow</a>, I remembered that I hadn&#8217;t posted the source for the Linux Journal article on Dojo&#8217;s fab DataGrid that ran in the June 2009 issue. Fortunately for me, <a href="http://www.linuxjournal.com/article/10380" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.linuxjournal.com');" target="_blank">Linux Journal posted the source online for this one</a>, so I&#8217;ll just go ahead and point you there instead of reproducing that work. It&#8217;s laid out nicely, so I hope you enjoy.</p>
<p>If you&#8217;re at OSCON, please come out to the <a href="http://dojotdg.zaffra.com/2009/07/interest-count-for-dojobeer-event-at-oscon-next-week/"  target="_blank">dojo.beer() on Wednesday at 7pm</a> and hang out with some of us. I&#8217;m here all week, so feel free to look me up if you want to chat about anything.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Dojo%E2%80%99s+Industrial-Strength+Grid+Widget+%28Linux+Journal+Reprint%29+http://ampgr.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/twitter.com');" title="Post to Twitter"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="[Post to Twitter]" border="0" /></a>&nbsp; <a class="tt" href="http://plurk.com/?status=Dojo%E2%80%99s+Industrial-Strength+Grid+Widget+%28Linux+Journal+Reprint%29+http://ampgr.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/plurk.com');" title="Post to Plurk"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-plurk.png" alt="[Post to Plurk]" border="0" /></a>&nbsp; <a class="tt" href="http://buzz.yahoo.com/submit?submitUrl=http://dojotdg.zaffra.com/2009/07/dojo%e2%80%99s-industrial-strength-grid-widget-linux-journal-reprint/&amp;submitHeadline=Dojo%E2%80%99s+Industrial-Strength+Grid+Widget+%28Linux+Journal+Reprint%29" onclick="javascript:pageTracker._trackPageview('/outbound/article/buzz.yahoo.com');" title="Post to Yahoo Buzz"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-buzz.png" alt="[Post to Yahoo Buzz]" border="0" /></a>&nbsp; <a class="tt" href="http://delicious.com/post?url=http://dojotdg.zaffra.com/2009/07/dojo%e2%80%99s-industrial-strength-grid-widget-linux-journal-reprint/&amp;title=Dojo%E2%80%99s+Industrial-Strength+Grid+Widget+%28Linux+Journal+Reprint%29" onclick="javascript:pageTracker._trackPageview('/outbound/article/delicious.com');" title="Post to Delicious"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="[Post to Delicious]" border="0" /></a>&nbsp; <a class="tt" href="http://digg.com/submit?url=http://dojotdg.zaffra.com/2009/07/dojo%e2%80%99s-industrial-strength-grid-widget-linux-journal-reprint/&amp;title=Dojo%E2%80%99s+Industrial-Strength+Grid+Widget+%28Linux+Journal+Reprint%29" onclick="javascript:pageTracker._trackPageview('/outbound/article/digg.com');" title="Post to Digg"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="[Post to Digg]" border="0" /></a>&nbsp; <a class="tt" href="http://ping.fm/ref/?method=microblog&amp;title=Dojo%E2%80%99s+Industrial-Strength+Grid+Widget+%28Linux+Journal+Reprint%29&amp;link=http://dojotdg.zaffra.com/2009/07/dojo%e2%80%99s-industrial-strength-grid-widget-linux-journal-reprint/" onclick="javascript:pageTracker._trackPageview('/outbound/article/ping.fm');" title="Post to Ping.fm"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-ping.png" alt="[Post to Ping.fm]" border="0" /></a>&nbsp; <a class="tt" href="http://reddit.com/submit?url=http://dojotdg.zaffra.com/2009/07/dojo%e2%80%99s-industrial-strength-grid-widget-linux-journal-reprint/&amp;title=Dojo%E2%80%99s+Industrial-Strength+Grid+Widget+%28Linux+Journal+Reprint%29" onclick="javascript:pageTracker._trackPageview('/outbound/article/reddit.com');" title="Post to Reddit"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="[Post to Reddit]" border="0" /></a>&nbsp; <a class="tt" href="http://stumbleupon.com/submit?url=http://dojotdg.zaffra.com/2009/07/dojo%e2%80%99s-industrial-strength-grid-widget-linux-journal-reprint/&amp;title=Dojo%E2%80%99s+Industrial-Strength+Grid+Widget+%28Linux+Journal+Reprint%29" onclick="javascript:pageTracker._trackPageview('/outbound/article/stumbleupon.com');" title="Post to StumbleUpon"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-su.png" alt="[Post to StumbleUpon]" border="0" /></a>&nbsp; </p>]]></content:encoded>
			<wfw:commentRss>http://dojotdg.zaffra.com/2009/07/dojo%e2%80%99s-industrial-strength-grid-widget-linux-journal-reprint/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Interest count for dojo.beer() event at OSCON next week</title>
		<link>http://dojotdg.zaffra.com/2009/07/interest-count-for-dojobeer-event-at-oscon-next-week/</link>
		<comments>http://dojotdg.zaffra.com/2009/07/interest-count-for-dojobeer-event-at-oscon-next-week/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 18:55:32 +0000</pubDate>
		<dc:creator>Matthew Russell</dc:creator>
		
		<category><![CDATA[News]]></category>

		<category><![CDATA[dojo.beer()]]></category>

		<category><![CDATA[oscon]]></category>

		<category><![CDATA[tons-o-fun]]></category>

		<guid isPermaLink="false">http://dojotdg.zaffra.com/?p=200</guid>
		<description><![CDATA[Update: We have some interest, and I&#8217;ll advertise this event at my Dojo tutorial on Tuesday, so anyone who is interested should pencil in Wednesday, 22 July @ 7pm. Venue: O&#8217;Flaherty&#8217;s. From the map, it looks to be easily accessible from the conference.
Anyone want to get together for a dojo.beer() event at OSCON next week? [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update: We have some interest, and I&#8217;ll advertise this event at my Dojo tutorial on Tuesday, so anyone who is interested should pencil in Wednesday, 22 July @ 7pm. Venue: <a href="http://www.oflahertyspub.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.oflahertyspub.com');" target="_blank">O&#8217;Flaherty&#8217;s</a></strong>. From the map, it looks to be easily accessible from the conference.</p>
<p>Anyone want to get together for a dojo.beer() event at OSCON next week? Basically, a dojo.beer() event is just a little get together to talk some shop about what&#8217;s happening with Dojo, Ajax, the open web, etc. whilst refreshing oneself with dinner and a few beers in good company.</p>
<p>Any preferences for Wednesday, July 22 versus Thursday, July 23?</p>
<p>Recommendations for venue in the San Jose area?</p>
<p>Please, chime in below or throw out a holla to <a href="http://twitter.com/dojotdg" onclick="javascript:pageTracker._trackPageview('/outbound/article/twitter.com');" target="_blank">@dojotdg</a> and/or <a href="http://twitter.com/dojobeer" onclick="javascript:pageTracker._trackPageview('/outbound/article/twitter.com');" target="_blank">@dojobeer</a>.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Interest+count+for+dojo.beer%28%29+event+at+OSCON+next+week+http://ttmkw.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/twitter.com');" title="Post to Twitter"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="[Post to Twitter]" border="0" /></a>&nbsp; <a class="tt" href="http://plurk.com/?status=Interest+count+for+dojo.beer%28%29+event+at+OSCON+next+week+http://ttmkw.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/plurk.com');" title="Post to Plurk"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-plurk.png" alt="[Post to Plurk]" border="0" /></a>&nbsp; <a class="tt" href="http://buzz.yahoo.com/submit?submitUrl=http://dojotdg.zaffra.com/2009/07/interest-count-for-dojobeer-event-at-oscon-next-week/&amp;submitHeadline=Interest+count+for+dojo.beer%28%29+event+at+OSCON+next+week" onclick="javascript:pageTracker._trackPageview('/outbound/article/buzz.yahoo.com');" title="Post to Yahoo Buzz"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-buzz.png" alt="[Post to Yahoo Buzz]" border="0" /></a>&nbsp; <a class="tt" href="http://delicious.com/post?url=http://dojotdg.zaffra.com/2009/07/interest-count-for-dojobeer-event-at-oscon-next-week/&amp;title=Interest+count+for+dojo.beer%28%29+event+at+OSCON+next+week" onclick="javascript:pageTracker._trackPageview('/outbound/article/delicious.com');" title="Post to Delicious"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="[Post to Delicious]" border="0" /></a>&nbsp; <a class="tt" href="http://digg.com/submit?url=http://dojotdg.zaffra.com/2009/07/interest-count-for-dojobeer-event-at-oscon-next-week/&amp;title=Interest+count+for+dojo.beer%28%29+event+at+OSCON+next+week" onclick="javascript:pageTracker._trackPageview('/outbound/article/digg.com');" title="Post to Digg"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="[Post to Digg]" border="0" /></a>&nbsp; <a class="tt" href="http://ping.fm/ref/?method=microblog&amp;title=Interest+count+for+dojo.beer%28%29+event+at+OSCON+next+week&amp;link=http://dojotdg.zaffra.com/2009/07/interest-count-for-dojobeer-event-at-oscon-next-week/" onclick="javascript:pageTracker._trackPageview('/outbound/article/ping.fm');" title="Post to Ping.fm"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-ping.png" alt="[Post to Ping.fm]" border="0" /></a>&nbsp; <a class="tt" href="http://reddit.com/submit?url=http://dojotdg.zaffra.com/2009/07/interest-count-for-dojobeer-event-at-oscon-next-week/&amp;title=Interest+count+for+dojo.beer%28%29+event+at+OSCON+next+week" onclick="javascript:pageTracker._trackPageview('/outbound/article/reddit.com');" title="Post to Reddit"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="[Post to Reddit]" border="0" /></a>&nbsp; <a class="tt" href="http://stumbleupon.com/submit?url=http://dojotdg.zaffra.com/2009/07/interest-count-for-dojobeer-event-at-oscon-next-week/&amp;title=Interest+count+for+dojo.beer%28%29+event+at+OSCON+next+week" onclick="javascript:pageTracker._trackPageview('/outbound/article/stumbleupon.com');" title="Post to StumbleUpon"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-su.png" alt="[Post to StumbleUpon]" border="0" /></a>&nbsp; </p>]]></content:encoded>
			<wfw:commentRss>http://dojotdg.zaffra.com/2009/07/interest-count-for-dojobeer-event-at-oscon-next-week/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Dojo: TDG - Now In Russian</title>
		<link>http://dojotdg.zaffra.com/2009/07/dojo-tdg-now-in-russian/</link>
		<comments>http://dojotdg.zaffra.com/2009/07/dojo-tdg-now-in-russian/#comments</comments>
		<pubDate>Sat, 11 Jul 2009 14:45:26 +0000</pubDate>
		<dc:creator>Matthew Russell</dc:creator>
		
		<category><![CDATA[News]]></category>

		<category><![CDATA[russian translation]]></category>

		<guid isPermaLink="false">http://dojotdg.zaffra.com/?p=197</guid>
		<description><![CDATA[I&#8217;m sure you can image my reaction when I checked the mail yesterday and discovered my book&#8230;only in a Russian translation&#8230;all ~500 pages of it. Wow! It&#8217;s too bad I don&#8217;t speak a lick of Russian or even know anything about the language. Maybe now is the time to start learning a few things&#8230;

I&#8217;ve always [...]]]></description>
			<content:encoded><![CDATA[<div class="mceTemp mceIEcenter" style="text-align: left;">I&#8217;m sure you can image my reaction when I checked the mail yesterday and discovered my book&#8230;only in a Russian translation&#8230;all ~500 pages of it. Wow! It&#8217;s too bad I don&#8217;t speak a lick of Russian or even know anything about the language. Maybe now is the time to start learning a few things&#8230;</div>
<div class="mceTemp mceIEcenter" style="text-align: left;"></div>
<div class="mceTemp mceIEcenter" style="text-align: left;">I&#8217;ve always curious about how good translations of technical books turn out and would love to hear about the quality of the translation from anyone who end up picking up a copy. I would provide a link to where you can buy the translated version, but I&#8217;m not having any luck finding one just yet.</div>
<div class="mceTemp mceIEcenter" style="text-align: left;"></div>
<div class="mceTemp mceIEcenter" style="text-align: left;">If anyone who speaks Russian will be at OSCON week after next, look me up!</div>
<div class="mceTemp mceIEcenter">
<dl id="attachment_198" class="wp-caption aligncenter" style="width: 220px;">
<dt class="wp-caption-dt"><a href="http://dojotdg.zaffra.com/wp-content/uploads/2009/07/russian.png" > <img class="size-medium wp-image-198 " title="russian" src="http://dojotdg.zaffra.com/wp-content/uploads/2009/07/russian-210x300.png" alt="" width="210" height="300" /></a></dt>
</dl>
</div>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Dojo%3A+TDG+-+Now+In+Russian+http://fxrmc.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/twitter.com');" title="Post to Twitter"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="[Post to Twitter]" border="0" /></a>&nbsp; <a class="tt" href="http://plurk.com/?status=Dojo%3A+TDG+-+Now+In+Russian+http://fxrmc.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/plurk.com');" title="Post to Plurk"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-plurk.png" alt="[Post to Plurk]" border="0" /></a>&nbsp; <a class="tt" href="http://buzz.yahoo.com/submit?submitUrl=http://dojotdg.zaffra.com/2009/07/dojo-tdg-now-in-russian/&amp;submitHeadline=Dojo%3A+TDG+-+Now+In+Russian" onclick="javascript:pageTracker._trackPageview('/outbound/article/buzz.yahoo.com');" title="Post to Yahoo Buzz"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-buzz.png" alt="[Post to Yahoo Buzz]" border="0" /></a>&nbsp; <a class="tt" href="http://delicious.com/post?url=http://dojotdg.zaffra.com/2009/07/dojo-tdg-now-in-russian/&amp;title=Dojo%3A+TDG+-+Now+In+Russian" onclick="javascript:pageTracker._trackPageview('/outbound/article/delicious.com');" title="Post to Delicious"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="[Post to Delicious]" border="0" /></a>&nbsp; <a class="tt" href="http://digg.com/submit?url=http://dojotdg.zaffra.com/2009/07/dojo-tdg-now-in-russian/&amp;title=Dojo%3A+TDG+-+Now+In+Russian" onclick="javascript:pageTracker._trackPageview('/outbound/article/digg.com');" title="Post to Digg"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="[Post to Digg]" border="0" /></a>&nbsp; <a class="tt" href="http://ping.fm/ref/?method=microblog&amp;title=Dojo%3A+TDG+-+Now+In+Russian&amp;link=http://dojotdg.zaffra.com/2009/07/dojo-tdg-now-in-russian/" onclick="javascript:pageTracker._trackPageview('/outbound/article/ping.fm');" title="Post to Ping.fm"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-ping.png" alt="[Post to Ping.fm]" border="0" /></a>&nbsp; <a class="tt" href="http://reddit.com/submit?url=http://dojotdg.zaffra.com/2009/07/dojo-tdg-now-in-russian/&amp;title=Dojo%3A+TDG+-+Now+In+Russian" onclick="javascript:pageTracker._trackPageview('/outbound/article/reddit.com');" title="Post to Reddit"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="[Post to Reddit]" border="0" /></a>&nbsp; <a class="tt" href="http://stumbleupon.com/submit?url=http://dojotdg.zaffra.com/2009/07/dojo-tdg-now-in-russian/&amp;title=Dojo%3A+TDG+-+Now+In+Russian" onclick="javascript:pageTracker._trackPageview('/outbound/article/stumbleupon.com');" title="Post to StumbleUpon"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-su.png" alt="[Post to StumbleUpon]" border="0" /></a>&nbsp; </p>]]></content:encoded>
			<wfw:commentRss>http://dojotdg.zaffra.com/2009/07/dojo-tdg-now-in-russian/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Dojo Tips and Tricks</title>
		<link>http://dojotdg.zaffra.com/2009/06/dojo-tips-and-tricks/</link>
		<comments>http://dojotdg.zaffra.com/2009/06/dojo-tips-and-tricks/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 15:00:07 +0000</pubDate>
		<dc:creator>Matthew Russell</dc:creator>
		
		<category><![CDATA[Articles]]></category>

		<category><![CDATA[News]]></category>

		<category><![CDATA[Tips]]></category>

		<category><![CDATA[Vetted Links]]></category>

		<category><![CDATA[gfx]]></category>

		<category><![CDATA[grid]]></category>

		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://dojotdg.zaffra.com/?p=194</guid>
		<description><![CDATA[Many months ago, I wrote an article for InsideRIA that provided a topical look at some of the more useful things that Dojo provides you entitled Dojo Tips and Tricks. I&#8217;d actually forgotten that I even wrote the article so it was a surprise when a colleague wrote me earlier this morning and mentioned it.
It&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>Many months ago, I wrote an article for InsideRIA that provided a topical look at some of the more useful things that <a href="http://dojotoolkit.org" onclick="javascript:pageTracker._trackPageview('/outbound/article/dojotoolkit.org');" target="_blank">Dojo</a> provides you entitled <a href="http://www.insideria.com/2009/06/dojo-tips-and-tricks.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.insideria.com');" target="_blank">Dojo Tips and Tricks</a>. I&#8217;d actually forgotten that I even wrote the article so it was a surprise when a colleague wrote me earlier this morning and mentioned it.</p>
<p>It&#8217;s a bit more diverse than some drive-by-tutorials in that it digs into DojoX just a little bit and mentions the build system, so even if you&#8217;ve been using some of the core tools for a while now, you may still learn a few things from a quick read.</p>
<p>In between the time when the article was finished and now, Dojo has since updated to version 1.3 so you&#8217;ll unfortunately see a few CDN URLs that point to version 1.2; however, upgrading the URLs <em>shouldn&#8217;t</em> break anything. The latest and greatest is usually a great place to start, so I always encourage folks to stay up to date.</p>
<p>If you&#8217;re coming to OSCON this summer, be sure to drop by my <a href="http://en.oreilly.com/oscon2009/public/schedule/speaker/6606" onclick="javascript:pageTracker._trackPageview('/outbound/article/en.oreilly.com');" target="_blank">3 hour tutorial</a> for a closer look at many of the great tools that Dojo provides.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Dojo+Tips+and+Tricks+http://pp9ct.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/twitter.com');" title="Post to Twitter"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="[Post to Twitter]" border="0" /></a>&nbsp; <a class="tt" href="http://plurk.com/?status=Dojo+Tips+and+Tricks+http://pp9ct.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/plurk.com');" title="Post to Plurk"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-plurk.png" alt="[Post to Plurk]" border="0" /></a>&nbsp; <a class="tt" href="http://buzz.yahoo.com/submit?submitUrl=http://dojotdg.zaffra.com/2009/06/dojo-tips-and-tricks/&amp;submitHeadline=Dojo+Tips+and+Tricks" onclick="javascript:pageTracker._trackPageview('/outbound/article/buzz.yahoo.com');" title="Post to Yahoo Buzz"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-buzz.png" alt="[Post to Yahoo Buzz]" border="0" /></a>&nbsp; <a class="tt" href="http://delicious.com/post?url=http://dojotdg.zaffra.com/2009/06/dojo-tips-and-tricks/&amp;title=Dojo+Tips+and+Tricks" onclick="javascript:pageTracker._trackPageview('/outbound/article/delicious.com');" title="Post to Delicious"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="[Post to Delicious]" border="0" /></a>&nbsp; <a class="tt" href="http://digg.com/submit?url=http://dojotdg.zaffra.com/2009/06/dojo-tips-and-tricks/&amp;title=Dojo+Tips+and+Tricks" onclick="javascript:pageTracker._trackPageview('/outbound/article/digg.com');" title="Post to Digg"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="[Post to Digg]" border="0" /></a>&nbsp; <a class="tt" href="http://ping.fm/ref/?method=microblog&amp;title=Dojo+Tips+and+Tricks&amp;link=http://dojotdg.zaffra.com/2009/06/dojo-tips-and-tricks/" onclick="javascript:pageTracker._trackPageview('/outbound/article/ping.fm');" title="Post to Ping.fm"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-ping.png" alt="[Post to Ping.fm]" border="0" /></a>&nbsp; <a class="tt" href="http://reddit.com/submit?url=http://dojotdg.zaffra.com/2009/06/dojo-tips-and-tricks/&amp;title=Dojo+Tips+and+Tricks" onclick="javascript:pageTracker._trackPageview('/outbound/article/reddit.com');" title="Post to Reddit"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="[Post to Reddit]" border="0" /></a>&nbsp; <a class="tt" href="http://stumbleupon.com/submit?url=http://dojotdg.zaffra.com/2009/06/dojo-tips-and-tricks/&amp;title=Dojo+Tips+and+Tricks" onclick="javascript:pageTracker._trackPageview('/outbound/article/stumbleupon.com');" title="Post to StumbleUpon"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-su.png" alt="[Post to StumbleUpon]" border="0" /></a>&nbsp; </p>]]></content:encoded>
			<wfw:commentRss>http://dojotdg.zaffra.com/2009/06/dojo-tips-and-tricks/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Dojo&#8217;s Industrial-Strength Grid Widget (Linux Journal, Jun 09)</title>
		<link>http://dojotdg.zaffra.com/2009/05/dojos-industrial-strength-grid-widget-linux-journal-jun-09/</link>
		<comments>http://dojotdg.zaffra.com/2009/05/dojos-industrial-strength-grid-widget-linux-journal-jun-09/#comments</comments>
		<pubDate>Sat, 02 May 2009 17:39:42 +0000</pubDate>
		<dc:creator>Matthew Russell</dc:creator>
		
		<category><![CDATA[News]]></category>

		<category><![CDATA[grid]]></category>

		<category><![CDATA[linux journal]]></category>

		<guid isPermaLink="false">http://dojotdg.zaffra.com/?p=188</guid>
		<description><![CDATA[The latest, greatest copy of Linux Journal features a great primer I put together on Dojo&#8217;s really fab grid widget! The content was written a couple of months before the 1.3 release, but the code examples still work just fine with the latest version of 1.2. I start out by briefly introducing some dojo.data fundamentals [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://www.linuxjournal.com/issue/182" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.linuxjournal.com');" target="_blank">latest, greatest copy of Linux Journal</a> features <a href="http://www.linuxjournal.com/article/10380" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.linuxjournal.com');" target="_blank">a great primer I put together on Dojo&#8217;s really fab grid widget</a>! The content was written a couple of months before the 1.3 release, but the code examples still work just fine with the latest version of 1.2. I start out by briefly introducing some dojo.data fundamentals and then show how the grid leverages these data APIs to do a lot of nifty things.<a href="http://dojotdg.zaffra.com/wp-content/uploads/2009/05/cover182small.jpg" ><img class="alignleft size-full wp-image-190" src="http://dojotdg.zaffra.com/wp-content/uploads/2009/05/cover182small.jpg" alt="" width="125" height="167" /></a></p>
<p>In early July, I&#8217;ll be allowed to reprint the article&#8217;s full content here under the terms of a free documentation license, and when that time comes, I&#8217;ll make sure it&#8217;s updated to work with the latest version of 1.3. In the meanwhile, I hope you enjoy the June edition of Linux Journal and make some time to get up close and personal with the grid widget.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Dojo%27s+Industrial-Strength+Grid+Widget+%28Linux+Journal%2C+Jun+09%29+http://tim8q.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/twitter.com');" title="Post to Twitter"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="[Post to Twitter]" border="0" /></a>&nbsp; <a class="tt" href="http://plurk.com/?status=Dojo%27s+Industrial-Strength+Grid+Widget+%28Linux+Journal%2C+Jun+09%29+http://tim8q.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/plurk.com');" title="Post to Plurk"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-plurk.png" alt="[Post to Plurk]" border="0" /></a>&nbsp; <a class="tt" href="http://buzz.yahoo.com/submit?submitUrl=http://dojotdg.zaffra.com/2009/05/dojos-industrial-strength-grid-widget-linux-journal-jun-09/&amp;submitHeadline=Dojo%27s+Industrial-Strength+Grid+Widget+%28Linux+Journal%2C+Jun+09%29" onclick="javascript:pageTracker._trackPageview('/outbound/article/buzz.yahoo.com');" title="Post to Yahoo Buzz"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-buzz.png" alt="[Post to Yahoo Buzz]" border="0" /></a>&nbsp; <a class="tt" href="http://delicious.com/post?url=http://dojotdg.zaffra.com/2009/05/dojos-industrial-strength-grid-widget-linux-journal-jun-09/&amp;title=Dojo%27s+Industrial-Strength+Grid+Widget+%28Linux+Journal%2C+Jun+09%29" onclick="javascript:pageTracker._trackPageview('/outbound/article/delicious.com');" title="Post to Delicious"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="[Post to Delicious]" border="0" /></a>&nbsp; <a class="tt" href="http://digg.com/submit?url=http://dojotdg.zaffra.com/2009/05/dojos-industrial-strength-grid-widget-linux-journal-jun-09/&amp;title=Dojo%27s+Industrial-Strength+Grid+Widget+%28Linux+Journal%2C+Jun+09%29" onclick="javascript:pageTracker._trackPageview('/outbound/article/digg.com');" title="Post to Digg"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="[Post to Digg]" border="0" /></a>&nbsp; <a class="tt" href="http://ping.fm/ref/?method=microblog&amp;title=Dojo%27s+Industrial-Strength+Grid+Widget+%28Linux+Journal%2C+Jun+09%29&amp;link=http://dojotdg.zaffra.com/2009/05/dojos-industrial-strength-grid-widget-linux-journal-jun-09/" onclick="javascript:pageTracker._trackPageview('/outbound/article/ping.fm');" title="Post to Ping.fm"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-ping.png" alt="[Post to Ping.fm]" border="0" /></a>&nbsp; <a class="tt" href="http://reddit.com/submit?url=http://dojotdg.zaffra.com/2009/05/dojos-industrial-strength-grid-widget-linux-journal-jun-09/&amp;title=Dojo%27s+Industrial-Strength+Grid+Widget+%28Linux+Journal%2C+Jun+09%29" onclick="javascript:pageTracker._trackPageview('/outbound/article/reddit.com');" title="Post to Reddit"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="[Post to Reddit]" border="0" /></a>&nbsp; <a class="tt" href="http://stumbleupon.com/submit?url=http://dojotdg.zaffra.com/2009/05/dojos-industrial-strength-grid-widget-linux-journal-jun-09/&amp;title=Dojo%27s+Industrial-Strength+Grid+Widget+%28Linux+Journal%2C+Jun+09%29" onclick="javascript:pageTracker._trackPageview('/outbound/article/stumbleupon.com');" title="Post to StumbleUpon"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-su.png" alt="[Post to StumbleUpon]" border="0" /></a>&nbsp; </p>]]></content:encoded>
			<wfw:commentRss>http://dojotdg.zaffra.com/2009/05/dojos-industrial-strength-grid-widget-linux-journal-jun-09/feed/</wfw:commentRss>
		</item>
		<item>
		<title>3 Hour Dojo Tutorial at OSCON in San Jose</title>
		<link>http://dojotdg.zaffra.com/2009/04/3-hour-dojo-tutorial-at-oscon-in-san-jose/</link>
		<comments>http://dojotdg.zaffra.com/2009/04/3-hour-dojo-tutorial-at-oscon-in-san-jose/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 16:40:31 +0000</pubDate>
		<dc:creator>Matthew Russell</dc:creator>
		
		<category><![CDATA[News]]></category>

		<category><![CDATA[oscon]]></category>

		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://dojotdg.zaffra.com/?p=186</guid>
		<description><![CDATA[If you&#8217;re coming out to OSCON this summer, be sure to drop in for my 3 hour Dojo tutorial that will add bit of kick to your web dev skills. I&#8217;ll lightly cover as much breadth as possible so that you have an appreciation for just how much is packed away in the toolkit, but [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re coming out to <a href="http://en.oreilly.com/oscon2009" onclick="javascript:pageTracker._trackPageview('/outbound/article/en.oreilly.com');" target="_blank">OSCON</a> this summer, be sure to drop in for my <a href="http://en.oreilly.com/oscon2009/public/schedule/detail/8210" onclick="javascript:pageTracker._trackPageview('/outbound/article/en.oreilly.com');" target="_blank">3 hour Dojo tutorial</a> that will add bit of kick to your web dev skills. I&#8217;ll lightly cover as much breadth as possible so that you have an appreciation for just how much is packed away in the toolkit, but we&#8217;ll certainly dig headfirst into especially interesting and fundamental areas of interest as well so that you have a firm grasp on those things you won&#8217;t want to live without.</p>
<p>If there are topics you&#8217;d like to see covered in particular, feel free to leave comments below, and I&#8217;ll do my best to make sure that they aren&#8217;t missed. Hope to see you there.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=3+Hour+Dojo+Tutorial+at+OSCON+in+San+Jose+http://9sr8d.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/twitter.com');" title="Post to Twitter"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="[Post to Twitter]" border="0" /></a>&nbsp; <a class="tt" href="http://plurk.com/?status=3+Hour+Dojo+Tutorial+at+OSCON+in+San+Jose+http://9sr8d.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/plurk.com');" title="Post to Plurk"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-plurk.png" alt="[Post to Plurk]" border="0" /></a>&nbsp; <a class="tt" href="http://buzz.yahoo.com/submit?submitUrl=http://dojotdg.zaffra.com/2009/04/3-hour-dojo-tutorial-at-oscon-in-san-jose/&amp;submitHeadline=3+Hour+Dojo+Tutorial+at+OSCON+in+San+Jose" onclick="javascript:pageTracker._trackPageview('/outbound/article/buzz.yahoo.com');" title="Post to Yahoo Buzz"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-buzz.png" alt="[Post to Yahoo Buzz]" border="0" /></a>&nbsp; <a class="tt" href="http://delicious.com/post?url=http://dojotdg.zaffra.com/2009/04/3-hour-dojo-tutorial-at-oscon-in-san-jose/&amp;title=3+Hour+Dojo+Tutorial+at+OSCON+in+San+Jose" onclick="javascript:pageTracker._trackPageview('/outbound/article/delicious.com');" title="Post to Delicious"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="[Post to Delicious]" border="0" /></a>&nbsp; <a class="tt" href="http://digg.com/submit?url=http://dojotdg.zaffra.com/2009/04/3-hour-dojo-tutorial-at-oscon-in-san-jose/&amp;title=3+Hour+Dojo+Tutorial+at+OSCON+in+San+Jose" onclick="javascript:pageTracker._trackPageview('/outbound/article/digg.com');" title="Post to Digg"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="[Post to Digg]" border="0" /></a>&nbsp; <a class="tt" href="http://ping.fm/ref/?method=microblog&amp;title=3+Hour+Dojo+Tutorial+at+OSCON+in+San+Jose&amp;link=http://dojotdg.zaffra.com/2009/04/3-hour-dojo-tutorial-at-oscon-in-san-jose/" onclick="javascript:pageTracker._trackPageview('/outbound/article/ping.fm');" title="Post to Ping.fm"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-ping.png" alt="[Post to Ping.fm]" border="0" /></a>&nbsp; <a class="tt" href="http://reddit.com/submit?url=http://dojotdg.zaffra.com/2009/04/3-hour-dojo-tutorial-at-oscon-in-san-jose/&amp;title=3+Hour+Dojo+Tutorial+at+OSCON+in+San+Jose" onclick="javascript:pageTracker._trackPageview('/outbound/article/reddit.com');" title="Post to Reddit"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="[Post to Reddit]" border="0" /></a>&nbsp; <a class="tt" href="http://stumbleupon.com/submit?url=http://dojotdg.zaffra.com/2009/04/3-hour-dojo-tutorial-at-oscon-in-san-jose/&amp;title=3+Hour+Dojo+Tutorial+at+OSCON+in+San+Jose" onclick="javascript:pageTracker._trackPageview('/outbound/article/stumbleupon.com');" title="Post to StumbleUpon"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-su.png" alt="[Post to StumbleUpon]" border="0" /></a>&nbsp; </p>]]></content:encoded>
			<wfw:commentRss>http://dojotdg.zaffra.com/2009/04/3-hour-dojo-tutorial-at-oscon-in-san-jose/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Dojo, Now With Drawing Tools (Linux Journal Reprint)</title>
		<link>http://dojotdg.zaffra.com/2009/03/dojo-now-with-drawing-tools-linux-journal-reprint/</link>
		<comments>http://dojotdg.zaffra.com/2009/03/dojo-now-with-drawing-tools-linux-journal-reprint/#comments</comments>
		<pubDate>Sat, 21 Mar 2009 00:47:24 +0000</pubDate>
		<dc:creator>Matthew Russell</dc:creator>
		
		<category><![CDATA[Articles]]></category>

		<category><![CDATA[2d drawing]]></category>

		<category><![CDATA[gfx]]></category>

		<category><![CDATA[linux journal]]></category>

		<guid isPermaLink="false">http://dojotdg.zaffra.com/?p=175</guid>
		<description><![CDATA[Internalizing Dojo's “write once, deploy anywhere” philosophy, Dojo's gfx (pronounced “g-f-x” or sometimes “graphics”) library packs a powerful 2-D drawing API that's capable of plugging in to an arbitrary renderer. Out of the box, it works with Canvas, Silverlight, SVG and VML, so regardless of which browser your application is ultimately viewed within, gfx has you covered.]]></description>
			<content:encoded><![CDATA[<p><em>This post is a &#8220;reprint&#8221; of a feature article I wrote for the <a href="http://www.linuxjournal.com/issue/178" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.linuxjournal.com');" target="_blank">February 2009 edition of </a></em><em><a href="http://www.linuxjournal.com/issue/178" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.linuxjournal.com');" target="_blank">Linux Journal</a>, entitled &#8220;Dojo, Now With Drawing Tools.&#8221; The article text was minimally adapted from the printed form, so no extensive hyperlinking or web layout has been done. Per my contract with Linux Journal, the article must be published under a <a href="http://www.fsf.org/licensing/licenses/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.fsf.org');" target="_blank">FSF Free Documentation License</a> if I reproduce it, so I hereby republish it under the <a href="http://www.freebsd.org/copyright/freebsd-doc-license.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.freebsd.org');" target="_blank">BSD Documentation License</a>. (*Strikes Gavel*) Enjoy.</em><img class="alignright" src="http://dojotdg.zaffra.com/wp-content/uploads/2009/03/cover178.small.jpg" alt="" width="125" height="167" /></p>
<p>Internalizing Dojo&#8217;s “write once, deploy anywhere” philosophy, Dojo&#8217;s gfx (pronounced “g-f-x” or sometimes “graphics”) library packs a powerful 2-D drawing API that&#8217;s capable of plugging in to an arbitrary renderer. Out of the box, it works with Canvas, Silverlight, SVG and VML, so regardless of which browser your application is ultimately viewed within, gfx has you covered.</p>
<div lang="en">My article <a href="http://dojotdg.zaffra.com/2008/09/using-dojo-the-javascript-toolkit-with-industrial-strength-mojo-linux-journal-reprint/"  target="_blank">Dojo: the JavaScript Toolkit with Industrial-Strength Mojo</a> in the <a href="http://www.linuxjournal.com/issue/171" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.linuxjournal.com');" target="_blank">July 2008 issue of <span><em>Linux Journal</em></span></a> illustrated how Dojo significantly lowers the amount of effort it takes to develop a cross-browser Web application by normalizing so many of the yucky aspects of Web programming, such as DOM manipulation, non-uniform aspects of the JavaScript across browsers, and repetitive tasks, such as styling nodes, performing AJAX requests and so forth. With that working knowledge, let&#8217;s turn to Dojo&#8217;s gfx library—a much more specialized aspect of the toolkit that&#8217;s expressly designed to give you 2-D drawing tools that can be used to do anything from producing a cool-looking reflection of an image to creating an animated game to rendering a drag-and-drop graph.</div>
<div lang="en"><img class="aligncenter" src="http://dojotdg.zaffra.com/wp-content/uploads/2009/03/reflection.png" alt="" width="245" height="326" /></div>
<div style="text-align: center;" lang="en"><em>Figure 1. An example of a slick effect gfx can produce on an image.</em></div>
<div lang="en">
<p>So that you better understand exactly where gfx fits into the larger toolkit, recall that Dojo breaks down into roughly five components: Base, Core, Dijit, DojoX and Util. Base is the tiny dojo.js file that contains hard-live-without library code for common operations; Core includes most of the programmatic machinery for the toolkit; Dijit is an assortment of turnkey widgets; DojoX provides a collection of specialized subprojects; and Util provides a testing framework and scripts for tasks, such as minifying and consolidating JavaScript and CSS files. <span style="text-decoration: underline;">The gfx library is one of those many specialized subprojects that lives under the DojoX umbrella.</span></p>
<div><img class="aligncenter" src="http://dojotdg.zaffra.com/wp-content/uploads/2009/03/toolkit_architecture.png" alt="" width="298" height="184" /></p>
<div>
<p style="text-align: center;"><em>Figure 2. A Conceptual Portrayal of Dojo&#8217;s Functional Architecture</em></p>
</div>
</div>
</div>
<p><em>Note:</em> A common misunderstanding is that everything within DojoX is experimental or necessarily unstable. Although there certainly are some alpha-quality subprojects within the DojoX namespace that you wouldn&#8217;t want to rely on for long-term production scenarios, several DojoX subprojects (including gfx) are quite ready for mainstream use. In general, you should be able to check a project&#8217;s README file to determine information about its status.</p>
<h2>A Minimal Development Template</h2>
<div lang="en">In order to demonstrate the various drawing concepts as clearly as possible, all of the examples you&#8217;re about to see will plug right in to the following minimal HTML page. Although you&#8217;re encouraged to download the entire toolkit eventually, so you have full access to the source code whenever you need it, let&#8217;s take advantage of the version that&#8217;s hosted on AOL&#8217;s Content Delivery Network, as it&#8217;s quicker to get up and running. The latest version of Dojo at the time of this writing is 1.2, so the minimal effort to put Dojo to work is the following page, which uses a script tag to cross-domain load the toolkit:</p>
<pre>&lt;html&gt;
  &lt;head&gt;
      &lt;title&gt;Minimal Development Template&lt;/title&gt;
      &lt;script
          type="text/javascript"
          src="http://o.aolcdn.com/dojo/1.2/dojo/dojo.xd.js"&gt;
      &lt;/script&gt;
      &lt;script type="text/javascript"&gt;
          dojo.addOnLoad(function() {
              /*Add Dojo-dependent logic
                here to avoid race conditions*/
          });
      &lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre>
<p>With the minimal template in place, it is trivial to load the gfx module and start drawing. The next section digs right in to various aspects of the API, but just so you can see where we&#8217;re heading, consider the modification to the template that instantiates a 600&#215;600 pixel drawing surface and draws a line from the upper-left corner to the lower-right corner shown in Listing 1.</p></div>
<div lang="en">
<div>
<p><em>Listing 1: A Minimal Development Template</em><strong><br />
</strong></p>
<pre>&lt;html&gt;
  &lt;head&gt;
      &lt;title&gt;Square with a Diagonal Line&lt;/title&gt;
      &lt;script
          type="text/javascript"
          src="http://o.aolcdn.com/dojo/1.2/dojo/dojo.xd.js"&gt;
      &lt;/script&gt;
      &lt;script type="text/javascript"&gt;
          dojo.require("dojox.gfx");
          dojo.addOnLoad(function() {
              var node = dojo.byId("surface");
              var surface = dojox.gfx.createSurface(node, 600, 600);

              surface.createLine({
                  x1 : 0,
                  y1 : 0,
                  x2 : 600,
                  y2 : 600
              })
              .setStroke("black")
              ;
          });
      &lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
      &lt;div style="width:600;height:600;border:solid 1px"
       id="surface"&gt;&lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre>
</div>
<div>
<p style="text-align: center;"><img class="aligncenter" src="http://dojotdg.zaffra.com/wp-content/uploads/2009/03/minimalPage_line.png" alt="" width="150" height="150" /></p>
<div>
<p style="text-align: center;"><em>Figure 3. A 600&#215;600 Drawing Surface with a Diagonal Line Drawn through It</em></p>
</div>
</div>
<p>Although quite simple, the previous example taught us that the origin of the drawing surface is the upper-left corner with positive axes extending down and to the right, and that you can place a drawing surface into an arbitrary page element. Although not directly stated, the latter implies that you can have multiple drawing surfaces on a single page.</p>
<p>It&#8217;s also worth noting that the style applied to the div element in no way applies to the gfx surface that is created. Internally, what happens is that the surface is created and placed inside of the div; thus, the containing div exhibits a 600&#215;600 size with a visible border around it, and the surface that is placed into the div just so happened to be 600&#215;600 pixels also. Without using Firebug to inspect the DOM, that may not have been obvious, so hopefully, mentioning it here avoids any confusion.</p>
<p>An additional aspect of this simple demonstration that&#8217;s important to note is that the browser was detected and a default drawing renderer was assigned automatically without any special intervention. In the case of a Gecko- or KHTML-based browser, like Firefox or Konqueror, SVG is used as the default renderer; Internet Explorer defaults to VML.</p>
<div><img class="aligncenter" src="http://dojotdg.zaffra.com/wp-content/uploads/2009/03/gfx_shim.png" alt="" width="340" height="86" /></p>
<div>
<p style="text-align: center;"><em>Figure 4. The gfx library&#8217;s flexible design provides a uniform API that supplies a uniform abstraction on top of the most common drawing engines in the mainstream. Because it internally detects the drawing engine that&#8217;s available, it works right out of the box.</em></p>
</div>
</div>
<p><span style="text-decoration: underline;">Silverlight and Canvas can be configured to run on supported platforms via a gfxRenderer configuration switch supplied to djConfig via the script tag that loads Dojo into the page.</span> For example, to instruct Firefox to use Canvas as the renderer you would provide the following script tag:</p>
<pre>&lt;script
    type="text/javascript"
    djConfig="gfxRenderer:'canvas'"
    src="http://o.aolcdn.com/dojo/1.2/dojo/dojo.xd.js"&gt;
&lt;/script&gt;</pre>
</div>
<div lang="en">
<div>
<div>
<h2>All Shapes and Sizes</h2>
</div>
</div>
<p>The gfx API exposes a number of intuitive functions for common operations, such as creating rectangles, circles, lines, polylines and paths that are loosely based on the SVG standard as well as a set of custom attributes, such as stroke, fill color, rounded corners and more. Most of the methods support “chaining syntax”, which allows you to operate on the results of the previous operation repeatedly, leading to crisp code and clean syntax, so long as you do not abuse the device (Listing 2).</p></div>
<div lang="en">
<div>
<p><em>Listing 2. An Assortment of Shapes</em></p>
<pre>dojo.addOnLoad(function() {
    var node = dojo.byId("surface");
    var surface = dojox.gfx.createSurface(node, 600, 600);

    surface.createEllipse({
        cx : 300,
        cy : 300,
        rx  : 50,
        ry  : 100
    })
    .setFill("yellow")
    ;

    surface.createRect({
        x : 90,
        y : 90,
        width : 50,
        height : 170
    })
    .setFill([255,0,0,0.5])
    ;

    surface.createCircle({
        cx : 400,
        cy : 200,
        r  : 50
    })
    .setFill([255,0,0,0.5]);

    surface.createCircle({
        cx : 425,
        cy : 225,
        r  : 50
    })
    .setFill([0,255,0,0.5])
    ;

    surface.createCircle({
        cx : 425,
        cy : 175,
        r  : 50
    })
    .setFill([0,0,255,0.5])
    ;

    surface.createPolyline([
            100,400,
            200,300,
            350,350,
            500,350
    ])
    .setStroke({
        width : 10,
        join : "round",
        cap : "round"
    })
    ;

    surface.createCircle({
        r : 50,
        cx : 200,
        cy: 200
    })
    .setFill({
        type: "radial",
        cx : 200,
        cy: 200,
        r:50,
        colors: [
            {color:"white",offset:0},
            {color:"red",offset:1}]
    })
    ;
});</pre>
</div>
<div>
<p style="text-align: center;"><img class="aligncenter" src="http://dojotdg.zaffra.com/wp-content/uploads/2009/03/shapes.png" alt="" width="250" height="250" /></p>
<div>
<p><em>Figure 5. Dojo&#8217;s fairly intuitive gfx API makes drawing a variety of customized elements easy and fun.</em></div>
</div>
<p>Hopefully, the code mostly speaks for itself. The various types of objects that you can create are usually framed in the same way that they are presented in grade school. For example, a circle has a center point and a radius defined by cx, cy and r. Given a circle, you could set a fill color in a number of different ways: a string value, an rgb(a) tuple or even something more complex like a radial gradient with custom parameters of its own.</p></div>
<div lang="en">
<div>
<div>
<h2>3&#215;3 Matrix Transforms</h2>
</div>
</div>
<p>Using a well-designed API with nice mnemonic devices is useful for much of the routine drawing you&#8217;ll be doing, but what about when you need to do something a lot more in depth? Although this is where a lot of JavaScript graphics libraries fall short, gfx absolutely shines here by equipping you with the ability to perform arbitrary 3&#215;3 matrix transformations.</p>
<p><span style="text-decoration: underline;">Just in case you don&#8217;t have a background with graphics, it may not be immediately apparent how 3&#215;3 matrices and “all of that math” is useful.</span> Basically, 3&#215;3 matrices provide a compact way to express the three common operations that you do with objects all at the same time:</p>
<div>
<ul type="disc">
<li>Translation: adjusting the position of an object in the x and y directions.</li>
<li>Rotation: adjusting the position of an object in the clockwise or counterclockwise directions usually (but not necessarily) around its center point.</li>
<li>Scaling: adjusting the size of an object by a scalar multiplier.</li>
</ul>
</div>
<p>Don&#8217;t freak out quite yet if you&#8217;re not a math buff and don&#8217;t want to sink time into re-learning linear algebra just to get started with that great idea you had for a game or drawing application. Many of the common operations for manipulating shapes come with intuitive wrappers. To illustrate a trivial example, let&#8217;s assume that you want to draw a square but then rotate it around its center point so that it looks like a diamond:</p>
<pre>dojo.addOnLoad(function() {
    var node = dojo.byId("surface");
    var surface = dojox.gfx.createSurface(node, 600, 600);

    rect1 = surface.createRect({
        x: 200,
        y: 200,
        width : 200,
        height:200
    })
    .setFill("red")
    .setTransform([dojox.gfx.matrix.rotategAt(45,300,300)])
    ;
});</pre>
<p>With an upper-left corner at point (200,200) and a width and height of 200 pixels, the square originally was centered on the surface. Then, applying a 45-degree rotation around the square&#8217;s center point of (300,300) rotated it in place.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://dojotdg.zaffra.com/wp-content/uploads/2009/03/diamong.png" alt="" width="250" height="250" /></p>
<div>
<div>
<p style="text-align: center;"><em>Figure 6. The effect of drawing a square and rotating 45 degrees around its center point.</em></p>
</div>
</div>
<p>To illustrate the effect of successively applying transformation matrices, let&#8217;s draw the very same diamond but rely on explicit translation to position it in the center of the surface before rotating it versus positioning it via the createRect function:</p>
<pre>dojo.addOnLoad(function() {
    var node = dojo.byId("surface");
    var surface = dojox.gfx.createSurface(node, 600, 600);

    rect1 = surface.createRect({
        /* x and y default to (0,0) */
        width : 200,
        height:200
    })
    .setFill("red")
    .setTransform([
        dojox.gfx.matrix.translate(200,200),
        dojox.gfx.matrix.rotategAt(45,100,100)
    ])
    ;
});</pre>
<p>In general, it is immensely more convenient to draw most shapes initially in a coordinate system with perpendicular x and y axes and then apply final positioning via translation and rotation. An important technicality to be aware of with successive transformations, however, is that the order in which the transforms are applied does matter, and the original position of the object is normally the point of reference. For instance, in the previous example, the shape explicitly was translated as 200 pixels in the x and y directions, but its original center point from before the translation is applied serves as the basis of rotation.</p>
<p>If you&#8217;re unconvinced that a shape as simple as a diamond would benefit much from the convenience of matrix transforms, just consider the extra work involved in calculating the exact coordinates for its corners, and you&#8217;ll quickly see that it&#8217;s easier to reason about “rotated squares” than it is about “native diamonds”.</p></div>
<div lang="en">
<div>
<div>
<h2>Manipulating Groups</h2>
</div>
</div>
<p>It won&#8217;t be long before you&#8217;ll find that it&#8217;s far more convenient to transform entire groups of objects instead of applying individual transforms to each object in the group. Let&#8217;s consider the task of drawing a simple arrow that is nothing more than a line with a triangle on the end of it. Although you could use a path to construct the entire arrow, take a look at how groups can be useful by combining the results from the createLine function and the createPath function (Listing 3).</p></div>
<div lang="en">
<div>
<p><em>Listing 3. Arrows in All Four Quadrants</em></p>
<pre>dojo.addOnLoad(function() {
    var node = dojo.byId("surface");
    var surface = dojox.gfx.createSurface(node, 600, 600)

    function drawArrow(p) {
        /////////////////////////////////////////////////////
        //Create a group that can be manipulated as a whole
        /////////////////////////////////////////////////////
        var group = surface.createGroup();

        var x1 = p.start.x,
            y1=p.start.y,
            x2 = p.end.x,
            y2=p.end.y;

        var len = Math.sqrt(Math.pow(x2-x1,2) + Math.pow(y2-y1,2));

        var _defaultStroke = {
            color : "black",
            style : "solid",
            width : 1
        };

        ///////////////////////////
        //Add a line to the group
        ///////////////////////////
        group.createLine({
            x1 : 0,
            y1 : 0,
            x2 : 0+len,
            y2 : 0
        })
        .setStroke(p.stroke || _defaultStroke)
        ;

        var _arrowHeight = p.arrowHeight || 5;
        var _arrowWidth = p.arrowWidth || 3;

        /////////////////////////////////////////////////////
        //Add a custom path that is a triangle to the group
        /////////////////////////////////////////////////////
        group.createPath()
        .moveTo(len-_arrowHeight,0)
        .lineTo(len-_arrowHeight,-_arrowWidth)
        .lineTo(len,0)
        .lineTo(len-_arrowHeight,_arrowWidth)
        .lineTo(len-_arrowHeight,0)
        .setStroke(p.stroke || _defaultStroke)
        .setFill(p.stroke ? p.stroke.color : "black" )
        ;

        var _rot = Math.asin((y2-y1)/len)*180/Math.PI;
        if (x2 &lt;= x1) {_rot = 180-_rot;}

        /////////////////////////////////////////////////////////////
        //Translate and rotate the entire group as a whole
        /////////////////////////////////////////////////////////////
        group.setTransform([
            dojox.gfx.matrix.translate(x1,y1),
            dojox.gfx.matrix.rotategAt(_rot,0,0)
        ]);
    }

    //diagonals
    drawArrow({start: {x:300,y:300}, end: {x : 435, y : 435}});
    drawArrow({start: {x:300,y:300}, end: {x : 165, y : 165}});
    drawArrow({start: {x:300,y:300}, end: {x : 435, y : 165}});
    drawArrow({start: {x:300,y:300}, end: {x : 165, y : 435}});

    //up, down, left, right
    drawArrow({start: {x:300,y:300}, end: {x : 300, y : 450}});
    drawArrow({start: {x:300,y:300}, end: {x : 300, y : 150}});
    drawArrow({start: {x:300,y:300}, end: {x : 150, y : 300}});
    drawArrow({start: {x:300,y:300}, end: {x : 450, y : 300}});
});</pre>
</div>
<p>Attempting to calculate the three points for each of the arrows without the benefit of rotation quickly demonstrates just how laborious high-school geometry really can be; perhaps putting it to work with gfx makes it at least a little more interesting.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://dojotdg.zaffra.com/wp-content/uploads/2009/03/arrows.png" alt="" width="250" height="250" /></p>
<div>
<div>
<p style="text-align: center;"><em>Figure 7. It&#8217;s generally a bit easier to think in terms of objects that have been rotated than trying to determine exact coordinates for shapes that don&#8217;t fit nicely into a simple perpendicular frame of reference.</em></p>
</div>
</div>
</div>
<div lang="en">
<div>
<div>
<h2>Drag-and-Droppable Dominoes</h2>
</div>
</div>
<p>Because it&#8217;s so common to want to interact with graphics, Dojo&#8217;s gfx library has gone a long way to do most of the legwork for you in this use case as well. To wrap up some aspects of drawing, let&#8217;s put together a little demonstration that draws a domino on the screen and then add drag-and-drop capabilities to it. As you&#8217;re about to see, the laborious part of the effort is actually drawing something interesting enough that you&#8217;d actually want to drag and drop it. The actual mechanics of making it drag-and-droppable amounts to <span><em>one whole line of code</em></span>.</div>
<div lang="en">
<div>
<p><em>Listing 4. Drag-and-Drappable Dominoes</em></p>
<pre>&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;Dominoes!&lt;/title&gt;
    &lt;script type="text/javascript"
        src="http://o.aolcdn.com/dojo/1.2/dojo/dojo.xd.js"&gt;
    &lt;/script&gt;
    &lt;script type="text/javascript"&gt;
           dojo.require("dojox.gfx");
            dojo.require("dojox.gfx.move");

            dojo.addOnLoad(function() {
                var node = dojo.byId("surface");
                var surface = dojox.gfx.createSurface(node, 600, 300);

                /* Using some sane ratios for layout, construct a domino */
                function drawDomino(surface,x,y,num1,num2,_width) {

                    var surface = surface.createGroup();

                    var _width = _width || 200;

                    _height = 2*_width, _r = _width/20;

                    //draw an empty domino...
                    var rect1 = surface.createRect({
                        x : x,
                        y : y,
                        width : _width,
                        height : _height,
                        r : _r
                    })
                    .setStroke("black")
                    .setFill("black")
                    ;
                    var rect2 = surface.createRect({
                        x : x+ _r/2,
                        y : y+ _r/2,
                        width : _width -_r,
                        height :_height -_r,
                        r : _r
                    })
                    .setStroke({width: _r/4, color: "white"})
                    ;

                    var line = surface.createLine({
                        x1 : x + _r/2,
                        y1 : y+_height/2,
                        x2 : x+ _width - _r/2,
                        y2 : y+_height/2,
                    })
                    .setStroke({width: _r/4, color: "white"})
                    ;

                    //now, fill in the dots

                    //numbers 1,3,5 have dots in the center
                    if (num1 == 1 || num1 == 3 || num1 == 5) {
                        surface.createCircle({
                            cx : x+_width/2,
                            cy : y+_height/4,
                            r : _width/10
                        })
                        .setStroke("white")
                        .setFill("white")
                        ;
                    }
                    if (num2 == 1 || num2 == 3 || num2 == 5) {
                        surface.createCircle({
                            cx : x+_width/2,
                            cy : y+_height/4*3,
                            r : _width/10
                        })
                        .setStroke("white")
                        .setFill("white")
                        ;
                    }

                    //numbers &gt;= 2 have two of the corners filled in
                    if (num1 &gt;= 2) {
                        surface.createCircle({
                            cx : x+_width/6*5,
                            cy : y+_height/12,
                            r : _width/10
                        })
                        .setStroke("white")
                        .setFill("white")
                        ;
                        surface.createCircle({
                            cx : x+_width/6,
                            cy : y+_height/12*5,
                            r : _width/10
                        })
                        .setStroke("white")
                        .setFill("white")
                        ;

                    }
                    if (num2 &gt;= 2) {
                        surface.createCircle({
                            cx : x+_width/6*5,
                            cy : y+_height/12*7,
                            r : _width/10
                        })
                        .setStroke("white")
                        .setFill("white")
                        ;
                        surface.createCircle({
                            cx : x+_width/6,
                            cy : y+_height/12*11,
                            r : _width/10
                        })
                        .setStroke("white")
                        .setFill("white")
                        ;
                    }

                    //numbers &gt;=4 have the other two corners filled in
                    if (num1 &gt;= 4) {
                        surface.createCircle({
                            cx : x+_width/6,
                            cy : y+_height/12,
                            r : _width/10
                        })
                        .setStroke("white")
                        .setFill("white")
                        ;
                        surface.createCircle({
                            cx : x+_width/6*5,
                            cy : y+_height/12*5,
                            r : _width/10
                        })
                        .setStroke("white")
                        .setFill("white")
                        ;
                    }
                    if (num2 &gt;= 4) {
                        surface.createCircle({
                            cx : x+_width/6,
                            cy : y+_height/12*7,
                            r : _width/10
                        })
                        .setStroke("white")
                        .setFill("white")
                        ;
                        surface.createCircle({
                            cx : x+_width/6*5,
                            cy : y+_height/12*11,
                            r : _width/10
                        })
                        .setStroke("white")
                        .setFill("white")
                        ;
                    }

                    //number 6 has the sides filled in
                    if (num1 == 6) {
                        surface.createCircle({
                            cx : x+_width/6,
                            cy : y+_height/4,
                            r : _width/10
                        })
                        .setStroke("white")
                        .setFill("white")
                        ;
                        surface.createCircle({
                            cx : x+_width/6*5,
                            cy : y+_height/4,
                            r : _width/10
                        })
                        .setStroke("white")
                        .setFill("white")
                        ;
                    }
                    if (num2 == 6) {
                        surface.createCircle({
                            cx : x+_width/6,
                            cy : y+_height/4*3,
                            r : _width/10
                        })
                        .setStroke("white")
                        .setFill("white")
                        ;
                        surface.createCircle({
                            cx : x+_width/6*5,
                            cy : y+_height/4*3,
                            r : _width/10
                        })
                        .setStroke("white")
                        .setFill("white")
                        ;
                    }

                    return surface;
                }

                var width=50,
                    padding=50;

                for (var i=0; i &lt;= 6; i++) {
                    var d = drawDomino(
                        surface,
                        i*75+padding,
                        2*padding,
                        i,
                        Math.floor(Math.random()*7),
                        width
                    );

                    ////////////////////////////////////////////
                    //This is all it takes to make the group
                    //drag-and-droppable!
                    ////////////////////////////////////////////
                    new dojox.gfx.Moveable(d);
                }

                ////////////////////////////////////////////
                //Ensure that the last domino moved is always on top
                //by subscribing to move notifications and
                //adjusting the z-index
                ////////////////////////////////////////////
                dojo.subscribe("/gfx/move/start", function(m) {
                    m.shape.moveToFront();
                });

            });

    &lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div id="surface"
     style="position:absolute;width:600;height:300;border:solid1px;"&gt;
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre>
</div>
<div>
<div>
<p style="text-align: center;"><img class="aligncenter" src="http://dojotdg.zaffra.com/wp-content/uploads/2009/03/dominos.png" alt="" width="303" height="153" /></p>
<p style="text-align: center;"><em>Figure 8. With the logic to draw the drag-and-droppable dominoes in place, now all that&#8217;s left is to write some game logic. (An exercise for the most interested of readers.)</em></p>
</div>
</div>
</div>
<div lang="en">
<div>
<div>
<h2>Charting: gfx on Steroids</h2>
</div>
</div>
<p>Perhaps the ultimate test of an API is a few good examples of what you can build with it. <span style="text-decoration: underline;">One of the ultimate demonstrations of gfx&#8217;s flexibility and power is Dojo&#8217;s charting library, another DojoX subproject.</span> A comprehensive introduction of the charting library would entail an article of its own, so until that time comes, you can find some great documentation on Dojo charting from the Dojo Key Links page. And, of course, you always can read over the source, which is located in the dojox.charting module of the toolkit&#8217;s source code, if you want to get an idea of how much work goes into aligning labels, drawing tick marks and so on.</p>
<p>In addition to equipping you with many of the basic charts you&#8217;d want to use in a Web application, charting recently got a boost with a number of cool new features, including event support so that custom tooltips and animations can occur within charts—that kind of visual flair makes all the difference. To give you an idea of just how easy the charting API is to get up and running, consider the code blurb in Listing 5 that shows how to create a chart.</p></div>
<div lang="en">
<div>
<p><em>Listing 5. Preview of Dojo&#8217;s Charting API</em></p>
<pre>//////////////////////////////////////////////////////
// This function demonstrates the general form of
// putting Dojo's charting API built on top of
// gfx to use. Pass in a node, customize the chart,
// and let Dojo take care of the rest
//////////////////////////////////////////////////////
new dojox.charting.Chart2D(node))
    .setTheme(dojox.charting.themes.PlotKit.blue)
    .addPlot("default", {
        type: "Default",
        lines: true,
        markers: true,
        tension: 2
    })
    .addAxis("x", {
        min: 0,
        max: 6,
        majorTick: { stroke: "black", length: 3 },
        minorTick: { stroke: "gray", length: 3 }
    })
    .addAxis("y", {
        vertical: true,
        min: 0,
        max: 10,
        majorTick: { stroke: "black", length: 3 },
        minorTick: { stroke: "gray", length: 3 }
    })
    .addSeries("Series A", [
        { x: 0.5, y: 5 },
        { x: 1.5, y: 1.5 },
        { x: 2, y: 9 },
        { x: 5, y: 0.3 }
    ])
    .addSeries("Series B", [
        { x: 0.3, y: 8 },
        { x: 4, y: 6 },
        { x: 5.5, y: 2 }
    ])
    .render()
    ;</pre>
</div>
<div>
<div>
<p><img class="aligncenter" src="http://dojotdg.zaffra.com/wp-content/uploads/2009/03/chart1.png" alt="" width="389" height="268" /></p>
<p style="text-align: center;"><em>Figure 9. An example of the charts you can draw with Dojo—no Flash required!</em></p>
</div>
</div>
<div>
<div>
<p style="text-align: center;"><img class="aligncenter" src="http://dojotdg.zaffra.com/wp-content/uploads/2009/03/chart2.png" alt="" width="391" height="237" /></p>
<p style="text-align: center;"><em>Figure 10. Another Example Chart Drawn with Dojo</em></p>
</div>
</div>
<p>Although only a teaser, it&#8217;s worthwhile to note the charting API focus on charting—not on raw drawing operations—so you can focus on the semantics of the task at hand instead of the implementation details associated with lower-level operations. In general, you simply provide some data that says what kind of chart you&#8217;d like, how to customize the axes and pass in the series data. Setting up event handlers, legends and other related things all work much the same way.</p></div>
<div lang="en">
<div>
<div>
<h2>There&#8217;s Plenty More Where That Came From</h2>
</div>
</div>
<p>2-D drawing is an enormous topic in and of itself, and no single article could cover all the nooks and crannies adequately. This article is designed to give you an idea of just how easy Dojo makes 2-D for the Web, which hopefully motivates you to start experimenting with the examples and check out the API docs.</p></div>
<div lang="en">
<div>
<h2>Resources</h2>
<ul>
<li>“Dojo: the JavaScript Toolkit with Industrial-Strength Mojo” by Matthew Russell, <span><em>LJ</em></span>, July 2008: <a href="http://www.linuxjournal.com/article/9900" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.linuxjournal.com');" target="_blank">www.linuxjournal.com/article/9900</a></li>
</ul>
<ul>
<li>The Dojo Toolkit: <a href="http://dojotoolkit.org" onclick="javascript:pageTracker._trackPageview('/outbound/article/dojotoolkit.org');" target="_blank">dojotoolkit.org</a></li>
</ul>
<ul>
<li>The gfx API Documentation: <a href="http://docs.google.com/View?docid=d764479_1hnb2tn" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');" target="_blank">docs.google.com/View?docid=d764479_1hnb2tn</a></li>
</ul>
<ul>
<li>Reflection with gfx: <a href="http://dojotdg.com/2008/09/a-simple-degradable-reflection-widget" onclick="javascript:pageTracker._trackPageview('/outbound/article/dojotdg.com');" target="_blank">dojotdg.com/2008/09/a-simple-degradable-reflection-widget</a></li>
</ul>
<ul>
<li>Overview of Transformation Matrices: <a href="http://en.wikipedia.org/wiki/Transformation_matrix" onclick="javascript:pageTracker._trackPageview('/outbound/article/en.wikipedia.org');" target="_blank">en.wikipedia.org/wiki/Transformation_matrix</a></li>
</ul>
<ul>
<li>Custom Fonts with gfx: <a href="http://www.sitepen.com/blog/2008/09/08/custom-fonts-with-dojoxgfx" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.sitepen.com');" target="_blank">www.sitepen.com/blog/2008/09/08/custom-fonts-with-dojoxgfx</a></li>
</ul>
<ul>
<li><span><em>Dojo: The Definitive Guide</em></span> (O&#8217;Reilly, June 2008): <a href="http://oreilly.com/catalog/9780596516482" onclick="javascript:pageTracker._trackPageview('/outbound/article/oreilly.com');" target="_blank">oreilly.com/catalog/9780596516482</a></li>
</ul>
<ul>
<li>Dojo Campus: <a href="http://dojocampus.org" onclick="javascript:pageTracker._trackPageview('/outbound/article/dojocampus.org');" target="_blank">dojocampus.org</a></li>
</ul>
<ul>
<li>Dojo Key Links: <a href="http://dojotoolkit.org/key-links" onclick="javascript:pageTracker._trackPageview('/outbound/article/dojotoolkit.org');" target="_blank">dojotoolkit.org/key-links</a></li>
</ul>
<ul>
<li>Dojo Foundation: <a href="http://dojofoundation.org" onclick="javascript:pageTracker._trackPageview('/outbound/article/dojofoundation.org');" target="_blank">dojofoundation.org</a></li>
</ul>
</div>
</div>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Dojo%2C+Now+With+Drawing+Tools+%28Linux+Journal+Reprint%29+http://g6gpk.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/twitter.com');" title="Post to Twitter"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="[Post to Twitter]" border="0" /></a>&nbsp; <a class="tt" href="http://plurk.com/?status=Dojo%2C+Now+With+Drawing+Tools+%28Linux+Journal+Reprint%29+http://g6gpk.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/plurk.com');" title="Post to Plurk"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-plurk.png" alt="[Post to Plurk]" border="0" /></a>&nbsp; <a class="tt" href="http://buzz.yahoo.com/submit?submitUrl=http://dojotdg.zaffra.com/2009/03/dojo-now-with-drawing-tools-linux-journal-reprint/&amp;submitHeadline=Dojo%2C+Now+With+Drawing+Tools+%28Linux+Journal+Reprint%29" onclick="javascript:pageTracker._trackPageview('/outbound/article/buzz.yahoo.com');" title="Post to Yahoo Buzz"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-buzz.png" alt="[Post to Yahoo Buzz]" border="0" /></a>&nbsp; <a class="tt" href="http://delicious.com/post?url=http://dojotdg.zaffra.com/2009/03/dojo-now-with-drawing-tools-linux-journal-reprint/&amp;title=Dojo%2C+Now+With+Drawing+Tools+%28Linux+Journal+Reprint%29" onclick="javascript:pageTracker._trackPageview('/outbound/article/delicious.com');" title="Post to Delicious"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="[Post to Delicious]" border="0" /></a>&nbsp; <a class="tt" href="http://digg.com/submit?url=http://dojotdg.zaffra.com/2009/03/dojo-now-with-drawing-tools-linux-journal-reprint/&amp;title=Dojo%2C+Now+With+Drawing+Tools+%28Linux+Journal+Reprint%29" onclick="javascript:pageTracker._trackPageview('/outbound/article/digg.com');" title="Post to Digg"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="[Post to Digg]" border="0" /></a>&nbsp; <a class="tt" href="http://ping.fm/ref/?method=microblog&amp;title=Dojo%2C+Now+With+Drawing+Tools+%28Linux+Journal+Reprint%29&amp;link=http://dojotdg.zaffra.com/2009/03/dojo-now-with-drawing-tools-linux-journal-reprint/" onclick="javascript:pageTracker._trackPageview('/outbound/article/ping.fm');" title="Post to Ping.fm"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-ping.png" alt="[Post to Ping.fm]" border="0" /></a>&nbsp; <a class="tt" href="http://reddit.com/submit?url=http://dojotdg.zaffra.com/2009/03/dojo-now-with-drawing-tools-linux-journal-reprint/&amp;title=Dojo%2C+Now+With+Drawing+Tools+%28Linux+Journal+Reprint%29" onclick="javascript:pageTracker._trackPageview('/outbound/article/reddit.com');" title="Post to Reddit"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="[Post to Reddit]" border="0" /></a>&nbsp; <a class="tt" href="http://stumbleupon.com/submit?url=http://dojotdg.zaffra.com/2009/03/dojo-now-with-drawing-tools-linux-journal-reprint/&amp;title=Dojo%2C+Now+With+Drawing+Tools+%28Linux+Journal+Reprint%29" onclick="javascript:pageTracker._trackPageview('/outbound/article/stumbleupon.com');" title="Post to StumbleUpon"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-su.png" alt="[Post to StumbleUpon]" border="0" /></a>&nbsp; </p>]]></content:encoded>
			<wfw:commentRss>http://dojotdg.zaffra.com/2009/03/dojo-now-with-drawing-tools-linux-journal-reprint/feed/</wfw:commentRss>
		</item>
		<item>
		<title>For You Twitterers Out There</title>
		<link>http://dojotdg.zaffra.com/2009/03/for-you-twitterers-out-there/</link>
		<comments>http://dojotdg.zaffra.com/2009/03/for-you-twitterers-out-there/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 01:30:56 +0000</pubDate>
		<dc:creator>Matthew Russell</dc:creator>
		
		<category><![CDATA[News]]></category>

		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://dojotdg.zaffra.com/?p=168</guid>
		<description><![CDATA[This is just a quick note for you twitterers out there: you can now follow dojotdg if that&#8217;s a more convenient way to keep up with new happenings than keeping an eye on your feed reader.
While we&#8217;re talking about Twitter, I might also add that you should take a moment to follow dojotoolkit if you&#8217;re [...]]]></description>
			<content:encoded><![CDATA[<p>This is just a quick note for you twitterers out there: you can now follow <a href="http://twitter.com/dojotdg" onclick="javascript:pageTracker._trackPageview('/outbound/article/twitter.com');" target="_blank"><em>dojotdg</em></a> if that&#8217;s a more convenient way to keep up with new happenings than keeping an eye on your feed reader.</p>
<p>While we&#8217;re talking about Twitter, I might also add that you should take a moment to follow <a href="http://twitter.com/dojotoolkit" onclick="javascript:pageTracker._trackPageview('/outbound/article/twitter.com');"><em>dojotoolkit</em></a> if you&#8217;re not already doing so. Whereas <em>dojotdg</em> is who you&#8217;d follow for specific content that&#8217;s somehow related to my book and posted here on this blog, <em>dojotoolkit</em> is who you&#8217;d follow for &#8220;all things Dojo&#8221;. There&#8217;s potentially some overlap there, so follow both of us, and call it good.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=For+You+Twitterers+Out+There+http://q82bx.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/twitter.com');" title="Post to Twitter"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="[Post to Twitter]" border="0" /></a>&nbsp; <a class="tt" href="http://plurk.com/?status=For+You+Twitterers+Out+There+http://q82bx.th8.us" onclick="javascript:pageTracker._trackPageview('/outbound/article/plurk.com');" title="Post to Plurk"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-plurk.png" alt="[Post to Plurk]" border="0" /></a>&nbsp; <a class="tt" href="http://buzz.yahoo.com/submit?submitUrl=http://dojotdg.zaffra.com/2009/03/for-you-twitterers-out-there/&amp;submitHeadline=For+You+Twitterers+Out+There" onclick="javascript:pageTracker._trackPageview('/outbound/article/buzz.yahoo.com');" title="Post to Yahoo Buzz"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-buzz.png" alt="[Post to Yahoo Buzz]" border="0" /></a>&nbsp; <a class="tt" href="http://delicious.com/post?url=http://dojotdg.zaffra.com/2009/03/for-you-twitterers-out-there/&amp;title=For+You+Twitterers+Out+There" onclick="javascript:pageTracker._trackPageview('/outbound/article/delicious.com');" title="Post to Delicious"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="[Post to Delicious]" border="0" /></a>&nbsp; <a class="tt" href="http://digg.com/submit?url=http://dojotdg.zaffra.com/2009/03/for-you-twitterers-out-there/&amp;title=For+You+Twitterers+Out+There" onclick="javascript:pageTracker._trackPageview('/outbound/article/digg.com');" title="Post to Digg"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="[Post to Digg]" border="0" /></a>&nbsp; <a class="tt" href="http://ping.fm/ref/?method=microblog&amp;title=For+You+Twitterers+Out+There&amp;link=http://dojotdg.zaffra.com/2009/03/for-you-twitterers-out-there/" onclick="javascript:pageTracker._trackPageview('/outbound/article/ping.fm');" title="Post to Ping.fm"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-ping.png" alt="[Post to Ping.fm]" border="0" /></a>&nbsp; <a class="tt" href="http://reddit.com/submit?url=http://dojotdg.zaffra.com/2009/03/for-you-twitterers-out-there/&amp;title=For+You+Twitterers+Out+There" onclick="javascript:pageTracker._trackPageview('/outbound/article/reddit.com');" title="Post to Reddit"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="[Post to Reddit]" border="0" /></a>&nbsp; <a class="tt" href="http://stumbleupon.com/submit?url=http://dojotdg.zaffra.com/2009/03/for-you-twitterers-out-there/&amp;title=For+You+Twitterers+Out+There" onclick="javascript:pageTracker._trackPageview('/outbound/article/stumbleupon.com');" title="Post to StumbleUpon"><img class="nothumb" src="http://dojotdg.zaffra.com/wp-content/plugins/tweet-this/icons/tt-su.png" alt="[Post to StumbleUpon]" border="0" /></a>&nbsp; </p>]]></content:encoded>
			<wfw:commentRss>http://dojotdg.zaffra.com/2009/03/for-you-twitterers-out-there/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
