<?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:atom="http://www.w3.org/2005/Atom" version="2.0">

  <channel>
    <title>dandean.com</title>
    <link>http://dandean.com/</link>
    
    <description>Stuff by Dan Dean</description>
    <language>en-us</language>
    <pubDate>Thu, 19 Jan 2012 09:17:01 PST</pubDate>
    <lastBuildDate>Thu, 19 Jan 2012 09:17:01 PST</lastBuildDate>

    
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/dandean-rss" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="dandean-rss" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>Tubbs - Database Agnostic Model Layer for Node.js</title>
      <link>http://dandean.com/tubbs</link>
      <pubDate>Thu, 29 Dec 2011 00:00:00 PST</pubDate>
      <author>me@dandean.com (Dan Dean)</author>
      <guid>http://dandean.com/tubbs</guid>
      <description>&lt;p&gt;More in-depth documentation can be found in &lt;a href="https://github.com/dandean/tubbs/blob/master/README.md"&gt;README on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="tubbshttpsgithubcomdandeantubbs-is-a-feature-rich-and-database-agnostic-model-layer-for-you-nodejs-applications"&gt;&lt;strong&gt;&lt;a href="https://github.com/dandean/tubbs"&gt;Tubbs&lt;/a&gt;&lt;/strong&gt; is a feature-rich and database-agnostic model layer for you Node.js applications.&lt;/h2&gt;

&lt;p&gt;Some of Tubbs&amp;rsquo; excellent features are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Rails ActiveModel style property validators, like &lt;code&gt;formatOf&lt;/code&gt;, &lt;code&gt;inclusionOf&lt;/code&gt;, etc&amp;hellip;&lt;/li&gt;
  &lt;li&gt;Hackable custom async validation&lt;/li&gt;
  &lt;li&gt;Model extensibility&lt;/li&gt;
  &lt;li&gt;ES5 getter/setter properties with configurable default values (none of that &lt;code&gt;model.set(...)&lt;/code&gt; garbage)&lt;/li&gt;
  &lt;li&gt;Non-serialized virtual properties&lt;/li&gt;
  &lt;li&gt;Can be used with any database as long as an adaptor is provided&lt;/li&gt;
  &lt;li&gt;Current built-in support for Riak and in-memory databases&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="example-define-a-user-model-module"&gt;Example: define a User model module:&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;Tubbs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;tubbs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;Validate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Tubbs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Validate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;Regex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;regex&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Tubbs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="c1"&gt;// Persist our data with Riak&lt;/span&gt;
  &lt;span class="nx"&gt;dataStore&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Tubbs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RiakStore&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;bucket&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;users&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  
  &lt;span class="c1"&gt;// Use the `username` property as the primary key for operations like `find`.&lt;/span&gt;
  &lt;span class="c1"&gt;// Defaults to the `id` property.&lt;/span&gt;
  &lt;span class="nx"&gt;primaryKey&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="nx"&gt;fields&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;first&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;last&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="c1"&gt;// Instances will have a `name` property, but it will not be serialized as&lt;/span&gt;
  &lt;span class="c1"&gt;// JSON when saved to the database.&lt;/span&gt;
  &lt;span class="nx"&gt;virtual&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;first&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&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; &amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;last&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="c1"&gt;// Add some validation...&lt;/span&gt;
  &lt;span class="nx"&gt;validation&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;Validate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nx"&gt;Validate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;formatOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;with&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Regex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;

    &lt;span class="nx"&gt;Validate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nx"&gt;Validate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;formatOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;with&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Regex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;passwordHash&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;

    &lt;span class="nx"&gt;Validate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;formatOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;email&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;with&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Regex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;
    &lt;span class="p"&gt;})&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;h3 id="example-the-defined-user-model-can-pull-data-from-our-database"&gt;Example: the defined User model can pull data from our database:&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;dandean&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;whatever@stuff.com&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&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="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Could not save, respond with the error messages&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;errors&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// User found, send the user bac to the client.&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&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="https://github.com/dandean/tubbs"&gt;Tubbs&lt;/a&gt; can do a whole lot more, and can make your database code pretty concise and easy to work with. &lt;strong&gt;Take a look at the &lt;a href="https://github.com/dandean/tubbs"&gt;repository&lt;/a&gt; for more examples and documentation&lt;/strong&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>fspkg - File System Packager</title>
      <link>http://dandean.com/fspkg</link>
      <pubDate>Wed, 28 Dec 2011 00:00:00 PST</pubDate>
      <author>me@dandean.com (Dan Dean)</author>
      <guid>http://dandean.com/fspkg</guid>
      <description>&lt;h1 id="fspkg---file-system-packager"&gt;&lt;code&gt;fspkg&lt;/code&gt; - File System Packager&lt;/h1&gt;

&lt;p class="date"&gt;Dec 28, 2011&lt;/p&gt;

&lt;p&gt;Take a look at the &lt;a href="https://github.com/dandean/fspkg"&gt;fspkg repository on GitHub&lt;/a&gt; for more detailed documentation.&lt;/p&gt;

&lt;h2 id="example---package-a-commonjs-module-from-a-directory-of-mustachejs-templates"&gt;Example - package a CommonJS module from a directory of mustache.js templates:&lt;/h2&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;pkgr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fspkg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pkgr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;./views&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;./views.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This would create the file &amp;ldquo;views.js&amp;rdquo;, and would look something like this:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;auth/login.mustache&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;username&amp;quot; value=&amp;quot;&amp;quot; placeholder=&amp;quot;Your Username&amp;quot;&amp;gt;\n&amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;password&amp;quot; value=&amp;quot;&amp;quot; placeholder=&amp;quot;Your Password&amp;quot;&amp;gt;\n&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Login&amp;lt;/button&amp;gt;\n&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;auth/register.mustache&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;input type=&amp;quot;email&amp;quot; name=&amp;quot;email&amp;quot; value=&amp;quot;&amp;quot; placeholder=&amp;quot;Email Address&amp;quot;&amp;gt;\n&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;username&amp;quot; value=&amp;quot;&amp;quot; placeholder=&amp;quot;Choose Username&amp;quot;&amp;gt;\n&amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;password&amp;quot; value=&amp;quot;&amp;quot; placeholder=&amp;quot;Password&amp;quot;&amp;gt;\n&amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;passwordConfirmation&amp;quot; value=&amp;quot;&amp;quot; placeholder=&amp;quot;Password Confirmation&amp;quot;&amp;gt;\n&amp;lt;p&amp;gt;By registering you agree to Awesome\&amp;#39;s &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;terms &amp;amp;amp; conditions&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;\n&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;Login&amp;lt;/button&amp;gt;\n&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;header.mustache&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;\n  &amp;lt;div&amp;gt;\n    &amp;lt;h1&amp;gt;&amp;lt;span&amp;gt;Awesome&amp;lt;/span&amp;gt; &amp;amp;nbsp;&amp;amp;rarr;&amp;amp;nbsp; &amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/h1&amp;gt;\n    &amp;lt;nav&amp;gt;\n      &amp;lt;a href=&amp;quot;/library/work&amp;quot;&amp;gt;Add Work&amp;lt;/a&amp;gt;\n      &amp;lt;a href=&amp;quot;/library&amp;quot;&amp;gt;Library&amp;lt;/a&amp;gt;\n      &amp;lt;a href=&amp;quot;/profile&amp;quot;&amp;gt;Profile&amp;lt;/a&amp;gt;\n      &amp;lt;a href=&amp;quot;/logout&amp;quot;&amp;gt;Logout&amp;lt;/a&amp;gt;\n    &amp;lt;/nav&amp;gt;\n  &amp;lt;/div&amp;gt;\n\n&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;index.mustache&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;library/collections.mustache&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;header&amp;gt;\n  &amp;lt;h1&amp;gt;Collections&amp;lt;/h1&amp;gt;\n  &amp;lt;button type=&amp;quot;button&amp;quot;&amp;gt;New Collection&amp;lt;/button&amp;gt;\n&amp;lt;/header&amp;gt;\n&amp;lt;form&amp;gt;\n  &amp;lt;input type=&amp;quot;input&amp;quot; name=&amp;quot;new-collection&amp;quot; id=&amp;quot;new-collection&amp;quot; placeholder=&amp;quot;Enter a name for your new collection...&amp;quot;&amp;gt;\n&amp;lt;/form&amp;gt;\n&amp;lt;ul&amp;gt;&amp;lt;/ul&amp;gt;\n&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;library/work.mustache&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;section id=&amp;quot;work-media-well&amp;quot;&amp;gt;&amp;lt;/section&amp;gt;\n\n&amp;lt;div id=&amp;quot;work-data&amp;quot;&amp;gt;\n  &amp;lt;section id=&amp;quot;work-actions&amp;quot;&amp;gt;\n    &amp;lt;button type=&amp;quot;button&amp;quot; id=&amp;quot;save-work&amp;quot;&amp;gt;Save&amp;lt;/button&amp;gt;\n\n    &amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;grouped-left&amp;quot;&amp;gt;Basic Information&amp;lt;/button&amp;gt;\n    &amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;grouped&amp;quot;&amp;gt;Editions&amp;lt;/button&amp;gt;\n    &amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;grouped&amp;quot;&amp;gt;Media&amp;lt;/button&amp;gt;\n    &amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;grouped-right&amp;quot; tabindex=&amp;quot;-1&amp;quot;&amp;gt; &amp;lt;/button&amp;gt;\n\n    &amp;lt;button type=&amp;quot;button&amp;quot; id=&amp;quot;delete-work&amp;quot;&amp;gt;Delete&amp;lt;/button&amp;gt;\n  &amp;lt;/section&amp;gt;\n\n  &amp;lt;section id=&amp;quot;work-info&amp;quot;&amp;gt;\n    &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;title&amp;quot; placeholder=&amp;quot;Title&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span&amp;gt;,&amp;lt;/span&amp;gt;\n    &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;year&amp;quot; placeholder=&amp;quot;Year&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;\n    &amp;lt;br&amp;gt;\n\n    &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;medium&amp;quot; placeholder=&amp;quot;Medium&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;\n\n    &amp;lt;fieldset&amp;gt;\n      &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;width&amp;quot; placeholder=&amp;quot;Width&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;\n      x\n      &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;height&amp;quot; placeholder=&amp;quot;Height&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;\n      x\n      &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;depth&amp;quot; placeholder=&amp;quot;Depth&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;\n    &amp;lt;/fieldset&amp;gt;\n\n    &amp;lt;textarea name=&amp;quot;text&amp;quot; placeholder=&amp;quot;About this piece&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;\n  &amp;lt;/section&amp;gt;\n  \n  &amp;lt;section id=&amp;quot;work-assets&amp;quot;&amp;gt;\n    &amp;lt;h2&amp;gt;Media&amp;lt;/h2&amp;gt;\n    &amp;lt;ul&amp;gt;&amp;lt;/ul&amp;gt;\n  &amp;lt;/section&amp;gt;\n&amp;lt;/div&amp;gt;\n&amp;#39;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Since it&amp;rsquo;s a CommonJS module, you load it up on the client-side and use it as
simply as this:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;views&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;./views.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Mustache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to_html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;views&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;auth/login.mustache&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id="example-command-line-usage"&gt;Example command line usage:&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;fspkg&lt;/code&gt; is also a command-line application, so you can use it from any of your
programs:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="sh"&gt;fspkg -s ./views.js ./views
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;npm install fspkg&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you want to use the command line utility, add the &lt;code&gt;-g&lt;/code&gt; flag:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install -g fspkg&lt;/code&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Installing Node, NPM and Express on Mac&amp;nbsp;OSX</title>
      <link>http://dandean.com/nodejs-npm-express-osx</link>
      <pubDate>Fri, 01 Apr 2011 00:00:00 PDT</pubDate>
      <author>me@dandean.com (Dan Dean)</author>
      <guid>http://dandean.com/nodejs-npm-express-osx</guid>
      <description>&lt;h1 id="installing-node-npm-and-express-on-osx-from-scratch"&gt;Installing Node, NPM and Express on OSX from Scratch&lt;/h1&gt;

&lt;p class="date"&gt;Apr 01, 2011&lt;/p&gt;

&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;

&lt;p&gt;You need to have Git installed. By far, the easiest way to do this is with &lt;a href="http://mxcl.github.com/homebrew/"&gt;Homebrew&lt;/a&gt;. Follow these &lt;a href="https://github.com/mxcl/homebrew/wiki/installation"&gt;Homebrew Installation Instructions&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Now that you&amp;rsquo;ve got Homebrew installed, use it to install Git from within your Terminal:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;brew install git
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id="installing-node"&gt;Installing Node&lt;/h2&gt;

&lt;p&gt;If you don&amp;rsquo;t have Git installed, use Homebrew to install that first.&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s a &lt;a href="https://github.com/joyent/node/wiki/Installation"&gt;basic installation guide&lt;/a&gt; for Node.&lt;/p&gt;

&lt;h3 id="getting-nodes-source-code"&gt;Getting Node&amp;rsquo;s source code&lt;/h3&gt;

&lt;p&gt;If you don&amp;rsquo;t already have a place to store external source code, put it somewhere usefuls, like a &amp;ldquo;src&amp;rdquo; directory in your home folder:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;mkdir ~/src
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Now that we&amp;rsquo;ve got a place to put it, let&amp;rsquo;s download Node:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/src
&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://github.com/joyent/node.git
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;node
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h3 id="building-node"&gt;Building Node&lt;/h3&gt;

&lt;p&gt;You&amp;rsquo;ll want the latest &lt;strong&gt;stable&lt;/strong&gt; version. Stable version are use even numbers, while unstable dev versions use odd. At the time of &lt;em&gt;this&lt;/em&gt; writing, the latest stable release is 0.4.7, so let&amp;rsquo;s checkout that tag before building:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git checkout v0.4.7   &lt;span class="c"&gt;# you&amp;#39;ll get a note about a detached HEAD state.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;JOBS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2         &lt;span class="c"&gt;# optional, sets number of parallel commands.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;mkdir ~/local
&lt;span class="nv"&gt;$ &lt;/span&gt;./configure --prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/local/node
&lt;span class="nv"&gt;$ &lt;/span&gt;make
&lt;span class="nv"&gt;$ &lt;/span&gt;make install
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h3 id="telling-your-system-where-to-find-node"&gt;Telling your system where to find Node&lt;/h3&gt;

&lt;p&gt;We&amp;rsquo;ve got to add the node bin folder to your path so that you can easily use node from the command line. Open up your &lt;code&gt;.bash_profile&lt;/code&gt; and add Node&amp;rsquo;s path to your PATH.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;nano ~/.bash_profile
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;If you already have a line that starts with &lt;code&gt;export PATH=&lt;/code&gt;, just add Node&amp;rsquo;s path to the beginning. For example this:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/bin:&lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;would become:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/local/node/bin:/usr/local/bin:&lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;If you don&amp;rsquo;t already have a PATH export declared, just add this to the file and save:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/local/node/bin:&lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h3 id="testing-your-node-installation"&gt;Testing your Node installation&lt;/h3&gt;

&lt;p&gt;To make sure this all worked as expected, open up a new Terminal window and run:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;node -v
&amp;gt; v0.4.7
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Success!&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id="installing-npm"&gt;Installing NPM&lt;/h2&gt;

&lt;p&gt;Now, I&amp;rsquo;m guessing you&amp;rsquo;d like to install some Node programs, like &lt;a href="http://expressjs.com/"&gt;Express&lt;/a&gt; or something like that. EASY! NPM is incredibly easy to install:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl http://npmjs.org/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This should print out a bunch of stuff, ending in &lt;code&gt;It worked&lt;/code&gt;. There may also be a single &lt;code&gt;npm WARN Not installed in blah blah blah...&lt;/code&gt; line &amp;ndash; don&amp;rsquo;t worry about it.&lt;/p&gt;

&lt;h3 id="testing-your-npm-installation"&gt;Testing your NPM installation&lt;/h3&gt;

&lt;p&gt;Again, just open a new Terminal window at run:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npm -v
&amp;gt; 1.0.1rc4
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Another success!&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id="bash-completion"&gt;Bash Completion&lt;/h3&gt;

&lt;p&gt;Once incredible helpful feature of NPM is that implements Bash completion, which makes using NPM quite a bit easier at times. To enable this you&amp;rsquo;ve got to source NPM&amp;rsquo;s completion file into your .bash_profile. Open .bash_profile up again, and add this to it:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/local/node/lib/node_modules/npm/lib/utils/completion.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id="installing-express"&gt;Installing Express&lt;/h2&gt;

&lt;p&gt;Now that we&amp;rsquo;ve got NPM installed, we can use &lt;em&gt;that&lt;/em&gt; to install all the Node.js goodness we can get our grubby little hands on, including Express!&lt;/p&gt;

&lt;p&gt;NPM 1.0 is more more opinionated than earlier releases &amp;ndash; instead of installing modules globally by default, modules are installed at the project-level. Command-line tools, on the other hand, can be installed globally.&lt;/p&gt;

&lt;h3 id="the-express-command-line-tool"&gt;The &lt;code&gt;express&lt;/code&gt; Command Line Tool&lt;/h3&gt;

&lt;p&gt;Express is both a project module, and a command line tool, so we&amp;rsquo;re going to install it in both places. Let&amp;rsquo;s start by installing it globally:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npm install -g express
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Now that we&amp;rsquo;ve got our &lt;code&gt;express&lt;/code&gt; command-line tool, let&amp;rsquo;s use that to create an Express application:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;mkdir ~/Sites/bitchin-express-app
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/Sites/bitchin-express-app
&lt;span class="nv"&gt;$ &lt;/span&gt;express -s -t jade
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Done!&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id="dependency-management"&gt;Dependency Management&lt;/h3&gt;

&lt;p&gt;Next we need to specify our application&amp;rsquo;s dependencies. NPM gives us a clean and maintainable way to do this with the &amp;ldquo;&lt;strong&gt;package.json&lt;/strong&gt;&amp;rdquo; file. Create this by running &lt;code&gt;npm init&lt;/code&gt; from with the root of your project, and just follow the prompts:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npm init
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;When you&amp;rsquo;re done with that, add your dependency declarations to the file. Express and Jade are both dependencies for me. This is what my final &amp;ldquo;package.json&amp;rdquo; looks like:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;bitchin-express-app&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;My Bitchin&amp;#39; Express App&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;&amp;quot;version&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;0.0.0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;&amp;quot;repository&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;url&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="s2"&gt;&amp;quot;author&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Dan Dean &amp;lt;me@dandean.com&amp;gt; (http://dandean.com)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;&amp;quot;directories&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;lib&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="s2"&gt;&amp;quot;scripts&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;expresso&amp;quot;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="s2"&gt;&amp;quot;engines&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;node&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;gt;= 0.4.7 &amp;lt; 0.5.0&amp;quot;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="s2"&gt;&amp;quot;dependencies&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;express&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;gt;= 2.0.0 &amp;lt; 3.0.0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;jade&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;*&amp;quot;&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;Dependency management is one of NPM&amp;rsquo;s excellent features. We can automatically install &lt;strong&gt;all&lt;/strong&gt; of our application dependencies by simply asking NPM to take care of it. From within your project folder run:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npm install
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;You should notice that your project now has a &amp;ldquo;node_modules&amp;rdquo; folder. Inside that you&amp;rsquo;ll see an &amp;ldquo;express&amp;rdquo; folder, which contains the Express framework module for use just with your new application.&lt;/p&gt;

&lt;h3 id="running-your-application"&gt;Running Your Application&lt;/h3&gt;

&lt;p&gt;We&amp;rsquo;ve got to create a couple more little files before we&amp;rsquo;re ready to go: our &amp;ldquo;layout&amp;rdquo; and &amp;ldquo;index&amp;rdquo; files.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;touch views/layout.jade views/index.jade
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;You&amp;rsquo;ll notice that back when we created our application we passed the &lt;code&gt;-t jade&lt;/code&gt; argument to &lt;code&gt;express&lt;/code&gt;. This configured our app to use the &lt;a href="http://jade-lang.com/"&gt;Jade&lt;/a&gt; templating engine.&lt;/p&gt;

&lt;p&gt;Open up &amp;ldquo;views/layout.jade&amp;rdquo; and paste this into it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;!!!
html
  head
    title Hell's Yeah.
    link(rel="stylesheet", href="/stylesheets/style.css")
  body!= body
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And paste this into &amp;ldquo;views/index.jade&amp;rdquo;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;h1 This is a Bitchin' Web Applications!
p Am I right?    
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now all we have to do is start our fucking rad, Bitchin&amp;rsquo; application! From the root of your project run this, the open the &lt;code&gt;http://localhost:3000&lt;/code&gt; in a browser:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;node app.js
&amp;gt; Express server listening on port 3000
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id="in-conclusion"&gt;In Conclusion&lt;/h2&gt;

&lt;p&gt;Hopefully this introduction is enough to get you up and running. There&amp;rsquo;s a whole lot going on in the community. Keep up to date by following the &lt;a href="http://blog.nodejs.org"&gt;Node blog&lt;/a&gt;. If you want to explore the many modules available for use in your applications, poke around the &lt;a href="http://search.npmjs.org"&gt;NPM Module Registry&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Installing Node.js on a Dreamhost Shared Server</title>
      <link>http://dandean.com/nodejs-on-dreamhost-shared-server</link>
      <pubDate>Fri, 09 Apr 2010 00:00:00 PDT</pubDate>
      <author>me@dandean.com (Dan Dean)</author>
      <guid>http://dandean.com/nodejs-on-dreamhost-shared-server</guid>
      <description>&lt;h1 id="installing-nodejs-on-a-dreamhost-shared-server"&gt;Installing Node.js on a Dreamhost Shared Server&lt;/h1&gt;

&lt;p class="date"&gt;Apr 09, 2010&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; It&amp;rsquo;s worth noting that Dreamhost does not allow long-running processes, so this will not work for most production deployment needs.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;First, get the &lt;strong&gt;latest &lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt; source&lt;/strong&gt; onto your server. I keep my git downloads at &lt;code&gt;~/downloads/git&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If it doesn’t already exist, create your download directories and &lt;code&gt;cd&lt;/code&gt; into it:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;mkdir ~/downloads/git
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/downloads/git
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Then, pull down the latest &lt;a href="http://github.com/ry/node"&gt;Node.js source code from GitHub&lt;/a&gt;:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git clone git://github.com/ry/node.git
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Since we’re on a Dreamhost shared server, we have to specify a personal directory for the node binaries to install to. This is because Dreamhost won’t allow us (for good reason) to install whatever we want into location which is shared by every other user on your server.&lt;/p&gt;

&lt;p&gt;So, lets create our OWN &lt;code&gt;/usr/local/bin&lt;/code&gt; directory:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;mkdir ~/usr/local/bin
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Now that we’ve got that, let’s get into the node Git repo and configure node to use our new custom bin directory:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;./configure --prefix&lt;span class="o"&gt;=&lt;/span&gt;~/usr/local
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;If everything went well, &lt;code&gt;make&lt;/code&gt; should handle the rest!&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;make
&amp;gt; ... a whole bunch of compilation output ...
&lt;span class="nv"&gt;$ &lt;/span&gt;make install
&amp;gt; ... more output ...
&amp;gt; Done!
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Now, you need to do one more thing to make node visible to your own scripts: add the new node binaries to your PATH! To do this you need to add the following line to two files in your home directory: &lt;strong&gt;&lt;code&gt;.bashrc&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;.bash_profile&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:/home/&lt;span class="o"&gt;[&lt;/span&gt;YOUR USER NAME&lt;span class="o"&gt;]&lt;/span&gt;/usr/local/bin
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;You’re almost done! Just save both of those files, close your connection, reconnect, and check if you can run node! You should get something like this:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;node --version
&amp;gt; v0.1.33-221-gff56d63
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Hot shit! Now go build some killer Node.js apps!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    

  </channel> 
</rss>

