<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Eric Wendelin's Blog</title>
	
	<link>http://eriwen.com</link>
	<description>Programming productively with open-source tools</description>
	<lastBuildDate>Tue, 13 Jul 2010 13:14:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/EricWendelin" /><feedburner:info uri="ericwendelin" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>39.929566</geo:lat><geo:long>-104.949317</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by/2.0/</creativeCommons:license><feedburner:emailServiceId>EricWendelin</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Testing your Hadoop jobs with MRUnit</title>
		<link>http://feedproxy.google.com/~r/EricWendelin/~3/bnqWQfUK4Zc/</link>
		<comments>http://eriwen.com/hadoop/testing-with-mrunit/#comments</comments>
		<pubDate>Thu, 20 May 2010 11:00:37 +0000</pubDate>
		<dc:creator>Eric Wendelin</dc:creator>
				<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://eriwen.com/?p=1137</guid>
		<description><![CDATA[Last Tuesday I gave a short presentation at the new <a href="http://www.meetup.com/Boulder-Denver-Hadoop/" title="Meetup.com Boulder Hadoop">Boulder Hadoopers Group</a> about testing Hadoop jobs with MRUnit. You will have to know what <a href="http://hadoop.apache.org/">Hadoop</a> is and how to read <a href="http://groovy.codehaus.org/" title="Groovy programming language">Groovy</a> code to fully understand it. I am including the important notes on the slides as well.



Related posts:<ol><li><a href='http://eriwen.com/javascript/stacktrace-update/' rel='bookmark' title='Permanent Link: Javascript Stacktrace update'>Javascript Stacktrace update</a></li>
<li><a href='http://eriwen.com/opinion/war-of-benefits/' rel='bookmark' title='Permanent Link: Software Engineering and the war of benefits'>Software Engineering and the war of benefits</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Last Tuesday I gave a short presentation at the new <a href="http://www.meetup.com/Boulder-Denver-Hadoop/" title="Meetup.com Boulder Hadoop">Boulder Hadoopers Group</a> about testing Hadoop jobs with MRUnit. You will have to know what <a href="http://hadoop.apache.org/">Hadoop</a> is and how to read <a href="http://groovy.codehaus.org/" title="Groovy programming language">Groovy</a> code to fully understand it. I am including the important notes on the slides as well.<br />
<!--00ab2f96e6414b06a0abf5321e153198--></p>
<div style="width:580px" id="__ss_4073730"><strong>If your browser doesn&#8217;t support flash, check out the <a href="http://www.slideshare.net/emwendelin/testing-hadoop-jobs-with-mrunit">slides at slideshare</a></strong><object id="__sse4073730" width="580" height="420"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=hadoop-joins-100512163936-phpapp02&#038;stripped_title=testing-hadoop-jobs-with-mrunit" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse4073730" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=hadoop-joins-100512163936-phpapp02&#038;stripped_title=testing-hadoop-jobs-with-mrunit" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="580" height="420"></embed></object></div>
<h2>Why use MRUnit?</h2>
<p>Testing a Hadoop job requires a lot of effort not related to the job. You must configure it to run locally, create a sample input file, run the job on your sample input, and then compare to an expected output file. This not only takes time, but makes your tests run very slow due to all the file I/O.</p>
<p><a href="http://archive.cloudera.com/docs/mrunit/index.html">MRUnit</a> is:</p>
<blockquote><p>a unit test library designed to facilitate easy integration between your MapReduce development process and standard development and testing tools such as JUnit</p></blockquote>
<p>With MRUnit, there are no test files to create, no configuration parameters to change, and generally less test code. You can cut the clutter and focus on the meat of your tests.</p>
<h2>The Good</h2>
<p>Hadoop tests are much simpler to write using MRUnit. Here&#8217;s an example of entire test class:</p>
<pre class="brush: groovy;">
class ExampleTest() {
  private Example.MyMapper mapper
  private Example.MyReducer reducer
  private MapReduceDriver driver

  @Before void setUp() {
    mapper = new Example.MyMapper()
    reducer = new Example.MyReducer()
    driver = new MapReduceDriver(mapper, reducer)
  }

  @Test void testMapReduce() {
    driver.withInput(new Text('key'), new Text('val'))
        .withOutput(new Text('foo'), new Text('bar'))
        .runTest()
  }
}
</pre>
<p>You can test map and reduce separately, of course. You can also easily verify counters:</p>
<pre class="brush: groovy; light: true;">
driver.withInput(...)
driver.run()

def counters = driver.getCounters()

assertEquals(1, counters.findCounter('foo', 'bar').getValue())
</pre>
<p>There&#8217;s a mess of other cool stuff like <em>MockReporter</em> and <em>MockInputSplit</em>, but I mostly haven&#8217;t found a use for them or time to make a simple example.</p>
<h2>The Bad</h2>
<p>Before I tell you to go grab the latest distribution, I want you to know some of the problems we&#8217;ve encountered in the &#8220;real-world&#8221;.</p>
<ol>
<li>First and foremost, MRUnit is <strong>not useful for streaming jobs</strong>. If you only write streaming map-reduce jobs, you&#8217;ll have to do it the old fashioned way</li>
<li>Calling <em>driver.runTest()</em> doesn&#8217;t tell you what the failure was (it just throws an AssertionError). Instead, call <em>def output = driver.run()</em> and assert</li>
<li>The <strong>documentation sucks</strong>. There&#8217;s only one example and the rest you basically have to figure out from the API</li>
<li><em>setup()</em> is called for the new Hadoop API (mapreduce packages) but not the old API (mapred packages). You have to call it yourself if you need it</li>
<li>Finally, tests reuse the same JVM. So <strong>if you&#8217;re accidentally maintaining state in your job, you will be bitten!</strong></li>
</ol>
<h2>Conclusion</h2>
<p>MRUnit makes writing tests for Hadoop easier. It has drawbacks, but they are far outweighed by the benefits.</p>
<p><strong><a href="http://archive.cloudera.com/docs/mrunit/index.html">Grab the latest MRUnit JAR</a></strong></p>
<p>By the way, here&#8217;s how you test a streaming job:</p>
<pre class="brush: plain; light: true;">
./myMapper.py &lt; test.input | sort | ./myReducer.py &gt; actual.out
diff expected.out actual.out
</pre>


<p>Related posts:<ol><li><a href='http://eriwen.com/javascript/stacktrace-update/' rel='bookmark' title='Permanent Link: Javascript Stacktrace update'>Javascript Stacktrace update</a></li>
<li><a href='http://eriwen.com/opinion/war-of-benefits/' rel='bookmark' title='Permanent Link: Software Engineering and the war of benefits'>Software Engineering and the war of benefits</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/EricWendelin?a=bnqWQfUK4Zc:IexZSL6FWA4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=bnqWQfUK4Zc:IexZSL6FWA4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=bnqWQfUK4Zc:IexZSL6FWA4:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/EricWendelin?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=bnqWQfUK4Zc:IexZSL6FWA4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=bnqWQfUK4Zc:IexZSL6FWA4:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=bnqWQfUK4Zc:IexZSL6FWA4:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/EricWendelin?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=bnqWQfUK4Zc:IexZSL6FWA4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=bnqWQfUK4Zc:IexZSL6FWA4:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/EricWendelin/~4/bnqWQfUK4Zc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://eriwen.com/hadoop/testing-with-mrunit/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://eriwen.com/hadoop/testing-with-mrunit/</feedburner:origLink></item>
		<item>
		<title>Book Review: MooTools 1.2 Beginner’s Guide</title>
		<link>http://feedproxy.google.com/~r/EricWendelin/~3/Rlw6r5iIrvg/</link>
		<comments>http://eriwen.com/books/mootools-1-2-beginners-guide/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 11:00:23 +0000</pubDate>
		<dc:creator>Eric Wendelin</dc:creator>
				<category><![CDATA[Books]]></category>

		<guid isPermaLink="false">http://eriwen.com/?p=1125</guid>
		<description><![CDATA[<img src="http://eriwen.com/images/mootools-beginners.png" alt="MooTools 1.2 Beginner's Guide cover" style="float: left; margin: 0 8px 8px 0; " />I have liked the works of Jacob Gube of <a href="http://sixrevisions.com">Six Revisions</a> and <a href="http://www.garrickcheung.com">Garrick Cheung</a> of the MooTools Community Team, so when <a href="http://www.packtpub.com">Packt Publishing</a> wanted me to review their book, I accepted. 

I hope authors, as well as readers, will gain some insights. Here is my review of <a href="http://www.packtpub.com/mootools-1-2-beginners-guide/book">MooTools 1.2 Beginner's Guide</a>.



Related posts:<ol><li><a href='http://eriwen.com/javascript/text-size-prefs/' rel='bookmark' title='Permanent Link: Guest Post: Save Text Size Preference Using MooTools and PHP'>Guest Post: Save Text Size Preference Using MooTools and PHP</a></li>
<li><a href='http://eriwen.com/css/color-palette-with-css-and-moo/' rel='bookmark' title='Permanent Link: Create a Color Palette Using CSS and MooTools 1.2'>Create a Color Palette Using CSS and MooTools 1.2</a></li>
<li><a href='http://eriwen.com/bookmarks/bookmarks-april-2008/' rel='bookmark' title='Permanent Link: This month in Bookmarks: April 2008'>This month in Bookmarks: April 2008</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://eriwen.com/images/mootools-beginners.png" alt="MooTools 1.2 Beginner's Guide cover" style="float: left; margin: 0 8px 8px 0; " />I have liked the works of Jacob Gube of <a href="http://sixrevisions.com">Six Revisions</a> and <a href="http://www.garrickcheung.com">Garrick Cheung</a> of the MooTools Community Team, so when <a href="http://www.packtpub.com">Packt Publishing</a> wanted me to review their book, I accepted. </p>
<p>I hope authors, as well as readers, will gain some insights. Here is my review of <a href="http://www.packtpub.com/mootools-1-2-beginners-guide/book">MooTools 1.2 Beginner&#8217;s Guide</a>.</p>
<h2>Book Structure</h2>
<p>The book basically takes you, step-by-step, through downloading the <a href="http://mootools.net">MooTools library</a> parts and building simple examples with HTML, CSS, and, of course, MooTools. It seems to touch on many of major parts of MooTools: Core, DOM selection, Events, Ajax, and Fx. Finally, it introduces you to MooTools More and how to write your own MooTools plugins. it approaches everything with <strong>very simple, very &#8220;hands-on&#8221; examples</strong>. There are some deviations (like pop quizzes), but they are few.</p>
<p>The examples themselves generally introduce a topic, give an HTML/CSS template and then progressively fill in the MooTools bits.</p>
<h2>The Good</h2>
<p>You can tell that the authors are bloggers by their very informal writing style. They know how to use simple language so that their writing does not impede the learning ability of the reader. I was able to read the entire book in about <strong>3 hours cover-to-cover, a testament to how easy-to-read it is</strong>. </p>
<p>This is a book that a real, never-coded-a-web-page-before dude(tte) could pick up and do something with immediately. </p>
<h2>The Bad</h2>
<p>It truly is a <strong>beginner&#8217;s</strong> guide, and having some sort of MooTools knowledge myself I was annoyed by the verboseness of the examples. There seemed to be a lot of times I was seeing a small code example stretched out to several pages of text. </p>
<p>I was slightly disappointed by the number of linguistic (spelling and grammar) mistakes throughout the book. These were obviously not cultural differences between the UK-based Packt and the US. I was always able to understand what the writer meant, but I kept getting hung up on the mistakes because that&#8217;s the kind of asshole I am ;)</p>
<p>I really <strong>missed a good reference or appendix section</strong> at the end where I could find links to more information about the parts of MooTools I was learning about. There was some stuff within the chapter texts, but not enough.</p>
<h2>You should buy this book if&#8230;</h2>
<p>&#8230; you are truly a beginning web developer. This book is a great introduction to web development with a core focus on MooTools. It seems to generally promote good web development practices in my opinion. </p>
<p>Conversely, this book is not great to use just for reference. If you want to lookup anything advanced, it&#8217;s not going to be your best bet. </p>
<p><a href="http://www.packtpub.com/mootools-1-2-beginners-guide/book">MooTools 1.2 Beginner&#8217;s Guide &raquo;</a></p>


<p>Related posts:<ol><li><a href='http://eriwen.com/javascript/text-size-prefs/' rel='bookmark' title='Permanent Link: Guest Post: Save Text Size Preference Using MooTools and PHP'>Guest Post: Save Text Size Preference Using MooTools and PHP</a></li>
<li><a href='http://eriwen.com/css/color-palette-with-css-and-moo/' rel='bookmark' title='Permanent Link: Create a Color Palette Using CSS and MooTools 1.2'>Create a Color Palette Using CSS and MooTools 1.2</a></li>
<li><a href='http://eriwen.com/bookmarks/bookmarks-april-2008/' rel='bookmark' title='Permanent Link: This month in Bookmarks: April 2008'>This month in Bookmarks: April 2008</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/EricWendelin?a=Rlw6r5iIrvg:Ekgn-XaslK0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=Rlw6r5iIrvg:Ekgn-XaslK0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=Rlw6r5iIrvg:Ekgn-XaslK0:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/EricWendelin?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=Rlw6r5iIrvg:Ekgn-XaslK0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=Rlw6r5iIrvg:Ekgn-XaslK0:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=Rlw6r5iIrvg:Ekgn-XaslK0:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/EricWendelin?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=Rlw6r5iIrvg:Ekgn-XaslK0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=Rlw6r5iIrvg:Ekgn-XaslK0:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/EricWendelin/~4/Rlw6r5iIrvg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://eriwen.com/books/mootools-1-2-beginners-guide/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://eriwen.com/books/mootools-1-2-beginners-guide/</feedburner:origLink></item>
		<item>
		<title>Leaving Sun/Oracle</title>
		<link>http://feedproxy.google.com/~r/EricWendelin/~3/CvfK7M2z_aI/</link>
		<comments>http://eriwen.com/updates/leaving-sun-oracle/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 11:00:43 +0000</pubDate>
		<dc:creator>Eric Wendelin</dc:creator>
				<category><![CDATA[Updates]]></category>

		<guid isPermaLink="false">http://eriwen.com/?p=1114</guid>
		<description><![CDATA[I had a great 2-and-a-half year journey with Sun, but my time there is sadly at an end. I was very fortunate to have worked with some <a href="http://blogs.sun.com/eric" title="Eric Arseneau">very</a>, <a href="http://fredjean.net" title="Fred Jean">very smart</a> people. We'll certainly keep in touch.

I worked on some really cool internal (and therefore not shareable) projects in Java, Jython, and Web languages and platforms. They were generally fun, diverse and challenging.

<h2>On to Return Path!</h2>
<a href="http://returnpath.net"><img src="http://eriwen.com/images/rp-logo.gif" alt="Return Path logo" style="margin: 0 8px 8px 0; float: left;"/></a>I'll now be joining a small, agile team at <a href="http://returnpath.net" title="Improve Email Deliverability">Return Path</a>. <strong>We will make email safer, and (I hope) win the war over spam.</strong> Audacious yes. Impossible... I think not.

I wish all my Sun/Oracle counterparts well. Good luck!



No related posts.]]></description>
			<content:encoded><![CDATA[<p>I had a great 2-and-a-half year journey with Sun, but my time there is sadly at an end. I was very fortunate to have worked with some <a href="http://blogs.sun.com/eric" title="Eric Arseneau">very</a>, <a href="http://fredjean.net" title="Fred Jean">very smart</a> people. We&#8217;ll certainly keep in touch.</p>
<p>I worked on some really cool internal (and therefore not shareable) projects in Java, Jython, and Web languages and platforms. They were generally fun, diverse and challenging.</p>
<h2>On to Return Path!</h2>
<p><a href="http://returnpath.net"><img src="http://eriwen.com/images/rp-logo.gif" alt="Return Path logo" style="margin: 0 8px 8px 0; float: left;"/></a>I&#8217;ll now be joining a small, agile team at <a href="http://returnpath.net" title="Improve Email Deliverability">Return Path</a>. <strong>We will make email safer, and (I hope) win the war over spam.</strong> Audacious yes. Impossible&#8230; I think not.</p>
<p>I wish all my Sun/Oracle counterparts well. Good luck!</p>


<p>No related posts.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/EricWendelin?a=CvfK7M2z_aI:9jboX01JpeY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=CvfK7M2z_aI:9jboX01JpeY:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=CvfK7M2z_aI:9jboX01JpeY:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/EricWendelin?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=CvfK7M2z_aI:9jboX01JpeY:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=CvfK7M2z_aI:9jboX01JpeY:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=CvfK7M2z_aI:9jboX01JpeY:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/EricWendelin?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=CvfK7M2z_aI:9jboX01JpeY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=CvfK7M2z_aI:9jboX01JpeY:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/EricWendelin/~4/CvfK7M2z_aI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://eriwen.com/updates/leaving-sun-oracle/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		<feedburner:origLink>http://eriwen.com/updates/leaving-sun-oracle/</feedburner:origLink></item>
		<item>
		<title>A CSS-only speech bubble</title>
		<link>http://feedproxy.google.com/~r/EricWendelin/~3/Dfay888Rf8I/</link>
		<comments>http://eriwen.com/css/speech-bubble/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 11:00:09 +0000</pubDate>
		<dc:creator>Eric Wendelin</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://eriwen.com/?p=988</guid>
		<description><![CDATA[I generally try to avoid using images or Javascript when I can accomplish good presentation with CSS. In this case, I wanted to apply <a href="http://www.howtocreate.co.uk/tutorials/css/slopes" title="CSS tutorial - Using borders to produce angled shapes">CSS shapes</a> to make a clever speech bubble. 

<h2>The problem with obtuse triangles and CSS</h2>
<a href="http://mathworld.wolfram.com/ObtuseTriangle.html">Obtuse triangles</a> are slightly more complicated, since you can only create acute and right triangles with the CSS shapes method linked above. Therefore I created two triangles: a positive (black) right triangle, and then a negative (white) triangle to emulate an obtuse triangle.



Related posts:<ol><li><a href='http://eriwen.com/css/color-palette-with-css-and-moo/' rel='bookmark' title='Permanent Link: Create a Color Palette Using CSS and MooTools 1.2'>Create a Color Palette Using CSS and MooTools 1.2</a></li>
<li><a href='http://eriwen.com/css/css-indirect-adjacent-combinator/' rel='bookmark' title='Permanent Link: About the indirect adjacent combinator (~) in CSS'>About the indirect adjacent combinator (~) in CSS</a></li>
<li><a href='http://eriwen.com/css/use-the-table-layout-css-property-to-speed-up-table-rendering/' rel='bookmark' title='Permanent Link: Use the table-layout CSS property to speed up table rendering'>Use the table-layout CSS property to speed up table rendering</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>I generally try to avoid using images or Javascript when I can accomplish good presentation with CSS. In this case, I wanted to apply <a href="http://www.howtocreate.co.uk/tutorials/css/slopes" title="CSS tutorial - Using borders to produce angled shapes">CSS shapes</a> to make a clever speech bubble. </p>
<h2>The problem with obtuse triangles and CSS</h2>
<p><a href="http://mathworld.wolfram.com/ObtuseTriangle.html">Obtuse triangles</a> are slightly more complicated, since you can only create acute and right triangles with the CSS shapes method linked above. Therefore I created two triangles: a positive (black) right triangle, and then a negative (white) triangle to emulate an obtuse triangle.</p>
<h2>The HTML</h2>
<pre class="brush: xml; light: true;">
&lt;blockquote id=&quot;bubble&quot;&gt;
    &lt;!-- Black (positive) triangle --&gt;
    &lt;span class=&quot;arrow&quot;&gt;
        &lt;!-- White (negative) triangle --&gt;
        &lt;span&gt; &lt;/span&gt;
    &lt;/span&gt;
    Content inside bubble
&lt;/blockquote&gt;
</pre>
<p>Any tag combination will work as long as the CSS shape elements are <em>inline</em> elements. </p>
<h2>The CSS</h2>
<p>The two key parts of the CSS are the rounded corners (available in major, non-IE browsers) and the arrow that extends from the bubble. </p>
<pre class="brush: css;">
#bubble {
    margin: 8px 0;
    padding: 10px;
    position: relative;
  /* Adjust these to taste */
    width: 175px;
    border: 2px solid #000;
    -moz-border-radius: 15px;
    -webkit-border-radius: 15px;
    border-radius: 15px; /* Opera and Chrome */
}
#bubble .arrow {
    border-bottom: 0px solid #FFF;
    border-right: 20px solid #000;
    border-top: 15px solid #FFF;
    position: absolute;
    left: -20px;
    top: 5px;
    height: 0;
    width: 0;
    line-height: 0;
}
#bubble .arrow span {
    border-bottom: 0px solid transparent;
    border-right: 20px solid #FFF;
    border-top: 8px solid transparent;
    width: 0;
    height: 0;
    line-height: 0;
    position: absolute;
    left: -2px;
    top: -8px;
}
</pre>
<p>After all this, we have:</p>
<p><img src="http://eriwen.com/images/bubble.png" alt="CSS Bubble image" style="display: block; margin: 0 auto;" /></p>
<p>I haven&#8217;t done so here, but you can can create more interesting elliptical borders with:</p>
<pre class="brush: css; light: true;">
    padding: 25px; /* &lt;- increase padding to avoid text overlap of the ellipse */
  /* attribute: width / height */
    -moz-border-radius: 60px / 15px;
    -webkit-border-radius: 60px / 15px;
    border-radius: 60px / 15px;
</pre>
<p>Note that Opera uses <em>border-radius</em> and that Safari/Chrome does not support percentages. I know this doesn&#8217;t look as pretty in IE, but it&#8217;s a neat &#8220;progressive enhancement&#8221;. This might be a great idea for comments, twitter statuses or sub-headings.</p>
<p>There probably is a clever way to inherit a transparent color from a parent element, but I didn&#8217;t really take the time to dig into it. If you have improvements, I&#8217;d love to hear them.</p>


<p>Related posts:<ol><li><a href='http://eriwen.com/css/color-palette-with-css-and-moo/' rel='bookmark' title='Permanent Link: Create a Color Palette Using CSS and MooTools 1.2'>Create a Color Palette Using CSS and MooTools 1.2</a></li>
<li><a href='http://eriwen.com/css/css-indirect-adjacent-combinator/' rel='bookmark' title='Permanent Link: About the indirect adjacent combinator (~) in CSS'>About the indirect adjacent combinator (~) in CSS</a></li>
<li><a href='http://eriwen.com/css/use-the-table-layout-css-property-to-speed-up-table-rendering/' rel='bookmark' title='Permanent Link: Use the table-layout CSS property to speed up table rendering'>Use the table-layout CSS property to speed up table rendering</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/EricWendelin?a=Dfay888Rf8I:7yXP9z6aWPw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=Dfay888Rf8I:7yXP9z6aWPw:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=Dfay888Rf8I:7yXP9z6aWPw:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/EricWendelin?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=Dfay888Rf8I:7yXP9z6aWPw:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=Dfay888Rf8I:7yXP9z6aWPw:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=Dfay888Rf8I:7yXP9z6aWPw:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/EricWendelin?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=Dfay888Rf8I:7yXP9z6aWPw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=Dfay888Rf8I:7yXP9z6aWPw:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/EricWendelin/~4/Dfay888Rf8I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://eriwen.com/css/speech-bubble/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://eriwen.com/css/speech-bubble/</feedburner:origLink></item>
		<item>
		<title>Interview with Andres Almiray</title>
		<link>http://feedproxy.google.com/~r/EricWendelin/~3/yKY6G-RsXGc/</link>
		<comments>http://eriwen.com/interview/andres-almiray/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 11:00:01 +0000</pubDate>
		<dc:creator>Eric Wendelin</dc:creator>
				<category><![CDATA[Interview]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://eriwen.com/?p=1076</guid>
		<description><![CDATA[<img src="http://eriwen.com/images/griffon-logo2.png" alt="Griffon logo" style="float: left; margin: 0 8px 8px 0;"/>Andres Almiray is the lead developer of <a href="http://griffon.codehaus.org/" title="A Grails-like Rich Internet Framework">Griffon</a>, a Grails like application framework for developing desktop applications in Groovy, and a committer on the <a href="http://groovy.codehaus.org/" title="An agile dynamic language for the Java Platform">Groovy</a> programming language. I consider him to be one of the most influential programmers in the world. I <em>strongly recommend</em> that you <a href="http://feeds.feedburner.com/aalmiray" title="Feeds for Andres Almiray's Weblog">subscribe to his blog</a> and <a href="http://twitter.com/aalmiray">follow him on Twitter</a>.

Andres was kind enough to answer questions that I think are relevant to all of you readers. I hope you learn from them as much as I have. Without further ado...



Related posts:<ol><li><a href='http://eriwen.com/tools/moving-to-github/' rel='bookmark' title='Permanent Link: Why I&#8217;m moving my projects to GitHub'>Why I&#8217;m moving my projects to GitHub</a></li>
<li><a href='http://eriwen.com/groovy/groovy-shell-scripts/' rel='bookmark' title='Permanent Link: Get groovy for better shell scripts'>Get groovy for better shell scripts</a></li>
<li><a href='http://eriwen.com/opinion/resolutions-2009/' rel='bookmark' title='Permanent Link: A programmer&#8217;s 2009 resolutions'>A programmer&#8217;s 2009 resolutions</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://eriwen.com/images/griffon-logo2.png" alt="Griffon logo" style="float: left; margin: 0 8px 8px 0;"/>Andres Almiray is the lead developer of <a href="http://griffon.codehaus.org/" title="A Grails-like Rich Internet Framework">Griffon</a>, a Grails like application framework for developing desktop applications in Groovy, and a committer on the <a href="http://groovy.codehaus.org/" title="An agile dynamic language for the Java Platform">Groovy</a> programming language. I consider him to be one of the most influential programmers in the world. I <em>strongly recommend</em> that you <a href="http://feeds.feedburner.com/aalmiray" title="Feeds for Andres Almiray's Weblog">subscribe to his blog</a> and <a href="http://twitter.com/aalmiray">follow him on Twitter</a>.</p>
<p>Andres was kind enough to answer questions that I think are relevant to all of you readers. I hope you learn from them as much as I have. Without further ado&#8230;</p>
<h4>How do you keep up-to-date with programming advancements and news?</h4>
<p>I keep a close eye on RSS feeds on specific blogs, blog aggregators and news sites. <a href="http://www.dzone.com" title="Fresh links for developers">DZone</a> is particularly a great source for many things JVM, with some .Net, Ruby, PHP sprinkles here and there. <a href="http://twitter.com">Twitter</a> is another good source for links and interesting readings, but you have to know who you should follow. Local JUG meetings and conferences are a good way to meet people that share your interests, then follow on social networks. Once you&#8217;re in you follow the natural process of data selection according to your needs, thus expanding your network as a result. Can&#8217;t forget about books too; blogs and online articles are just the tip of the iceberg.</p>
<h4>What is the best decision you ever made to improve your programming ability?</h4>
<p>I have to say starting an open source project did it for me. It opened the door where people will see your code and give you all kind of feedback. they will take your code and use it in ways you did not foresee. They&#8217;ll break it. They&#8217;ll mangle it. They&#8217;ll enhance it. You can share code and learn from others; it is all about reaching out to developers and users that otherwise you&#8217;d never meet. Besides working on open source projects did help me finding employment, which besides a stable income provided me with additional learning opportunities.</p>
<h4>What are the most important skills for a programmer to have?</h4>
<p>Quoting Heraclitus: &#8220;Panta rhei&#8221;. Everything flows. A programmer should be able to ride paradigm shifts. Who would have thought back in 95 that Java would be found everywhere years later? (even in space!) A few years ago the ajax revolution changed the web landscape. These days mobile devices seem to be the driving force. Learning a new programming language (at least every 12 months) is a good way to keep you on your toes.</p>
<h4>Which programming tools could you not live without?</h4>
<p>Vim as editor, <a href="http://git-scm.com/">Git</a> as source control. These days I don&#8217;t use an IDE unless it is 100% Java related, in which case it is a coin flip between Eclipse and NetBeans.</p>
<h4>Which programmer has had the biggest influence on you?</h4>
<p>I&#8217;ve learned a lot from many but I have to save the first spot for <a href="http://www.vanderburg.org/Blog" title="Glenn Vanderburg: Blog">Glenn Vanderburg</a>. He is the one responsible for that last nudge that made me jump into contributing back to the open source community. Thank you Glenn!</p>
<h4>What first got you interested in Groovy?</h4>
<p>I was actually first interested in Ruby after spending a whirlwind Saturday listening to Dave Thomas and Stuart Halloway during an NFJS tour stop in Austin back in 2006. I remember clearly during a panel on the next day that Venkat Subramanian said &#8220;Groovy&#8217;s future a year ago was very grim, today it&#8217;s safe and well&#8221;. Because I was not &#8220;ready&#8221; to embrace Ruby completely (I had strong roots in Java) decided to give Groovy a try, as I heard both languages were close to one another feature-wise. Once I discovered meta-programming via GORM&#8217;s dynamic finders I was sold completely, haven&#8217;t turned back since and I&#8217;m happy with it. </p>
<h4>You now lead the <a href="http://griffon.codehaus.org/" title="A Grails-like Rich Internet Framework">Griffon</a> project, what is your motivation for developing it?</h4>
<p>I first got into Java because I needed an UI for a term project back in college. Java was a few months old and after seeing applets I convinced the professor to accept Java code rather than C++ code. Java AWT is very quirky when compared to modern toolkits but it did the job, and what&#8217;s more it did it better than what I was used to at that moment (low level C/C++ XT bindings), as a result I was hooked into Java. Across the years I keep coming back to desktop app development but longed for a framework that helped speeding things up. It wasn&#8217;t until all the pieces came together (Groovy, Grails, SwingBuilder and its siblings) that a framework like Griffon could emerge. Griffon puts a smile back in my face while doing desktop development, I simply cannot describe the joy of doing application development with it. As a result I was able to prototype/finalize more applications in a year than in my whole career (including college projects).</p>
<h4>Can you make any predictions about the future of Groovy and Griffon?</h4>
<p>Groovy has reached a tipping point IMO, it is a buzzword already. There are a few places where Groovy cannot be found but Java can (android, JME for example), but it&#8217;s just a matter of time until that happens. Griffon on the other hand may have a bright future with polyglot programmers, not just Java developers, as it supports (at the moment) 5 languages that can be mixed together on an application: Java, Groovy, Clojure, Scala and JavaFX. On the UI side it is also multi-toolkit. Swing is not the only game in town, Griffon can play nice with JavaFX, Swt, Pivot and Gtk. There may be other toolkits in the future&#8230; [dramatic pause] &#8230; soon.</p>
<h4>Anything you&#8217;d like to plug to readers?</h4>
<p>Sure, if you&#8217;re interested in <a href="http://groovy.codehaus.org/" title="An agile dynamic language for the Java Platform">Groovy</a>/<a href="http://grails.codehaus.org/" title="a Groovy-based web framework inspired by Ruby on Rails">Grails</a>/<a href="http://griffon.codehaus.org/" title="A Grails-like Rich Internet Framework">Griffon</a> then do not hesitate to drop by the mailing lists. You&#8217;ll find a thriving community that spans all three projects and then some more (<a href="http://gradle.codehaus.org/" title="Ease - Freedom - Power for your Build">Gradle</a>, <a href="http://gant.codehaus.org/" title="A Groovy-based build system that uses Ant tasks, but no XML.">Gant</a>, <a href="http://www.easyb.org/" title="bdd in Java can't get any easier, man">Easyb</a>, etc). Lastly, if you&#8217;re really into learning Griffon there&#8217;s a book coming up <a href="http://manning.com/almiray" title="Manning: Griffon in Action">Griffon in Action</a> written by 2 out of 4 of the project&#8217;s founders.</p>
<p class="update">I&#8217;d like to thank <a href="http://www.jroller.com/aalmiray/" title="Andres Almiray's Weblog">Andres Almiray</a> for his insights. If you found his Groovy stuff interesting, keep up-to-date on the latest <a href="http://twitter.com/aalmiray">on twitter</a>.</p>


<p>Related posts:<ol><li><a href='http://eriwen.com/tools/moving-to-github/' rel='bookmark' title='Permanent Link: Why I&#8217;m moving my projects to GitHub'>Why I&#8217;m moving my projects to GitHub</a></li>
<li><a href='http://eriwen.com/groovy/groovy-shell-scripts/' rel='bookmark' title='Permanent Link: Get groovy for better shell scripts'>Get groovy for better shell scripts</a></li>
<li><a href='http://eriwen.com/opinion/resolutions-2009/' rel='bookmark' title='Permanent Link: A programmer&#8217;s 2009 resolutions'>A programmer&#8217;s 2009 resolutions</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/EricWendelin?a=yKY6G-RsXGc:He-LohL2JM0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=yKY6G-RsXGc:He-LohL2JM0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=yKY6G-RsXGc:He-LohL2JM0:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/EricWendelin?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=yKY6G-RsXGc:He-LohL2JM0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=yKY6G-RsXGc:He-LohL2JM0:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=yKY6G-RsXGc:He-LohL2JM0:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/EricWendelin?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=yKY6G-RsXGc:He-LohL2JM0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=yKY6G-RsXGc:He-LohL2JM0:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/EricWendelin/~4/yKY6G-RsXGc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://eriwen.com/interview/andres-almiray/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://eriwen.com/interview/andres-almiray/</feedburner:origLink></item>
		<item>
		<title>Why I’m moving my projects to GitHub</title>
		<link>http://feedproxy.google.com/~r/EricWendelin/~3/JJTYi2VOK3o/</link>
		<comments>http://eriwen.com/tools/moving-to-github/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 11:00:19 +0000</pubDate>
		<dc:creator>Eric Wendelin</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://eriwen.com/?p=1069</guid>
		<description><![CDATA[<img src="http://eriwen.com/images/github-logo.png" alt="GitHub logo" style="float: left; margin: 0 4px 4px 0;"/>With the announcement of the <a href="http://blogs.sun.com/projectkenai/entry/the_future_of_kenai_com">closure of kenai.com</a>, I've decided to move my open-source projects to <a href="http://github.com" title="Social coding">GitHub</a>.

<blockquote>It's with a sad heart that we have to announce that the Kenai.com domain will be shutdown as part of the consolidation of project hosting sites now that Sun is a wholly owned subsidiary of Oracle.</blockquote>

This is sad because I thought Kenai had some really killer features like excellent JIRA and NetBeans integration. Nevertheless, it's not up to me to decide. 

<h2>Software is only as good as it's community</h2>
A great project cannot thrive without people to improve and maintain it. The reason I am choosing GitHub is the number of people (especially friends) already on it. The is it's main advantage over something like <a href="http://bitbucket.org/">bitbucket</a>. Git, in my opinion, has great momentum in the OSS community and is roughly equivalent to mercurial in functionality (with a few differences, obviously). Both <acronym title="Distributed Version Control Systems">DVCS</acronym> are far superior to their non-distributed counterparts. To sum up the biggest benefit in a phrase: "Local commits FTW!" 

Moving to GitHub has <em>already paid off</em> because my recent <a href="http://github.com/emwendelin/javascript-stacktrace" title="Micro-library for getting stack traces in all web browsers">javascript-stacktrace project</a> already has over 50 watchers and a couple forks. 


Related posts:<ol><li><a href='http://eriwen.com/groovy/introducing-groovyrtm/' rel='bookmark' title='Permanent Link: Introducing GroovyRTM: A Groovier way to Remember The Milk'>Introducing GroovyRTM: A Groovier way to Remember The Milk</a></li>
<li><a href='http://eriwen.com/opinion/follow-up-why-programmers-should-twitter/' rel='bookmark' title='Permanent Link: Follow-up: Why programmers should twitter'>Follow-up: Why programmers should twitter</a></li>
<li><a href='http://eriwen.com/interview/andres-almiray/' rel='bookmark' title='Permanent Link: Interview with Andres Almiray'>Interview with Andres Almiray</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://eriwen.com/images/github-logo.png" alt="GitHub logo" style="float: left; margin: 0 4px 4px 0;"/>With the announcement of the <a href="http://blogs.sun.com/projectkenai/entry/the_future_of_kenai_com">closure of kenai.com</a>, I&#8217;ve decided to move my open-source projects to <a href="http://github.com" title="Social coding">GitHub</a>.</p>
<blockquote><p>It&#8217;s with a sad heart that we have to announce that the Kenai.com domain will be shutdown as part of the consolidation of project hosting sites now that Sun is a wholly owned subsidiary of Oracle.</p></blockquote>
<p>This is sad because I thought Kenai had some really killer features like excellent JIRA and NetBeans integration. Nevertheless, it&#8217;s not up to me to decide. </p>
<h2>Software is only as good as it&#8217;s community</h2>
<p>A great project cannot thrive without people to improve and maintain it. The reason I am choosing GitHub is the number of people (especially friends) already on it. The is it&#8217;s main advantage over something like <a href="http://bitbucket.org/">bitbucket</a>. Git, in my opinion, has great momentum in the OSS community and is roughly equivalent to mercurial in functionality (with a few differences, obviously). Both <acronym title="Distributed Version Control Systems">DVCS</acronym> are far superior to their non-distributed counterparts. To sum up the biggest benefit in a phrase: &#8220;Local commits FTW!&#8221; </p>
<p>Moving to GitHub has <em>already paid off</em> because my recent <a href="http://github.com/emwendelin/javascript-stacktrace" title="Micro-library for getting stack traces in all web browsers">javascript-stacktrace project</a> already has over 50 watchers and a couple forks. </p>
<h2>Follow me</h2>
<p>You should <a href="http://github.com/emwendelin">follow me on GitHub</a> if you are interested in any of my projects, or if you think I might be interested in yours. Only good can come from reaching out. I look forward to seeing your <acronym title="Open Source Software">OSS</acronym> projects. </p>
<p>New links for my other projects (update your bookmarks or whatever):</p>
<ul>
<li><a href="http://github.com/emwendelin/cheqlist" title="JavaFX desktop application for Remember The Milk">Cheqlist</a> &#8211; JavaFX desktop application for Remember The Milk</li>
<li><a href="http://github.com/emwendelin/groovyrtm" title="Groovy API for Remember The Milk">GroovyRTM</a> &#8211; Groovy API for Remember The Milk</li>
</ul>
<p>Agree about GitHub? Chime in on the &#8220;preferred version control system&#8221; poll and tell me if I&#8217;m full of crap in the comments.</p>


<p>Related posts:<ol><li><a href='http://eriwen.com/groovy/introducing-groovyrtm/' rel='bookmark' title='Permanent Link: Introducing GroovyRTM: A Groovier way to Remember The Milk'>Introducing GroovyRTM: A Groovier way to Remember The Milk</a></li>
<li><a href='http://eriwen.com/opinion/follow-up-why-programmers-should-twitter/' rel='bookmark' title='Permanent Link: Follow-up: Why programmers should twitter'>Follow-up: Why programmers should twitter</a></li>
<li><a href='http://eriwen.com/interview/andres-almiray/' rel='bookmark' title='Permanent Link: Interview with Andres Almiray'>Interview with Andres Almiray</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/EricWendelin?a=JJTYi2VOK3o:Wip_Zv2ncdQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=JJTYi2VOK3o:Wip_Zv2ncdQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=JJTYi2VOK3o:Wip_Zv2ncdQ:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/EricWendelin?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=JJTYi2VOK3o:Wip_Zv2ncdQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=JJTYi2VOK3o:Wip_Zv2ncdQ:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=JJTYi2VOK3o:Wip_Zv2ncdQ:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/EricWendelin?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=JJTYi2VOK3o:Wip_Zv2ncdQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=JJTYi2VOK3o:Wip_Zv2ncdQ:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/EricWendelin/~4/JJTYi2VOK3o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://eriwen.com/tools/moving-to-github/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://eriwen.com/tools/moving-to-github/</feedburner:origLink></item>
		<item>
		<title>Javascript Stacktrace update</title>
		<link>http://feedproxy.google.com/~r/EricWendelin/~3/xRrcGb8fm7A/</link>
		<comments>http://eriwen.com/javascript/stacktrace-update/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 11:00:10 +0000</pubDate>
		<dc:creator>Eric Wendelin</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://eriwen.com/?p=1050</guid>
		<description><![CDATA[I started a <a href="http://eriwen.com/javascript/js-stack-trace/" title="A Javascript stacktrace in any browser">Javascript Stacktrace project</a> back in August 2008. The idea was to give additional debugging power to browsers where you don't have good tools to work with. I'd like to give you an update on where the project is today.

Lately, I've been working on updating my old script. Since it was written, we've seen lots of major browser releases and the introduction of the V8 Javascript engine used by <a href="http://www.google.com/chrome">Google Chrome</a>.

<h2>Updated browser compatibility</h2>
Browsers that are fully-supported and well-tested:
<ol>
<li>Firefox (and Iceweasel) 0.9+</li>
<li>Safari 3+</li>
<li>IE 5.5+</li>
<li>Konqueror 3.5+</li>
<li>K-Meleon 1.5.3+</li>
<li>Epiphany 2.28.0+</li>
</ol>

Browsers that are supported in almost all cases but not as well-tested:
<ol>
<li>Chrome 1+ - One bug (feature?) that may be in Chrome reporting functions as anonymous when they aren't. HOWEVER, Chrome's stack gives us line numbers AND column numbers, so we can see exactly where our problem is - even in minified Javascript! Sweet!</li>
<li>Opera 9+ - Opera is dead to me now. Opera 10+ has removed the error.stack info we needed and introduced error.stacktrace, but it seems very unstable.</li>
</ol>

More info about compatibility can be shown with the <a href="http://browsershots.org/http://eriwen.com/js/javascript-stacktrace/test-stacktrace.html" title="BrowserShots site testing">BrowserShots of the test suite</a>. 



Related posts:<ol><li><a href='http://eriwen.com/javascript/js-stack-trace/' rel='bookmark' title='Permanent Link: A Javascript stacktrace in any browser'>A Javascript stacktrace in any browser</a></li>
<li><a href='http://eriwen.com/python/update-feedburner-count/' rel='bookmark' title='Permanent Link: Using Python to update your FeedBurner stats'>Using Python to update your FeedBurner stats</a></li>
<li><a href='http://eriwen.com/javascript/highlight-search-results-with-js/' rel='bookmark' title='Permanent Link: How to highlight search results with JavaScript and CSS'>How to highlight search results with JavaScript and CSS</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>I started a <a href="http://eriwen.com/javascript/js-stack-trace/" title="A Javascript stacktrace in any browser">Javascript Stacktrace project</a> back in August 2008. The idea was to give additional debugging power to browsers where you don&#8217;t have good tools to work with. I&#8217;d like to give you an update on where the project is today.</p>
<p>Lately, I&#8217;ve been working on updating my old script. Since it was written, we&#8217;ve seen lots of major browser releases and the introduction of the V8 Javascript engine used by <a href="http://www.google.com/chrome">Google Chrome</a>.</p>
<h2>Updated browser compatibility</h2>
<p>Browsers that are fully-supported and well-tested:</p>
<ol>
<li>Firefox (and Iceweasel) 0.9+</li>
<li>UPDATE: Chrome 1+ now perfectly supported</li>
<li>Safari 3+</li>
<li>IE 5.5+</li>
<li>Opera 9+</li>
<li>Konqueror 3.5+</li>
<li>K-Meleon 1.5.3+</li>
<li>Epiphany 2.28.0+</li>
</ol>
<p>Browsers that are supported in almost all cases but not as well-tested:</p>
<ol>
<li><span style="text-decoration: line-through;">Chrome 1+ &#8211; One bug (feature?) that may be in Chrome reporting functions as anonymous when they aren&#8217;t. HOWEVER, Chrome&#8217;s stack gives us line numbers AND column numbers, so we can see exactly where our problem is &#8211; even in minified Javascript! Sweet!</span> Chrome 1+ now fully supported.</li>
<li>Opera 7-8 &#8211; Opera is dead to me now. Opera 10+ has removed the error.stack info we needed and introduced error.stacktrace, but it seems very unstable. Argh.</li>
</ol>
<p>More info about compatibility can be shown with the <a href="http://browsershots.org/http://eriwen.com/js/javascript-stacktrace/test-stacktrace.html" title="BrowserShots site testing">BrowserShots of the test suite</a>. </p>
<h2>Now socially coded</h2>
<p>I&#8217;m not going to post the code here because the source and tests are now on the <a href="http://github.com/emwendelin/javascript-stacktrace">javascript-stacktrace project on GitHub</a>. You can download it <a href="http://github.com/emwendelin/javascript-stacktrace/downloads" title="Javascript Stacktrace downloads">here</a>.</p>
<p>Follow it, file bugs, and make comments there. If you have improvements to make, please fork the project and then contact me or do a &#8220;push request&#8221;. I&#8217;ll make sure you get credit ;)</p>
<p class="update">UPDATE: <a href="http://kinsey.no/blog" title="rantings in the dark">Øyvind Sean Kinsey</a> has added memoization (caching the implementation) for the mode and XHR bits as well as the ability to pass an <strong>existing Javascript Error</strong> and get a stacktrace.  We&#8217;re working on tests and you should see project updates soon. Thanks, Øyvind!</p>
<pre class="brush: jscript;">
var lastError;
try {
    // error producing code
} catch(e) {
   lastError = e;
   // do something else with error
}

// later...
printStackTrace({e: lastError}); //Returns stacktrace from lastError!
</pre>
<h2>Try it out!</h2>
<p>The code is in use on my blog. <a href="javascript:foo();">Click here</a> to give it a spin. </p>
<pre class="brush: jscript; light: true;">
function foo() {
    var blah;
    bar(&quot;blah&quot;);
}

function bar(blah) {
    var stuff;
    thing();
}

function thing() {
    if (true) { //your error condition here
        var st = printStackTrace();
        alert(st.join(&quot;\n\n&quot;));
    }
}

foo();
</pre>
<p>Random note: one cool suggestion I saw was to assign printStackTrace to window.onerror. Pretty brilliant if you ask me. </p>
<p>I want to thank the guys who contributed to the script: <strong><a href="http://lucassmith.name">Luke Smith</a>, Loic Dachary and Johan Euphrosine.</strong></p>
<p>I could use a bit of help getting the Chrome and Opera bugs worked out. I&#8217;m sure some of you guys who remember how to write software can help. Suggestions and whinings are welcome as long as they don&#8217;t get out of hand in the comments.</p>
<p><a href="http://github.com/emwendelin/Javascript-Stacktrace">Javascript Stacktrace on GitHub</a></p>


<p>Related posts:<ol><li><a href='http://eriwen.com/javascript/js-stack-trace/' rel='bookmark' title='Permanent Link: A Javascript stacktrace in any browser'>A Javascript stacktrace in any browser</a></li>
<li><a href='http://eriwen.com/python/update-feedburner-count/' rel='bookmark' title='Permanent Link: Using Python to update your FeedBurner stats'>Using Python to update your FeedBurner stats</a></li>
<li><a href='http://eriwen.com/javascript/highlight-search-results-with-js/' rel='bookmark' title='Permanent Link: How to highlight search results with JavaScript and CSS'>How to highlight search results with JavaScript and CSS</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/EricWendelin?a=xRrcGb8fm7A:1Ek6xTpDFv0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=xRrcGb8fm7A:1Ek6xTpDFv0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=xRrcGb8fm7A:1Ek6xTpDFv0:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/EricWendelin?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=xRrcGb8fm7A:1Ek6xTpDFv0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=xRrcGb8fm7A:1Ek6xTpDFv0:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=xRrcGb8fm7A:1Ek6xTpDFv0:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/EricWendelin?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=xRrcGb8fm7A:1Ek6xTpDFv0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=xRrcGb8fm7A:1Ek6xTpDFv0:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/EricWendelin/~4/xRrcGb8fm7A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://eriwen.com/javascript/stacktrace-update/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		<feedburner:origLink>http://eriwen.com/javascript/stacktrace-update/</feedburner:origLink></item>
		<item>
		<title>Stupid productivity comparisons between Linux and Mac</title>
		<link>http://feedproxy.google.com/~r/EricWendelin/~3/aNoP0_BCaUM/</link>
		<comments>http://eriwen.com/productivity/compare-linux-and-mac/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 11:00:13 +0000</pubDate>
		<dc:creator>Eric Wendelin</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://eriwen.com/?p=1000</guid>
		<description><![CDATA[If you've been <a href="http://twitter.com/eriwen" title="Eric Wendelin on Twitter">following me on twitter</a>, you've already been tipped off that I recently got an older MacBook Pro. Since it came with Mac OS installed, I decided I would give it a fair, 30-day trial before I move it to Linux. I'm about 3 weeks in, and I'm logging my thoughts publicly so you can hopefully see benefit.

<h2>What I'm NOT comparing</h2>
In a word: speed. This was a significant hardware upgrade from my last computer, so I'm not going to say anything how everything is so much faster, smoother blah blah because it would've been anyway and that's not useful to you or anyone. Also, virtualization: I know that I can get X or Y if I just use <a href="http://www.virtualbox.org/" title="Virtualization software">VirtualBox</a>. I'm going to ignore that here for simplicity. 

<h2>Tools</h2>
Before I make stupid lists, I should note that I was working on an Ubuntu Karmic Koala, so I had all of the pre-packaged nice-ities that come with that. 

Now, in no order whatsoever:
<ul style="margin-left: 2em;"><li><strong>Dock</strong> - Mac has a built-in dock, Linux has <a href="https://launchpad.net/awn" title="Avant Window Navigator">AWN</a> and <a href="http://do.davebsd.com/wiki/index.php?title=Docky">Gnome-Do Docky</a>. IMO, <em>Linux wins barely</em> because you have more options for customization.</li>
<li><strong>Terminal</strong> - Both systems have a built-in terminal. I'm a <abbr title="Bourne Again SHell">bash</abbr> user and that came with both. One part where <em>Linux shines</em> is that a lot more tools build themselves to be launched by the Terminal <em>by default</em>. For example, try typing "which firefox" in the Mac terminal. Nope.</li></ul>


Related posts:<ol><li><a href='http://eriwen.com/linux/easy-ways-try-linux/' rel='bookmark' title='Permanent Link: Mindlessly easy ways try out Linux or Solaris'>Mindlessly easy ways try out Linux or Solaris</a></li>
<li><a href='http://eriwen.com/firefox/firefox-add-ons-for-productivity/' rel='bookmark' title='Permanent Link: Firefox add-ons for productivity'>Firefox add-ons for productivity</a></li>
<li><a href='http://eriwen.com/firefox/my-firefox-setup/' rel='bookmark' title='Permanent Link: 8 steps to my personal Firefox setup for productivity'>8 steps to my personal Firefox setup for productivity</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;ve been <a href="http://twitter.com/eriwen" title="Eric Wendelin on Twitter">following me on twitter</a>, you&#8217;ve already been tipped off that I recently got an older MacBook Pro. Since it came with Mac OS installed, I decided I would give it a fair, 30-day trial before I move it to Linux. I&#8217;m about 3 weeks in, and I&#8217;m logging my thoughts publicly so you can hopefully see benefit.</p>
<h2>What I&#8217;m NOT comparing</h2>
<p>In a word: speed. This was a significant hardware upgrade from my last computer, so I&#8217;m not going to say anything how everything is so much faster, smoother blah blah because it would&#8217;ve been anyway and that&#8217;s not useful to you or anyone. Also, virtualization: I know that I can get X or Y if I just use <a href="http://www.virtualbox.org/" title="Virtualization software">VirtualBox</a>. I&#8217;m going to ignore that here for simplicity. </p>
<h2>Tools</h2>
<p>Before I make stupid lists, I should note that I was working on an Ubuntu Karmic Koala, so I had all of the pre-packaged nice-ities that come with that. </p>
<p>Now, in no order whatsoever:</p>
<ul style="margin-left: 2em;">
<li><strong>Dock</strong> &#8211; Mac has a built-in dock, Linux has <a href="https://launchpad.net/awn" title="Avant Window Navigator">AWN</a> and <a href="http://do.davebsd.com/wiki/index.php?title=Docky">Gnome-Do Docky</a>. IMO, <em>Linux wins</em> because you have more options for customization.</li>
<li><strong>Terminal</strong> &#8211; Both systems have a built-in terminal. I&#8217;m a <abbr title="Bourne Again SHell">bash</abbr> user and that came with both. One part where <em>Linux shines</em> is that a lot more tools build themselves to be launched by the Terminal <em>by default</em>. <span style="text-decoration: line-through;">For example, try typing &#8220;which firefox&#8221; in the Mac terminal. Nope.</span> On Mac, you can use &#8220;open -a [application]&#8221; to do this. I&#8217;ll reluctantly say <em>tie</em> here then ;)</li>
<li><strong>Browsers</strong> &#8211; Oh sweet! I can get Safari on a Mac without any hacks. Don&#8217;t care. Long as you have <a href="http://www.google.com/chrome" title="Google Chrome web browser">Google Chrome</a> you basically have Safari with a faster Javascript engine as far as I&#8217;m concerned. <em>No winner</em></li>
<li><strong>Code editing</strong> &#8211; All the dev. tools I had in Linux, I still have on Mac. Same vim. Same <a href="http://netbeans.org">NetBeans</a> (well, as far as you care). Same IntelliJ. BUT&#8230; I now have access to <a href="http://macromates.com/" title="Mac text editor">TextMate</a> and <a href="http://www.panic.com/coda/">Coda</a>. So far I suck with both but a bunch of cool people say they rock so I&#8217;m going to <em>give Mac the win here</em>. Oh, and XCode tools which I&#8217;d need if I ever wanted to write an iPhone app. That, too.</li>
<li><strong>Window organization/effects</strong> &#8211; I&#8217;m a <a href="http://eriwen.com/productivity/multiple-desktops-to-get-things-done/">big fan of multiple desktops</a>. Both OSes have this, but I&#8217;d argue that <a href="http://www.compiz.org/">Compiz</a> on Linux has way more customization options. Both have cool the  exposé. On Mac, though, you can&#8217;t move windows between desktops with a keyboard shortcut (Are you kidding me? There has GOT to be a Mac tool that allows this). <em>Linux wins here</em>.</li>
<li><strong>Multiple monitor support</strong> &#8211; I&#8217;m breaking out the cliché phrase &#8220;It just works&#8221; here and I <em>bow humbly to Mac OS here</em>. No more messing with xorg.conf files or dealing with the crappy NVidia tools.</li>
<li><strong>Notifications</strong> &#8211; <em>Should die</em> anyway because they kill productivity, but if you care more stuff on Mac (that I&#8217;ve seen) integrates with <a href="http://growl.info/" title="Mac notifier utility">Growl</a> than those that integrate with libnotify on Linux. Whatever.</li>
<li><strong>App launching</strong> &#8211; <a href="http://do.davebsd.com/" title="Linux app launcher">Gnome-Do</a> is pretty much a really good rip-off of Mac&#8217;s <a href="http://www.macupdate.com/info.php/id/14831" title="Mac app launcher">Quicksilver</a>. <em>Love both.</em> To me they&#8217;re pretty much equivalent except that I&#8217;m seeing more plugins/customization options for Gnome-Do.</li>
<li><strong>Backups and scheduling</strong> &#8211; Both systems have <a href="http://eriwen.com/productivity/crontab-for-automation/">cron</a>, so that&#8217;s not an issue. Both integrate well with <a href="http://getdropbox.com" title="Online storage service">Dropbox</a> (&lt;3 that service). One thing <em>Mac has over Linux</em> here is built-in Time Machine. It integrates really well with my Time Capsule at home, and most of you (except <a href="http://css-tricks.com">Chris Coyier</a>, sorry dude that sucks) have shared good experiences with it. It does annoy me that I can&#8217;t configure when backups run, but I&#8217;m not going to whine until it bites me harder.</li>
<li><strong>Dashboard</strong> &#8211; Not much of a comparison, really. One thing Linux has that I can&#8217;t seem to find a good replacement for is <a href="http://conky.sourceforge.net/">conky</a>. Only sorta-not-really replacement is the Mac dashboard, which does look sweet granted.</li>
<li><strong>App updates</strong> &#8211; The Synaptic package manager pretty much kicks the crap out of all other app management systems. That said, I&#8217;ve found the Mac <a href="http://metaquark.de/appfresh/" title="Mac app updater">AppFresh</a> to be marginally useful for keeping stuff up-to-date. <em>Linux still wins here, though.</em></li>
<li><strong>Presentations</strong> &#8211; I didn&#8217;t buy Keynote, so I can&#8217;t compare it with Linux offerings. Only reason I put it here is that I <em>do</em> care about it and if anyone has any insights that&#8217;d rock.</li>
<li class="update"><strong>UPDATE: VPN</strong> &#8211; I forgot how cool the built-in VPN is on Macs. It is much more painful in Linux (in my experience) <em>Score +1 for Mac there</em>.</li>
</ul>
<p>I&#8217;m sure I forgot or don&#8217;t know about some tools. Leave a comment and I&#8217;ll answer.</p>
<h2>Keyboard shortcuts</h2>
<p>I&#8217;ll start by saying that switching to a mac keyboard still f***s me up often. I&#8217;ve installed <a href="http://doublecommand.sourceforge.net/">DoubleCommand</a> to help alleviate some of my problems, but this whole &#8220;Home not being start of line&#8221; stuff really messes with me. If someone could point me to a good guide on with keyboard shortcuts for editing (like selecting a single word) I&#8217;ll buy you a beer or something equivalent.</p>
<p>Other than my initial whining, most everything can be hooked to a keyboard action and I hardly have to touch my sweet multi-touch touchpad. I&#8217;d say Mac OS generally equivalent to Linux other than the whole can&#8217;t move windows to workspaces (seriously, WTF). <em>A beer if you can help me figure out how to do that, too.</em> On second thought, Linux wins because it does have a lot more places you can configure shortcuts (good), but they&#8217;re often duplicated and could be conflicting and confuing. Ok, on third thought nobody wins.</p>
<h2>Other random carp</h2>
<p>This multi-touch thingy is pretty sweet. I know Linux has some multi-touch libs but I haven&#8217;t tried them out. More on that later, but I&#8217;m <em>betting Mac wins</em>.</p>
<p>I know I omitted a lot of stuff. Probably because I don&#8217;t care about it, but maybe I do and I just didn&#8217;t think of it. This is my setup and won&#8217;t work for you. That said, advice welcome. :)</p>
<p>At this point, there are <strong>no winners, just differences</strong>. That&#8217;ll change once I feel like I&#8217;ve given Mac OS a fair shot. <strong>FWIW, this is good news for Linux</strong>. Even if I switch to Mac, right now I can&#8217;t find that much more sweetness here (unless I have to write iPhone apps). Good work Linux community, you&#8217;re getting there. Keep it up.</p>
<p>Oh, one more thing&#8230; I don&#8217;t normally do this, but this video was the best review of Mac OS &#8220;Snow Leopard&#8221; and probably the funniest thing I&#8217;ve seen in 2009. Enjoy!</p>
<p><object width="560" height="340"><param name="movie" value="http://www.youtube.com/v/1W-ygu6_aDc&#038;hl=en_US&#038;fs=1&#038;"/><param name="allowFullScreen" value="true"/><param name="allowscriptaccess" value="always"/><embed src="http://www.youtube.com/v/1W-ygu6_aDc&#038;hl=en_US&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"/></object></p>


<p>Related posts:<ol><li><a href='http://eriwen.com/linux/easy-ways-try-linux/' rel='bookmark' title='Permanent Link: Mindlessly easy ways try out Linux or Solaris'>Mindlessly easy ways try out Linux or Solaris</a></li>
<li><a href='http://eriwen.com/firefox/firefox-add-ons-for-productivity/' rel='bookmark' title='Permanent Link: Firefox add-ons for productivity'>Firefox add-ons for productivity</a></li>
<li><a href='http://eriwen.com/firefox/my-firefox-setup/' rel='bookmark' title='Permanent Link: 8 steps to my personal Firefox setup for productivity'>8 steps to my personal Firefox setup for productivity</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/EricWendelin?a=aNoP0_BCaUM:7IrTrv0qQic:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=aNoP0_BCaUM:7IrTrv0qQic:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=aNoP0_BCaUM:7IrTrv0qQic:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/EricWendelin?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=aNoP0_BCaUM:7IrTrv0qQic:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=aNoP0_BCaUM:7IrTrv0qQic:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=aNoP0_BCaUM:7IrTrv0qQic:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/EricWendelin?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/EricWendelin?a=aNoP0_BCaUM:7IrTrv0qQic:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/EricWendelin?i=aNoP0_BCaUM:7IrTrv0qQic:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/EricWendelin/~4/aNoP0_BCaUM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://eriwen.com/productivity/compare-linux-and-mac/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		<feedburner:origLink>http://eriwen.com/productivity/compare-linux-and-mac/</feedburner:origLink></item>
	</channel>
</rss>
