<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>RSS - 光与暗的殿堂</title>
    <description>光与暗的殿堂 - </description>
    <link></link>
    <atom:link href="/page/feed.xml" rel="self" type="application/rss+xml" />
    <pubDate>Thu, 26 May 2016 02:11:59 +0000</pubDate>
    <lastBuildDate>Thu, 26 May 2016 02:11:59 +0000</lastBuildDate>
    <generator>消失的旅人</generator>
    
      <item>
        <title>Git 少用 Pull 多用 Fetch 和 Merge</title>
        <description>&lt;p&gt;翻译地址：&lt;a href=&quot;http://www.oschina.net/translate/git-fetch-and-merge&quot;&gt;OSChina技术翻译&lt;/a&gt;&lt;br /&gt;
原文地址：&lt;a href=&quot;http://longair.net/blog/2009/04/16/git-fetch-and-merge/&quot;&gt;Mark’s Blog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;本文有点长而且有点乱，但就像Mark Twain Blaise Pascal的笑话里说的那样：我没有时间让它更短些。在Git的邮件列表里有很多关于本文的讨论，我会尽量把其中相关的观点列在下面。&lt;/p&gt;

&lt;p&gt;我最常说的关于git使用的一个经验就是：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;不要用git pull，用git fetch和git merge代替它。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;git pull的问题是它把过程的细节都隐藏了起来，以至于你不用去了解git中各种类型分支的区别和使用方法。当然，多数时候这是没问题的，但一旦代码有问题，你很难找到出错的地方。看起来git pull的用法会使你吃惊，简单看一下git的使用文档应该就能说服你。&lt;/p&gt;

&lt;p&gt;将下载（fetch）和合并（merge）放到一个命令里的另外一个弊端是，你的本地工作目录在未经确认的情况下就会被远程分支更新。当然，除非你关闭所有的安全选项，否则git pull在你本地工作目录还不至于造成不可挽回的损失，但很多时候我们宁愿做的慢一些，也不愿意返工重来。&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;###分支(Branches)&lt;/p&gt;

&lt;p&gt;在说git pull之前，我们需要先澄清分支的概念（branches）。很多人像写代码似的用一行话来描述分支是什么，例如:&lt;/p&gt;

&lt;p&gt;准确而言，分支的概念不是一条线，而类似于开发中的有向无环图
分支类似于一个重量级的大对象集合。
我认为你应该这样来理解分支的概念：它是用来标记特定的代码提交，每一个分支通过SHA1sum值来标识，所以对分支进行的操作是轻量级的–你改变的仅仅是SHA1sum值。&lt;/p&gt;

&lt;p&gt;这个定义或许会有意想不到的影响。比如，假设你有两个分支，“stable” 和 “new-idea”, 它们的顶端在版本 E 和 F:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; A-----C----E (&quot;stable&quot;)
   \
    B-----D-----F (&quot;new-idea&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;所以提交(commits) A, C和 E 属于“stable”，而 A, B, D 和 F 属于 “new-idea”。如果之后你用下面的命令 将“new-idea” merge 到 “stable” ：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git checkout stable   # Change to work on the branch &quot;stable&quot;
git merge new-idea    # Merge in &quot;new-idea&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;那么你会得到这个：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  A-----C----E----G (&quot;stable&quot;)
   \             /
    B-----D-----F (&quot;new-idea&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;要是你继续在“new idea” 和“stable”分支提交, 会得到：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  A-----C----E----G---H (&quot;stable&quot;)
   \             /
    B-----D-----F----I (&quot;new-idea&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;因此现在A, B, C, D, E, F, G 和 H 属于 “stable”，而A, B, D, F 和 I 属于 “new-idea”。&lt;/p&gt;

&lt;p&gt;当然了，分支确实有些特殊的属性——其中最重要的是，如果你在一个分支进行作业并创建了一个新的提交(commits)，该分支的顶端将前进到那个提交(commits)。这正是你所希望的。当用git merge 进行合并(merge)的时候，你只是指定了要合并到当前分支的那个并入分支，以及当前分支的当前进展。&lt;/p&gt;

&lt;p&gt;另一个表明使用分支会有很大帮助的观点的常见情形是：假设你直接工作在一个项目的主要分支（称为“主版本”），当你意识到你所做的可能是一个坏主意时已经晚了，这时你肯定宁愿自己是工作在一个主题分支上。如果提交图看起来像这样：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;   last version from another repository
      |
      v
  M---N-----O----P---Q (&quot;master&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;那么你把你的工作用下面的一组命令分开做（如图显示的是执行它们之后所更改的状态）：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git branch dubious-experiment

M---N-----O----P---Q (&quot;master&quot; and &quot;dubious-experiment&quot;)

git checkout master

# Be careful with this next command: make sure &quot;git status&quot; is
# clean, you&#39;re definitely on &quot;master&quot; and the
# &quot;dubious-experiment&quot; branch has the commits you were working
# on first...

git reset --hard &amp;lt;SHA1sum of commit N&amp;gt;

       (&quot;master&quot;)
M---N-------------O----P---Q (&quot;dubious-experiment&quot;)

git pull # Or something that updates &quot;master&quot; from
           # somewhere else...

M--N----R---S (&quot;master&quot;)
    \
     O---P---Q (&quot;dubious-experiment&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;这是个看起来我最终做了很多的事情。&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;###分支类型&lt;/p&gt;

&lt;p&gt;分支这个术语不太容易理解,而且在git的开发过程中发生了很多变化。但简单来说git的分支只有两种：&lt;/p&gt;

&lt;p&gt;a）“本地分支(local branches)” ，当你输入“git branch”时显示的。例如下面这个小例子：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;   $ git branch
     debian
     server
   * master
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;b)“远程跟踪分支(Remote-tracking branches)” ，当你输入“git branch -r”是显示的，如:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;   $ git branch -r
   cognac/master
   fruitfly/server
   origin/albert
   origin/ant
   origin/contrib
   origin/cross-compile
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;从上面的输出可以看到，跟踪分支的名称前有一个“远程的”标记名称（如 :origin, cognac, fruitfly）后面跟一个“／”，然后远程仓库里分支的真正名称。（“远程名称”是一个代码仓库别名，和本地目录或URL是一个含义，你可以通过”git remote”命令自由定义额外的“远程名称”。但“git clone”命令默认使用的是“origin”这个名称。） 如果你对分支在本地是如何存储感兴趣的话，看看下面文件：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;.git/refs/head/[本地分支]
.git/refs/remotes/[正在跟踪的分支]
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;两种类型的分支在某些方面十分相似-它们都只是在本地存储一个表示提交的SHA1校验和。（我强调“本地”，因为许多人看到”origin/master” 就认为这个分支在某种意义上说是不完整的，没有访问远端服务器的权限- 其实不是这种情况。） 
不管如何相似，它们还是有一个特别重大的区别：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;更改远端跟踪分支的安全方法是使用git fetch或者是作为git-push副产品，你不能直接对远端跟踪分支这么操作。相反，你总得切换到本地分支，然后创建可移动到分支顶端的新提交 。&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;因此，你对远端跟踪分支最多能做的是下面事情中的一件：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;使用git fetch 更新远端跟踪分支&lt;/li&gt;
    &lt;li&gt;合并远端跟踪分支到当前分支&lt;/li&gt;
    &lt;li&gt;根据远端跟踪分支创建本地分支&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;p&gt;###基于远程跟踪分支创建本地分支&lt;/p&gt;

&lt;p&gt;如果你想基于远程跟踪分支创建本地分支（在本地分支上工作）,你可以使用如下命令：git branch –track或git checkout –track -b，两个命令都可以让你切换到新创建的本地分支。例如你用git branch -r命令看到一个远程跟踪分支的名称为“origin/refactored”是你所需要的，你可以使用下面的命令：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git checkout --track -b refactored origin/refactored
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;在上面的命令里，“refactored”是这个新分支的名称，“origin/refactored”则是现存远程跟踪分支的名称。（在git最新的版本里，例子中‘-track’选项已经不需要了，如果最后一个参数是远程跟踪分支，这个参数会被默认加上。）
“–track”选项会设置一些变量，来保持本地分支和远程跟踪分支的相关性。他们对下面的情况很有用：&lt;/p&gt;

&lt;p&gt;git pull命令下载新的远程跟踪分支之后，可以知道合并到哪个本地分支里
使用git checkout检查本地分支时，可以输出一些有用的信息：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Your branch and the tracked remote branch ‘origin/master’ have
diverged, and respectively have 3 and 384 different commit(s) each.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;或者：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Your branch is behind the tracked remote branch
    ‘origin/master’ by 3 commits, and can be fast-forwarded.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;允许使用的配置变量是：&lt;code class=&quot;highlighter-rouge&quot;&gt;branch.&amp;lt;local-branch-name&amp;gt;.merge&lt;/code&gt;和&lt;code class=&quot;highlighter-rouge&quot;&gt;branch.&amp;lt;local-branch-name&amp;gt;.remote&lt;/code&gt;，但通常情况下你不用考虑他们的设置。
当从远程代码仓库创建一个本地分支之后，你会注意到，“git branch -r”能列出很多远程跟踪分支，但你的电脑上只有一个本地分支，你需要给上面的命令设置一个参数，来指定本地分支和远程分支的对应。&lt;/p&gt;

&lt;p&gt;有一些术语上的说法容易混淆需要注意一下：“track”在当作参数”-track”使用时，意思指通过本地分支对应一个远程跟踪分支。在远程跟踪分支中则指远程代码仓库中的跟踪分支。有点绕口。。。
下面我们来看一个例子，如何从远程分支中更新本地代码，以及如何把本地分支推送到一个新的远程仓库中。&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;###从远端仓库进行更新&lt;/p&gt;

&lt;p&gt;如果我想从远端的源仓库更新到本地的代码仓库，可以输入&lt;code class=&quot;highlighter-rouge&quot;&gt;git fetch origin&lt;/code&gt;的命令，该命令的输入类似如下格式：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;remote: Counting objects: 382, done.
remote: Compressing objects: 100% (203/203), done.
remote: Total 278 (delta 177), reused 103 (delta 59)
Receiving objects: 100% (278/278), 4.89 MiB | 539 KiB/s, done.
Resolving deltas: 100% (177/177), completed with 40 local objects.
From ssh://longair@pacific.mpi-cbg.de/srv/git/fiji
    3036acc..9eb5e40  debian-release-20081030 -&amp;gt; origin/debian-release-20081030
    * [new branch]      debian-release-20081112 -&amp;gt; origin/debian-release-20081112
    * [new branch]      debian-release-20081112.1 -&amp;gt; origin/debian-release-20081112.1
    3d619e7..6260626  master     -&amp;gt; origin/master
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;最重要的是这两行：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    3036acc..9eb5e40  debian-release-20081030 -&amp;gt; origin/debian-release-20081030
    * [new branch]      debian-release-20081112 -&amp;gt; origin/debian-release-20081112
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;第一行表明远端的origin/debian-release-20081030分支的提交(commit)ID已经从3036acc更新为9eb5e40。箭头前的部分是远端分支的名称。第二行是我们采取的动作，创建远程跟踪分支（如果远程仓库有新的tags，git fetch也会一并下载到本地）。
前面那些行显示出“git fetch”命令会将哪些文件下载到本地，这些文件一旦下载到本地之后，就可以在本地进行任意操作了。&lt;/p&gt;

&lt;p&gt;“git fetch”命令执行完毕之后，还不会立即将下载的文件合并到你当前工作目录里，这就给你了一个选择下一步操作的机会，要是想将从远程分支下载的文件更新到你的工作目录里，你需要执行一个“合并（merge）”操作。例如，我当前的本地分支为”master“（执行git checkout master后），这时我想执行合并操作：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git merge origin/master
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;( 几句题外话：合并的时候有可能你还没有对远程分支提交过任何的更改，或者可能是一个复杂的合并。)
如果你只是想看看本地分支和远程分支的差异，你可以使用下面的命令：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git diff master origin/master
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;单独进行下载和合并是一个好的做法，你可以先看看下载的是什么，然后再决定是否和本地代码合并。而且分开来做，可以清晰的区别开本地分支和远程分支，方便选择使用。&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;###把你的变更推送到一个远程仓库&lt;/p&gt;

&lt;p&gt;如何通过其他的方式呢? 假设你对 “experimental”分支做了变更并且希望把他push到”origin”远程仓库中去. 你可以这样做:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git push origin experimental
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;你可能将会收到:远程仓库无法fast-forward该分支的错误信息, 这将意味着可能有别人push了不同的变更到了这个分支上.所以,你需要fetch和merge别人的变更并再次尝试push操作.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;扩展阅读： 如果这个分支在远程仓库里对应不同的名称（如:experiment-by-bob）,你应该这么做：&lt;/p&gt;

  &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git push origin experimental:experiment-by-bob
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;

  &lt;p&gt;在旧版本的git里，如果“experiment-by-bob”不存在，命令应该这么写：&lt;/p&gt;

  &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git push origin experimental:refs/heads/experiment-by-bob
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;

  &lt;p&gt;这样会首先创建远程分支。但git 1.6.1.2应该就不用这么做了。参加下面Sitaram’s的评论。&lt;br /&gt;
如果本地分支和远程分支名称相同，不需要特殊说明系统将会自动创建这个分支,就像常规的git push操作一样。&lt;/p&gt;

  &lt;p&gt;在实际应用中，保持名称相同可以减少混淆，因此“本地名称和远程名称”作为“refspec”参数，我们不会进行更多的讨论。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;del&gt;git push的操作不会牵扯远程跟踪分支（origin/experimental），只有在你下次进行git fetch时才会被更新。&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;上面这个说法不对，根据Deskin Miller的评论纠正：当推送到对应的远程分支后，你的远程跟踪分支就会被更新。&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;###为什么不用 git 的 pull？&lt;/p&gt;

&lt;p&gt;虽然 git pull 大部分时候是好的，特别是如果你用CVS类型的方式使用Git时，它可能正适合你。然而，如果你想用一个更地道的方式（建立很多主题分支，当你需要时随时改写本地历史，等等）使用Git，那么习惯把 git fetch 和 git merge 分开做会有很大帮助。&lt;/p&gt;

</description>
        <pubDate>Sat, 28 Feb 2015 00:00:00 +0000</pubDate>
        <link>/blog/2015/02/28/fetch_and_pull.html</link>
        <guid isPermaLink="true">/blog/2015/02/28/fetch_and_pull.html</guid>
        
        <category>git</category>
        
      </item>
    
      <item>
        <title>Node.js学习资料</title>
        <description>&lt;p&gt;引用地址: &lt;a href=&quot;http://stackoverflow.com/questions/2353818/how-do-i-get-started-with-node-js&quot;&gt;How do I get started with Node.js&lt;/a&gt;&lt;/p&gt;

&lt;div class=&quot;post-text&quot; itemprop=&quot;text&quot;&gt;
&lt;p&gt;&lt;strong&gt;Tutorials&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://nodeschool.io/&quot;&gt;NodeSchool.io interactive lessons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/maxogden/art-of-node/#the-art-of-node&quot;&gt;The Art of Node (an introduction to Node)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://node.blog.com/2014/12/29/hello-world-with-node-and-express/&quot;&gt;Hello World Example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.nodebeginner.org/#hello-world&quot;&gt;Hello World&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.nodebeginner.org/#building-the-application-stack&quot;&gt;Hello World Web Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://nodeguide.com/&quot;&gt;Node.js guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://howtonode.org/express-mongodb&quot;&gt;Build a blog with Node.js, express and MongoDB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://project70.com/&quot;&gt;Node.Js Tutorials At Project 70&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://net.tutsplus.com/tutorials/javascript-ajax/node-js-for-beginners/&quot;&gt;Node.js for Beginners&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://javascriptissexy.com/learn-node-js-completely-and-with-confidence/&quot;&gt;Learn Node.js Completely and with Confidence&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.modulus.io/absolute-beginners-guide-to-nodejs&quot;&gt;Absolute Beginners Guide To Node.js&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Developer Sites&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.joyent.com/developers/node&quot;&gt;Joyent&#39;s developer site for node&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Videos&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://nodetuts.com/&quot;&gt;Node tuts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=jo_B4LTHi3I&quot;&gt;Introduction to Node.js with Ryan Dahl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.infoq.com/presentations/nodejs&quot;&gt;Node.js: Asynchronous Purity Leads to Faster Development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.infoq.com/presentations/Parallel-Programming-with-Nodejs&quot;&gt;Parallel Programming with Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://vimeo.com/18077379&quot;&gt;Server-side JavaScript with Node, Connect &amp;amp; Express&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lynda.com/Nodejs-tutorials/Nodejs-First-Look/101554-2.html&quot;&gt;Node.js First Look&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=0_GNHWZHc-o&quot;&gt;Node.js with MongoDB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=F6k8lTrAE2g&quot;&gt;Ryan Dahl&#39;s Google Tech Talk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://node.codeschool.com/levels/1&quot;&gt;Real Time Web with Node.js&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Screencasts&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://learnallthenodes.com&quot;&gt;Learn All The Nodes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://nodetuts.com/&quot;&gt;NodeTuts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://nodecasts.net/&quot;&gt;NodeCasts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.develop.com/webcasts/watch/5318c4d5d588bf08c461f4b1/create-server-side-mvc-apps-with-node-js-and-express&quot;&gt;Create server-side MVC apps with Node.js and Express&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Books&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://nodebeginner.org/&quot;&gt;The Node Beginner Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tj/masteringnode&quot;&gt;Mastering Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://chimera.labs.oreilly.com/books/1234000001808/index.html&quot;&gt;Up and Running with Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.manning.com/cantelon/&quot;&gt;Node.js in Action&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://amzn.com/B008Z5OEUY&quot;&gt;Smashing Node.js: JavaScript Everywhere&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.amazon.de/dp/389864829X&quot;&gt;Node.js &amp;amp; Co. (in German)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://nodejsbook.io/&quot;&gt;Sam&#39;s Teach Yourself Node.js in 24 Hours&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jsbooks.revolunet.com/&quot;&gt;Most detailed list of free JavaScript Books&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://book.mixu.net/node/index.html&quot;&gt;Mixu&#39;s Node Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pragprog.com/book/jwnode/node-js-the-right-way&quot;&gt;Node.js the Right Way: Practical, Server-Side JavaScript That Scale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://leanpub.com/webdevelopmentwithnodejs&quot;&gt;Beginning Web Development with Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.packtpub.com/node-javascript-web-development/book&quot;&gt;Node Web Development&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Courses&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://node.codeschool.com/&quot;&gt;Real Time Web with Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.develop.com/training-course/nodejs-featuring-node-npm-express-mocha-mongodb-with-mongoose&quot;&gt;Essential Node.js from DevelopMentor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Blogs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.nodejs.org/&quot;&gt;The Node.js blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://howtonode.org/&quot;&gt;How To Node&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dailyjs.com/&quot;&gt;DailyJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.nodejitsu.com/&quot;&gt;Nodejitsu blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.wilcoxd.com/whitepapers/node_js/&quot;&gt;Ryan Wilcox&#39;s Whitepaper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.devthought.com/&quot;&gt;devthought&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Podcasts&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://nodeup.com/&quot;&gt;NodeUp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;JavaScript resources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://yuiblog.com/crockford/&quot;&gt;Crockford&#39;s videos&lt;/a&gt; (must see!)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/&quot;&gt;Essential JavaScript Design Patterns For Beginners&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bonsaiden.github.com/JavaScript-Garden/&quot;&gt;JavaScript garden&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://oreilly.com/catalog/9780596806767&quot;&gt;JavaScript Patterns&lt;/a&gt; book&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://oreilly.com/catalog/9780596517748/&quot;&gt;JavaScript: The Good Parts&lt;/a&gt; book&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Node.js Modules&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://npmjs.org/&quot;&gt;Search for registered Node.js modules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joyent/node/wiki/modules&quot;&gt;Wiki List on GitHub/Joyent/Node.js&lt;/a&gt; (start here last!)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.freshblurbs.com/articles/important-node-js-modules.html&quot;&gt;A completely biased and incomplete selection of useful Node.js modules&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Other&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://jsapp.us/&quot;&gt;JSApp.US - like jsfiddle, but for Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ebayopensource.org/index.php/VJET/NodeJS&quot;&gt;Node with VJET JS (for Eclipse IDE)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Production sites with published source: 
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://nodeknockout.com/&quot;&gt;Node Knockout Hackathon&lt;/a&gt; &lt;a href=&quot;https://github.com/nko3/website&quot;&gt;(source)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://coding.smashingmagazine.com/2011/09/16/useful-node-js-tools-tutorials-and-resources/&quot;&gt;Useful Node.js Tools, Tutorials and Resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://runnable.com/&quot;&gt;Runnable.com - like jsfiddle, but for server side as well&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devcenter.heroku.com/categories/nodejs&quot;&gt;Getting Started with Node.js on Heroku&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.openshift.com/run-your-nodejs-projects-on-openshift-in-two-simple-steps/&quot;&gt;Getting Started with Node.js on Open-Shift&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://passportjs.org/guide/&quot;&gt;Authentication using Passport&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
    &lt;/div&gt;
</description>
        <pubDate>Wed, 25 Feb 2015 00:00:00 +0000</pubDate>
        <link>/blog/2015/02/25/Nodejs.html</link>
        <guid isPermaLink="true">/blog/2015/02/25/Nodejs.html</guid>
        
        <category>Node.js</category>
        
      </item>
    
  </channel>
</rss>
