<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

  <title><![CDATA[Engineered Web]]></title>
  
  <link href="http://engineeredweb.com/" />
  <updated>2012-05-15T23:07:50-04:00</updated>
  <id>http://engineeredweb.com/</id>
  <author>
    <name><![CDATA[Matt Farina]]></name>
    <email><![CDATA[matt@mattfarina.com]]></email>
  </author>

  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/EngineeredWeb" /><feedburner:info uri="engineeredweb" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>EngineeredWeb</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry>
    <title type="html"><![CDATA[Drupal 7.14 API Compatibility Breaking Change]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/uQ5gk09m6sE/drupal-7-14-api-incompatible-change" />
    <updated>2012-05-15T20:30:00-04:00</updated>
    <id>http://engineeredweb.com/blog/drupal-7-14-api-incompatible-change</id>
    <content type="html">&lt;p&gt;Minor &lt;a href="http://drupal.org"&gt;Drupal&lt;/a&gt; versions are usually for bug fixes, security updates, and the occasional new feature that doesn't break backwards compatibility. Compatibility changes are reserved for major Drupal releases. There are exceptions such as Drupal 6.2. It was such a big deal there is an &lt;a href="http://drupal.org/node/244569"&gt;update documentation page just for this release&lt;/a&gt;. When Drupal 7.14 made an API breaking change &lt;a href="http://drupal.org/update/modules"&gt;without providing documentation&lt;/a&gt; or notification to module developers I was quite surprised. The lack of detail made it difficult to track down the changes when I had a broken codebase. Here are the details so others can, hopefully, have an easier time if they run into this problem.&lt;!--break--&gt;&lt;/p&gt;

&lt;h2&gt;What Is An API Breaking Change?&lt;/h2&gt;

&lt;p&gt;I consider a change to be API breaking if for the same input a function or method has a change to the output. For example, the data structure for the response from a function is different from before. This is what happened in Drupal 7.14.&lt;/p&gt;

&lt;h2&gt;The Change in Drupal 7.14&lt;/h2&gt;

&lt;p&gt;Prior to Drupal 7.14 the database connections were configured, by default, to fetch all field and column names as lowercase. &lt;a href="http://drupal.org/node/1171866"&gt;As of Drupal 7.14 this has changed&lt;/a&gt; and they come back as the database sent them.&lt;/p&gt;

&lt;p&gt;For many modules who have defined their schemas to use lowercase table names and fields this change won't cause an issue. If however a module makes a SQL query like &lt;code&gt;show table status&lt;/code&gt; (using a function like &lt;a href="http://api.drupal.org/api/drupal/includes%21database%21database.inc/function/db_query/7"&gt;db_query()&lt;/a&gt;) the results will no longer be lowercase. Say you get the results back as an associative array the key names will be different (e.g., &lt;code&gt;Name&lt;/code&gt; instead of &lt;code&gt;name&lt;/code&gt;). This has caused &lt;a href="http://drupal.org/node/1576812"&gt;some modules&lt;/a&gt; &lt;a href="http://drupal.org/project/migrate"&gt;to break&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For the record, I like this change in theory. Bringing it into the middle of the Drupal 7 life cycle without documenting the change or notifying the develops was a bad idea.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;How To Work Around It&lt;/h2&gt;

&lt;p&gt;The following work around will work for all versions of Drupal 7 by generating lowercase field and table names. This should only be used for the places it's absolutely needed. Instead of using db_query use the following function:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="php"&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;_custom_db_query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;target&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;target&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;default&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nv"&gt;$connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Database&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="na"&gt;getConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;target&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="c1"&gt;// Backup and restore PDO::ATTR_CASE. Prior to Drupal 7.14 this is&lt;/span&gt;
  &lt;span class="c1"&gt;// PDO::CASE_LOWER. Afterwards it is PDO::CASE_NATURAL.&lt;/span&gt;
  &lt;span class="nv"&gt;$orig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$connection&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;getAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PDO&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="na"&gt;ATTR_CASE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nv"&gt;$connection&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PDO&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="na"&gt;ATTR_CASE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;PDO&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="na"&gt;CASE_LOWER&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Execute the query statement.&lt;/span&gt;
  &lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$connection&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;queryRange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Restore the attribute.&lt;/span&gt;
  &lt;span class="nv"&gt;$connection&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PDO&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="na"&gt;ATTR_CASE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$orig&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;




&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YVImk95EFST2Uuykf4WgJz9h3cg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YVImk95EFST2Uuykf4WgJz9h3cg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YVImk95EFST2Uuykf4WgJz9h3cg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YVImk95EFST2Uuykf4WgJz9h3cg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/uQ5gk09m6sE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/drupal-7-14-api-incompatible-change</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Ethics, Software Engineering, and The Web]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/y8FdGhAdvMo/ethics-software-engineering-web" />
    <updated>2012-05-15T08:20:00-04:00</updated>
    <id>http://engineeredweb.com/blog/ethics-software-engineering-web</id>
    <content type="html">&lt;p&gt;One of the required classed for my engineering degree was an engineering ethics course. They said the reason this class was required was due to all the ethical failures engineers had been making. At the time I thought of people working on children's toys or military applications. An ethics course could be good to help them work through or realize any dilemmas they had going on. At that time I would never have imagined I would see more ethical failures working on the web than I did working for a military sub-contractor. Unfortunately, this has been the case.&lt;!--break--&gt;&lt;/p&gt;

&lt;h2&gt;Ethics&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Ethics"&gt;Ethics&lt;/a&gt; a the branch of philosophy that deals with right and wrong behavior. For example, putting sharp small objects inside a toy for a one year old is considered wrong. A lot of wrong behavior can get you in trouble or hurt those around you. This is why large companies tend to have ethics training for their employees. Well, that and &lt;a href="https://en.wikipedia.org/wiki/Cover_your_ass"&gt;CYA&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Fail, Fail, Fail&lt;/h2&gt;

&lt;p&gt;I've seen numberous developers and web companies fail at ethical issues. My gut reaction is to think they don't realize what they're doing. I want to give them the benefit of the doubt. Many of these developers are focused on themselves and their product well more than 40 hours a week. Being so &lt;em&gt;me&lt;/em&gt; focused leaves little time and energy to focus on the implications to others. And, where I had a university education that covered ethics many of those building the web today didn't. Ethics may not be on their mind.&lt;/p&gt;

&lt;h2&gt;A Nonthreatening Example&lt;/h2&gt;

&lt;p&gt;I first saw this one a few years ago. A startup that was doing quite well had done it. This startup web application had taken a JavaScript library and in minifying it stripped out the license and attribution. It was part of their web interface and the JavaScript was &lt;strong&gt;distributed&lt;/strong&gt; from their servers to a users browser. This was a violation of the license and the developer contacted the startup over the issue. The license he chose had been violated and he &lt;em&gt;felt&lt;/em&gt; wronged. The startup didn't respond to him.&lt;/p&gt;

&lt;p&gt;This isn't a one time failure or a singled out case. I've seen this disregard for licenses (even open source ones) happen numerous times. I've talked with angry developers who've been wronged.&lt;/p&gt;

&lt;h2&gt;It Doesn't Stop There&lt;/h2&gt;

&lt;p&gt;There are a lot of cases of more problematic ethical failures. They happen all around us and they are hurting people. My professors were right to think an ethics course was a good idea.&lt;/p&gt;

&lt;p&gt;If you've never taken an ethics course and don't know much about it consider taking a &lt;a href="http://scpd.stanford.edu/search/publicCourseSearchDetails.do?method=load&amp;amp;courseId=1284929"&gt;professional development course&lt;/a&gt;, &lt;a href="http://www.apple.com/education/itunes-u/"&gt;watching some of the free iTunesU videos&lt;/a&gt;, or picking up a good book (anyone have a good recommendation?). I'm regularly asking myself, when we build the future of the web are we building an ethical place? I'm not so sure the answer is yes.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OoAGC2155043FHrlFbzr87384Z0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OoAGC2155043FHrlFbzr87384Z0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OoAGC2155043FHrlFbzr87384Z0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OoAGC2155043FHrlFbzr87384Z0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/y8FdGhAdvMo" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/ethics-software-engineering-web</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Speedy 1.0 Released]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/EawXLU9x0aE/speedy-1-released" />
    <updated>2012-05-07T15:30:00-04:00</updated>
    <id>http://engineeredweb.com/blog/speedy-1-released</id>
    <content type="html">&lt;p&gt;Minifying the JavaScript distributed to a browser is &lt;a href="http://engineeredweb.com/blog/why-minify-javascript/"&gt;important for performance&lt;/a&gt;. The &lt;a href="http://drupal.org/project/speedy"&gt;speedy module&lt;/a&gt; came into being in an effort to make this easy for Drupal sites to implement everywhere. Today the 1.0 release of the module comes out providing minified JavaScript for Drupal 7 core.&lt;!--break--&gt;&lt;/p&gt;

&lt;h2&gt;Path Forward&lt;/h2&gt;

&lt;p&gt;While there are many performance problems we can solve over time we want to get those that work out there as quickly as possible. In the speedy issue there are more features we are hoping to add over time. The initial release is just one step to better performance.&lt;/p&gt;

&lt;h3&gt;Default JavaScript to Footer&lt;/h3&gt;

&lt;p&gt;Unless you have a reason to your JavaScript files should be included in the footer. By default Drupal places them in the header which is a much safer approach. When included in the footer there are times this won't work well. We are working to &lt;a href="http://drupal.org/node/1563530"&gt;make the footer the default except for cases it shouldn't be&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;A Pluggable System&lt;/h3&gt;

&lt;p&gt;While I use &lt;a href="https://github.com/mishoo/UglifyJS"&gt;UglifyJS&lt;/a&gt; to minify my JavaScript there are other tools. Some you may want to automate into build scripts or some other method. For example, using an external service to generate the minified files. There are a number of issues in the &lt;a href="http://drupal.org/project/issues/speedy"&gt;speedy issue queue&lt;/a&gt; targeted at making this work.&lt;/p&gt;

&lt;h3&gt;Minified Contrib JavaScript&lt;/h3&gt;

&lt;p&gt;One of the hard problems to solve is to legally minify JavaScript libraries included in contrib. If a library is include in a module with license information we have to be sure not to remove that. We want this module to be safe for anyone to install without worrying if they are violating any license. This is one of those non-trivial problems to solve but we are &lt;a href="http://drupal.org/node/1536810"&gt;working on it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you would like to help please join the issue queues, create some patches, start some git branches with changes, write some documentation, or even just spread the word. &lt;a href="http://drupal.org/user/32095"&gt;JohnAlbin&lt;/a&gt; and &lt;a href="http://drupal.org/user/27259"&gt;arthurf&lt;/a&gt; already have.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/aSNhEJRpeFRfQTflg85blqX-i0s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aSNhEJRpeFRfQTflg85blqX-i0s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/aSNhEJRpeFRfQTflg85blqX-i0s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aSNhEJRpeFRfQTflg85blqX-i0s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/EawXLU9x0aE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/speedy-1-released</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Understanding Other Developers - Users Of Our Development Products]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/QMivIR30PVs/understanding-other-developers" />
    <updated>2012-04-23T15:00:00-04:00</updated>
    <id>http://engineeredweb.com/blog/understanding-other-developers</id>
    <content type="html">&lt;p&gt;&lt;em&gt;Other developers are not like me.&lt;/em&gt; This is something I have to tell myself regularly. I'm reminded of this by the simple numbers for &lt;a href="http://w3techs.com/technologies/details/cm-wordpress/all/all"&gt;Wordpress usage&lt;/a&gt;. 16.3% of websites are powered by Wordpress and it accounts for 54% or the CMS market. While we can argue how these numbers are measured we can't argue that &lt;strong&gt;A LOT&lt;/strong&gt; of websites are built on technology often railed on in tech blogs.&lt;/p&gt;

&lt;p&gt;I find this even more interesting when it comes to creating development tools, documenting methods, and advocating use of the &lt;em&gt;new hotness&lt;/em&gt;. All too often this happens in the bubble of &lt;em&gt;people who think like us and do thinkings in a similar manner&lt;/em&gt;. We wonder why others struggle with what we are suggesting. We wonder why something isn't catching on. Sometimes we even write off these other developers as incompetent because they suggest using some piece of technology we've grown to despise. None the less, they keep trucking along, thinkings change slowly, some camps move further apart, and may good ideas go stale.&lt;/p&gt;

&lt;p&gt;Part of the equation we often miss is that other developers are different and how those differences matter. They have different needs. Their customers have different needs. The list of tasks they have to do for their job is different. The priorities they have are different. Understanding these differences can help us make better all around products and move the Internet in a better direction in a healthier manner.&lt;!--break--&gt;&lt;/p&gt;

&lt;h2&gt;Differences of Note&lt;/h2&gt;

&lt;p&gt;After talking to a lot of developers in many different circles I've found a few differences that are worth noting and understanding. They provide us with some keys into others making it easier to explain things or even know what to explain.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The specialist vs. the generalist - A simple case is someone who only works on JavaScript compared to someone who writes JavaScript along with PHP, dealing with deployments, working with clients, managing others, or any number of other tasks. The JavaScript developer is going to dig into the nuance of patterns, play with different techniques, quote Crockford, and be really into it. The generalist will likely just want to touch enough JavaScript to get the task in front of them done.&lt;/li&gt;
&lt;li&gt;The &lt;a href="http://501manifesto.org/"&gt;501-ish developer&lt;/a&gt; vs. the I live for this developer - Some developers just want to get their tasks done quickly, easily, and meeting the needs in front of them. At the end of the day they disconnect from developing and go do something else. There are other developers who don't disconnect. Their hobby is what they do for work. In their off hours they are doing other development practices. It's not just a job, it's a passion.&lt;/li&gt;
&lt;li&gt;I love change vs. I avoid change. Some developers love change. Sometimes they even like to stir the pot to inspire change. Others what to stay with what's been tried and true for them. There are a lot of reasons that cause this. For example, someone may want to avoid change because they don't have time to learn all the new stuff while meeting the needs or their clients of project. Someone else may love change because they are easily bored and change keeps them interested.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Just looking at these three dimensions we can see we have developers that can range from generalists who don't develop outside working hours and don't like to change their development practices all the way through specialists who live for this stuff and are always changing what they are doing. That's quite a range.&lt;/p&gt;

&lt;h2&gt;Where Things Can Go Terribly Wrong&lt;/h2&gt;

&lt;p&gt;I've watched stuff go wrong time and time again. Frustrations start to show up. And people wonder why it didn't work. Unfortunately, &lt;em&gt;technical problems are usually the easy ones to solve&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Let me give you an example of something gone terribly wrong. Imagine a JavaScript developer on a team of non-JavaScript developers. The JavaScript developer does a lot of the front end development while the others do back end development, APIs, deployments, and the other parts of the stack. Some of these developers do some front end work. To get better overall JavaScript would it be better to teach them all the intricacies of front end development or to make it easier for them to know very little about front end development but output good end products through the use of documentation and helpers.&lt;/p&gt;

&lt;p&gt;I've seen and been told that the rest of the team should learn the latest patterns. That it's in their best interests. Trying to make non-JavaScript developers into JavaScript developers in addition to what ever else they have to do can prove to be fairly in-effective at best and piss people off at worst.&lt;/p&gt;

&lt;h2&gt;Picking Your Goal&lt;/h2&gt;

&lt;p&gt;With such a wide range of developers it can be important to pick your goal. Looking at the this case is the goal to make the rest of the team write better JavaScript or to make the output JavaScript be more performant, better to manage, or something else? This is important because you need to take the goal and mix it in with a good dose of the difference in a group of people to come up with a productive path forward.&lt;/p&gt;

&lt;p&gt;In the open source world this can be harder to do. Continuing this example, imagine a handful of JavaScript developers get together and want to make a change to a product. They think like JavaScript developers and make the change they want to see. It gets released and then the complaining begins from all the people not like that first group that envisioned and built it.&lt;/p&gt;

&lt;h2&gt;Making It Easier On Yourself&lt;/h2&gt;

&lt;p&gt;Failure you can learn from has lead me to a number of tips and tricks that help me with these occasions come up.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Learn about the others affected by what you're doing. I prefer having a beer or coffee with some others in the affected group and talking frankly about the subject. Learn what they think and why. How it impacts them.&lt;/li&gt;
&lt;li&gt;Make it easier on others. Once you understand their needs, questions, and problem write documentation they would want to read. Present on it. Do a video demo. Alter the concept to make it easier for them. Provide a helper library. Or, if the idea isn't going to be helpful &lt;em&gt;consider scrapping it and sharing why&lt;/em&gt;. Or, making it pluggable so you and they can both co-exist.&lt;/li&gt;
&lt;li&gt;Plan for the hard stuff. Making technology changes is often the easy part. The hard part is working with others, explaining yourself, answering support questions, and all the not-as-fun-as-technology stuff. Plan for it. That may mean getting others to do the dirty work or setting different expectations.&lt;/li&gt;
&lt;li&gt;Be kind to others. Being a dick does not help others accept what your doing or help them want to follow you in the future. Treating others with respect and kindness goes a long way.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;The next time you want to make or support something that's a change consider the implications to those actions. They may be more than meets the eye and there may be some things you can do to set yourself up for success.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: If you think any example here is about you it's not. Many examples have influenced me but none of those are directly reflected in an example.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZQGlp8CsAxT3KTcEv5pp8Sv-4fk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZQGlp8CsAxT3KTcEv5pp8Sv-4fk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZQGlp8CsAxT3KTcEv5pp8Sv-4fk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZQGlp8CsAxT3KTcEv5pp8Sv-4fk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/QMivIR30PVs" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/understanding-other-developers</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Why It Is Hard To Minify On The Fly]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/28ZSyd9BARM/why-hard-minify-on-the-fly" />
    <updated>2012-04-17T09:55:00-04:00</updated>
    <id>http://engineeredweb.com/blog/why-hard-minify-on-the-fly</id>
    <content type="html">&lt;p&gt;One of the tips to speed up websites is it &lt;a href="https://developers.google.com/speed/docs/best-practices/payload#MinifyJS"&gt;minify the JavaScript&lt;/a&gt;. It's simple, effective and &lt;a href="http://www.slideshare.net/mattfarina/front-end-performance-improvements/27"&gt;the major players already do it&lt;/a&gt; (except &lt;a href="http://drupal.org"&gt;Drupal&lt;/a&gt;). In the discussions for Drupal 8 and how we can speed up Drupal 7 we've been talking about how we go about providing minified JavaScript files for browsers and there are two camps. One camp wants to ship minified files and the other wants to minify on the fly. While minifying on the fly would be nice it turns out that this is really hard for Drupal and other CMS systems.&lt;!--break--&gt;&lt;/p&gt;

&lt;h2&gt;Not A Technical Problem&lt;/h2&gt;

&lt;p&gt;When it comes to problems the technical ones can mostly be overcome. It's not hard to tie in with &lt;a href="https://github.com/mishoo/UglifyJS/"&gt;UglifyJS&lt;/a&gt; or another tool to minify JavaScript. PHP libraries like &lt;a href="https://github.com/kriswallsmith/assetic"&gt;Assetic&lt;/a&gt; already do this and there are even web services we could use.&lt;/p&gt;

&lt;h2&gt;The License Problems&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Note: I am not a lawyer and this is not legal advice. If you want legal advice go see a lawyer.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Licenses are something virtually every software project uses. Some will even argue that you need to use license X instead of license Y. When we sign up to use a license we need to respect what we signed up for and follow them. Many of us work for companies with lawyers that will make us respect them/follow the law. This ends up creating a complication because many of the JavaScript files we use contain license and copyright information in comments. When a file is minified comments are stripped out. &lt;em&gt;When we manage how they are minified by hand we can make sure licenses are still properly handled where on the fly processing can't do this.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Removing comments may seem simple and safe because they aren't needed for the application to technically run. But, when we ship files from our web servers to execute in a browser the way JavaScript does we are distributing a file. This brings the license sections on distribution into play.&lt;/p&gt;

&lt;p&gt;We can see examples in the &lt;a href="http://www.gnu.org/licenses/gpl-2.0.html"&gt;GPLv2&lt;/a&gt; where is says "keep intact all the notices that refer to this License" and even the &lt;a href="https://en.wikipedia.org/wiki/MIT_License"&gt;MIT License&lt;/a&gt; where it says "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software." At the very least removing notices pointing the MIT license violates the spirit.&lt;/p&gt;

&lt;h2&gt;Does It Matter?&lt;/h2&gt;

&lt;p&gt;I look at it in two ways. Does it matter legally and does it matter to the developers who put the license and copyright statements in the code? I think we need to look at both to be a legal and kind community.&lt;/p&gt;

&lt;p&gt;On the matter of legality I would recommend you go see a lawyer. If you aren't going to get one look at what companies with lawyers are doing and saying. From a legal standpoint this was all first brought to my attention by a company I wasn't working for whom I suggested they minify their JavaScript. Figuring out how they could handle the license issues was what was stopping them.&lt;/p&gt;

&lt;p&gt;Being kind is entirely different. Several years ago I watched as a big name company used a JavaScript library and strip out the copyright and license information. The author was hurt because he felt violated. He contacted the company and got no response. He felt violated. On the flip side it did hurt him. Anyone else technically sound who looked at how this functionality worked would not see the authors name. He wouldn't get credit nor would it cause anyone to seek him out to congratulate him, or try to hire him.&lt;/p&gt;

&lt;p&gt;Seeing the legal impacts and personal ones I do think it matters.&lt;/p&gt;

&lt;h2&gt;What Can We Do?&lt;/h2&gt;

&lt;p&gt;I see three things we can do about this.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use the &lt;a href="http://drupal.org/project/speedy"&gt;Speedy module&lt;/a&gt; to minify Drupal core JavaScript. No license notice exists so there is nothing to strip.&lt;/li&gt;
&lt;li&gt;Help get other Drupal contributed modules to ship with minified JavaScript files that properly handle licensing.&lt;/li&gt;
&lt;li&gt;Help us try to &lt;a href="http://drupal.org/node/1536810"&gt;find a way to minify on the fly and preserve licenses&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hnKAFQbFIw0EzBmgu_-4SAwFEjQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hnKAFQbFIw0EzBmgu_-4SAwFEjQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hnKAFQbFIw0EzBmgu_-4SAwFEjQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hnKAFQbFIw0EzBmgu_-4SAwFEjQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/28ZSyd9BARM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/why-hard-minify-on-the-fly</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Using Bitbucket In Addition To Github]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/SZIEFZd1_2A/using-bitbucket-and-github" />
    <updated>2012-04-13T11:40:00-04:00</updated>
    <id>http://engineeredweb.com/blog/using-bitbucket-and-github</id>
    <content type="html">&lt;p&gt;&lt;a href="http://github.com"&gt;Github&lt;/a&gt; is awesome. I've used it for open source projects and with companies I've worked for. The pull requests, comments, gists, and tools are fantastic. So much so that I'd even go so far as to recommend large enterprises checkout &lt;a href="https://enterprise.github.com/"&gt;Github enterprise&lt;/a&gt;. Despite all of this I find myself happily using &lt;a href="https://bitbucket.org/"&gt;Bitbucket&lt;/a&gt; for personal projects that aren't open source. There are cases where using Bitbucket just makes sense for me.&lt;!--break--&gt;&lt;/p&gt;

&lt;h2&gt;Some Background&lt;/h2&gt;

&lt;p&gt;I first learned about Bitbucket when it was used solely for Mercurial hosting and &lt;a href="http://sonspring.com/"&gt;Nathan Smith&lt;/a&gt; had moved his &lt;a href="http://960.gs/"&gt;960 grid&lt;/a&gt; over there. Git won the distributed VCS wars and 960 moved back to Github. But, I was introduced to Bitbucket.&lt;/p&gt;

&lt;p&gt;Since that time Bitbucket added support for Git, improved the UI (though it's not as good as Github), and was purchased by &lt;a href="http://www.atlassian.com/"&gt;Atlassian&lt;/a&gt;. Atlassian purchased &lt;a href="http://www.sourcetreeapp.com/"&gt;SourceTree&lt;/a&gt; and made it free. SourceTree is a Git/Mercurial/SVN Mac GUI that integrates with Github and Bitbucket nicely. Bitbucket pricing has also been made really friendly.&lt;/p&gt;

&lt;h2&gt;Why I Use Bitbucket&lt;/h2&gt;

&lt;p&gt;Not every project I do is open source, for work, or something I want to share with the world. I used to run &lt;a href="http://engineeredweb.com/blog/10/2/building-your-own-git-server/"&gt;my own git server&lt;/a&gt; for these projects. Sometimes I would want to collaborate with others on these projects or share links to changes with others. Yet, they still weren't meant to be public. To make my own setups have the features I wanted was more work than I was willing to put in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/plans"&gt;Github plans&lt;/a&gt; are nice for some cases. For example, a team working on a product where they just need a handful of repos. Or, for an individual collaborating with a few others on a project. But, when you get into a company doing client work and they have a lot of clients you need to have a plan for repos you aren't actively working on. This may be an issue if you have a lot of clients you are supporting who aren't in active development. Or, you can pay quite a bit per month. What if you are an individual who want's to collaborate on a hobby project with 3 or 4 others on a private project? Or, you have 5 or 6 or 7 personal sites plus backup scripts and you want them in VCS.&lt;/p&gt;

&lt;p&gt;If there were no other options I would probably recommend paying Github. But, there is competition in this space so I'm embracing it. Of the different alternatives I've found myself using Bitbucket and have been happy with it. For my personal private projects it's turned out to be the alternative I'm the most happy with. Atlassian is a successful stable parent company. If you are looking for an alternative for some cases consider Bitbucket alongside Github.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sp45L0zBXRyDgWgIrO1QbGsq0pY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sp45L0zBXRyDgWgIrO1QbGsq0pY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sp45L0zBXRyDgWgIrO1QbGsq0pY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sp45L0zBXRyDgWgIrO1QbGsq0pY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/SZIEFZd1_2A" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/using-bitbucket-and-github</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Why I Continue To Choose PHP]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/LqKzEU9Y1Kc/why-i-continue-to-choose-php" />
    <updated>2012-04-12T10:35:00-04:00</updated>
    <id>http://engineeredweb.com/blog/why-i-continue-to-choose-php</id>
    <content type="html">&lt;p&gt;While I was responding to comments &lt;a href="http://engineeredweb.com/blog/why-i-love-php/"&gt;on a recent post&lt;/a&gt; I had the realization that the motivations I have for choosing the development tools I use are quite different from those others have. I find a little self evaluation to be healthy so I thought I would share what I found when I looked at why I continue to choose &lt;a href="http://php.net"&gt;PHP&lt;/a&gt; as my language of choice.&lt;!--break--&gt;&lt;/p&gt;

&lt;h2&gt;A Little Background&lt;/h2&gt;

&lt;p&gt;Context is everything when it comes to making personal decisions. Understanding how someone got to where they are can show insights in the decisions they made (or failed to make). So, there are a couple pieces of context I should share.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I've always liked to help others. I've volunteered with non-profits. I've taken my own time to try and help others solve problems. I try to learn how to do things and share it with others so they can learn from my experiences.&lt;/li&gt;
&lt;li&gt;I like solving practical problems with practical solutions.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;Low Barrier To Entry&lt;/h2&gt;

&lt;p&gt;PHP has a low barrier to entry. Some would argue the barrier to entry is too low.&lt;/p&gt;

&lt;p&gt;This low barrier isn't just about helping someone learn to program because they want or need to learn. It's also helpful when you want to help enable someone whose skilled in another discipline do something on the web. Maybe a web designer who targets a niche audience and needs to know just enough coding to be dangerous.&lt;/p&gt;

&lt;p&gt;Sure, you could say they might write some ugly code or there are security issues. But, I've seen ugly code out of seasoned "professionals" and just look what happened with the &lt;a href="https://github.com/blog/1068-public-key-security-vulnerability-and-mitigation"&gt;mass-assignment rails vulnerability&lt;/a&gt; recently. I consider these all education points not reasons a low barrier to entry isn't good.&lt;/p&gt;

&lt;h2&gt;Host It Virtually Anywhere&lt;/h2&gt;

&lt;p&gt;Hosting can be complicated. Just last night I had a light discussion on rails hosting. I regularly talk about cloud hosting. So many of these solutions aren't for the mom and pop stores or small local non-profits that can benefit form a basic web presence. Cool hip hosting solutions are great. They just aren't great for everyone in the &lt;a href="https://en.wikipedia.org/wiki/Long_Tail"&gt;long tail&lt;/a&gt; of the web.&lt;/p&gt;

&lt;p&gt;PHP can be hosted all over the place. There are so many hosting options (some that even drive me a little nuts). Some even provide free options for non-profits. Sure, it's not powerful but many of these organizations don't need it.&lt;/p&gt;

&lt;h2&gt;At Scale&lt;/h2&gt;

&lt;p&gt;PHP can scale. And it's not hard to make it do so. So, if a small hobby project, non-profit, or something else takes off it's not hard to scale the project. If a project remains small and steady it can do that well. This is well documented, well shared, and people know how to do it.&lt;/p&gt;

&lt;h2&gt;It Makes Me Replaceable&lt;/h2&gt;

&lt;p&gt;I'm easily distracted and I have a great day job. So, when I help others get going I want them to have other easy to get to resources because that means they don't need me anymore. I don't really have the time to help everyone I'd like over the long haul.&lt;/p&gt;

&lt;p&gt;There are a lot of PHP developers. I'm happily replaceable when I become to busy or distracted by the next thing.&lt;/p&gt;

&lt;h2&gt;What This Means&lt;/h2&gt;

&lt;p&gt;I've found a couple nuggets of usefulness in these.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When I generally work on and share useful PHP stuff, even if not targeted at others, it can help others. Sometimes the long tail of web people who I want to see be successful.&lt;/li&gt;
&lt;li&gt;Our motivations can often shape our choices. If I just wanted a good programming language for me and I didn't care about helping others I might choose a different language or tool set. What motivations do you have for your language of choice?&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Whether you agree or disagree with me hopefully you understand why a little bit more.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HxRQ6eIW8pNmTysrWLc3_sLyMls/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HxRQ6eIW8pNmTysrWLc3_sLyMls/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HxRQ6eIW8pNmTysrWLc3_sLyMls/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HxRQ6eIW8pNmTysrWLc3_sLyMls/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/LqKzEU9Y1Kc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/why-i-continue-to-choose-php</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[4 Reasons To Choose PHP For Your Next New Project]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/IJW_JHOP-Iw/reseason-to-choose-php" />
    <updated>2012-04-11T08:20:00-04:00</updated>
    <id>http://engineeredweb.com/blog/reseason-to-choose-php</id>
    <content type="html">&lt;p&gt;With all the new development toys why would someone want to choose &lt;a href="http://php.net"&gt;PHP&lt;/a&gt; for their next new web project? Why would someone choose PHP over &lt;a href="http://nodejs.org/"&gt;node.js&lt;/a&gt; or &lt;a href="http://rubyonrails.org/"&gt;Rails&lt;/a&gt;? It's easy to say something is a legacy application in PHP and it's not cost effective to migrate away from it. It's entirely different to choose something for an entirely new project all together. So, here are 4 reasons to consider PHP for a new web project.&lt;!--break--&gt;&lt;/p&gt;

&lt;h2&gt;There Are Bodies To Hire&lt;/h2&gt;

&lt;p&gt;What happens if your project takes off and you need to hire people? Or, you hired someone to develop your site and they are not longer available and you need them? If a project has a need for people choosing a language where there are fresh warm bodies is important. There are a lot of developers with PHP experience. Compare this with Ruby (and Rails) or node.js. While these projects may be younger or hotter how deep is the available talent pool of available developers? &lt;em&gt;I'll give you a hint, it's not deep enough.&lt;/em&gt; PHP has a deep pool of developers.&lt;/p&gt;

&lt;h2&gt;Hosting Is Everywhere&lt;/h2&gt;

&lt;p&gt;People who know me might say I point this out too much. But, if you are going to create the next product for &lt;a href="https://en.wikipedia.org/wiki/Long_Tail"&gt;the long tail&lt;/a&gt; of sites or want to try and create the next big CMS you'll want to start with the most fertile ground for hosting. There is a reason &lt;a href="http://w3techs.com/technologies/details/pl-php/all/all"&gt;PHP is currently used for 77.5% of sites&lt;/a&gt;. You can host PHP stuff almost anywhere.&lt;/p&gt;

&lt;h2&gt;There Are Good Tools Available&lt;/h2&gt;

&lt;p&gt;This is where I can imagine getting push back. Good tools? &lt;em&gt;Really?&lt;/em&gt; It's not like I'm suggesting you build a Wordpress site &lt;em&gt;(&lt;a href="http://w3techs.com/technologies/details/cm-wordpress/all/all"&gt;16.2% of all sites are wordpress&lt;/a&gt;)&lt;/em&gt;. I'm talking about frameworks like &lt;a href="http://symfony.com/"&gt;Symfony&lt;/a&gt;, dependency managers like &lt;a href="http://getcomposer.org/"&gt;Composer&lt;/a&gt;, editors like &lt;a href="http://www.sublimetext.com/2"&gt;Sublime Text 2&lt;/a&gt;, and documentation tools like &lt;a href="http://www.phpdoc.org/"&gt;phpDocumentor 2&lt;/a&gt; or &lt;a href="http://www.stack.nl/~dimitri/doxygen/"&gt;Doxygen&lt;/a&gt;. The tools to write good quality code exist in PHP. I'm not joking. Really.&lt;/p&gt;

&lt;h2&gt;Lots and Lots and Lots of Documentation and Knowledge&lt;/h2&gt;

&lt;p&gt;Floating around the PHP community and the web there is a lot of documentation on PHP. Has your project grown and it's ready to move off shared hosting or a single VM? The documentation and knowledge for scaling is all over the place.&lt;/p&gt;

&lt;p&gt;This even applies to searches. When I &lt;a href="http://duckduckgo.com/"&gt;search&lt;/a&gt; for a programming topic in PHP I tend to get more results (sometimes significantly more results) than the other server side languages I've searched for.&lt;/p&gt;

&lt;h2&gt;In Conclusion&lt;/h2&gt;

&lt;p&gt;Using PHP might not get you fame and accolades from computer science purists. Or even from cutting edge hackers. But, that hasn't stopped &lt;a href="http://www.wikipedia.org/"&gt;Wikipedia&lt;/a&gt;, &lt;a href="http://facebook.com"&gt;Facebook&lt;/a&gt;, &lt;a href="http://www.whitehouse.gov/"&gt;The White House&lt;/a&gt;, &lt;a href="http://www.etsy.com/"&gt;Etsy&lt;/a&gt;, &lt;a href="http://wordpress.org/"&gt;Wordpress&lt;/a&gt;, &lt;a href="http://hpcloud.com"&gt;HP&lt;/a&gt;, and so many others from being successful using it.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/c3eUmkscKNTp0x9mBsyCbR6wKjA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c3eUmkscKNTp0x9mBsyCbR6wKjA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/c3eUmkscKNTp0x9mBsyCbR6wKjA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c3eUmkscKNTp0x9mBsyCbR6wKjA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/IJW_JHOP-Iw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/reseason-to-choose-php</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Why I Love PHP]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/orGvxSDJvLg/why-i-love-php" />
    <updated>2012-04-10T12:00:00-04:00</updated>
    <id>http://engineeredweb.com/blog/why-i-love-php</id>
    <content type="html">&lt;p&gt;While I was just reading an article titled &lt;em&gt;&lt;a href="http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/"&gt;PHP: a fractal of bad design&lt;/a&gt;&lt;/em&gt; I felt the need to defend &lt;a href="http://php.net/"&gt;PHP&lt;/a&gt;. Over the years PHP has gotten a bad reputation and is regularly railed on. Yet, I've recently grown to like using PHP again. If you're curious why someone would like PHP (or insight into my possibly twisted world) here you go.&lt;!--break--&gt;&lt;/p&gt;

&lt;h2&gt;Disclaimer&lt;/h2&gt;

&lt;p&gt;I'm an engineer. I like to build things that work and take into account the &lt;a href="http://encyclopedia.thefreedictionary.com/Ilities"&gt;ilities&lt;/a&gt;. If you want to discuss the nuances of language design talk to a language designer. If you want to talk about designing the perfect language you might consider talking to a philosopher. Or, if you look at a lot of well engineered failures consider &lt;a href="http://eandt.theiet.org/magazine/2012/03/a-bridge-too-far.cfm"&gt;looking&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/List_of_bridge_failures"&gt;at&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/Tacoma_Narrows_Bridge_(1940"&gt;bridges&lt;/a&gt;). When they fail it's a big deal.&lt;/p&gt;

&lt;h2&gt;Some Context Surrounding PHP&lt;/h2&gt;

&lt;p&gt;It's important to understand some elements of PHP and how it's used. Making judgments about something without understand the context surrounding it can be short sighted and cause problems. Understanding context and history can help us understand why decisions were made and even evaluate if something was a healthy decision or not.&lt;/p&gt;

&lt;h3&gt;Target Audience&lt;/h3&gt;

&lt;p&gt;Not all programming languages are created alike. PHP is built for the web. On php.net it puts it this way:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;What is PHP?
PHP is a widely-used general-purpose scripting language that is especially suited for Web development and can be embedded into HTML.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Many languages are general purpose languages or have their own targets. For example, python.org states:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Python is a programming language that lets you work more quickly and integrate your systems more effectively.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;PHP is targeted at the web while Python isn't. That means decisions are based on different criteria. So, when it comes to PHP a mass majority of the discussion centers around the web. For other languages this may not be the case. For example, I'm writing this post in &lt;a href="http://www.sublimetext.com/2"&gt;an editor written in Python&lt;/a&gt;. Can you imagine a desktop GUI application in PHP?!?!&lt;/p&gt;

&lt;h3&gt;Long History Of Popularity and Usage&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://w3techs.com/technologies/details/pl-php/all/all"&gt;PHP is used by 77.5% of sites where the language can be detected&lt;/a&gt;. Let that sink in for a moment. PHP is popular and has been for a long time. Ten years ago PHP was really popular. While we often talk about the amount of time a language has been around there is a difference between a popular language and one that's a lot less popular.&lt;/p&gt;

&lt;p&gt;To put popularity into context we need to look at the web. The web is &lt;strong&gt;a lot&lt;/strong&gt; more than Facebook, Google, the other huge sites, and the hot new startups. The &lt;a href="https://en.wikipedia.org/wiki/Long_Tail"&gt;long tail&lt;/a&gt; of the Internet is really long. That includes the blogs of people living with cancer, the stores in suburban villages, the websites sharing pictures of cats with the world, and so much more. Most of these sites don't have engineers or IT on staff. When you make language decisions and have this audience you are attempting to be benevolent with it's not as simple as making decisions on a whim or even those to clean up language design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now that I think about it, handling this long tail well is one of the reasons I love PHP.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;Ever Language Has It's Ugly Spots&lt;/h2&gt;

&lt;p&gt;I've written terrible code in over a dozen languages. I've seen the ugly spots in many languages. For example, Python doesn't have interfaces. Some people may like it and others don't. To some, this is an ugly spot. While it's popular to rail on PHP for it's ugly spots, every programming language has ugly spots for some developers.&lt;/p&gt;

&lt;h2&gt;Why I Love PHP&lt;/h2&gt;

&lt;p&gt;Let me count the ways...&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The language can be hosted almost anywhere. I've worked on applications for the web intended to be installed and used by others. To help the long tail. The wide availability of hosting is something amazing. While this isn't great for people who are writing their own application in an environment they intimately control, for some of the use cases I work in this is great.&lt;/li&gt;
&lt;li&gt;PHP has some nice underutilized features. For example, &lt;a href="http://us2.php.net/manual/en/book.stream.php"&gt;PHP Stream Wrappers&lt;/a&gt;. If you want to store files in a remote storage (e.g., S3) you might use a library. In Ruby you might use &lt;a href="http://fog.io/"&gt;Fog&lt;/a&gt; or Java you might use &lt;a href="https://github.com/jclouds/jclouds"&gt;jclouds&lt;/a&gt;. To use these you have to write you application around them. With PHP you can have your code use the same underlying file handling code for a file system and implement a stream wrapper to make the remote location work. No rewriting your codebase to work with remote apis. You just work with files like you always have. This was a feature we took advantage of with some recent &lt;a href="http://hpcloud.github.com/HPCloud-PHP/"&gt;HP Cloud Object Storage&lt;/a&gt; work. This is just one example among many.&lt;/li&gt;
&lt;li&gt;Since PHP doesn't force us into a coding style there are now some &lt;a href="http://symfony.com/"&gt;nice frameworks&lt;/a&gt; being developed and &lt;a href="http://fabien.potencier.org/article/50/create-your-own-framework-on-top-of-the-symfony2-components-part-1"&gt;well written articles being shared&lt;/a&gt;. In PHP you can write maintainable, well written, code that takes into account the illities.&lt;/li&gt;
&lt;li&gt;PHP is well documented and contributing to the documentation is something anyone can get involved in. I love documentation so this hits close to home.&lt;/li&gt;
&lt;li&gt;Developing with PHP is becoming a wide open field again. For some time PHP felt out dated and crufty. There was a lot of ugly code and ugly processes. When I looked at PHP I thought of applications like Wordpress and Pear. PHP has been reinvigorated with projects like Symfony,
&lt;a href="http://getcomposer.org/"&gt;Composer&lt;/a&gt;, and &lt;a href="https://github.com/kriswallsmith/assetic"&gt;Assetic&lt;/a&gt;. There is a movement of good quality code and it's fun to watch or contribute to.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;I could go on and on but, I have to go write some PHP code. If you have reasons to love PHP or maybe just like it please share. I'd love to read what others think as well.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4D46exjvd2pnw1de7RQGrtOkNHg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4D46exjvd2pnw1de7RQGrtOkNHg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4D46exjvd2pnw1de7RQGrtOkNHg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4D46exjvd2pnw1de7RQGrtOkNHg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/orGvxSDJvLg" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/why-i-love-php</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[An Hour A Week To Better Documentation]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/GPYrq0bqY3I/an-hour-better-documentation" />
    <updated>2012-04-10T07:50:00-04:00</updated>
    <id>http://engineeredweb.com/blog/an-hour-better-documentation</id>
    <content type="html">&lt;p&gt;If you're like me, a lot of your projects aren't very well documented. If you look over &lt;a href="http://github.com"&gt;Github&lt;/a&gt; or &lt;a href="http://drupal.org"&gt;Drupal.org&lt;/a&gt; a significant number of projects are poorly documented. I'm only aware of &lt;a href="http://technosophos.com/"&gt;a few people&lt;/a&gt; who regularly document their projects well. In an effort to improve the documentation on the projects I maintain (or try to maintain) I've started to schedule an hour per week to just write better documentation.&lt;/p&gt;

&lt;p&gt;An important element to note is that this is scheduled time. I've added it to my calendar and scheduled it into my week. To keep this as a useful part of my time I've scheduled it for the second hour of my work week. This gives me time to get through my email and any communication I need to get done (or any slow starts). Then, I start writing documentation before the week gets in the way.&lt;/p&gt;

&lt;p&gt;If you'd like to start writing better documentation I invite you to join me in spending an hour a week improving the documentation in our projects.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/O2V7gYLfljQhZmq4oghjj63G7XU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/O2V7gYLfljQhZmq4oghjj63G7XU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/O2V7gYLfljQhZmq4oghjj63G7XU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/O2V7gYLfljQhZmq4oghjj63G7XU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/GPYrq0bqY3I" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/an-hour-better-documentation</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Faster Mobile Sites]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/AfX-a4ecrF4/faster-mobile-sites-drupalcon-denver" />
    <updated>2012-04-05T12:00:00-04:00</updated>
    <id>http://engineeredweb.com/blog/faster-mobile-sites-drupalcon-denver</id>
    <content type="html">&lt;p&gt;&lt;strong&gt;87% of the time it takes to load a web page happens in the front end.&lt;/strong&gt; &lt;a href="http://www.stevesouders.com/blog/2012/02/10/the-performance-golden-rule/"&gt;This it taken from actual measurements of the top 50k websites&lt;/a&gt;. When we want to look for ways to speed up our sites we should look to where most of the time is occurring. At &lt;a href="http://denver2012.drupal.org"&gt;DrupalCon Denver&lt;/a&gt; I presented an introduction to front end performance in the session &lt;a href="http://denver2012.drupal.org/program/sessions/faster-mobile-sites"&gt;Faster Mobile Sites&lt;/a&gt;. This introduction talked about why front end performance is important, covered some details about what's technically happening, offered some simple solutions to get going, and talked about some useful tools.&lt;!--break--&gt;&lt;/p&gt;

&lt;h2&gt;The Slides&lt;/h2&gt;

&lt;p&gt;The slides cover most of what I talked about. They were more than an aide to the presentation since many people don't watch the presentation videos.&lt;/p&gt;

&lt;script async class="speakerdeck-embed" data-id="4f6a47b3b9324f002200a856" data-ratio="1.299492385786802" src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;


&lt;p&gt;&lt;em&gt;If you have trouble viewing the slides they are also available on &lt;a href="http://speakerdeck.com/u/mattfarina/p/faster-mobile-sites"&gt;Speaker Deck&lt;/a&gt;. A mobile friendly version is available through &lt;a href="http://www.slideshare.net/mattfarina/faster-mobile-sites"&gt;slideshare&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;The Video&lt;/h2&gt;

&lt;iframe src="http://blip.tv/play/AYLw0BcC.html?p=1" width="596" height="334" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;


&lt;p&gt;&lt;embed type="application/x-shockwave-flash" src="http://a.blip.tv/api.swf#AYLw0BcC" style="display:none"&gt;&lt;/embed&gt;
&lt;em&gt;If you have trouble with the video it is up on &lt;a href="http://blip.tv/drupalcondenver/faster-mobile-sites-6039475"&gt;Blip&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QskkSfgk8DAIp0tktfPToAbambE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QskkSfgk8DAIp0tktfPToAbambE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QskkSfgk8DAIp0tktfPToAbambE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QskkSfgk8DAIp0tktfPToAbambE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/AfX-a4ecrF4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/faster-mobile-sites-drupalcon-denver</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Drupal 8 and Front End Performance]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/rGWkVdykgsM/drupal-8-front-end-performance" />
    <updated>2012-04-03T00:00:00-04:00</updated>
    <id>http://engineeredweb.com/blog/drupal-8-front-end-performance</id>
    <content type="html">&lt;p&gt;At &lt;a href="http://denver2012.drupal.org"&gt;DrupalCon Denver&lt;/a&gt; I spoke on Front End Performance improvements we can make to &lt;a href="http://drupal.org"&gt;Drupal&lt;/a&gt;, why they are important, and provided some information about what's happening technically so we can spot more cases to improve. This presentation was targeted at low barrier to entry changes we can make in Drupal 8 with the short amount of time we have until the feature freeze. If you're interested in front end performance, making Drupal really perform on mobile, or just want to heckle me checkout these slides and video.&lt;!--break--&gt;&lt;/p&gt;

&lt;h2&gt;The Slides&lt;/h2&gt;

&lt;p&gt;Most of the relevant information is in the slides. There is a portion at the end of the video where some questions were discussed and some other topics came up.&lt;/p&gt;

&lt;script src="http://speakerdeck.com/embed/4f68e27831bc2d0022020b1d.js"&gt;&lt;/script&gt;


&lt;p&gt;&lt;em&gt;If you have trouble viewing the slides they are also available on &lt;a href="http://speakerdeck.com/u/mattfarina/p/front-end-performance-improvements"&gt;Speaker Deck&lt;/a&gt;. A mobile friendly version is available through &lt;a href="http://www.slideshare.net/mattfarina/front-end-performance-improvements"&gt;slideshare&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;The Video&lt;/h2&gt;

&lt;iframe src="http://blip.tv/play/AYLwumkC.html?p=1" width="596" height="334" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;


&lt;p&gt;&lt;embed type="application/x-shockwave-flash" src="http://a.blip.tv/api.swf#AYLwumkC" style="display:none"&gt;&lt;/embed&gt;
&lt;em&gt;If you have trouble with the video it is up on &lt;a href="http://blip.tv/drupalcondenver/front-end-performance-improvements-6036741"&gt;Blip&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-PgxTI5GHP5v8jcJDgqlczwp3nE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-PgxTI5GHP5v8jcJDgqlczwp3nE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-PgxTI5GHP5v8jcJDgqlczwp3nE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-PgxTI5GHP5v8jcJDgqlczwp3nE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/rGWkVdykgsM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/drupal-8-front-end-performance</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Why Minify JavaScript?]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/qsLkiXwmYps/why-minify-javascript" />
    <updated>2012-03-29T00:00:00-04:00</updated>
    <id>http://engineeredweb.com/blog/why-minify-javascript</id>
    <content type="html">&lt;p&gt;When I was at &lt;a href="http://denver2012.drupal.org"&gt;DrupalCon Denver&lt;/a&gt; I suggested that all production JavaScript should be minified. This seemed like something simple that I wouldn't get any push back on. After all, the major JavaScript packages do it and the performance recommendation tools all recommend it. I was wrong. Over the past couple weeks I've received push back from numerous people who've told that me if you use gzip (or deflate) compression there's no need to minify JavaScript. So, here is a case for minifying JavaScript.&lt;!--break--&gt;&lt;/p&gt;

&lt;p&gt;A good place to start is with size examples for different files. The table below has a breakdown for discussion. The three files used in the example here were chosen because they are used on ever page in &lt;a href="http://drupal.org"&gt;Drupal&lt;/a&gt; where JavaScript is used.&lt;/p&gt;

&lt;table class="table table-bordered table-striped"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;File&lt;/th&gt;
      &lt;th&gt;Original&lt;/th&gt;
      &lt;th&gt;Minified&lt;/th&gt;
      &lt;th&gt;Gzip&lt;/th&gt;
      &lt;th&gt;Min + Gzip&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;jquery.js&lt;/td&gt;
      &lt;td&gt;252881&lt;/td&gt;
      &lt;td&gt;94840&lt;/td&gt;
      &lt;td&gt;73775&lt;/td&gt;
      &lt;td&gt;33656&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;drupal.js&lt;/td&gt;
      &lt;td&gt;13852&lt;/td&gt;
      &lt;td&gt;3338&lt;/td&gt;
      &lt;td&gt;4708&lt;/td&gt;
      &lt;td&gt;1457&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;jquery.once.js&lt;/td&gt;
      &lt;td&gt;2974&lt;/td&gt;
      &lt;td&gt;568&lt;/td&gt;
      &lt;td&gt;1081&lt;/td&gt;
      &lt;td&gt;384&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;Total&lt;/th&gt;
      &lt;td&gt;269707&lt;/td&gt;
      &lt;td&gt;98746&lt;/td&gt;
      &lt;td&gt;79564&lt;/td&gt;
      &lt;td&gt;35497&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
  &lt;caption&gt;JavaScript files and their sizes when minified and gzipped. File sizes are in bytes.&lt;/caption&gt;
&lt;/table&gt;


&lt;h2&gt;Why Are drupal.js and jquery.once.js Smaller When Minified?&lt;/h2&gt;

&lt;p&gt;One thing that surprised me right off the bat was that drupal.js and jquery.once.js are smaller minified than compressed with gzip. These two files have lots of fantastic documentation in them. When a file is minified this is stripped out as it's not needed for functionality. When the file is compressed with gzip all of this text is compressed and shipped. Well documented files like these can really benefit from being minified.&lt;/p&gt;

&lt;h2&gt;Total File Savings&lt;/h2&gt;

&lt;p&gt;The savings between gzip compression and gzip plus being minified is 44067 bytes. If you figure you have 10,000 downloads of this bundle of files per month that's a savings of 420 Megs of bandwidth savings in a month. No small amount. Even though drupal.js and jquery.once.js are small we have over a 3 Meg savings in bandwidth for just these two files at 10,000 downloads a month.&lt;/p&gt;

&lt;h2&gt;Round Trips Saved&lt;/h2&gt;

&lt;p&gt;The real fun starts to appear when we look round trip requests. To understand why this matters I would first suggest reading &lt;a href="http://www.stevesouders.com/blog/2010/07/13/velocity-tcp-and-the-lower-bound-of-web-performance/"&gt;TCP and the Lower Bound of Web Performance&lt;/a&gt; by Steve Souders where he talks about connections, TCP slow-start, and how it matters. To put it way to simply, when a browser fetches a file from a server it does it in multiple round trip requests. Each of these round trips has a delay as communications travel between a browser and a server. On mobile networks this delay can be several times that of a wired connection for each of the round trip requests. So, to speed up performance for an individual user it can be helpful to remove unneeded requests.&lt;/p&gt;

&lt;p&gt;With JavaScript files in the head of a page this can be extra important. JavaScript files can block the rest of the assets in a page from being downloaded. Drupal puts these assets in the head of a page. Saving time on these files means the rest of the assets in a page start downloading sooner.&lt;/p&gt;

&lt;p&gt;To download the original uncompressed set of files would take 10 round trip requests. To downloaded the gzipped version would take 6 round trip requests. By minifying the JavaScript in addition to gzip compression we save 2 more round trip requests to get the same functionality.&lt;/p&gt;

&lt;h2&gt;Extending This To All The JavaScript&lt;/h2&gt;

&lt;p&gt;Here I've only touched on the base JavaScript included in Drupal. Now lets extend this to ajax.js, form.js, jQuery UI, and all the other JavaScript in Drupal. By minifying files we can reduce the bandwidth and save on round trip requests giving our users a performance improvement without sacrificing functionality.&lt;/p&gt;

&lt;p&gt;To do one last test I took an aggregated from from drupal.org. This file already includes a minified version of jquery.js so the improvements we will see are from JavaScript files bundled with Drupal and contributed modules. The sizes were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Original: 156297 bytes&lt;/li&gt;
&lt;li&gt;Minified: 97984 bytes&lt;/li&gt;
&lt;li&gt;Gzipped: 53810 bytes&lt;/li&gt;
&lt;li&gt;Min + Gzip: 37698 bytes&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;This produces a savings of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;15.7 Kb per download.&lt;/li&gt;
&lt;li&gt;1 round trip per user.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Minifying files can have a real world performance difference. There is a reason jQuery calls the minified version the production version and the original source the development version. If you want to start using minified Drupal core JavaScript files now checkout the &lt;a href="http://drupal.org/project/speedy"&gt;Speedy module&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update: I wanted to note that I used &lt;a href="https://github.com/mishoo/UglifyJS"&gt;UglifyJS&lt;/a&gt; to minify the files. This is the tool jQuery uses.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pAyWE99dcfxWDCZwIBFWtKrOLHY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pAyWE99dcfxWDCZwIBFWtKrOLHY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pAyWE99dcfxWDCZwIBFWtKrOLHY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pAyWE99dcfxWDCZwIBFWtKrOLHY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/qsLkiXwmYps" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/why-minify-javascript</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Introducting the Speedy Module]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/TXbRaUIQvfA/speedy-module" />
    <updated>2012-03-21T00:00:00-04:00</updated>
    <id>http://engineeredweb.com/blog/speedy-module</id>
    <content type="html">&lt;p&gt;Website front end performance is important. &lt;a href="http://www.stevesouders.com/blog/2012/02/10/the-performance-golden-rule/"&gt;Better than 85% of the time it takes for a page to load occurs in the front end&lt;/a&gt;. One of the low barrier to entry ways to speed up a site is to make sure the JavaScript sent to browsers is minified. This is considered a standard practice with other common platforms, like Sharepoint and Wordpress, already doing this. The &lt;a href="http://drupal.org/project/speedy"&gt;Speedy Module&lt;/a&gt; brings minified JavaScript files to &lt;a href="http://drupal.org"&gt;Drupal&lt;/a&gt; core.&lt;!--break--&gt;&lt;/p&gt;

&lt;h2&gt;What Do Minified Files Give Us?&lt;/h2&gt;

&lt;p&gt;An example can help us see where the gains are. A minified version of drupal.js is 24% the size of the original. That means you have 76% less to send to users.&lt;/p&gt;

&lt;p&gt;This happens because a minified JavaScript has most comments remove, whitespace removed, and can even transform functions to make them smaller. One of the simplest function alterations is to rename safe variables to single letter names.&lt;/p&gt;

&lt;h2&gt;What About GZip Compression?&lt;/h2&gt;

&lt;p&gt;I've been told that minified files aren't necessary if you use gzip compression. This isn't really the case. When you compress with gzip (or Deflate) everything is compressed. That includes the comments in the code and the spaces used for indentation. Then in the browser (even mobile browser) all if this is ungzipped. Minified JavaScript should be used along with gzip compression to get the best of both worlds.&lt;/p&gt;

&lt;h2&gt;How The Speedy Module Works&lt;/h2&gt;

&lt;p&gt;Some of the JavaScript libraries used in Drupal core are already minified. But, most of the common Drupal specific JavaScript is not minified. The Speed module contains minified versions of these core files and swaps out the core one for the minified version. This files are handled per Drupal version so alterations to core JavaScript are taken into account.&lt;/p&gt;

&lt;p&gt;If you want a simple way to speed up your websites consider installing &lt;a href="http://drupal.org/project/speedy"&gt;Speedy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fvEhAmSh3qWA6gMJxA-hwuF-LTI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fvEhAmSh3qWA6gMJxA-hwuF-LTI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fvEhAmSh3qWA6gMJxA-hwuF-LTI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fvEhAmSh3qWA6gMJxA-hwuF-LTI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/TXbRaUIQvfA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/speedy-module</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Drupal, HP Cloud, and PHP]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/usm4BhXPv7s/drupal-hpcloud-php" />
    <updated>2012-03-20T00:00:00-04:00</updated>
    <id>http://engineeredweb.com/blog/drupal-hpcloud-php</id>
    <content type="html">&lt;p&gt;Cloud computing is something a lot of Drupal developers are interested in these days. As someone who works on the cloud, works for a cloud provider, and does a lot of Drupal work I want to see &lt;a href="http://drupal.org"&gt;Drupal&lt;/a&gt; and &lt;a href="http://hpcloud.com"&gt;HP Cloud&lt;/a&gt; (my cloud of choice) easily work together. So, we are releasing PHP Bindings and a Drupal module that uses them to bring the HP Cloud to Drupal.&lt;!--break--&gt;&lt;/p&gt;

&lt;h2&gt;Language Bindings&lt;/h2&gt;

&lt;p&gt;At the core of enabling Drupal to work with HP Cloud is a &lt;a href="http://hpcloud.github.com/HPCloud-PHP"&gt;PHP library&lt;/a&gt; to do the heavy lifting. In the initial release of the library the functionality for identity services (authentication), object storage, and CDN for object storage are available. More features will come to this library over time.&lt;/p&gt;

&lt;p&gt;For the technical minded this library:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is PHP 5.3+ based.&lt;/li&gt;
&lt;li&gt;Uses PSR-0 Naming.&lt;/li&gt;
&lt;li&gt;Provides a low level API and stream wrappers.&lt;/li&gt;
&lt;li&gt;Works with &lt;a href="http://getcomposer.org/"&gt;Composer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Has a ton of documentation.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Drupal Support&lt;/h2&gt;

&lt;p&gt;Imagine mounting public or private files from Object Storage right into Drupal. With all the public files being served out of a CDN. Or, automating backups to Object Storage. The &lt;a href="http://drupal.org/project/hpcloud"&gt;HPCloud Drupal module&lt;/a&gt; enables this. This module ties HP Cloud services right into the core of Drupal.&lt;/p&gt;

&lt;p&gt;If you're a &lt;a href="http://drupal.org/project/backup_migrate"&gt;Backup and Migrate&lt;/a&gt; user you can use the module to backup right to Object Storage.&lt;/p&gt;

&lt;h2&gt;Kudos to Matt Butcher&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://technosophos.com/"&gt;Matt Butcher&lt;/a&gt; wrote the code powering both the language bindings and Drupal module. The code is a great example of well documented, tested, and well written code. Kudos to Matt.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Full Discosure: I work for HP Cloud in the developer experience department.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YVf0bFAGP-u9n3j6ES_VGt_i8HM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YVf0bFAGP-u9n3j6ES_VGt_i8HM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YVf0bFAGP-u9n3j6ES_VGt_i8HM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YVf0bFAGP-u9n3j6ES_VGt_i8HM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/usm4BhXPv7s" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/drupal-hpcloud-php</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Learning From Verizon Wireless Experience Failures]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/LmcEMy557LA/learning-from-verizon-wireless-experience-failures" />
    <updated>2012-03-13T00:00:00-04:00</updated>
    <id>http://engineeredweb.com/blog/learning-from-verizon-wireless-experience-failures</id>
    <content type="html">&lt;p&gt;Providing good customer service is important. Providing secure well thought out technical solutions when you deal with someone finances is important. So, when I experienced repeated serious failures using &lt;a href="http://www.verizonwireless.com/"&gt;Verizon Wireless&lt;/a&gt; I decided to take it as a learning and actionable experience. If you're curious what I learned keep reading.&lt;!--break--&gt;&lt;/p&gt;

&lt;h2&gt;Lesson 1: Provide An Upgrade Path To Changes&lt;/h2&gt;

&lt;p&gt;The serious of problems I had started because my username stopped working. When I set it up I was allowed to have special characters in the username. At some point they stopped allowing special characters but didn't provide an upgrade path for users with special characters in their usernames. They simply stopped working.&lt;/p&gt;

&lt;p&gt;The lesson is to provide an upgrade path when you change your data structure.&lt;/p&gt;

&lt;h2&gt;Lesson 2: Prepare Your Customer Service Agents&lt;/h2&gt;

&lt;p&gt;When I had the problem I connected with an online customer service person. This was a chat window right on the website. So, when I was asked to reset my username through the site by this agent I was surprised. This isn't a feature of the site. Shouldn't the customer service agent have known how they website works?&lt;/p&gt;

&lt;h2&gt;Lesson 3: Don't Use Social Security Numbers&lt;/h2&gt;

&lt;p&gt;When I connected with a phone representative I was asked about an account password. This is different from the online password and one I setup years ago so I couldn't recall. It's not like I call in often. I've made all my changes via the web for years. When I didn't remember this password the representative wanted the last 4 digits of my social security number. This is a problem.&lt;/p&gt;

&lt;p&gt;To put some background to this, I used to work in a call center. I know a number of others who have worked in call centers. I'm aware of situations where account information was stolen and used for bad things. Because of this history I don't like reps having easy access to any part of my social security number. Verizon uses this as a fall back when you don't have your password.&lt;/p&gt;

&lt;p&gt;A lesson is to have other information on the account you can use to verify a user. This could be payment dates (a bank I have uses deposit dates and amounts) or numerous other pieces of information they collect.&lt;/p&gt;

&lt;h2&gt;Lesson 4: Make Customers Happy&lt;/h2&gt;

&lt;p&gt;By the time I had gotten through all of this I was not really happy. Unfortunately, without my password or part of my social security number I wasn't allowed to talk to a manager. To get this all taken care of I might have given the last 4 of my soc to a manager who listened to my complaint. Instead I was told I couldn't talk to a manager without it.&lt;/p&gt;

&lt;p&gt;Managers or supervisors should be equipped to make happy customers and deal with problems. Sometimes they just need someone to listen. If unhappy customers aren't able to connect with people who have training like this you end up with blog posts like this floating around.&lt;/p&gt;

&lt;p&gt;A simple lesson, enable representatives to make customers happy.&lt;/p&gt;

&lt;h2&gt;Lesson 5: Use Secure Passwords&lt;/h2&gt;

&lt;p&gt;When I was finally helped I was told I needed to have my account deleted and to create a new one. There was no way to change the username even if they could somehow get me logged in (this could be a failure but I'll keep going). While registering for a new account I was really limited on my password options. No special characters and no more than 20 characters. This makes me really suspect they are storing the password rather than a salted hash.&lt;/p&gt;

&lt;p&gt;The lesson here is to be secure with passwords. I should be able to have a 64 character random password if I wanted. I'd even appreciate a password strength meter.&lt;/p&gt;

&lt;h2&gt;Lesson 6: Don't Have WTF Moments&lt;/h2&gt;

&lt;p&gt;When this whole process started I was logging in with my phone number. For security reasons they wanted me to input my username. You are allowed to login with a username or phone number. The username was failing for special characters. After I created a new account I logged in with my phone number. This time there was nothing asking for my username. WTF.&lt;/p&gt;

&lt;p&gt;When we build websites and web applications we need to think about users, their experiences, security, and caring for them. No matter how big or small an organization. On the bright side this was a reminder for me.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Se4NLwzBO2wBHjYb_jKF-7TpEj0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Se4NLwzBO2wBHjYb_jKF-7TpEj0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Se4NLwzBO2wBHjYb_jKF-7TpEj0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Se4NLwzBO2wBHjYb_jKF-7TpEj0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/LmcEMy557LA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/learning-from-verizon-wireless-experience-failures</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Understanding The Hard Stuff]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/Nq3YszGbh08/understanding-hard-stuff" />
    <updated>2012-03-12T00:00:00-04:00</updated>
    <id>http://engineeredweb.com/blog/understanding-hard-stuff</id>
    <content type="html">&lt;p&gt;Building websites is easy right? You install Rails, Drupal, Symfony, or some other tool and just start coding (or site building). If you want to code from the ground up you can grab a book or one of the millions of tutorials online and off you go. But, what happens when a customer or boss asks about security, performance, or something else highly technical?&lt;!--break--&gt;&lt;/p&gt;

&lt;p&gt;This topic came to the forefront of my mind with the &lt;a href="http://groups.drupal.org/node/216314"&gt;recently published security issue in Drupal&lt;/a&gt;. In the time between the initial report and a response from the Drupal security team I investigated the issue, read the code in question, and even ran some tests. In my discussions with others I was finding a bit of FUD and people taking sides behind someones opinion rather than understanding (or discussing) the problem space.&lt;/p&gt;

&lt;p&gt;This topic doesn't just relate to security issues. For instance, Google, Amazon, and others have found the time it takes for a page to display to a user matters. The faster it displays the more likely a user is to do more interactions (that includes shopping). Yet, how many web developers know the ins and outs of making pages faster? Where are the low hanging fruit in this discussion? How does this all work?&lt;/p&gt;

&lt;p&gt;Lately, I've started to wonder if there is a distinction between the easy stuff getting sites and apps up and going versus the hard stuff in the form of security, performance, scalability, and so on. It can be easy to get into web development and start building sites. And, with everything else we have to do in our lives and jobs it can be easy to stop there. Instead, let me challenge you to dig into the hard stuff because it's not as hard as it may seem and there are payoffs.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hSqBP5QrvdLq0fk8y8r5GfApXXg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hSqBP5QrvdLq0fk8y8r5GfApXXg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hSqBP5QrvdLq0fk8y8r5GfApXXg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hSqBP5QrvdLq0fk8y8r5GfApXXg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/Nq3YszGbh08" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/understanding-hard-stuff</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Switching From Bash to Zsh]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/P6SkLGk6Oqk/switching-from-bash-to-zsh" />
    <updated>2012-03-05T00:00:00-05:00</updated>
    <id>http://engineeredweb.com/blog/switching-from-bash-to-zsh</id>
    <content type="html">&lt;p&gt;As a long time shell user I've spent a lot of time using bash as my default shell. In most of the hosting environments I regularly use bash is the default shell. Because of this bash is what I've been using on my local development machine until I recently switched to &lt;a href="https://en.wikipedia.org/wiki/Z_shell"&gt;Zsh&lt;/a&gt; and &lt;a href="https://github.com/robbyrussell/oh-my-zsh"&gt;oh-my-zsh&lt;/a&gt;. This post outlines why I prefer Zsh and how I made the switch.&lt;!--break--&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://engineeredweb.com/media/images/screen-shots/Zsh-In-Action.png" style="width: 100%"&gt;&lt;/p&gt;

&lt;h2&gt;Why I Prefer Zsh&lt;/h2&gt;

&lt;p&gt;There are a few reasons that Zsh has really popped for me.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the image above you can see my current Zsh config in action. This &lt;em&gt;theme&lt;/em&gt; allows me to see details about my system and the current working directory. oh-my-zsh ships with a bunch of themes and you can create your own.&lt;/li&gt;
&lt;li&gt;I love plugins. My CMS of choice has them. My text editor has them. Why shouldn't my terminal. Zsh has them and oh-my-zsh ships with a bunch of useful ones like git integration, github, osx, and so much more.&lt;/li&gt;
&lt;li&gt;Because of it's compatibility with bash commands I only had to learn the new stuff such as how to use the plugins.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;iTerm2&lt;/h2&gt;

&lt;p&gt;My development systems are Macs. The default terminal shipped with the operating system is nothing special. Instead of using the default terminal I use &lt;a href="http://www.iterm2.com/"&gt;iTerm2&lt;/a&gt;. iTerm2 has tabs, multiple panes, and you can even &lt;a href="http://technosophos.com/content/configure-iterm2-act-visor"&gt;configure it to operate like visor&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Installing oh-my-zsh and Customizing&lt;/h2&gt;

&lt;p&gt;Zsh is already installed on most modern operating systems and is already on OS X. Installing oh-my-zsh and setting zsh as the default shell is a &lt;a href="https://github.com/robbyrussell/oh-my-zsh#readme"&gt;simple one line install script in the readme documentationn&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Out of the box it won't look like the image of the shell above. I've switched themes from the default one.&lt;/p&gt;

&lt;p&gt;The first step I did was to migrate my current bash customizations from my .bashrc and .bash_profile files to the new .zshrc file in my home directory.&lt;/p&gt;

&lt;p&gt;The next step is to customize to your liking. First, there are a number of plugins, some of which are &lt;a href="https://github.com/robbyrussell/oh-my-zsh/wiki/Plugins"&gt;documented on the wiki&lt;/a&gt;. Plugins are enabled in the .zshrc.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="c"&gt;# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)&lt;/span&gt;
&lt;span class="c"&gt;# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/&lt;/span&gt;
&lt;span class="c"&gt;# Example format: plugins=(rails git textmate ruby lighthouse)&lt;/span&gt;
&lt;span class="nv"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;git git-flow osx github&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;To make the display look the way you want you can choose or create a theme. A number of the themes that come with oh-my-zsh are pictured on the &lt;a href="https://github.com/robbyrussell/oh-my-zsh/wiki/Themes"&gt;theme wiki&lt;/a&gt;. The one pictured above is the &lt;em&gt;dstufft&lt;/em&gt; theme.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="c"&gt;# Set name of the theme to load.&lt;/span&gt;
&lt;span class="c"&gt;# Look in ~/.oh-my-zsh/themes/&lt;/span&gt;
&lt;span class="c"&gt;# Optionally, if you set this to &amp;quot;random&amp;quot;, it&amp;#39;ll load a random theme each&lt;/span&gt;
&lt;span class="c"&gt;# time that oh-my-zsh is loaded.&lt;/span&gt;
&lt;span class="nv"&gt;ZSH_THEME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;dstufft&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;h2&gt;More Reading&lt;/h2&gt;

&lt;p&gt;In getting started I read a number of useful posts. Here are some I found useful.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://forrst.com/posts/Oh_my_zsh_iTerm2_Nice_Colors_git_hg_suppo-1Ct"&gt;Oh my zsh! + iTerm2 + Nice Colors + git/hg support === amazazing.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stevelosh.com/blog/2010/02/my-extravagant-zsh-prompt/"&gt;My Extravagant Zsh Prompt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://zanshin.net/2011/08/12/oh-my-zsh/"&gt;Oh My Zsh!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JyEgJvjCv4c_yb8Nf7oyHwqhavw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JyEgJvjCv4c_yb8Nf7oyHwqhavw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JyEgJvjCv4c_yb8Nf7oyHwqhavw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JyEgJvjCv4c_yb8Nf7oyHwqhavw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/P6SkLGk6Oqk" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/switching-from-bash-to-zsh</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Jekyll Deploy Scripts]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/O28q4nMCWTo/jekyll-deploy-scripts" />
    <updated>2012-02-20T00:00:00-05:00</updated>
    <id>http://engineeredweb.com/blog/jekyll-deploy-scripts</id>
    <content type="html">&lt;p&gt;One of the goals I had when I converted my blog to Jekyll was to speed up front end performance. To do this I wanted to minify the CSS and HTML files I deployed (I'm already manually handling the minification of the JS files). Luckly, &lt;a href="http://grenadesandwich.com/"&gt;grenadesandwich.com by Steven Merrill&lt;/a&gt; was already doing this and &lt;a href="https://github.com/smerrill/grenadesandwich.com/blob/master/_build/productionify.sh"&gt;provided a good outline&lt;/a&gt;. I'm now able to use the command &lt;code&gt;make deploy&lt;/code&gt; to generate the site, minify everything, and deploy it to the server.&lt;!--break--&gt;&lt;/p&gt;

&lt;p&gt;To do all of this I take advantage of &lt;a href="http://developer.yahoo.com/yui/compressor/"&gt;yuicompressor&lt;/a&gt;, &lt;a href="http://code.google.com/p/htmlcompressor/"&gt;htmlcompressor&lt;/a&gt;, make, and rsync. While make and rsync are installed on the system the Java jar files for yuicompressor and htmlcompressor are in a _build directory within my Jekyll site.&lt;/p&gt;

&lt;p&gt;At the root of the site I have a Makefile containing the code snippet below (with some modifications for paths).&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;server:
  @@jekyll --server

render:
  @@echo &lt;span class="s2"&gt;&amp;quot;Building the site...&amp;quot;&lt;/span&gt;
  @@jekyll --no-future
  
minify:
  @@echo &lt;span class="s2"&gt;&amp;quot;Minifying the CSS...&amp;quot;&lt;/span&gt;
  @@java -jar _build/yuicompressor.jar --verbose --type css -o _site/path/to/style.css _site/path/to/style.css
  @@echo &lt;span class="s2"&gt;&amp;quot;Minifying the HTML...&amp;quot;&lt;/span&gt;
  @@java -jar _build/htmlcompressor.jar -r --type html -o _site _site

build: render minify

deploy: build
  @@echo &lt;span class="s1"&gt;&amp;#39;Deploying site.&amp;#39;&lt;/span&gt;
  @@rsync -avq --delete-after _site/ sshAlias:/path/to/site/html

.PHONY: server render build minify deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;&lt;em&gt;You can get this as a &lt;a href="https://gist.github.com/1860912"&gt;gist&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The path to the css file and the location where rsync places the files are customized for my site and you should update those as well.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/P6RIY5Qe3xkp4K_6t1eMLYWkjT4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/P6RIY5Qe3xkp4K_6t1eMLYWkjT4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/P6RIY5Qe3xkp4K_6t1eMLYWkjT4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/P6RIY5Qe3xkp4K_6t1eMLYWkjT4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/O28q4nMCWTo" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/jekyll-deploy-scripts</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[LossLess Theme Image Optimization with ImageOptim]]></title>
    <link href="http://feedproxy.google.com/~r/EngineeredWeb/~3/NpkppWvUYMo/Losless-Image-Optimization-With-ImageOptim" />
    <updated>2012-02-13T00:00:00-05:00</updated>
    <id>http://engineeredweb.com/blog/Losless-Image-Optimization-With-ImageOptim</id>
    <content type="html">&lt;p&gt;I used to think that exporting images from Photoshop for web and devices produced optimized images ready to use in my production sites. Sure, there are optimization techniques you can use for &lt;a href="http://www.smashingmagazine.com/2009/07/15/clever-png-optimization-techniques/"&gt;PNGs&lt;/a&gt; and &lt;a href="http://www.smashingmagazine.com/2009/07/01/clever-jpeg-optimization-techniques/"&gt;JPEGs&lt;/a&gt; that I would need to incorporate. But, since Photoshop is considered one of the best imagine editing programs on the market I expected it would do a fantastic job exporting images.&lt;/p&gt;

&lt;p&gt;I've since learned there are a number of techniques for producing smaller file sizes without compromising quality that Photoshop doesn't use. For example, 8-bit PNGs with alpha transparency. On the advice of &lt;a href="http://sonspring.com/"&gt;Nathan Smith&lt;/a&gt; I've started using &lt;a href="http://imageoptim.pornel.net/"&gt;ImageOptim&lt;/a&gt; to losslessly compress my theme images.&lt;!--break--&gt;&lt;/p&gt;

&lt;h1&gt;Why Smaller Images Matter&lt;/h1&gt;

&lt;p&gt;If you aren't sure why using smaller images is better here are a couple reasons to consider.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Smaller files are less to transfer for the sender and receiver. This means using less bandwidth to serve the site and the receiving browser receives the site faster to load it faster.&lt;/li&gt;
&lt;li&gt;Smaller images take up less room in memory. With the rise in use of mobile devices with different memory constraints, using memory more efficiently is a good thing.&lt;/li&gt;
&lt;/ol&gt;


&lt;h1&gt;ImageOptim&lt;/h1&gt;

&lt;p&gt;&lt;img src="http://engineeredweb.com//media/images/screen-shots/imageoptim.png" alt="ImageOptim" /&gt;&lt;/p&gt;

&lt;p&gt;Using &lt;a href="http://imageoptim.pornel.net/"&gt;ImageOptim&lt;/a&gt; is simple. You just drag and drop images onto ImageOptim or it's icon on the dock and it does the rest. Under the tools menu option you can select which tools are used to do the optimizations.&lt;/p&gt;

&lt;h1&gt;If You're Not On A Mac&lt;/h1&gt;

&lt;p&gt;ImageOptim is a mac program which is what I use for development. If you are on Windows of Linux and are looking for a tool consider the web based tool &lt;a href="http://www.smushit.com/ysmush.it/"&gt;Smush.it&lt;/a&gt;. Other than this I don't really have a tool I can recommend. If you know of one please offer it up in the comments.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/o6xpc162mDTJKMIz3kOjRrrOueA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o6xpc162mDTJKMIz3kOjRrrOueA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/o6xpc162mDTJKMIz3kOjRrrOueA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o6xpc162mDTJKMIz3kOjRrrOueA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/NpkppWvUYMo" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://engineeredweb.com/blog/Losless-Image-Optimization-With-ImageOptim</feedburner:origLink></entry>
  
</feed>

