<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0" xml:base="http://engineeredweb.com">
<channel>
 <title>Engineered Web</title>
 <link>http://engineeredweb.com</link>
 <description />
 <language>en</language>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+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><item>
 <title>Visualize Your Page Size with Browser Size</title>
 <link>http://feedproxy.google.com/~r/EngineeredWeb/~3/Y5TF8tWkW0Q/visualize-your-page-size-browser-size</link>
 <description>&lt;p&gt;I was recently asked to review the look and feel of a website for someone. When I first looked at the site I was surprised at how wide the content region was. Sitting at close to 1200 pixels wide I thought to myself, there's the first red flag. But, when I pointed it out to the site developer he didn't think the width was a problem. After talking to him for a few minutes I discovered that he was under the impression this was now an acceptable resolution to use.&lt;/p&gt;
&lt;p&gt;He was under a false impression. But, how do you show someone they are wrong? &lt;a href="http://browsersize.googlelabs.com/"&gt;Browser Size&lt;/a&gt; is a tool that can help do just that. It takes a look at page size and shows you what percentage of browser users can view how much of the page.&lt;/p&gt;
&lt;p&gt;If we take a look at 1200 pixels we see that only 50% of those surfing the web can view that width without having to horizontally scroll. Yikes!&lt;br /&gt;
&lt;!--break--&gt;&lt;br /&gt;
&lt;img src="http://engineeredweb.com/sites/engineeredweb.com/files/images/screen-shots/Google-BrowserSize.png" width="598" height="496" alt="Google-BrowserSize.png" class="image-border"/&gt;&lt;/p&gt;
&lt;p&gt;There are exceptions where 1200 pixels might be appropriate. An internal organization web application where the organization controls all the monitors is one example. The web at large is just not a place for that.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/Y5TF8tWkW0Q" height="1" width="1"/&gt;</description>
 <comments>http://engineeredweb.com/blog/10/3/visualize-your-page-size-browser-size#comments</comments>
 <category domain="http://engineeredweb.com/blog/tags/tools">Tools</category>
 <pubDate>Fri, 05 Mar 2010 16:39:49 +0000</pubDate>
 <dc:creator>Matt</dc:creator>
 <guid isPermaLink="false">56 at http://engineeredweb.com</guid>
<feedburner:origLink>http://engineeredweb.com/blog/10/3/visualize-your-page-size-browser-size</feedburner:origLink></item>
<item>
 <title>Showdown: Blueprint vs. the 960 Grid</title>
 <link>http://feedproxy.google.com/~r/EngineeredWeb/~3/ym32SC0-F-g/showdown-blueprint-vs-960-grid</link>
 <description>&lt;p&gt;I've head a lot of great things about using &lt;a href="http://en.wikipedia.org/wiki/CSS_framework" title="Wikipedia: CSS Framework"&gt;CSS frameworks&lt;/a&gt; in site builds. Two of the more popular options I'm interested in are &lt;a href="http://www.blueprintcss.org/"&gt;Blueprint&lt;/a&gt; and &lt;a href="http://960.gs/"&gt;960&lt;/a&gt;. When I tried to find a good comparison between the two I found, for the most part, opinion pieces on why one was better than the other. I couldn't find a detailed enough analysis to feed my need. What is an inquiring engineer to do? I did the analysis myself.&lt;br /&gt;
&lt;!--break--&gt;&lt;/p&gt;
&lt;h2&gt;Introducing 960&lt;/h2&gt;
&lt;p&gt;&lt;img src="http://engineeredweb.com/sites/engineeredweb.com/files/images/screen-shots/960-Grid-System.jpg" width="598" height="514" alt="960-Grid-System.jpg" class="image-border" /&gt;&lt;br /&gt;
960 is what its name implies. It is a 960 pixel wide grid. The grid has 940 pixels of space for content and 10 pixel gutters on the right and left. The 10 pixel gutter on the left is very important. When a browser window is smaller than 960 pixels there is a gutter between the edge of the browser window and the content making it more readable than if the content went right to the windows edge.&lt;/p&gt;
&lt;p&gt;Included in 960 is a 12-column grid with 60 pixel wide columns and a 16-column grid with 40 pixel wide columns. Each column has 10 pixels of space on the right and left creating 20 pixel gutters between each column. If you like even more columns, included in 960 is a 24-column layout with 30 pixel wide columns with 5 pixels of space on the right and left making 10 pixel gutters.&lt;/p&gt;
&lt;p&gt;960 pixels is used because it makes for pretty math. All of the numbers listed here are clean numbers. Nothing ends in a decimal that a browser would try to round. Additionally, a 12-column grid is nicely divided up for the &lt;a href="http://en.wikipedia.org/wiki/Golden_ratio" title="Wikipedia: Golden Ratio"&gt;golden ratio&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sometimes a 960 grid is not what a project calls for. For those times there is a &lt;a href="http://www.spry-soft.com/grids/"&gt;grid generator&lt;/a&gt; based on 960. The number of columns, column width, and gutter width are all configurable. Once you have something your comfortable with &lt;em&gt;(there is a live preview)&lt;/em&gt; you can download CSS generated from it.&lt;/p&gt;
&lt;p&gt;960, also, includes a reset stylesheet from &lt;a href="http://meyerweb.com/eric/tools/css/reset/"&gt;Eric Meyer&lt;/a&gt; and a basic typography stylesheet. 960 doesn't handle typography. This is the basics for rapid prototyping. As &lt;a href="http://sonspring.com/journal/960-grid-system"&gt;Nathan Smith, the developer of 960 puts it&lt;/a&gt;,&lt;/p&gt;
&lt;blockquote cite="http://sonspring.com/journal/960-grid-system"&gt;&lt;p&gt;
One of the glaring omissions, or nice features, depending on how you look at it, is the way the 960 handles (or doesn’t) typography. There is a text.css file included, but this is mainly to ensure that there is at least a something in place, so that as you do rapid prototyping, common elements such as headings, paragraphs and lists have basic styling.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://sonspring.com"&gt;Nathan Smith&lt;/a&gt; is the developer of 960. This project is, for the most part, a one man show. Some features have come from others, like the push_XX and pull_XX classes that enable source reordering.&lt;/p&gt;
&lt;p&gt;Along with the grid there are templates for all the major design programs and a printable pdf with the grid for sketching. The 960 grid is dual licensed using the GPL and MIT licenses.&lt;/p&gt;
&lt;h2&gt;Introducing Blueprint&lt;/h2&gt;
&lt;p&gt;&lt;img src="http://engineeredweb.com/sites/engineeredweb.com/files/images/screen-shots/BlueprintCSS.jpg" width="598" height="503" alt="BlueprintCSS.jpg" class="image-border" /&gt;&lt;br /&gt;
The Blueprint grid is a 950 pixel wide grid with 24 columns. Each column is 30 pixels wide with a 10 pixel gutter. The 10 pixel gutter is on the right side of each column. This grid, also, nicely works with the golden ratio and in 950 everything ends in nice round numbers.&lt;/p&gt;
&lt;p&gt;If a 950 pixel grid isn't right for you, included with Blueprint is a &lt;a href="http://en.wikipedia.org/wiki/Ruby_(programming_language)" title="Wikipedia: Ruby (programming language)"&gt;Ruby&lt;/a&gt; script that can generate different grid sizes. Don't worry if you don't know Ruby. There are detailed instructions and it works like other command line applications. If you are looking for &lt;a href="http://wiki.github.com/joshuaclayton/blueprint-css/tools-and-resources"&gt;web based generators you need to look no further than the community of developers around 950&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The grid provides source reordering with push, pull, append, and prepend classes. This is handy when you want to have your source in one order for good SEO and your presentation in a different visual order.&lt;/p&gt;
&lt;p&gt;Like the 960 grid reset, Blueprint provides a reset stylesheet based on the work by Eric Meyer.&lt;/p&gt;
&lt;p&gt;This is where the similarities between 960 and Blueprint end. Blueprint goes beyond a grid to provide much more. Some of the additional elements in Blueprint include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Typography&lt;/strong&gt; - Provides typography size and spacing defaults.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Form Styling&lt;/strong&gt; - Default styling for forms and some classes that can be used to add to forms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Print Styles&lt;/strong&gt; - Print styles are important and often overlooked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plugins&lt;/strong&gt; - CSS &lt;em&gt;(and sometimes images)&lt;/em&gt; for buttons, tabs, and sprites.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A PSD template is available for Blueprint from the Blueprint repo. If you go beyond the Blueprint repo there are generators for CSS files with different dimensions and templates for other tools from the community of Blueprint users.&lt;/p&gt;
&lt;p&gt;Blueprint is the work of a team. The original creator has handed Blueprint off to two admins and several contributors. Much of the CSS used comes from the work of big names in the design community.&lt;/p&gt;
&lt;p&gt;Blueprint is distributed under the GPL and a modified MIT license.&lt;/p&gt;
&lt;h2&gt;My Notes&lt;/h2&gt;
&lt;p&gt;While reading through the sites, looking for the similarities and differences, and seeing what I liked or disliked about these two frameworks I took some notes that some may find useful.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Blueprint content butts up to the browser window on the left when the window is smaller than the content area. This can cause problems for readability of content. A designer can add a gutter to the left side of the content to account for this. I tested several sites and often found the text butted up to the left side of the window.&lt;/li&gt;
&lt;li&gt;In most of the designs I work with the designer has chosen the typography, look of the forms, and other visual elements. A framework that provides these is not useful when a designer is customizing the look for the branding of the site or the organizations branding is dictating parts of the design.&lt;/li&gt;
&lt;li&gt;If someone is not a designer but is throwing a design together the defaults provided by Blueprint would be very handy. There are far to many ugly developer sites because of bad defaults.&lt;/li&gt;
&lt;li&gt;I don't really like the gutter all being on one side of the column in Blueprint. It feels unbalanced. Like a person who has short hair on the right side of their head and long hair on the other. Maybe it's just me but it doesn't feel right.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Blueprint and 960 are very different setups. They offer different features and have a different purpose. Picking between them is more a matter of preference. The approaches are just different. 960 is additive. It provides a grid and the design elements are added to your CSS. Blueprint is subtractive. It provides a lot of functionality. If you want to go a different route you need to subtract or override what you don't want from Blueprint.&lt;/p&gt;
&lt;p&gt;Both solutions are solid, well tested, and well used. With either choice you aren't going to go wrong.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/ym32SC0-F-g" height="1" width="1"/&gt;</description>
 <comments>http://engineeredweb.com/blog/10/3/showdown-blueprint-vs-960-grid#comments</comments>
 <category domain="http://engineeredweb.com/blog/tags/css">CSS</category>
 <category domain="http://engineeredweb.com/blog/tags/tools">Tools</category>
 <pubDate>Thu, 04 Mar 2010 12:46:56 +0000</pubDate>
 <dc:creator>Matt</dc:creator>
 <guid isPermaLink="false">55 at http://engineeredweb.com</guid>
<feedburner:origLink>http://engineeredweb.com/blog/10/3/showdown-blueprint-vs-960-grid</feedburner:origLink></item>
<item>
 <title>More Git GUIs</title>
 <link>http://feedproxy.google.com/~r/EngineeredWeb/~3/38zRmAifeIE/more-git-guis</link>
 <description>&lt;p&gt;After posting about &lt;a href="http://engineeredweb.com/blog/10/2/smartgit-best-git-gui-so-far" title="SmartGit - The Best Git Gui So Far"&gt;SmartGit in a recent post&lt;/a&gt; I was contacted about numerous other Git GUI programs. While I think SmartGit is the best all around solution for your average users there are other programs for Git GUI users to consider. The nice part of these programs is that they are free for commercial use.&lt;br /&gt;
&lt;!--break--&gt;&lt;/p&gt;
&lt;h2&gt;Git GUI&lt;/h2&gt;
&lt;p&gt;&lt;img src="http://img.skitch.com/20100226-rys1rd6ba8gr24e59sk33erw7u.png" alt="Git Gui (ffpc) /Users/mfarina/workspace/ffpc" class="image-border"/&gt;&lt;br /&gt;
Git GUI is included with a git installation. From the command line you can type &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;git gui&lt;/code&gt;&lt;/span&gt; to start it up. Git GUI provides most of what you need to work in Git. &lt;/p&gt;
&lt;p&gt;Why didn't I recommend this previously? I don't believe Git GUI is very intuitive. If someone isn't familiar with the intricacies of Git it can be easy to get lost in the interface. So, for your average user I wouldn't make it my first choice.&lt;/p&gt;
&lt;p&gt;Two notices for Mac users:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you are on a Mac and would like to open a project right into Git GUI there is a &lt;a href="http://code.google.com/p/git-osx-installer/wiki/OpenInGitGui" title="OpenInGitGui"&gt;Droplet&lt;/a&gt; for that.&lt;/li&gt;
&lt;li&gt;If you are on OS X Leopard you may get an error about a missing framework. To use it you'll need to install the framework.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;TortoiseGit&lt;/h2&gt;
&lt;p&gt;If you are a windows user familiar with TortoiseSVN or any of the other Tortoise version control interfaces than &lt;a href="http://code.google.com/p/tortoisegit/"&gt;TortoiseGit&lt;/a&gt; may be for you.&lt;/p&gt;
&lt;p&gt;Since I am no longer a Windows user &lt;em&gt;(except for some Internet Explorer testing)&lt;/em&gt; I cannot really provide a review. I hear good things about it and it expect to be in the same line as many of the other Tortoise applications.&lt;/p&gt;
&lt;h2&gt;GitX&lt;/h2&gt;
&lt;p&gt;&lt;img src="http://img.skitch.com/20100226-xk81ua2edafnhqcwwb7129jj3a.png" alt="ffpc (branch: master)" class="image-border" /&gt;&lt;br /&gt;
&lt;a href="http://gitx.frim.nl/"&gt;GitX&lt;/a&gt;, a mac application, is not like the other GUIs I've written about. The other GUIs provide the base features your average user can use. GitX doesn't provide those. GitX lets you visualize the source tree, see diffs, and visualize where a project repo is at. You can't commit, checkout, or do other basic commands in GitX.&lt;/p&gt;
&lt;p&gt;For what GitX does, it does it well.&lt;/p&gt;
&lt;p&gt;While I have shared these other tools I still believe SmartGit is the best option for average users at this point.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/38zRmAifeIE" height="1" width="1"/&gt;</description>
 <comments>http://engineeredweb.com/blog/10/3/more-git-guis#comments</comments>
 <category domain="http://engineeredweb.com/blog/tags/git">Git</category>
 <pubDate>Tue, 02 Mar 2010 17:04:46 +0000</pubDate>
 <dc:creator>Matt</dc:creator>
 <guid isPermaLink="false">53 at http://engineeredweb.com</guid>
<feedburner:origLink>http://engineeredweb.com/blog/10/3/more-git-guis</feedburner:origLink></item>
<item>
 <title>Pluggable Entity Operations in Drupal 7</title>
 <link>http://feedproxy.google.com/~r/EngineeredWeb/~3/dYR3zG61RLc/pluggable-entity-operations-drupal-7</link>
 <description>&lt;p&gt;In &lt;a href="http://drupal.org" title="Drupal - Content Management Platform"&gt;Drupal&lt;/a&gt; 7 core all the common objects, like nodes, users, comments, and terms, are called entities. Entities are a base level conceptual object designed to be used as a base for objects in core and contrib. But, &lt;strong&gt;there is a problem with the core entity pattern we can improve on in our contrib modules.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Entities have a controller used for their loading operations. The controller is a class that can be swapped out for alternative controllers when developers want to do something fancy, like have their own node caching setup. But, only the load operation is on the controller. The other &lt;a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete" title="Create, read, update and delete"&gt;CRUD (create, read, and delete)&lt;/a&gt; are hard coded in functions like node_load, node_save, and other object operations. The CRUD control for entities can't be completely swapped out. Let's take a look at a base pattern to use for completely swappable controllers.&lt;br /&gt;
&lt;!--break--&gt;&lt;/p&gt;
&lt;h2&gt;Why a completely swappable controller?&lt;/h2&gt;
&lt;p&gt;There are several reasons to provide a fully swappable controller. There are different use cases that are important to different developers. Let's look at a reason that is becoming fairly common.&lt;/p&gt;
&lt;p&gt;Alternative databases are becoming all the rage. &lt;a href="http://drupal.org/project/mongodb" title="MongoDB Drupal Module"&gt;MongoDB and Drupal are already on their way to being used together where they can&lt;/a&gt;. Some developers will want to store entities in alternative locations like a &lt;a href="http://www.mongodb.org"&gt;MongoDB&lt;/a&gt; database. To do this all of the CRUD operations need to be swapped out.&lt;/p&gt;
&lt;h2&gt;The Pattern&lt;/h2&gt;
&lt;p&gt;Lets look at a code example to see how completely swappable CRUD would work. We start by looking at &lt;a href="http://api.drupal.org/api/function/hook_entity_info/7"&gt;hook_entity_info&lt;/a&gt; where the controller is defined&lt;/p&gt;
&lt;p&gt;&lt;div class="geshifilter"&gt;&lt;pre class="php geshifilter-php" style="font-family:monospace;"&gt;&lt;span style="color: #009933; font-style: italic;"&gt;/**
 * Implements hook_entity_info().
 */&lt;/span&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; example_entity_info&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
  &lt;span style="color: #000088;"&gt;$return&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt;  &lt;a href="http://www.php.net/array"&gt;&lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;
    &lt;span style="color: #0000ff;"&gt;'example'&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;a href="http://www.php.net/array"&gt;&lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;
      &lt;span style="color: #0000ff;"&gt;'label'&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; t&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'Example Entity'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
      &lt;span style="color: #0000ff;"&gt;'controller class'&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'ExampleEntityController'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
      &lt;span style="color: #0000ff;"&gt;'base table'&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'example_entity'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
      &lt;span style="color: #0000ff;"&gt;'fieldable'&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;TRUE&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
      &lt;span style="color: #0000ff;"&gt;'path callback'&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'example_entity_path'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
      &lt;span style="color: #0000ff;"&gt;'object keys'&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;a href="http://www.php.net/array"&gt;&lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;
        &lt;span style="color: #0000ff;"&gt;'id'&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'id'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
      &lt;span style="color: #339933;"&gt;...&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000088;"&gt;$return&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Here we create a basic entity called &lt;em&gt;example&lt;/em&gt; and specify &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-php"&gt;ExampleEntityController&lt;/code&gt;&lt;/span&gt; as the controller. We cannot specify the default controller provided by core because it only has the load operation. But, we can extend the default controller allowing us to use everything it has and add our own additional methods.&lt;/p&gt;
&lt;p&gt;&lt;div class="geshifilter"&gt;&lt;pre class="php geshifilter-php" style="font-family:monospace;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;class&lt;/span&gt; ExampleEntityController &lt;span style="color: #000000; font-weight: bold;"&gt;extends&lt;/span&gt; DrupalDefaultEntityController &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp;
  &lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; save&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$entity&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
    &lt;span style="color: #339933;"&gt;...&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  &lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; delete&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$entity_ids&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
    &lt;span style="color: #339933;"&gt;...&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  &lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; create&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
    &lt;span style="color: #339933;"&gt;...&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;The pattern in Drupal is to have functions for the CRUD operations. For example, node has node_load, node_save, and node_delete. In keeping form with these we should create &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-php"&gt;example_load&lt;/code&gt;&lt;/span&gt;, &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-php"&gt;example_load_multiple&lt;/code&gt;&lt;/span&gt;, &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-php"&gt;example_save&lt;/code&gt;&lt;/span&gt;, &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-php"&gt;example_delete&lt;/code&gt;&lt;/span&gt;, and &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-php"&gt;example_create&lt;/code&gt;&lt;/span&gt; functions that call back to the controller. For the most part these functions should be pretty simple. For example,&lt;/p&gt;
&lt;p&gt;&lt;div class="geshifilter"&gt;&lt;pre class="php geshifilter-php" style="font-family:monospace;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; example_save&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$entity&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
  &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; entity_get_controller&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'example'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;save&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$entity&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Calling &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-php"&gt;entity_get_controller&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'example'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt; returns the controller for that entity. In this case we call the save method and pass in the entity object to be saved. The idea is that the crud functions simply pass though the functionality to the controller.&lt;/p&gt;
&lt;h2&gt;Why not Entity Module?&lt;/h2&gt;
&lt;p&gt;The &lt;a href="http://drupal.org/project/entity" title="Entity Drupal module"&gt;Entity Module&lt;/a&gt; is attempting to provide a base to do something like this and more. But, it does a lot more than provide a pattern for swappable operations. It introduces Entity objects, the &lt;a href="http://en.wikipedia.org/wiki/Facade_pattern" title="Wikipedia: Facade Pattern"&gt;facade pattern&lt;/a&gt;, and more. At this point I'm not ready to recommend its approach.&lt;/p&gt;
&lt;p&gt;How we go about advancing entities beyond pluggable operations still seems to be under a bit of healthy debate. This post shows the first step in a better direction. There will be more to follow as the healthy discussion turns into solid approaches.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/dYR3zG61RLc" height="1" width="1"/&gt;</description>
 <comments>http://engineeredweb.com/blog/10/3/pluggable-entity-operations-drupal-7#comments</comments>
 <category domain="http://engineeredweb.com/blog/tags/architecture">Architecture</category>
 <category domain="http://engineeredweb.com/blog/tags/drupal">Drupal</category>
 <category domain="http://engineeredweb.com/blog/tags/drupal-planet">Drupal Planet</category>
 <pubDate>Mon, 01 Mar 2010 13:38:06 +0000</pubDate>
 <dc:creator>Matt</dc:creator>
 <guid isPermaLink="false">54 at http://engineeredweb.com</guid>
<feedburner:origLink>http://engineeredweb.com/blog/10/3/pluggable-entity-operations-drupal-7</feedburner:origLink></item>
<item>
 <title>Farbtastic 1.3u</title>
 <link>http://feedproxy.google.com/~r/EngineeredWeb/~3/pnkV8ziveLQ/farbtastic-13u</link>
 <description>&lt;p&gt;&lt;a href="http://acko.net/blog/farbtastic-1-2-out" title="Farbtastic 1.2 out"&gt;Farbtastic 1.2 was released years ago&lt;/a&gt;. In that time &lt;a href="http://jquery.org"&gt;jQuery&lt;/a&gt; has changed creating a need for farbtastic to change as well. For example, internal logic in farbtastic was calculating the offset but changes in jQuery caused it to not calculate it accurately in all cases. Switching to the &lt;a href="http://docs.jquery.com/CSS/offset"&gt;jQuery.offset&lt;/a&gt; method, which was added after the release of farbtastic 1.2, fixed the problem.&lt;/p&gt;
&lt;p&gt;So, when I recently moved &lt;a href="http://engineeredweb.com/blog/10/2/farbtastic-dead-long-live-farbtastic" title="Farbtastic is Dead, Long Live Farbtastic"&gt;Farbtastic over to GitHub to continue development&lt;/a&gt; I created a tag called &lt;a href="http://github.com/mattfarina/farbtastic/tree/1.3u"&gt;1.3u&lt;/a&gt; &lt;em&gt;(the u stands for unofficial)&lt;/em&gt; containing updates that were already being using in production sites.&lt;/p&gt;
&lt;p&gt;The complete list of changes, from the changelog are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Updated style to use anonymous function wrapper per &lt;a href="http://docs.jquery.com/Plugins/Authoring#Custom_Alias" title="http://docs.jquery.com/Plugins/Authoring#Custom_Alias"&gt;http://docs.jquery.com/Plugins/Authoring#Custom_Alias&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Now it uses the .offset() method available as of jQuery 1.2.x.&lt;/li&gt;
&lt;li&gt;Works with JavaScript aggregators and compressors.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://github.com/mattfarina/farbtastic/downloads"&gt;Downloads are available by tag on Github&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/pnkV8ziveLQ" height="1" width="1"/&gt;</description>
 <comments>http://engineeredweb.com/blog/10/2/farbtastic-13u#comments</comments>
 <category domain="http://engineeredweb.com/blog/tags/jquery">jQuery</category>
 <pubDate>Fri, 26 Feb 2010 16:16:56 +0000</pubDate>
 <dc:creator>Matt</dc:creator>
 <guid isPermaLink="false">52 at http://engineeredweb.com</guid>
<feedburner:origLink>http://engineeredweb.com/blog/10/2/farbtastic-13u</feedburner:origLink></item>
<item>
 <title>SmartGit - The Best Git Gui So Far</title>
 <link>http://feedproxy.google.com/~r/EngineeredWeb/~3/ApZY1KsBOj0/smartgit-best-git-gui-so-far</link>
 <description>&lt;p&gt;As &lt;a href="http://git-scm.com" title="Git - Fast Version Control System"&gt;Git&lt;/a&gt; becomes more popular and widely used a &lt;a href="http://en.wikipedia.org/wiki/Graphical_user_interface" title="Wikipedia: Graphical User Interface"&gt;GUI&lt;/a&gt; becomes even more important. This was especially important when &lt;a href="http://drupal.org" title="Drupal - Content Management Platform"&gt;Drupal&lt;/a&gt; recently looked at what version control system it was going to switch to. &lt;em&gt;(If you're interested in the &lt;a href="http://groups.drupal.org/node/48818?page=2#comment-133893" title="Evaluation discussion for how to move Drupal.org off of CVS"&gt;Drupal (unofficial) decision checkout Angie Byrons post on groups.drupal.org&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When I surveyed the Git GUI landscape &lt;a href="http://www.syntevo.com/smartgit/index.html"&gt;SmartGit&lt;/a&gt; stood above the rest for your standard user.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://img.skitch.com/20100218-cdxm1aubspnrdii3wa4hmypkr2.jpg" alt="SmartGit" class="image-border" /&gt;&lt;br /&gt;
&lt;!--break--&gt;&lt;/p&gt;
&lt;h2&gt;For Your Average User&lt;/h2&gt;
&lt;p&gt;Git is an extremely powerful program. Powerful enough that there is a manual called &lt;a href="http://eagain.net/articles/git-for-computer-scientists/"&gt;Git for Computer Scientists&lt;/a&gt; which dives in really deep. There are advanced features within Git that I can't imagine how to build a GUI for.&lt;/p&gt;
&lt;p&gt;That being said, the common features that most of us use can be easily encapsulated in a GUI and SmartGit does just that. For a typical user, including front end developers, weekend warriors, and anyone who just doesn't need the advanced abilities, you have access to it with SmartGit.&lt;/p&gt;
&lt;p&gt;And, &lt;strong&gt;since it was written in Java it runs on Macs, Windows, and Linux.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;GitHub Integration&lt;/h2&gt;
&lt;p&gt;The most popular site for public Git repos is &lt;a href="http://github.com"&gt;Github&lt;/a&gt;. The interface is slick, the documentation is easy to understand, and it just works. This is where projects like jQuery and TinyMCE are hosted.&lt;/p&gt;
&lt;p&gt;SmartGit provides integration with Github.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://img.skitch.com/20100219-tfse78yjnb926865ce1wc5sg33.jpg" alt="SmartGit" class="image-border" /&gt;&lt;/p&gt;
&lt;p&gt;If you've provided your Github login information into SmartGit clicking on "Select from Github..." will bring up the list of projects you have on Github and let you clone them to your local system to work on them.&lt;/p&gt;
&lt;h2&gt;Paying For Commercial Use&lt;/h2&gt;
&lt;p&gt;SmartGit is not an open source project and it is not free for anyone to use. It's free for non-commercial use but, &lt;a href="http://www.syntevo.com/smartgit/purchase.html" title="Purchase SmartGit Commercial Licenses"&gt;for commercial use you need to pay for a license&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you want a GUI for commercial use but are looking to only use Open Source or free software there are alternatives. For your average user none of them is as nice.&lt;/p&gt;
&lt;p&gt;I've had the chance to use several Git GUIs. Many of them are great at what they do but are not right for your typical user. SmartGit hits that sweet spot.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/ApZY1KsBOj0" height="1" width="1"/&gt;</description>
 <comments>http://engineeredweb.com/blog/10/2/smartgit-best-git-gui-so-far#comments</comments>
 <category domain="http://engineeredweb.com/blog/tags/drupal">Drupal</category>
 <category domain="http://engineeredweb.com/blog/tags/drupal-planet">Drupal Planet</category>
 <category domain="http://engineeredweb.com/blog/tags/git">Git</category>
 <pubDate>Wed, 24 Feb 2010 12:41:40 +0000</pubDate>
 <dc:creator>Matt</dc:creator>
 <guid isPermaLink="false">49 at http://engineeredweb.com</guid>
<feedburner:origLink>http://engineeredweb.com/blog/10/2/smartgit-best-git-gui-so-far</feedburner:origLink></item>
<item>
 <title>Building Your Own Git Server</title>
 <link>http://feedproxy.google.com/~r/EngineeredWeb/~3/MmV-DB8kD9Q/building-your-own-git-server</link>
 <description>&lt;p&gt;Many of the projects I work on are not appropriate for public &lt;a href="http://en.wikipedia.org/wiki/Revision_control" title="Wikipedia: Revision Control"&gt;version control systems&lt;/a&gt; like &lt;a href="http://github.com"&gt;Github&lt;/a&gt; or &lt;a href="http://sourceforge.net/" title="Find and Develop Open Source Software"&gt;Sourceforge&lt;/a&gt;. They might be client projects or code I am tinkering with but am not sure what I'll eventually do with. In these cases it's good to have a private version control site. Since I am now a &lt;a href="http://git-scm.com" title="Git - The Fast Version Control System"&gt;Git&lt;/a&gt; user that server needs to be Git based. Luckily there are a couple great choices.&lt;br /&gt;
&lt;!--break--&gt;&lt;br /&gt;
The two prime candidates for personal Git servers are gitosis and gitolite. Where they differ is in the launguage they are written in and how they handle repo permissions.&lt;/p&gt;
&lt;h2&gt;Gitosis&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way" title="Hosting Git repositories, The Easy (and Secure) Way"&gt;Gitosis&lt;/a&gt; has been around longer than Gitolite but has fewer access controls.&lt;/p&gt;
&lt;p&gt;Permissions are handled on a per repo basis. Each user has their public ssh key stored in gitosis config. Then each repo has a list of users associated with it. These users can read and write to the repo. It's that simple.&lt;/p&gt;
&lt;p&gt;Additionally, individual repos can be set to allow anonymous user checkouts.&lt;/p&gt;
&lt;p&gt;If you don't have complex access rules Gitosis may be great for you.&lt;/p&gt;
&lt;h2&gt;Gitolite&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://github.com/sitaramc/gitolite"&gt;Gitolite&lt;/a&gt; started out as a souped up version of Gitosis. The original goal was to add per branch permissions. From there it changed languages and grew into something with more features with more fine grained permissions.&lt;/p&gt;
&lt;p&gt;If you have complex access rules Gitolite might be more up your alley.&lt;/p&gt;
&lt;h2&gt;Gitweb&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://git.wiki.kernel.org/index.php/Gitweb"&gt;Gitweb&lt;/a&gt; is the de-facto standard web GUI for git. So much so that it is now included in the Git source code. Gitweb is a perl script enabling you to view the repos on a server.&lt;/p&gt;
&lt;p&gt;Both Gitosis and Gitolite integrate with Gitweb. For example, you can tell Gitweb to only display the public repos and the ones that anonymous users can't access are not displayed.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/MmV-DB8kD9Q" height="1" width="1"/&gt;</description>
 <comments>http://engineeredweb.com/blog/10/2/building-your-own-git-server#comments</comments>
 <category domain="http://engineeredweb.com/blog/tags/git">Git</category>
 <pubDate>Tue, 23 Feb 2010 12:13:54 +0000</pubDate>
 <dc:creator>Matt</dc:creator>
 <guid isPermaLink="false">50 at http://engineeredweb.com</guid>
<feedburner:origLink>http://engineeredweb.com/blog/10/2/building-your-own-git-server</feedburner:origLink></item>
<item>
 <title>Switching to Git</title>
 <link>http://feedproxy.google.com/~r/EngineeredWeb/~3/BbYxtfM0p5c/switching-git</link>
 <description>&lt;p&gt;I recently switched to &lt;a href="http://git-scm.com/" title="Git - Fast Version Control System"&gt;Git&lt;/a&gt; to manage the source code for projects I work on. I still use &lt;a href="http://en.wikipedia.org/wiki/Concurrent_Versions_System" title="Wikipedia: Concurrent Versions System"&gt;CVS&lt;/a&gt; to manage &lt;a href="http://drupal.org" title="Drupal - Content Management Platform"&gt;Drupal&lt;/a&gt; modules on drupal.org and &lt;a href="http://en.wikipedia.org/wiki/Subversion_(software)" title="Wikipedia: Subversion"&gt;SVN&lt;/a&gt; for many client projects. But, when I have a choice I choose Git.&lt;/p&gt;
&lt;p&gt;Git, for those of you who don't know, is one of the most popular &lt;a href="http://en.wikipedia.org/wiki/Distributed_revision_control" title="Wikipedia: Distributed Version Control System"&gt;Distributed Version Control Systems&lt;/a&gt; (DVCS). A DVCS can be used in a traditional central repo style setup or a distributed approach. For more details checkout the &lt;a href="http://en.wikipedia.org/wiki/Distributed_revision_control" title="Wikipedia: Distributed revision control"&gt;Wikipedia article on Distributed Version Control&lt;/a&gt;.&lt;br /&gt;
&lt;!--break--&gt;&lt;/p&gt;
&lt;h2&gt;Why I Switched To Git&lt;/h2&gt;
&lt;p&gt;When I initially started using a DVCS and moved away from SVN I turned to &lt;a href="http://bazaar.canonical.com/" title="Bazaar Distributed Version Control System"&gt;Bazaar&lt;/a&gt;. It was easy to switch to bzr because the syntax is similar to SVN and the basic usage is fairly straight forward and simple. I knew git was powerful but the lack of good Windows support left me wanting something that could be used more universally. That is no longer a problem thanks to &lt;a href="http://code.google.com/p/msysgit/" title="msysgit - Git on Windows"&gt;msysgit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What caught my attention about Git wasn't so much the impressive technology. It was the community surrounding Git. If I wanted a tutorial, application to interface with it, hosting service, or most other things I wanted in a version control system, it was there for Git.&lt;/p&gt;
&lt;h2&gt;Tutorials To Help With Switching&lt;/h2&gt;
&lt;p&gt;Git does things very differently than other version control systems. Sometimes this is due to the features and other times it's just because Git wants to do its own thing. In some cases it is quite annoying. Especially when the command to do something in CVS or SVN simply has a different name in Git. Needless to say, the Git learning curve can be more than a little steep.&lt;/p&gt;
&lt;p&gt;Thanks to the wonderful Git community there is more than one tutorial on the topic:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.gitready.com/" title="git ready - learn git one commit at a time"&gt;Git Ready&lt;/a&gt; - Learn git one commit at a time.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://learn.github.com"&gt;Learn Git&lt;/a&gt; - How to with git from the people at github.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/everyday.html" title="Git in 20 Commands"&gt;Everyday Git&lt;/a&gt; - Git in 20 Commands&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you're looking to make a version control change or want to jump on the bandwagon of coming changes git Git a try.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/BbYxtfM0p5c" height="1" width="1"/&gt;</description>
 <comments>http://engineeredweb.com/blog/10/2/switching-git#comments</comments>
 <category domain="http://engineeredweb.com/blog/tags/git">Git</category>
 <pubDate>Mon, 22 Feb 2010 16:57:52 +0000</pubDate>
 <dc:creator>Matt</dc:creator>
 <guid isPermaLink="false">45 at http://engineeredweb.com</guid>
<feedburner:origLink>http://engineeredweb.com/blog/10/2/switching-git</feedburner:origLink></item>
<item>
 <title>Downloading Dependencies With Drush Make</title>
 <link>http://feedproxy.google.com/~r/EngineeredWeb/~3/VC7mcdDRZkE/downloading-dependencies-drush-make</link>
 <description>&lt;p&gt;Quite a few &lt;a href="http://drupal.org" title="Drupal - Content Management Platform"&gt;Drupal&lt;/a&gt; modules rely on outside libraries to work. Some are JavaScript based requiring outside plugins and others are based on outside libraries. When users install these modules they, also, have to download and install the outside library. This is a pain that &lt;a href="http://drupal.org/project/drush"&gt;drush&lt;/a&gt; &lt;a href="http://drupal.org/project/drush_make" title="Drush Make Drupal Module"&gt;make&lt;/a&gt; and the &lt;a href="http://drupal.org/project/libraries" title="Drupal Libraries API Module"&gt;Libraries API&lt;/a&gt; in modules can help with.&lt;/p&gt;
&lt;p&gt;A typical setup will have a &lt;a href="http://drupal.org/project/drush_make" title="Drush Make Drupal Module"&gt;drush make&lt;/a&gt; file with a project and associated libraries defined within in them. The author who puts together the profile or top level make file will need to know the library and where it needs to go.&lt;/p&gt;
&lt;p&gt;A little known feature about drush make files is that all projects can have make files and drush recursively builds each one out. So, if a module has a make file and the module is included in another make file the modules make file will be executed as well.&lt;br /&gt;
&lt;!--break--&gt;&lt;br /&gt;
A simple use could be a module that uses an outside JavaScript library. That module could define a ModuleName.make file telling drush to download the library. A good solution would be to tell the script to go to the libraries directory alongside the modules and themes directories. Then, the module could use the Libraries API to grab the libraries location.&lt;/p&gt;
&lt;h2&gt;An Example&lt;/h2&gt;
&lt;p&gt;In this example we have the Super Awesome module using the awesome JavaScript file. So, in superawesome.make, which sits alongside superawesome.module, we have something like:&lt;/p&gt;
&lt;p&gt;&lt;div class="geshifilter"&gt;&lt;pre class="text geshifilter-text" style="font-family:monospace;"&gt;core = 6.x
&amp;nbsp;
; Libraries
libraries[awesome][download][type] = &amp;quot;get&amp;quot;
libraries[awesome][download][url] = &amp;quot;http://example.com/awesome.js.zip&amp;quot;
libraries[awesome][directory_name] = &amp;quot;awesome&amp;quot;
libraries[awesome][destination] = &amp;quot;libraries&amp;quot;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;This will tell drush to download the awesome library and stick it in a directory called awesome within the libraries folder. The libraries folder could be in profiles/profileName, sites/all, or sites/someSiteName.com. Since the file has the zip extension drush will know how to unzip it as well.&lt;/p&gt;
&lt;p&gt;Since the files could be placed in one of several places we can use the Libraries API. To get the path in our module we can use the following:&lt;/p&gt;
&lt;p&gt;&lt;div class="geshifilter"&gt;&lt;pre class="php geshifilter-php" style="font-family:monospace;"&gt;  &lt;span style="color: #000088;"&gt;$path&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; libraries_get_path&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'awesome'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2&gt;Some Things You Should Know&lt;/h2&gt;
&lt;p&gt;There are two issues to be aware of with this approach.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If a project (modules or theme) is included in a make file but already exists elsewhere (like a profile or site make file) you'll get an error. Drush make doesn't, currently, handle a project being defined more than once.&lt;/li&gt;
&lt;li&gt;If there are only libraries and no projects defined in a make file a warning will be thrown. Everything works as expected. There is just a one line warning for each make file without a project.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;But, Is This A Good Idea?&lt;/h2&gt;
&lt;p&gt;Doing something like this would move control from profile builders to module developers. So, we need to ask if this control shift is a good idea? At this point I'm not clear on the answer.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/VC7mcdDRZkE" height="1" width="1"/&gt;</description>
 <comments>http://engineeredweb.com/blog/10/2/downloading-dependencies-drush-make#comments</comments>
 <category domain="http://engineeredweb.com/blog/tags/drupal">Drupal</category>
 <category domain="http://engineeredweb.com/blog/tags/drupal-planet">Drupal Planet</category>
 <pubDate>Fri, 19 Feb 2010 12:55:02 +0000</pubDate>
 <dc:creator>Matt</dc:creator>
 <guid isPermaLink="false">48 at http://engineeredweb.com</guid>
<feedburner:origLink>http://engineeredweb.com/blog/10/2/downloading-dependencies-drush-make</feedburner:origLink></item>
<item>
 <title>Farbtastic is Dead, Long Live Farbtastic</title>
 <link>http://feedproxy.google.com/~r/EngineeredWeb/~3/ekaOQZBMrxk/farbtastic-dead-long-live-farbtastic</link>
 <description>&lt;p&gt;Farbtastic is one of those widely used &lt;a href="http://jquery.com"&gt;jQuery&lt;/a&gt; plugins you may not have realized you were using. One place many people have seen it in action is on &lt;a href="http://twitter.com"&gt;Twitter&lt;/a&gt;. If you've changed the colors on your twitter page and used the color wheel to select the color you've used it. Farbtastic is the color wheel in Twitter, &lt;a href="http://identi.ca"&gt;identi.ca&lt;/a&gt;, &lt;a href="http://drupal.org" title="Drupal - Content Management Platform"&gt;Drupal&lt;/a&gt;, &lt;a href="http://wordpress.org" title="Wordpress - Blog Tool and Publishing Platform"&gt;Wordpress&lt;/a&gt;, and many other tools and services. While farbtastic is widely used it does have one major problem. Farbtastic is dead. The latest release of Farbtastic is version 1.2 written to work with jQuery 1.0. &lt;a href="http://blog.jquery.com/2006/07/18/jquery-color-picker/" title="jQuery Color Picker"&gt;Remember how long ago that was?&lt;/a&gt;&lt;br /&gt;
&lt;!--break--&gt;&lt;/p&gt;
&lt;h2&gt;Why Farbtastic is Great&lt;/h2&gt;
&lt;p&gt;Color wheels are a great way to select colors. Different spots on the wheel have different meanings. For example, If you pick a base color and want to find a complimentary color you jump to another part of the color wheel to find it. This is &lt;a href="http://en.wikipedia.org/wiki/Color_theory" title="Wikipedia: Color theory"&gt;color theory&lt;/a&gt; and color theory uses color wheels.&lt;/p&gt;
&lt;p&gt;For people who don't know color theory or care about it the color wheel is a neat way to select the color.&lt;/p&gt;
&lt;h2&gt;Why Farbtastic is Dead&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://acko.net"&gt;Steven Wittens&lt;/a&gt;, the original author, wrote farbtastic for Drupal. As many people know, he is no longer actively contributing to the project and this plugin fell by the way side. With the &lt;a href="http://acko.net/dev/farbtastic" title="Farbtastic: jQuery color picker plug-in"&gt;official site for the plugin&lt;/a&gt; being his personal site it was difficult for someone else to take over.&lt;/p&gt;
&lt;p&gt;Some time ago I approached Steven about moving the codebase to Google Code. It was moved &lt;a href="http://code.google.com/p/farbtastic" title="Farbtastic on Google Code"&gt;there&lt;/a&gt;, updates we had been using in Drupal to keep up with newer releases of jQuery were incorporated, and Steven even wrote a 2.x version that utilizes canvas to draw the color wheel. It seemed like a resurrection of the plugin.&lt;/p&gt;
&lt;p&gt;But, Steven is a very busy and talented developer. He became busy and farbtastic fell to the side again. The 1.3 release, that's already used on numerous production sites, never happened and the 2.x version was never shared with the world.&lt;/p&gt;
&lt;h2&gt;Long Live Farbtastic&lt;/h2&gt;
&lt;p&gt;Farbtastic is still strongly in use and the version used by Drupal has been tested to work with jQuery 1.2.6+. that includes the new jQuery 1.4. In an effort to share this I've migrated the codebase from the SVN repository on Google Code to Github. Please use it, fork it, and grow it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://github.com/mattfarina/farbtastic"&gt;Farbtastic on Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mattfarina.github.com/farbtastic/"&gt;Farbtastic Demos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/EngineeredWeb/~4/ekaOQZBMrxk" height="1" width="1"/&gt;</description>
 <comments>http://engineeredweb.com/blog/10/2/farbtastic-dead-long-live-farbtastic#comments</comments>
 <category domain="http://engineeredweb.com/blog/tags/jquery">jQuery</category>
 <pubDate>Wed, 17 Feb 2010 16:38:07 +0000</pubDate>
 <dc:creator>Matt</dc:creator>
 <guid isPermaLink="false">47 at http://engineeredweb.com</guid>
<feedburner:origLink>http://engineeredweb.com/blog/10/2/farbtastic-dead-long-live-farbtastic</feedburner:origLink></item>
</channel>
</rss>
