<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Laurence Gellert&#039;s Blog</title>
	<atom:link href="http://www.laurencegellert.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.laurencegellert.com</link>
	<description>Re: Software Is My Life, So Make It A Good One</description>
	<lastBuildDate>Wed, 18 Apr 2012 03:07:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Software Careers for the Future</title>
		<link>http://www.laurencegellert.com/2012/04/software-careers-for-the-future/</link>
		<comments>http://www.laurencegellert.com/2012/04/software-careers-for-the-future/#comments</comments>
		<pubDate>Wed, 11 Apr 2012 05:26:00 +0000</pubDate>
		<dc:creator>Laurence</dc:creator>
				<category><![CDATA[Book Reviews]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[career]]></category>
		<category><![CDATA[leadership]]></category>

		<guid isPermaLink="false">http://www.laurencegellert.com/?p=729</guid>
		<description><![CDATA[Today&#8217;s topic is success as software professionals.  Many important lessons on this subject can be found in an unlikely place &#8211; Colin Powell&#8217;s auto-biography &#8220;My American Journey&#8221;, published in 1995.  Hey, what does this have to do with software you might &#8230; <a href="http://www.laurencegellert.com/2012/04/software-careers-for-the-future/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Today&#8217;s topic is success as software professionals.  Many important lessons on this subject can be found in an unlikely place &#8211; Colin Powell&#8217;s auto-biography <em>&#8220;My American Journey&#8221;, </em>published in 1995.  Hey, what does this have to do with software you might ask? As I keep saying, success in a technical discipline like software increasingly hinges on communication and leadership ability.  <em>My American Journey</em> is a manual for success.</p>
<p><img class="alignnone size-full wp-image-735" title="powell" src="http://www.laurencegellert.com/wp-content/uploads/2012/04/powell.jpg" alt="" width="300" height="272" /></p>
<p><strong>My first observation is how Colin Powell (a C student in high school) found himself in a huge organization that he could flourish in and would eventually lead.  </strong>This happened to be the military at the height of the cold war. More on the cold war later&#8230;</p>
<p>Powell sets out career themes which he reinforced, rather &#8216;drilled&#8217; throughout the book. He kept sayings on his desk to remind him of things he learned the hard way. Some of these are quoted below:</p>
<p><strong>Communication:</strong></p>
<p>In any presentation Powell would take care to manage his words, posture, and body movements. These are techniques he learned at officer training school. In the civilian world we have Toast Masters.</p>
<p><em>&#8220;Tell &#8216;em what your gonna&#8217; tell &#8216;em. Then tell &#8216;em what you just told &#8216;em.&#8221;</em></p>
<p>At press conferences he would do his best to give the answer he wanted to hear, vs. answering the question put to him.</p>
<p><em>&#8220;Never let them see you sweat.&#8221;</em></p>
<p>&nbsp;</p>
<p><strong>Attitude:</strong></p>
<p><em>&#8220;Perpetual optimism is a force multiplier.&#8221;</em></p>
<p>This is real. The startup I was part of in 2002 had this going for it. I have helped it manifest again and again in my career. It is a joyous feeling to begin each day on the job surrounded by the force multiplier.</p>
<p>Sometimes, we get crappy assignments. Here is how to deal with it:</p>
<p><em>&#8220;If you get the dirty end of the stick, sharpen it and turn it into a useful tool.&#8221;</em></p>
<p>&nbsp;</p>
<p><strong>Change:</strong></p>
<p>Okay, back to the cold war&#8230; When Powell became the Chairman of the Joint Chiefs of Staff, he saw Russia collapsing and the cold war coming to an end. This made much of the US mililtary strategy obsolete as the 1980&#8242;s drew to a close. Powell saw the magnitude of this earlier than most.  Instead of holding onto the past, he pushed for a 25% reduction in the size of the military. This was in spite of the fact he personally loved the military and knew how damaging the cuts would be to service men and women entrusted to his care.  The rules had changed.  He was in a position to do something about it. Understanding the reoccurring dynamic of change, as illogical and random as it often can be, is a key to success.</p>
<p>Software becomes obsolete and that can take people with it. Here&#8217;s a trick for staying ahead of change that Powell learned from a lawyer during a round of downsizing:</p>
<p><em>&#8220;Avoid having your ego so close to your position that when your position falls, your ego goes with it.&#8221;</em></p>
<p><strong>So what does a career in software look like?</strong></p>
<p>There is no 30 year career map for a programmer like there is for a 4 star general. It is more like a steep ramp from Jr. to Senior in 5-7 years that involves a 3-4x pay boost.  Then what? Architect, principal engineer, CTO, freelancer, teacher, entrepreneur, author, consultant?   The answer is <em>Tabula rasa - </em>a blank slate.</p>
<p><strong>So how does a software professional flourish?</strong> Today nobody cares if you did DOS 5.0 programming.  <em>In fact they may feel sorry for you.</em>  However, if you lead a team of diverse individuals to succeed on a project that made money, it is absolutely relevant and always will be.  The software professional of the future is not a coder, but a communicator and leader who understands the business and the code.  Coding is a commodity. Understanding how to apply the commodity to get the outcome is where the action is. It does not hurt to genuinely enjoy the challenge of working with customers.</p>
<p>Final quote from Powell, especially when it comes to your life -<em> &#8220;Have a vision. Be demanding.&#8221;</em></p>
<p><strong>More information on Colin Powell:</strong><br />
<a href="http://en.wikipedia.org/wiki/Colin_Powell">http://en.wikipedia.org/wiki/Colin_Powell</a></p>
<p><strong>A complete list of his rules can be found here:</strong></p>
<ul>
<li><a href="http://www.lucidcafe.com/library/96apr/powell2.html">http://www.lucidcafe.com/library/96apr/powell2.html</a></li>
<li><a href="http://managementisajourney.com/2011/04/revisiting-colin-powells-13-rules-of-leadership/">http://managementisajourney.com/2011/04/revisiting-colin-powells-13-rules-of-leadership/</a></li>
<li><a href="http://implementimprovement.com/?p=571">http://implementimprovement.com/?p=571</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.laurencegellert.com/2012/04/software-careers-for-the-future/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Response Design Testing Tool Launched</title>
		<link>http://www.laurencegellert.com/2012/04/response-design-testing-tool-launched/</link>
		<comments>http://www.laurencegellert.com/2012/04/response-design-testing-tool-launched/#comments</comments>
		<pubDate>Fri, 06 Apr 2012 02:52:34 +0000</pubDate>
		<dc:creator>Laurence</dc:creator>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://www.laurencegellert.com/?p=725</guid>
		<description><![CDATA[Just posted this CSS Responsive Design testing tool. You can enter your site&#8217;s URL and it will render it at a variety of resolutions. Enjoy!]]></description>
			<content:encoded><![CDATA[<p>Just posted this <a href="http://www.laurencegellert.com/software/css-responsive-design-testing-tool/">CSS Responsive Design testing tool</a>.  You can enter your site&#8217;s URL and it will render it at a variety of resolutions.  </p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.laurencegellert.com/2012/04/response-design-testing-tool-launched/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Responsive Design Theme Implemented</title>
		<link>http://www.laurencegellert.com/2012/03/theme-updated/</link>
		<comments>http://www.laurencegellert.com/2012/03/theme-updated/#comments</comments>
		<pubDate>Fri, 30 Mar 2012 03:10:41 +0000</pubDate>
		<dc:creator>Laurence</dc:creator>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[fun]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://www.laurencegellert.com/?p=695</guid>
		<description><![CDATA[New blog theme was launched tonight! The theme name is Brunelleschi, by Kit MacAllister.  He&#8217;s also from Portland. Here&#8217;s what I love about the theme &#8211; it uses Responsive Design. For a demonstration of what Responsive Design is, try re-sizing &#8230; <a href="http://www.laurencegellert.com/2012/03/theme-updated/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>New blog theme was launched tonight!</p>
<p>The theme name is <a href="http://kitmacallister.com/2011/brunelleschi/" target="_blank">Brunelleschi</a>, by <a href="http://kitmacallister.com/about/" target="_blank">Kit MacAllister</a>.  He&#8217;s also from Portland.</p>
<p>Here&#8217;s what I love about the theme &#8211; it uses <strong>Responsive Design</strong>.</p>
<p><em><strong>For a demonstration of what Responsive Design is, try re-sizing this browser window, or loading it with your phone or tablet.</strong></em> Notice how the site manages to compensate for whatever width it is being rendered at.   This is completely CSS driven, using the new HTML5 CSS3 standard called <em><strong>media queries</strong></em>.  These allow the CSS to understand the current page width and apply styles accordingly.  From a programming perspective, it is like having an {if/then} statement right there in the CSS.  I have to say, I&#8217;m hooked on this technology!  The media query standard took a lot of foresight from its creators and solves a difficult problem quite elegantly.</p>
<p>From an application architecture standpoint costs go down and productivity goes up. A web application can use one set of markup and work on just about any modern web enabled device (phones, tablets, and desktops).  Note I said <em>modern</em> device.  IE6 is out, but its market share is dwindling which means it is getting harder to make the old tired argument &#8211; <em>&#8220;but we need to support IE6&#8230;&#8221;</em>.  In quick testing it seems to work okay with IE7 and IE8 (simulated through IE9).</p>
<p><strong> Some examples of Responsive CSS code that help make this possible:</strong></p>
<pre>/* Set it up so images do not over flow their container */
img {
  max-width: 100%;
  height: auto;
}

/* When the width is below 767, adjust the right hand bar to
 *  drop below, instead of float right. */
@media handheld, only screen and (max-width: 767px) {
  .widget-area {
     width: auto;
     float: none;
     margin-left: 0px;
     margin-right: 0px;
     padding-left: 20px;
     padding-right: 20px;
   }
}</pre>
<p>&nbsp;</p>
<p><strong>Links on Responsive Design:</strong></p>
<p><a href="http://webdesignerwall.com/tutorials/responsive-design-with-css3-media-queries">http://webdesignerwall.com/tutorials/responsive-design-with-css3-media-queries</a> (good introduction to the technology)</p>
<p><a href="http://css-tricks.com/responsive-data-tables/">http://css-tricks.com/responsive-data-tables/</a>  (for handling &lt;table&gt; rendering on phone size screens)</p>
<p><a href="http://getskeleton.com/">http://getskeleton.com/</a> (framework)</p>
<p><a href="http://lessframework.com/">http://lessframework.com/</a> (framework)</p>
<p>Personally I would play with the CSS first before delving into a framework. Media queries are super simple to work with and don&#8217;t require much to get going.  Introducing them into an existing site is another story&#8230;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.laurencegellert.com/2012/03/theme-updated/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript the Good Parts &#8211; Review</title>
		<link>http://www.laurencegellert.com/2012/03/javascript-the-good-parts-review/</link>
		<comments>http://www.laurencegellert.com/2012/03/javascript-the-good-parts-review/#comments</comments>
		<pubDate>Sat, 10 Mar 2012 19:13:49 +0000</pubDate>
		<dc:creator>Laurence</dc:creator>
				<category><![CDATA[Book Reviews]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://www.laurencegellert.com/?p=672</guid>
		<description><![CDATA[First, let&#8217;s start with a little joke about JavaScript: See the difference? &#160; This book is targeted at helping readers understand the &#8216;low level&#8217; implementation details of JavaScript. The code examples on nuances of the language are the best I have found. As &#8230; <a href="http://www.laurencegellert.com/2012/03/javascript-the-good-parts-review/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>First, let&#8217;s start with a little joke about JavaScript:</p>
<p><img src="http://www.laurencegellert.com/wp-content/uploads/2012/03/goodparts1.jpg" alt="JavaScript good vs evil" width="550" height="270" /></p>
<p><em><strong>See the difference?</strong></em></p>
<p>&nbsp;</p>
<p>This book is targeted at helping readers understand the &#8216;low level&#8217; implementation details of JavaScript.</p>
<p>The code examples on nuances of the language are the best I have found. As a primer, check out <a href="http://www.crockford.com/" target="_blank">Douglas Crockford&#8217;s website</a>, which has a lot of the same information in the book.</p>
<p><img src="http://www.laurencegellert.com/wp-content/uploads/2012/03/goodparts2.png" alt="JavaScript the good parts" width="300" height="391" /></p>
<p>The book itself is only about 100 pages. 20% of that is filled with train track diagrams that explain the syntax of JavaScript graphically &#8211; not that useful to me personally. There is a good chapter on RegEx (which is more about understanding RegEx than JavaScript). The book is more in depth than his website, but still paper thin relative to a C++ or Java tome. I would have liked to see more examples and the way he might approach setting up a library or a small app.</p>
<p><strong><em>JavaScript sucks right? It was built for Netscape 2.0.<br />
The only language worse than JavaScript is Action Script 2.0, right??</em></strong></p>
<p>I think not.</p>
<p>JavaScript is a critical language for the next decade. The forces driving this include:</p>
<ul>
<li>Apple and Google are pushing hard on JavaScript. So is Microsoft with their HTML5 based Windows8.</li>
<li>Mobile Browsers &#8211; why build a native app when you can get 80-90% of the functionality out of a mobile web app? Marketing firms are asking this question, and opting for mobile web apps vs native apps because in many cases it is more practical. Sure, native apps still rock and are required for many use cases. However, organizations won&#8217;t be building multiple native apps targeting Android and iOS, when they can just build one mobile web app that gets the job done.</li>
<li>Node.js is to JavaScript what Ruby on Rails was to Ruby back in 2005. We&#8217;ll continue to see rapid growth in the Node.js area.</li>
</ul>
<p><strong>The book points out that to master JavaScript, we must be aware of certain pitfalls:</strong></p>
<ul>
<li>Relies on global variables.</li>
<li>&#8216;+&#8217; is used to add, or to concatenate strings.</li>
<li>All variables declared in a function are global to that function &#8211; no block scope.</li>
<li>Falsy and Truthy are hard to follow when comparing different types. Best to use === and !== which compare on type and value, instead of == and != which compare on value through a type cast if necessary.</li>
<li>Functions are redefined at runtime at the top of their scope (eg, a function can be called above its declaration).</li>
<li>(list truncated)</li>
</ul>
<p><strong>The biggest thing I got out of the book, something that every JavaScript programmer needs to know, is the behavior of the &#8216;new&#8217; keyword:</strong></p>
<p>The behavior the &#8216;new&#8217; keyword is convoluted and non-obvious. When an object/function is created, adding the new keyword changes the meaning of &#8216;this&#8217;. When &#8216;new&#8217; is added, &#8216;this&#8217; refers to the object, which makes sense. However in the next code block, where &#8216;new&#8217; is omitted, &#8216;this&#8217; refers to the global Window object! The code example shows how the global object can be polluted. Watch out for &#8216;this&#8217;.</p>
<pre class="prettyprint">// setup our example function
var Example = function(name) {
	var self = this;
	self.name = name;
	return {
		getName: function () {
			return self.name;
		}
	};
};

// check our Window's name, which should start off blank
console.log("Window's name is: " + window.name);
// -&gt; Window's name is:

// using new keyword
var thisIsSafe = new Example('Safe!');
console.log("thisIsSafe name: " + thisIsSafe.getName());
// -&gt; thisIsSafe name: Safe!

// let's check our Window's name again, should still be blank
console.log("Window's name is: " + window.name);
// -&gt; Window's name is:

// without new keyword
var thisIsBad = Example('Bad!!!');
console.log("thisIsBad name: " + thisIsBad.getName());
// -&gt; thisIsBad name:  Bad!!!
console.log("Window's name is now: " + window.name);
// -&gt; Window's name is now: Bad!!!
// We just polluted the global 'window' variable.
// oh no!!! get away from the fuel tanks!!!</pre>
<p>&nbsp;</p>
<p><strong>Quick JavaScript Tip:</strong></p>
<ul>
<li>CTL+SHIFT+J in Chrome is my friend &#8211; brings up the JavaScript console.</li>
<li>CTL+SHIFT+J in Firefox brings up the JavaScript error console as well, but it is not as handy as Chrome&#8217;s.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.laurencegellert.com/2012/03/javascript-the-good-parts-review/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Fat-Free Routing Examples</title>
		<link>http://www.laurencegellert.com/2012/02/php-fat-free-routing-examples/</link>
		<comments>http://www.laurencegellert.com/2012/02/php-fat-free-routing-examples/#comments</comments>
		<pubDate>Sun, 26 Feb 2012 00:42:06 +0000</pubDate>
		<dc:creator>Laurence</dc:creator>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://www.laurencegellert.com/?p=652</guid>
		<description><![CDATA[The PHP Fat-Free framework is the best library I have found in the PHP world for SEO friendly URL routes (eg, /people/{some_username}). It is simple, flexible, and gets the job done with only a 58KB footprint! This can be thought &#8230; <a href="http://www.laurencegellert.com/2012/02/php-fat-free-routing-examples/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://fatfree.sourceforge.net/" target="_blank">PHP Fat-Free framework</a> is the best library I have found in the PHP world for SEO friendly URL routes (eg, /people/{some_username}). It is simple, flexible, and gets the job done with only a 58KB footprint!  This can be thought of as the &#8216;C&#8217; in MVC, for controller, which handles incoming requests and provides the glue between the model and the view.  With Fat-Free all the &#8216;configuration&#8217; is done directly in PHP code. Some might think that a lack of external configuration is a downside. I would agree with that for large scale enterprise type projects. However, for the kind of projects I use with Fatfree (and LAMP stack in general), I absolutely love the simplicity it offers.</p>
<p><strong>To set up Fat-Free routes in Apache, first configure your .htaccess file:</strong></p>
<pre class="homebrew">RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L,QSA]</pre>
<p>&nbsp;<br />
This tells Apache to send all requests into the app (which lives at &#8216;/&#8217;) through index.php (unless the file or directory that corresponds to the requested location exists on the file system).  This way CSS, images, javascript files, or whatever else we want to serve will be handled directly by Apache, bypassing Fat-Free.</p>
<p><strong>The next step is to setup index.php that includes Fat-Free and defines a route:</strong></p>
<pre class="prettyprint">require_once "fatfree/base.php";   //Fat-free
F3::set('DEBUG', 3); // debug is good for dev, not for live

F3::route('GET /example/@name', function() {
	F3::set("pageTitle", "First try at Fatfree");
	echo F3::render('templates/example.php');
});

F3::run();  // kick off Fat-Free routing
</pre>
<p>&nbsp;<br />
This route specifies that GET requests to /example/{some string} will be sent to example.php. Go ahead and make the file templates/example.php, and put some <a href="http://www.lipsum.com/" target="_blank">great content</a> into it.</p>
<p>Access the pageTitle variable like so:</p>
<pre class="prettyprint">echo F3::get("pageTitle");</pre>
<p>&nbsp;<br />
Access the value of @name with:</p>
<pre class="prettyprint">echo F3::resolve('{{@PARAMS.name}}');</pre>
<p>&nbsp;<br />
It is very smart to go with a layout for your site. Fat-Free lets us chain templates. To add a header and footer:</p>
<pre class="prettyprint">F3::route('GET /example/@name', function() {
	F3::set("pageTitle", "First try at Fatfree");
	echo F3::render('templates/header.php');
	echo F3::render('templates/example.php');
	echo F3::render('templates/footer.php');
});

// if you don't need pageTitle, you can do this as:
F3::route('GET /example/@page','templates/header.php; templates/example.php; templates/footer.php');
</pre>
<p>&nbsp;<br />
The nice thing about Fat-Free is, each file is executed it its own sandbox. To share variables between templates you can use PHP globals (just make sure to use them wisely).<br />
&nbsp;<br />
<strong>To respond to a POST event on the example page, just create another route:</strong></p>
<pre class="prettyprint">// here is our route from the last example
F3::route('GET /example/@name', function() {
	F3::set("pageTitle", "First try at Fatfree");
	echo F3::render('templates/header.php');
	echo F3::render('templates/example.php');
	echo F3::render('templates/footer.php');
});

// now we'll do a POST that does some processing magic
F3::route('POST /example/@name', function() {
	F3::set("pageTitle", "First try at Fatfree");
	include("actions/example_post_logic.php");
	echo F3::render('templates/header.php');
	echo F3::render('templates/example.php');
	echo F3::render('templates/footer.php');
});
</pre>
<p>&nbsp;<br />
This way the routing configuration is controlling when to pull in the logic that handles the POST operation. This very cleanly breaks out the relative concerns into multiple files, without the overhead of a bloated MVC framework.<br />
&nbsp;<br />
This tutorial should be enough to wet your appetite. <a href="http://fatfree.sourceforge.net/page/routing-engine" target="_blank">Click here for the official documentation with more examples.</a>  There are several additional things Fat-Free does as well, including: dependency auto loading, templating, form handling, ORM, etc.</p>
<p><strong>Things to be aware of about Fat-Free&#8217;s routing framework:</strong></p>
<ul>
<li>Given that the routing is setup as a PHP file, eventually a site will get large enough to warrant breaking it up into smaller subsets.</li>
<li>There is some repetition when defining the templates, especially the way I have been doing it here with GET and POST.</li>
<li>Error handling takes some work to setup. I will do another post on how I approach that.</li>
<li>Fat-Free is dual licensed as GPL and commercial friendly for a donation. Just be aware of that, and buy a license if you need it.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.laurencegellert.com/2012/02/php-fat-free-routing-examples/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Does 0.999… Equal 1 ?</title>
		<link>http://www.laurencegellert.com/2012/02/does-0-999%e2%80%a6-equal-1/</link>
		<comments>http://www.laurencegellert.com/2012/02/does-0-999%e2%80%a6-equal-1/#comments</comments>
		<pubDate>Sat, 11 Feb 2012 16:40:03 +0000</pubDate>
		<dc:creator>Laurence</dc:creator>
				<category><![CDATA[Science and Math]]></category>
		<category><![CDATA[math]]></category>

		<guid isPermaLink="false">http://www.laurencegellert.com/?p=643</guid>
		<description><![CDATA[For those who want immediate gratification, YES, 0.999… = 1 The dot dot dot (…) means 9’s repeating infinitely, past 2012, past the end of time, FOREVER. That is a lot of nines. It can also be written with a bar &#8230; <a href="http://www.laurencegellert.com/2012/02/does-0-999%e2%80%a6-equal-1/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>For those who want immediate gratification, YES, 0.999… = 1</strong></p>
<p>The dot dot dot (…) means 9’s repeating infinitely, past 2012, past the end of time, FOREVER. That is a lot of nines. It can also be written with a bar over the 9, as <strong>0.<span style="text-decoration: overline;">9</span></strong>.</p>
<p>So what is going on here with 0.999&#8230;</p>
<ul>
<li>0.9 != 1</li>
<li>0.9999 != 1</li>
<li>0.9999999 != 1</li>
<li>0.9999999999 != 1</li>
<li>0. 9999999999999 != 1</li>
<li>0. 9999999999999999 != 1</li>
<li>0. 9999999999999999999 != 1</li>
<li>0. 9999999999999999999999 != 1</li>
<li>0. 9999999999999999999999999 != 1</li>
<li>0. 9999999999999999999999999999 != 1</li>
<li>0. 9999999999999999999999999999999 != 1</li>
<li>0. 9999999999999999999999999999999999 != 1</li>
<li>0. 9999999999999999999999999999999999999 != 1</li>
<li>0. 9999999999999999999999999999999999999999 != 1</li>
<li>Wheeeeeeeeeeeeeeeeeeeeeeeeeeeeee! ………………………………..</li>
</ul>
<p>According to the hill of ASCII art, sliding down farther and farther never gets you there.  The pattern never reaches a value of 1. The sequence will always be just a hair under 1.<br />
<br/></p>
<p><strong>This is along the same lines as Zeno’s Dichotomy paradox:</strong><br />
To move onto an elevator, you must first get half way there, and then get a quarter of the way there, and then one eighth, and one sixteenth, and one 32nd, and 1/64th and 1/128th, and so on…. such that you never reach the elevator because there is always an additional half step to travel.  Zeno was good at driving people crazy with ideas like that.</p>
<p><br/><br />
<strong>Guess what? It is a riddle. Calculus is the answer.</strong></p>
<p>Using the concept of infinity (positive infinity in this case) and the concept of a limit equation, calculus shows that indeed, 0.999… equals 1.</p>
<p><img class="alignnone size-full wp-image-644" title="0999calc" src="http://www.laurencegellert.com/wp-content/uploads/2012/02/0999calc.png" alt="" width="664" height="49" /></p>
<p>YES!</p>
<p>Think along conventional lines and get conventional answers.</p>
<p>Information in this article and the calculus equation graphic are attributed to <a href="http://en.wikipedia.org/wiki/0.999..." target="_blank">http://en.wikipedia.org/wiki/0.999&#8230;</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.laurencegellert.com/2012/02/does-0-999%e2%80%a6-equal-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Associative Arrays in JavaScript</title>
		<link>http://www.laurencegellert.com/2012/01/associative-arrays-in-javascript/</link>
		<comments>http://www.laurencegellert.com/2012/01/associative-arrays-in-javascript/#comments</comments>
		<pubDate>Sun, 29 Jan 2012 19:39:49 +0000</pubDate>
		<dc:creator>Laurence</dc:creator>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://www.laurencegellert.com/?p=503</guid>
		<description><![CDATA[Associative Arrays in JavaScript are a breed of their own. It is a side effect of the weak typing in JavaScript. To understand the issue, let&#8217;s walk through some examples: The length property is not defined as it would be &#8230; <a href="http://www.laurencegellert.com/2012/01/associative-arrays-in-javascript/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Associative Arrays in JavaScript are a breed of their own. It is a side effect of the weak typing in JavaScript. To understand the issue, let&#8217;s walk through some examples:</p>
<p>The length property is not defined as it would be in a normal array:</p>
<pre class="prettyprint">var basicArray = new Array();
basicArray[0] = "Portland";
basicArray[1] = "Beaverton";
basicArray[2] = "Lake Oswego";
console.log(basicArray.length);
// --&gt; Outputs 3, as expected

var associativeArray = new Array();
associativeArray['city'] = "Portland";
associativeArray['state'] = "Oregon";
associativeArray['country'] = "United States";
console.log(associativeArray.length);
// --&gt; Outputs 0 in Chrome, what the heck?

// we can also access values through .property notation ?!
console.log("City is: " + associativeArray['city']);
console.log("City is: " + associativeArray.city); 

// outputs
// --&gt; City is: Portland
// --&gt; City is: Portland</pre>
<p>&nbsp;</p>
<p>What is going on here? <em><strong>I want my associative array and I want it now!</strong></em></p>
<p>Well it turns out, that just isn&#8217;t going to happen (<em>grumble&#8230;</em>).  Associative arrays in JavaScript are actually treated as Objects. Properties and methods can be assigned arbitrarily. In practice, the associativeArray variable declared above doesn&#8217;t make sense. It is correctly done this way:</p>
<pre class="prettyprint">var myObject = {};  // denotes an Object is being created
myObject.city = "Portland";
myObject.state = "Oregon";
myObject.country = "United States";
console.log(myObject.length);  // results in undefined
console.log("City is: " + myObject['city']);
console.log("City is: " + myObject.city); 

// outputs
// --&gt; City is: Portland
// --&gt; City is: Portland</pre>
<p>Now that we know we are working with an Object we have to implement our own length function (but does that really even make sense?).</p>
<p>One way to get at the properties is to use a for/in loop:</p>
<pre class="prettyprint">for(property in myObject) {
   console.log(property + " = " + myObject[property]);
}

// outputs:
// --&gt; city = Portland
// --&gt; state = Oregon
// --&gt; country = United States</pre>
<p><strong>Introducing Object.keys():</strong></p>
<p>A manual loop? That seems too low level to be missing from the API! It turns out there is the <em><strong>Object.keys([object])</strong></em> method, but it is not supported in all browsers. <a href="http://kangax.github.com/es5-compat-table/" target="_blank">This link covers recent browsers and what JavaScript methods are supported</a>. As you can expect IE8 is at the back of the pack, with FF 3.5 and Safari 4 sightly ahead. It seems that Chrome, FF 4+, and IE9 do quite well on the list.</p>
<pre class="prettyprint">Object.keys(myObject);
// --&gt; ["city", "state", "country"]
Object.keys(myObject).length
// --&gt; 3

// calling myObject.keys() results in:
// --&gt; Type Error: Object #&lt;Object&gt; has no method 'keys'</pre>
<p><strong>Another way to define an array:</strong></p>
<p>While we are on the subject of arrays in JavaScript, it is good know there are two ways to define them. Using <em><strong>var x = [];</strong></em> will also declare an array. In JavaScript with [] you do not have the option of setting the initial size of the array. You can only set the value at index 0. Note how the lengths are different in the example below:</p>
<pre class="prettyprint">// with this setup, there is no way to set the length ahead of time
var terseDeclaration = [5];
console.log(terseDeclaration[0]);
// --&gt; 5
console.log(terseDeclaration.length);
// --&gt; 1

// with Array() the length can be set up front
var longDeclaration = new Array(5);
console.log(longDeclaration[0]);
// --&gt; undefined
console.log(longDeclaration.length);
// --&gt; 5</pre>
<p><strong>More thoughts:</strong><br />
JavaScript is, after all, an Object Oriented language. The commonly operated on &#8216;window&#8217; and &#8216;document&#8217; keywords are objects defined by the browser.  Even to this day, most users of the language rarely approach JavaScript with Objects mind.  That likely attributed to JavaScript&#8217;s primary use as a DOM manipulator and event handler.  Projects like <a href="http://nodejs.org/" target="_blank">Node.js</a> are changing that rapidly. JavaScript&#8217;s growth will only continue to accelerate given the expanding use of web technology, particularly on mobile devices. <a href="http://documentcloud.github.com/backbone/" target="_blank">Backbone.js</a> is another popular framework that is gaining traction I have been playing with lately.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.laurencegellert.com/2012/01/associative-arrays-in-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Node.js and Paperboy for local JavaScript development</title>
		<link>http://www.laurencegellert.com/2012/01/node-js-and-paperboy-for-local-javascript-development/</link>
		<comments>http://www.laurencegellert.com/2012/01/node-js-and-paperboy-for-local-javascript-development/#comments</comments>
		<pubDate>Sat, 21 Jan 2012 18:53:05 +0000</pubDate>
		<dc:creator>Laurence</dc:creator>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://www.laurencegellert.com/?p=609</guid>
		<description><![CDATA[Node.js + Paperboy make for a slick replacement to Apache as an http server for local JavaScript development. This has come in handy a lot lately when working on JavaScript experiments or prototypes. Often times it is easiest to use &#8230; <a href="http://www.laurencegellert.com/2012/01/node-js-and-paperboy-for-local-javascript-development/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://nodejs.org/" target="_blank">Node.js</a> + <a href="https://github.com/felixge/node-paperboy" target="_blank">Paperboy</a> make for a slick replacement to Apache as an http server for local JavaScript development. This has come in handy a lot lately when working on JavaScript experiments or prototypes. Often times it is easiest to use a CDN to include whatever base libraries are needed (jQuery, Dojo, etc). Annoyingly, browsers won&#8217;t download CDN content when working on a JavaScript/HTML project served off the local disk (URL like file:///C:/PROJECTS/node/local_server/demo.htm). <strong>CDN content is blocked in this situation because the browser sets a different security level for local files.</strong> For the CDN to work, the page must be accessed through a URL such as http://localhost:8000/demo.htm.</p>
<p><img title="nodejs" src="http://www.laurencegellert.com/wp-content/uploads/2011/11/nodejs.png" alt="NodeJS" width="276" height="94"></p>
<p>A plug-in for <a href="http://nodejs.org/" target="_blank">Node.js</a> called <a href="https://github.com/felixge/node-paperboy" target="_blank">Paperboy</a> acts as a local file server. <a href="https://github.com/felixge/node-paperboy" target="_blank">Paperboy </a>needs to be extracted to the /node_modules/paperboy directory where your node binary lives. You do need to write a quick script to activate paperboy. This is actually a pretty fun way to try Node for the first time.  What&#8217;s great about this is it works anywhere Node works, so Windows, Mac, Linux users can all benefit from this.</p>
<p><strong>The local http server script:</strong></p>
<pre class="prettyprint">"use strict";

// base requirements
var http = require('http');
var path = require('path');
var paperboy = require('paperboy');

// configuration options
var PORT = 8000;
// the directory is relative to where node.exe is being started from
var DIRECTORY = path.join(path.dirname(__filename), 'local_dev');

// static server
http.createServer(function(req, res) {
  var ip = req.connection.remoteAddress;
  paperboy
    .deliver(DIRECTORY, req, res)
    .addHeader('Expires', 300)
    .after(function(code) {
      log(code, req.url, ip);
    })
    .error(function(code, msg) {
      res.writeHead(code, {'Content-Type': 'text/plain'});
      res.end("Error " + code);
      log(code, req.url, ip, msg);
    })
    .otherwise(function(err) {
      res.writeHead(404, {'Content-Type': 'text/plain'});
      res.end("Error 404: File not found");
      log(404, req.url, ip, err);
    });
}).listen(PORT);

// logging method
function log(code, url, ip, err) {
  var str = code + ' - ' + url + ' - ' + ip;
  if (err)
    str += ' - ' + err;
  console.log(str);
}</pre>
<p><br/><br />
Save this script as local_server.js and locate it in the same folder where the node binary lives.  Set the desired PORT and DIRECTORY variables.  Run the binary and pass in which script you want it to load and you are up and running.</p>
<pre style="background: #dddddd;">$ ./node.exe local_server.js
</pre>
<p><br/></p>
<p><strong>More on prototypes:</strong></p>
<p>Prototyping is a really smart idea when it comes to building software. This is true even for minor increments that will ultimately be integrated into a larger software system. Prototyping gives you something to show the customer a lot sooner. That way feedback can be incorporated earlier which leads to less re-work.</p>
<p>When it comes to doing JavaScript features, the thing I love about doing a simple proof of concept outside the larger is system is that changes are immediately available in the browser. There is nothing worse than the pain of waiting for a build or app server restart! The local node server technique has made me more effective as a developer. You don&#8217;t have to use Node + Paperboy to do JavaScript prototypes, and a CDN is not required either, but together they save time.  Plus this gives you an excuse to try out something new.  Personally, I like having a few Node.js projects hanging out in my home directory.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.laurencegellert.com/2012/01/node-js-and-paperboy-for-local-javascript-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Software Productivity, Change, and Peopleware</title>
		<link>http://www.laurencegellert.com/2011/12/software-productivity-change-and-peopleware/</link>
		<comments>http://www.laurencegellert.com/2011/12/software-productivity-change-and-peopleware/#comments</comments>
		<pubDate>Sat, 31 Dec 2011 18:01:41 +0000</pubDate>
		<dc:creator>Laurence</dc:creator>
				<category><![CDATA[Book Reviews]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[career]]></category>
		<category><![CDATA[leadership]]></category>

		<guid isPermaLink="false">http://www.laurencegellert.com/?p=576</guid>
		<description><![CDATA[Peopleware – Book Review Peopleware 2nd Edition Productive Projects and Teams By Tom Demarco and Timothy Lister Peopleware is a timeless book on the human side of making software. We have all encountered many of the anti-patterns described in the &#8230; <a href="http://www.laurencegellert.com/2011/12/software-productivity-change-and-peopleware/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>Peopleware – Book Review</strong></p>
<p><em>Peopleware 2nd Edition</em><br />
<em> Productive Projects and Teams</em><br />
<em> By Tom Demarco and Timothy Lister</em></p>
<p><img title="peopleware" src="http://www.laurencegellert.com/wp-content/uploads/2011/12/peopleware.jpg" alt="peopleware" width="300" height="450" /></p>
<p>Peopleware is a timeless book on the human side of making software. We have all encountered many of the anti-patterns described in the book personally or anecdotally through co-workers. My Grandmother who was a COBOL programmer in the 70’s and 80’s can relate to the human aspects of software development. <strong>In Grandma&#8217;s opinion, job satisfaction is all about who you work with.</strong> The ornery guy in her department who played practical jokes is an example of someone who got away with wasting everybody&#8217;s time. He enjoyed tweaking the software so it would clear all fields at random intervals! Then he&#8217;d get a grin on his face to tell you who was responsible (seems like many diabolical evil doers just want attention). Working with motivated talented people makes the hours fly by. Turns out it is also good for the bottom line too. Peopleware shows this and backs it up with data.</p>
<p>Aside from the team, management’s philosophy on software is very important. <strong>As a software professional, it is favorable to work for a software company as opposed to another type of business. A company that views software as a cost puts software professionals in the same category as “IT”, as opposed to R+D where they belong and can flourish.</strong><br />
Peopleware goes on to show how human behavior is baked into the process of building software, whether we like it or not. The idea that history repeats itself is evident in how software works out. We make the same mistakes over and over, forgetting the wisdom of the past. There’s a great quote from Battelestar Galactica &#8211; &#8220;<em>All this has happened before, and all this will happen again&#8221;.</em></p>
<p>Take the crash of Netflix in the fall of 2011.</p>
<p><img title="netflix1" src="http://www.laurencegellert.com/wp-content/uploads/2011/12/netflix1.jpg" alt="netflix" width="300" height="141" /></p>
<p>Netflix&#8217;s stock went from above $300 to $77, representing a 75% loss in value over four months. Netflix might not seem like software at first glance. However, practically speaking, 99.9% of interaction with them is through a Web based UI – and that counts as software. Leading up to the crash, Netflix executives might have been thinking &#8211; <em>&#8220;With Qwikster, we will differentiate ourselves in the marketplace, create a streamlined user experience! The financial statements will be clearer since mailed DVD’s and streaming internet really are separate businesses! Plus we&#8217;ll spell Quickster with a Qw to copy Qwest, since that’s trendy!&#8221;.</em> Sounds like a Dilbert cartoon to me.</p>
<p>If the Netflix executives would have read Peopleware they would have seen this quote:</p>
<div style="border: 1px solid black; background: #cccccc; padding: 8px; margin: 5px 0px 5px 0px;"><span style="font-size: 1.7em;"><em>&#8220;People hate change…</em><br />
<em> and that’s because people hate change…</em><br />
<em> I want to be sure that you get my point.</em><br />
<em> People <strong>really</strong> hate change.</em><br />
<em> They <strong>really, really</strong> do.&#8221;</em></span><br />
- Steve McMenamin, The Atlantic Systems Guild, 1996  <em>[emphasis added]</em></div>
<p>Nextflix forced an untested change down paying customer’s throats! Qwikster may have very well been a better alternative for customers, but they rejected it because of the way the change was communicated.</p>
<p>Does this mean we never make changes? No.</p>
<p>The book points out that to help foster change we need to:</p>
<ol>
<li>Celebrate the way things used to be done.</li>
<li>Point out positive reasons for moving ahead such as: business opportunities that are now attainable, previously unavailable technology.</li>
<li>Include the &#8216;old&#8217; people in the change and give them a stake in it.</li>
</ol>
<p>A senior engineer I work with once framed it like this: &#8220;Our software was built with a model-T transmission, which is what we had at the time (2001). If you want to put in an automatic transmission, great!&#8221;.</p>
<p><strong>So what about history repeating itself?</strong></p>
<p>If all software professionals read this book, would every project be released on time with no burnout, turnover, or teamicde? Maybe, but the nature of business could get in the way:</p>
<ul>
<li>There will always be non-software managers at the helm who feel empowered to make decisions (poorly).</li>
<li>There will always be competition for resources and risk taking in business. This leads to the following anti-patterns that come from underfunding:</li>
<ul>
<li>Excessive overtime.</li>
<li>Lack of skills allocated to project, perhaps knowingly to save money.</li>
<li>Documentation, testing, best practices thrown out the window.</li>
</ul>
</ul>
<p>I am not expecting we all go out and demand perfect working conditions and twice the budget. One thing we can do as software professionals is recognize the situation and communicate it diplomatically to our superiors.</p>
<p><strong>Other Interesting Notes:</strong></p>
<ul>
<li>Organizational busy work tends to expand to fill the working day. – pg 29</li>
<li>Quality is a means to higher productivity (in software).</li>
<li>Good people gravitate towards good organizations. <em>&#8220;While this 10:1 productivity differential among programmers is understandable, there is also a 10:1 difference in productivity among software organizations.&#8221;</em> – Software Productivity, pg 48.</li>
<li>Cornell experiment that showed listening to music occupies the right brain and blocks creative potential when working on a logic problem. So much for using Pandora!</li>
<li>There is a Danish law that requires every employee in an office to get a window. Narrow buildings result. I love it!</li>
<li><em>&#8220;The ultimate management sin is wasting people&#8217;s time.&#8221;</em> pg 215 &#8211; Is it a meeting or a ceremony?</li>
<li>Managing smart people is really about getting out of their way. My best managers get this. The micromanaging types fail at this.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.laurencegellert.com/2011/12/software-productivity-change-and-peopleware/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IntelliJ vs. Eclipse – IDEA is my new friend</title>
		<link>http://www.laurencegellert.com/2011/12/intellij-vs-eclipse-%e2%80%93-idea-is-my-new-friend/</link>
		<comments>http://www.laurencegellert.com/2011/12/intellij-vs-eclipse-%e2%80%93-idea-is-my-new-friend/#comments</comments>
		<pubDate>Sat, 10 Dec 2011 18:31:33 +0000</pubDate>
		<dc:creator>Laurence</dc:creator>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://www.laurencegellert.com/?p=552</guid>
		<description><![CDATA[Most professional Java developers swear by IntelliJ IDEA. In my new job I use it on a daily basis. I have to agree &#8211; it rocks. At $499 it is not terribly expensive compared to other commercial licenses. The free &#8230; <a href="http://www.laurencegellert.com/2011/12/intellij-vs-eclipse-%e2%80%93-idea-is-my-new-friend/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Most professional Java developers swear by <a href="http://www.jetbrains.com/idea/buy/index.jsp" target="_blank">IntelliJ IDEA</a>. In my new job I use it on a daily basis. I have to agree &#8211; it rocks. At $499 it is not terribly expensive compared to other commercial licenses. The free version has restrictions and I cannot speak to what those are since I have not tried it.</p>
<p>Coming from an <a href="http://www.eclipse.org/" target="_blank">Eclipse</a> background I wanted to share my take on the differences between the two. Debating the merits of an IDE can incite a holy war. Everybody is different, everybody wants it their way, and what is familiar often takes precedent over what is foreign. However, <em><strong>when I get too comfortable with a tool it probably means I am not keeping up.  </strong></em>Embracing change is an important part of being a software professional.</p>
<p><strong>Both Tools are Really Good:</strong></p>
<p><img title="eclipse_bckgr_logo_fc_med" src="http://www.laurencegellert.com/wp-content/uploads/2011/11/eclipse_bckgr_logo_fc_med.jpg" alt="" width="360" height="238" /></p>
<p>VS</p>
<p><img title="logo_intellij_idea" src="http://www.laurencegellert.com/wp-content/uploads/2011/11/logo_intellij_idea.gif" alt="" width="360" height="69" /></p>
<p>&nbsp;</p>
<p>Both tools get the job done and don&#8217;t get in my way too much. I am happy using either. IntelliJ is smoother in several areas, especially navigation and integration with SVN. However, IntelliJ is focused on the Java ecosystem, which can be a limitation. They both take 30+ seconds to start and sometimes freeze up during complex operations.</p>
<p><strong>Eclipse&#8217;s Broad Language Support and Plug-ins:</strong></p>
<p>Eclipse has a huge plug-in eco system. Some of the plug-ins are gold. Some are downright garbage and don&#8217;t work. Some plug-ins only work in a certain version of Eclipse. It can be frustrating to get everything working just right. Such is the nature of open source.</p>
<p>One thing IntelliJ users often over look is the fact that Eclipse does much more Java. I have used Eclipse for Python (pydev), PHP, Ruby, CSS/HTML, Perl, Database Modeling, SQL, UML&#8230; the list goes on. According to the wiki, Eclipse even does COBOL, Ada, and C++! In a past job, I was having to switch between languages on a daily basis. Not having to switch IDEs was nice. <em><strong>Eclipse destroys IntelliJ when it comes to a work environment where both java and non-java technologies are called for.</strong></em></p>
<p><strong>IntelliJ – Overall Impression:</strong></p>
<p>IntelliJ seems to anticipate what I am doing and makes navigating a complex object model fairly straight forward. Integration with app servers, such as WebLogic, is seamless. The debugger works really well. The search feature is fast. One thing I really, really love is how responsive the auto-complete is. I can&#8217;t count how many times Eclipse would grind for 15-20 seconds when I would type a &#8216;.&#8217; after an object. The pause would break my chain of thought.</p>
<p><strong>SubVersion Integration &#8211; IntelliJ Wins!</strong></p>
<p>I think my favorite thing about IntelliJ is the integration with SVN and the ability to shelve changes. I had used Subclipse in the past for Eclipse. With Eclipse, each changed folder/file gets a tiny little star next to it. This makes it difficult to see what has changed locally. IntelliJ has a tab dedicated to changes that stays at the bottom of the window. No need to switch perspectives. The built in diff tool, (Ctl +D) is really handy.</p>
<p><strong>IntelliJ IDEA Keyboard Short Cuts:</strong></p>
<p>For developers switching from Eclipse to IntelliJ, I have made the following list of hot keys in IntelliJ:</p>
<table class="datatable" width="546" border="1" cellspacing="0" cellpadding="4">
<colgroup>
<col width="174" />
<col width="353" /> </colgroup>
<tbody>
<tr valign="TOP">
<th width="174">Key Combination</th>
<th width="353">Description</th>
</tr>
<tr valign="TOP">
<td width="174">Alt + Insert</td>
<td width="353">Generates code (getters, setters, etc.)</td>
</tr>
<tr valign="TOP">
<td width="174">Alt + F7</td>
<td width="353">Find uses (highlight a method or variable)</td>
</tr>
<tr valign="TOP">
<td width="174">Ctl + N</td>
<td width="353">Lookup Java class by name</td>
</tr>
<tr valign="TOP">
<td width="174">Ctl + Shift + N</td>
<td width="353">Lookup files in project by name</td>
</tr>
<tr valign="TOP">
<td width="174">Ctl + F12</td>
<td width="353">Inspect all class methods</td>
</tr>
<tr valign="TOP">
<td width="174">Ctl + Mouse Hover</td>
<td width="353">Shows class name</td>
</tr>
<tr valign="TOP">
<td width="174">Ctl + Click</td>
<td width="353">Navigate into a method</td>
</tr>
<tr valign="TOP">
<td width="174">Ctl + Alt + Left</td>
<td width="353">Go back to last tab</td>
</tr>
<tr valign="TOP">
<td width="174">Ctl + Shift + Backspace</td>
<td width="353">Back to last place where changes were made</td>
</tr>
<tr valign="TOP">
<td width="174">Ctl + F10</td>
<td width="353">Redeploy and update degugged instance</td>
</tr>
<tr valign="TOP">
<td width="174">Shift + F10</td>
<td width="353">Run</td>
</tr>
<tr valign="TOP">
<td width="174">Ctl + /</td>
<td width="353">Comment / uncomment code by line (adds //)</td>
</tr>
<tr valign="TOP">
<td width="174">Ctl+ / + Shift</td>
<td width="353">Comment / uncomment code with block comment</td>
</tr>
<tr valign="TOP">
<td width="174">Ctl + Alt + F</td>
<td width="353">Format code</td>
</tr>
<tr valign="TOP">
<td width="174">Ctl + Alt + O</td>
<td width="353">Organize imports</td>
</tr>
<tr valign="TOP">
<td width="174">Alt + Enter</td>
<td width="353">Fixes and contextual actions</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.laurencegellert.com/2011/12/intellij-vs-eclipse-%e2%80%93-idea-is-my-new-friend/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.220 seconds -->

