Windows 7下安装部署NodeJs

第一步  安装NodeJs

http://nodejs.org/download/

下载windows版本的msi文件,双击进行安装即可。安装完毕,默认安装路径为C:\Program Files\nodejs\目录下,虽然官方说利用此方法可以自动添加环境变量,

但是如果可能没有进行自动添加node的环境变量的话可以右键”计算机“》”属性“》”高级系统设置“》”环境变量“》”系统变量“的PATH里添加;C:\Program Files\nodejs\

就可以了,这样可以在任何地方都可以使用node命令了。

测试是否安装正确:

1、打开命令提示符或者直接打开Node.js command prompt

注:undefined 是 console.log()这个函数的返回值。

2、在D盘新建个文件,例如D:\min\test.js,代码如下:

复制代码
var  http = require("http"); 
   
http.createServer( function (req, res) { 
  res.writeHead( 200 , {"Content-Type": "text/html"}); 
  res.write("<h1>Node.js</h1>"); 
  res.write("<p>Hello World</p>");
  res.end("<p>beyondweb.cn</p>");
}).listen(3000); 
console.log("HTTP server is listening at port 3000.");
复制代码

命令行中输入: node d:/min/test.js

浏览器中输入:http://localhost:3000/或者http://127.0.0.1:3000/  查看效果

 

第二步 安装GIT

https://code.google.com/p/msysgit/downloads/list   下载并安装,安装完成后把GIT安装bin目录加到系统环境变量中 C:\Program Files (x86)\Git\bin\

命令提示符中输入 git –version查看是否安装成功

 

第四步 安装NPM

在确保node.exe和git都在PATH环境变量中后执行以下命令:

命令提示符中输入以下命令:

git clone –recursive git://github.com/isaacs/npm.git

cd npm

node cli.js install npm -gf

 

好了,一切就绪,开始你的NodeJs之旅吧!!!

 

StackOverFlow精彩问答赏析:有jQuery背景的开发者如何建立起AngularJS的思维模式

【编辑注】本文来自StackOverFlow上How do I “think in AngularJS” if I have a jQuery background?一题中得票最高的回答。该回答得票超过3000次,回答者Josh David Miller是活跃于开源社区的开发者,也是Emergenesis公司的联合创始人。该答案最初由数云架构师韩铮翻译并发布在自己的博客上,在征得Josh同意后由韩铮本人推荐给 InfoQ进行分享,并在经过InfoQ社区编辑崔康审校后发布在此。

1. 不要先设计页面,然后再使用DOM操作来改变它的展现

在jQuery中,你通常会设计一个页面,然后再给它动态效果。这是因为jQuery的设计就是为了扩充DOM并在这个简单的前提下疯狂的生长的。

但是在AngularJS里,必须从头开始就在头脑中思考架构。必须从你想要完成的功能开始,然后设计应用程序,最后来设计视图,而非“我有这么一个DOM片段,我想让他可以实现XXX效果”。

2. 不要用AngularJS来加强jQuery

类似的,不要以这样的思维开始:用jQuery来做X,Y和Z,然后只需要把AngularJS的models和controllers加在这上面。这在刚开始的时候显得非常诱人,这也是为什么我总是建议AngularJS的新手完全不使用jQuery,至少不要在习惯使用“Angular Way”开发之前这么做。

我在邮件列表里看到很多开发者使用150或200行代码的jQuery插件创造出这些复杂的解决方案,然后使用一堆callback函数以及$apply把它粘合到AngularJS里,看起来复杂难懂;但是他们最终还是把它搞定了!问题是在大多数情况下这些jQuery插件可以使用很少的AngularJS代码重写,而且所有的一切都很简单直接容易理解。

这里的底线是:当你选择解决方案时,首先“think in AngularJS”;如果想不出一个解决方案,去社区求助;如果还是没有简单的解决方案,再考虑使用jQuery。但是不要让jQuery成为你的拐杖,导致你永远无法真正掌握AngularJS。

3. 总是以架构的角度思考

首先要知道Single-page应用是应用,不是网页。所以我们除了像一个客户端开发者般思考外,还需要像一个服务器端开发者一样思考。我们必须考虑如何把我们的应用分割成独立的,可扩展且可测试的组件。

那么如何做到呢?如何“think in AngularJS”?这里有一些基本原则,对比jQuery。

视图是“Official Record”

在jQuery里,我们编程改变视图。我们会将一个下拉菜单定义为一个ul :

<ul class="main-menu">
    <li class="active"> <a href="#/home">Home</a> </li>
    <li> <a href="#/menu1">Menu 1</a> 
        <ul>
            <li><a href="#/sm1">Submenu 1</a></li> 
            <li><a href="#/sm2">Submenu 2</a></li>
            <li><a href="#/sm3">Submenu 3</a></li>
        </ul>
    </li>
    <li> <a href="#/home">Menu 2</a> </li>
</ul>

在jQuery里,我们会在应用逻辑里这样启用这个下拉菜单:

$('.main-menu').dropdownMenu();

当我们只关注视图,这里不会立即明显的体现出任何(业务)功能。对于小型应用,这没什么不妥。但是在规模较大的应用中,事情就会变得难以理解且难以维护。

而在AngularJS里,视图是基于视图的功能。ul声明就会像这样:

<ul class="main-menu" dropdown-menu> ... </ul>

这两种方式做了同样的东西,但是在AngularJS的版本里任何人看到这个模版都可以知道将会发生什么事。不论何时一个新成员加入开发团队,他看到这个就会知道有一个叫做dropdownMenu的directive作用在这个标签上;他不需要靠直觉去猜测代码的功能或者去看任何代码。视图本身告诉我们会发生什么事。清晰多了。

首次接触AngularJS的开发者通常会问这样一个问题:如何找到所有的某类元素然后给它们加上一个directive。但当我们告诉他:别这么做时,他总会显得非常的惊愕。而不这么做的原因是这是一种半jQuery半AngularJS的方式,这么做不好。这里的问题在于开发者尝试在 AngularJS的环境里“do jQuery”。这么做总会有一些问题。视图是official record(译者注:作者可能想表达视图是一等公民)。在一个directive外,绝不要改变DOM。所有的directive都应用在试图上,意图非常清晰。

记住:不要设计,然后写标签。你需要架构,然后设计。

数据绑定

这是到现在为止最酷的AngularJS特性。这个特性使得前面提到的很多DOM操作都显得不再需要。AngularJS会自动更新视图,所以你自己不用这么做!在jQuery里,我们响应事件然后更新内容,就像这样:

$.ajax({ 
    url: '/myEndpoint.json', 
    success: function ( data, status ) { 
        $('ul#log').append('<li>Data Received!</li>'); 
    } 
});

对应的视图:

<ul class="messages" id="log"> </ul>

除了要考虑多个方面,我们也会遇到前面视图中的问题。但是更重要的是,需要手动引用并更新一个DOM节点。如果我们想要删除一个log条目,也需要针对DOM编码。那么如何脱离DOM来测试这个逻辑?如果想要改变展现形式怎么办?

这有一点凌乱琐碎。但是在AngularJS里,可以这样来实现:

$http('/myEndpoint.json').then(function (response) {
    $scope.log.push({
        msg: 'Data Received!'
    });
});

视图看起来是这个样子的:

<ul class="messages"> <li ng-repeat="entry in log"></li> </ul>

但是其实还可以这样来做:

<div class="messages"> <div class="alert" ng-repeat="entry in log">  </div> </div>

现在如果我们想使用Bootstrap的alert boxes,而不是一个无序列表,根本不需要改变任何的controller代码!更重要的是,不论log在何处或如何被更新,视图便会随之更新。自动的。巧妙!

尽管我没有在这里展示,数据绑定其实是双向的。所以这些log信息在视图里也可以是可编辑的。只需要这么做:

<input ng-model="entry.msg" />

。简单快乐。

清晰的模型(Model)层

在jQuery里,DOM在一定程度上扮演了模型的角色。但在AngularJS中,我们有一个独立的模型层可以灵活的管理。完全与视图独立。这有助于上述的数据绑定,维护了关注点的分离(独立的考虑视图和模型),并且引入了更好的可测性。后面还会提到这点。

关注点分离

上面所有的内容都与这个愿景相关:保持你的关注点分离。视图负责展现将要发生的事情;模型表现数据;有一个service层来实现可复用的任务;在 directive里面进行DOM操作和扩展;使用controller来把上面的东西粘合起来。这在其他的答案里也有叙述,我在这里只增加关于可测试性的内容,在后面的一个段落里详述。

依赖注入

依赖注入帮我们实现了关注点分离。如果你来自一个服务器语言(java或php),可能对这个概念已经非常熟悉,但是如果你是一个来自jQuery的客户端开发者,这个概念可能看起来有点傻而多余。但其实不是的。。。

大体来讲,DI意味着可以非常自由的声明组件,然后在另一个组件里,只需要请求一个该组件的实例,就可以得到它。不需要知道(关心)加载顺序,或者文件位置,或类似的事情。这种强大可能不会立刻显现,但是我只提供一个(常见。。)的例子:测试。

就说在你的应用里,我们需要一个服务通过REST API来实现服务器端存储,并且根据不同的应用状态,也有可能使用(客户端)本地存储。当我们运行controller的测试时,不希望必须和服务器交互 —— 毕竟是在测试controller逻辑。我们可以只添加一个与本来使用的service同名的mock service,injector会确保controller自动得到假的那个service —— controller不会也不需要知道有什么不同。

说起测试……

4. 总是 —— 测试驱动开发

这其实是关于架构的第3节。但是它太重要了,所以我把它单独拿出来作为一个顶级段落。

在所有那些你见过,用过或写过的jQuery插件中,有多少是有测试集的?不多,因为jQuery经不起测试的考验。但是AngularJS可以。

在jQuery中,唯一的测试方式通常是独立地创建附带sample/demo页面的组件,然后我们的测试在这个页面上做DOM操作。所以我们必须独立的开发一个组件,然后集成到应用里。多不方便!在使用jQuery开发时,太多的时间,我们挑选迭代而非测试驱动开发。谁又能责怪我们呢?

但是因为有了关注点分离,我们可以在AngularJS中迭代地做测试驱动开发!例如,想要一个超级简单的directive来展现我们的当前路径。可以在视图里声明:

<a href="/hello" when-active>Hello</a>

OK,现在可以写一个测试:

it('should add "active" when the route changes', inject(function () {
    var elm = $compile('<a href="/hello" when-active>Hello</a>')($scope);
    $location.path('/not-matching');
    expect(elm.hasClass('active')).toBeFalsey();
    $location.path('/hello');
    expect(elm.hasClass('active')).toBeTruthy();
}));

执行这个测试来确认它是失败的。然后我们可以开始写这个directive了:

.directive('whenActive', function ($location) {
    return {
        scope: true,
        link: function (scope, element, attrs) {
            scope.$on('$routeChangeSuccess', function () {
                if ($location.path() == element.attr('href')) {
                    element.addClass('active');
                } else {
                    element.removeClass('active');
                }
            });
        }
    };
});

测试现在通过了,然后我们的menu按照请求的方式执行。开发过程既是迭代的也是测试驱动的。太酷了。

5. 概念上,Directives并不是打包的jQuery

你经常会听到“只在directive里做DOM操作”。这是必需的。请给它应有的尊重!

但让我们再深入一点……

一些directive仅仅装饰了视图中已经存在的东西(想想ngClass)并且因此有时候仅仅直接做完DOM操作然后就完事了。但是如果一个 directive像一个“widget”并且有一个模版,那么它也要做到关注点分离。也就是说,模版本身也应该很大程度上与其link和 controller实现保持独立。

AngularJS拥有一整套工具使这个过程非常简单;有了ngClass我们可以动态地更新class;ngBind使得我们可以做双向数据绑定。ngShow和ngHide可编程地展示和隐藏一个元素;以及更多地 —— 包括那些我们自己写的。换句话说,我们可以做到任何DOM操作能实现的特性。DOM操作越少,directive就越容易测试,也越容易给它们添加样式,在未来也越容易拥抱变化,并且更加的可复用和发布。

我见过很多AngularJS新手,把一堆jQuery扔到directive里。换句话说,他们认为“因为不能在controller里做DOM操作,就把那些代码弄到directive里好了”。虽然这么做确实好一些,但是依然是错误的。

回想一下我们在第3节里写的那个logger。即使要把它放在一个directive里,我们依然希望用“Angular Way”来做。它依然没有任何DOM操作!有很多时候DOM操作是必要的,但其实比你想的要少得多!在应用里的任何地方做DOM操作之前,问问你自己是不是真的需要这么做。有可能有更好的方式。

这里有一个示例,展示出了我见过最多的一种模式。我们想做一个可以toggle的按钮。(注意:这个例子有一点牵强、啰嗦,这是为了表达出使用同样方式处理问题的更复杂的情况。)

.directive('myDirective', function () {
    return {
        template: '<a class="btn">Toggle me!</a>',
        link: function (scope, element, attrs) {
            var on = false;
            $(element).click(function () {
                if (on) {
                    $(element).removeClass('active');
                } else {
                    $(element).addClass('active');
                }
                on = !on;
            });
        }
    };
});

这里有一些错误的地方。首先,jQeury根本没必要出现。我们在这里做的事情都根本用不着jQuery!其次,即使已经将jQuery用在了页面上,也没有理由用在这里。第三,即使假设这个directive依赖jQuery来工作,jqLite(angular.element)在加载后总会使用jQuery!所以我们没必要使用$ —— 用angular.element就够了。第四,和第三条紧密关联,jqLite元素不需要被$封装 —— 传到link里的元素本来就会是一个jQuery元素!第五,我们在前面段落中说过,为什么要把模版的东西混到逻辑里?

这个directive可以(即使是更复杂的情况下!)写得更简单:

.directive('myDirective', function () {
    return {
        scope: true,
        template: '<a class="btn" ng-class="{active: on}" ng-click="toggle()">Toggle me!</a>',
        link: function (scope, element, attrs) {
            scope.on = false;
            scope.toggle = function () {
                scope.on = !$scope.on;
            };
        }
    };
});

再一次地,模版就在模版里,当有样式需求时,你(或你的用户)可以轻松的换掉它,不用去碰逻辑。重用性 —— boom!

当然还有其他的好处,像测试 —— 很简单!不论模版中有什么,directive的内部API从来不会被碰到,所以重构也很容易。可以不碰directive就做到任意改变模版。不论你怎么改,测试总是通过的。

所以如果directive不仅仅是一组类似jQuery的函数,那他们是什么?Directive实际是HTML的扩展。如果HTML没有做你需要它做的事情,你就写一个directive来实现,然后就像使用HTML一样使用它。

换句话说,如果AngularJS库没有做的一些事情,想想开发团队会如何完成它来配合ngClick,ngClass等。

总结

不要用jQuery。连include也不要。它会让你停滞不前。如果遇到一个你认为已经知道如何使用jQuery来解决的问题,在使用$之前,试试想想如何在AngularJS的限制下解决它。如果你不知道,问!20次中的19次,最好的方式不需要jQuery。如果尝试使用jQuery会增加你的工作量。


这是我目前最长的Stack Overflow回答。事实上,这个答案太长了,我都要填一个Captcha了。但是就如我常说的:能说多时候说的少其实就是懒。

希望这个答案对你有用。

AngularJS 最佳实践

AngularJS 最佳实践

2013-07-01 17:51

56,935 次围观

 

AngularJS Logo

AngularJS 是一个 Web 应用框架,它实现了前端的 MVC 架构,能让开发人员很方便地实现业务逻辑。

举个栗子,要做到下面的效果,以前可能需要写一连串的 JavaScript 代码绑定 N 多事件。而使用 AngularJS 框架,一句 JavaScript 都不用写就能实现了,神奇吧?查看演示

angularjs-demo

    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>
    <div data-ng-app>
        单价: <input type="number" min=0 ng-model="price" ng-init="price = 299">
        <br>
        数量: <input type="number" min=0 ng-model="quantity" ng-init="quantity = 1">
        <br>
        总价: {{ quantity * price }}
    </div>

这得益于 AngularJS 中的双向数据绑定特性(Two Way Data-Binding),将 Model 和 View 自动关联了起来,在更复杂的业务场景下,还有代码分离的好处,将 DOM 操作和应用逻辑解耦,非常实用。

不过没有银弹,和其他框架一样,AngularJS 也有它的局限。CRUD 类型的操作是它所擅长的,想想看以前写过的管理后台,几乎大部分都是从数据库中读取数据,然后呈现在页面上,进行各种增删改查。AngularJS 约定了一套规范(约定优于配置),于是你可以很便捷地操作数据。而在其他方面,例如开发复杂的 Web 游戏,AngularJS 则是无用武之地了。

一、AngularJS 中的精美特性

双向绑定

上面的例子已经说明了,我们可以像 PHP Smarty 模板一样在 HTML 中写表达式,用 {{ 和 }} 包起来。在 AngularJS 里,View 和 Model 是在 Controller 里面绑定的,所以无论你在 View 的表单中修改了内容,还是在 Controller 里通过代码修改了 Model 值,两边都会即时发生变化,同步更新。因为 AngularJS 会监控 (watch) Model 对象的变化,随时反映到 View 中。

Filter

Filter 类似 Unix 里面的 | 管道概念,AngularJS 把它搬到了前端。还是举个例子,你们感受一下——

<div>{{ 9999 | number }}</div>
<div>{{ 9999+1 | number:2 }}</div>
<div>{{ 9*9 | currency }}</div>
<div>{{ 'Hello World' | uppercase }}</div>

输出结果:

9,999
10,000.00
$81.00
HELLO WORLD

二、AngularJS 中的一些“坑”

由于过去写 JavaScript 的习惯使然,人们很容易掉进一些 AngularJS 的陷阱里。下面的内容假设你已经了解前端 MVC 概念,并对 AngularJS 有了一定经验,初学者读起来可能比较艰深晦涩。

DOM 操作

避免使用 jQuery 来操作 DOM,包括增加元素节点,移除元素节点,获取元素内容,隐藏或显示元素。你应该使用 directives 来实现这些动作,有必要的话你还要编写自己的 directives。

如果你感到很难改变习惯,那么考虑从你的网页中移除 jQuery 吧。真的,AngularJS 中的 $http 服务非常强大,基本可以替代 jQuery 的 ajax 函数,而且 AngularJS 内嵌了 jQLite —— 它内部实现的一个 jQuery 子集,包含了常用的 jQuery DOM 操作方法,事件绑定等等。但这并不是说用了AngularJS 就不能用 jQuery 了。如果你的网页有载入 jQuery 那么 AngularJS 会优先采用你的 jQuery,否则它会 fall back 到 jQLite。

需要自己编写 directives 的情况通常是当你使用了第三方的 jQuery 插件。因为插件在 AngularJS 之外对表单值进行更改,并不能即时反应到 Model 中。例如我们用得比较多的 jQueryUI datepicker 插件,当你选中一个日期后,插件会将日期字符串填到 input 输入框中。View 改变了,却并没有更新 Model,因为 $('.datepicker').datepicker(); 这段代码不属于 AngularJS 的管理范围。我们需要编写一个directive 来让 DOM 的改变即时更新到 Model 里。

var directives = angular.module('directives', []);
 
directives.directive('datepicker', function() {
   return function(scope, element, attrs) {
       element.datepicker({
           inline: true,
           dateFormat: 'dd.mm.yy',
           onSelect: function(dateText) {
               var modelPath = $(this).attr('ng-model');
               putObject(modelPath, scope, dateText);
               scope.$apply();
           }
       });
   }
});

然后在 HTML 中引入这个 direcitve

<input type="text" datepicker ng-model="myObject.myDateValue" />

说白了 directive 就是在 HTML 里写自定义的标签属性,达到插件的作用。这种声明式的语法扩展了 HTML。

需要说明的是,有一个 AngularUI 项目提供了大量的 directive 给我们使用,包括 Bootstrap 框架中的插件以及基于 jQuery 的其他很热门的 UI 组件。我之前说过 AngularJS 的社区很活跃嘛,生态系统健全。

ngOption 中的 value

这是个大坑。如果你去查看 ngOption 生成的 <select> 中的 <option> 的选项值(每个 <option value="xxx"> 的 value 部分),那绝对是枉费心机。因为这里的值永远都会是 AngularJS 内部元素的索引,并不是你所指定的表单选项值。

还是要转变观念,AngularJS 已经不再用表单进行数据交互了,而是用 Model。使用 $http 来提交 Model,在 php 中则使用 file_get_contents('php://input') 来获取前端提交的数据。

{{ }} 的问题

在页面初始化的时候,用户可能会看到 {{ }},然后闪烁一下才出现真正的内容。
解决办法:

  1. 使用 ng-cloak directive 来隐藏它
  2. 使用 ng-bind 替代 {{ }}

将界面与业务逻辑分离

Controller 不应该直接引用 DOM,而应该控制 view 的行为。例如“如果用户操作了 X,应该发生什么事情”,“我从哪里可以获得 X?”

Service 在大部分情况下也不应该直接引用 DOM,它应该是一个单例(singletons),独立于界面,与 view 的逻辑无关。它的角色只是“做 X 操作”。

DOM 操作应该放在 directives 里面。

尽量复用已有功能

你所写的功能很可能 AngularJS 已经实现了,有一些代码是可以抽象出来复用的,使用更 Angular 的方式。总之就是很多 jQuery 的繁琐代码可以被替代。

1. ng-repeat

ng-repeat 很有用。当 Ajax 从服务器获得数据后,我们经常使用 jQuery (比如上面讲过的例子) 向某些 HTML 容器节点中添加更多的元素,这在 AngularJS 里是不好的做法。有了 ng-repeat 一切就变得非常简单了。在你的 $scope 中定义一个数组 (model) 来保存从服务器拉取的数据,然后使用 ng-repeat 将它与 DOM 绑定即可。下面的例子初始化定义了 friends 这个 model

<div ng-init="friends = [{name:'John', age:25}, {name:'Mary', age:28}]">
    I have {{friends.length}} friends. They are:
    <ul>
        <li ng-repeat="friend in friends">
            [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.
        </li>
    </ul>
</div>

显示结果

I have 2 friends. They are:
  [1] John who is 25 years old.
  [2] Mary who is 28 years old.

2. ng-show

ng-show 也很有用。使用 jQuery 来根据条件控制界面元素的显示隐藏,这很常见。但是 Angular 有更好的方式来做到这一点。ng-show (以及 ng-hide) 可以根据布尔表达式来决定隐藏和显示。在 $scope 中定义一个变量:

<div ng-show="!loggedIn">
    点击 <a href="#/login">这里</a> 登录
</div>

类似的内置 directives 还有 ng-disabled, ng-switch 等等,用于条件控制,语法简洁,都很强大。

3. ng-class

ng-class 用于条件性地给元素添加 class,以前我们也经常用 jQuery 来实现。Angular 中的 ng-class 当然更好用了,例子:

<div ng-class="{ errorClass: isError, warningClass: isWarning, okClass: !isError && !isWarning }">...</div>

在这里 ng-class 接受一个 object 对象,key 为 CSS class 名,值为 $scope 变量控制的条件表达式,其他类似的内置 directives 还有 ng-class-even 和 ng-class-odd,很实用。

$watch 和 $apply

AngularJS 的双向数据绑定是最令人兴奋的特性了,然而它也不是全能的魔法,在某些情况下你需要做一些小小的修正。

当你使用 ng-model, ng-repeat 等等来绑定一个元素的值时, AngularJS 为那个值创建了一个 $watch,只要这个值在 AngularJS 的范围内有任何改变,所有的地方都会同步更新。而你在写自定义的 directive 时,你需要定义你自己的 $watch 来实现这种自动同步。

有时候你在代码中改变了 model 的值,view 却没有更新,这在自定义事件绑定中经常遇到。这时你就需要手动调用 scope.$apply() 来触发界面更新。上面 datepicker 的例子已经说明了这一点。第三方插件可能会有 call back,我们也可以把回调函数写成匿名函数作为参数传入$apply()中。

将 ng-repeat 和其他 directives 结合起来

ng-repeat 很有用,不过它和 DOM 绑定了,很难在同一个元素上使用其他 directives (比如 ng-show, ng-controller 等等)。

如果你想对整个循环使用某个 directive,你可以在 repeat 外再包一层父元素把 directive 写在那儿;如果你想对循环内部的每一个元素使用某个 directive,那么把它放到 ng-repeat 的一个子节点上即可。

Scope

Scope 在 templates 模板中应该是 read-only 的,而在 controller 里应该是 write-only 的。Scope 的目的是引用 model,而不是成为 model。model 就是我们定义的 JavaScript 对象。

$rootScope 是可以用的,不过很可能被滥用

Scopes 在 AngularJS 中形成一定的层级关系,树状结构必然有一个根节点。通常我们用不到它,因为几乎每个 view 都有一个 controller 以及相对应的自己的 scope。

但偶尔有一些数据我们希望全局应用在整个 app 中,这时我们可以将数据注入 $rootScope。因为其他 scope 都会继承 root scope,所以那些注入的数据对于 ng-show 这类 directive 都是可用的,就像是在本地 $scope 中的变量一样。

当然,全局变量是邪恶的,你必须很小心地使用 $rootScope。特别是不要用于代码,而仅仅用于注入数据。如果你非常希望在 $rootScope 写一个函数,那最好把它写到 service 里,这样只有用到的时候它才会被注入,测试起来也方便些。

相反,如果一个函数的功能仅仅是存储和返回一些数据,就不要把它创建成一个 service。

三、AngularJS 项目的目录结构

怎样组织代码文件和目录?这恐怕是初学者一开始就会遇到的问题。AngularJS 应用开发的官方入门项目 angular-seed,其文件结构是这样的:

  • css/
  • img/
  • js/
    • app.js
    • controllers.js
    • directives.js
    • filters.js
    • services.js
  • lib/
  • partials/

这种结构对于一个简单的单页 app 来说是可行的,只是一旦代码中存在多个 Controller 或者 Service,就很难找到想要寻找的对象了。我们可以对文件按照业务逻辑进行拆分,就像下面这样:

  • controllers/
    • LoginController.js
    • RegistrationController.js
    • ProductDetailController.js
    • SearchResultsController.js
  • directives.js
  • filters.js
  • models/
    • CartModel.js
    • ProductModel.js
    • SearchResultsModel.js
    • UserModel.js
  • services/
    • CartService.js
    • UserService.js
    • ProductService.js

这种结构把不同的业务功能拆分为独立的文件,条理清晰,但是仍有一定的局限性。最大的问题是一个业务功能的代码分布在controllers, models, servers 三个不同目录下,要从中挑出正确的文件,建立起代码关联,还是有些麻烦。按照功能进行模块化划分目录结构,应该要更为合理一些:

  • cart/
    • CartModel.js
    • CartService.js
  • common/
    • directives.js
    • filters.js
  • product/
    • search/
      • SearchResultsController.js
      • SearchResultsModel.js
    • ProductDetailController.js
    • ProductModel.js
    • ProductService.js
  • user/
    • LoginController.js
    • RegistrationController.js
    • UserModel.js
    • UserService.js

这样也是适合 RequireJS 等模块加载器的自然直观的代码组织方式。

PHP开发框架流行度排名:Laravel居首

摘要:在PHP开发中,选择合适的框架有助于加快软件开发,节约宝贵的项目时间,让开发者专注于功能的实现上。Sitepoint网站做了一个小的调查,结果显示最流行的PHP框架前三甲为:Laravel、Phalcon、Symfony2。

在项目开发中,一些架构和代码都是重复的,为了避免重复劳动,于是各种各样的框架诞生了。

在PHP开发中,选择合适的框架有助于加快软件开发,节约宝贵的项目时间,让开发者专注于功能的实现上。由于流行的框架经过了大量项目的检验,所以使用框架还有助于创建更加稳定和安全的应用程序。

Sitepoint网站做了一个小的调查,看看PHP开发者们最喜欢使用哪个PHP框架。调查结果显示,最流行的PHP框架前三甲为:Laravel、Phalcon、Symfony2。

1. Laravel——巨匠级PHP开发框架


Laravel是一个简单优雅的PHP Web开发框架,可以将开发者从意大利面条式的代码中解放出来,通过简单、高雅、表达式语法开发出很棒的Web应用,Laravel拥有更富有表现力的语法、高质量的文档、丰富的扩展包,被称为“巨匠级PHP开发框架”。

2. Phalcon——最快的PHP框架


Phalcon是一个开源的、全栈的、用C语言编写的PHP5框架,为开发者提供了网站及应用开发所需的大量高级工具,且Phalcon是松耦合的,开发者可以根据需要使用其他组件。Phalcon中的所有函数都以PHP类的方式呈现,开发者无需学习和使用C语言,且无需担心性能问题。

性能优越、强大且易于使用是Phalcon受欢迎的最主要的因素。

3. Symfony2——开发速度和性能的结合体


Symfony2是一个开源的PHP Web框架,有着开发速度快、性能高等特点。与其他框架相比,Symfony2的优势包括:支持DI(依赖注入)和IoC(控制反转);扩展性强;文档和社区比较成熟。但是Symfony2的学习曲线也比较陡峭,没有经验的初学者往往需要一些练习才能掌握其特性。

fssssssss 2015-01-12 18:23
我都是裸写的。:-O写着玩玩
dlyus 2014-11-19 19:07
好用才是硬道理。
liyunde 2014-11-19 12:26
呵呵,第一名的不没听过,我用zend framework,ci
小虾 2014-11-13 11:24
thinkphp居然都没统计在内
chenbotome 2015-02-25 15:45
( ⊙ o ⊙ )是的,我是醉了,求理由!
zjy1074 2014-11-10 21:38
我在51job上用各种框架的名称做关键字进行了一下相关职位数量的一个查询,初步判断作者所说的三甲排名并不准确,请大家不要轻信,最好自己再找资料了解一下。 具体查询结果如下,框架名称后边跟的数字是提到这个框架的相关职位数量 Laravel 33 Phalcon 16 Symfony2 15 yii 408 thinkphp 726 ci 1024
2票 回复
树根根 2014-10-11 17:18
不错哦,多学习学习
tempestlxc 2014-10-11 16:45
mark
summer_charlie 2014-08-23 10:57
PHPhub – PHP & Laravel的中文社区 一个干净, 纯粹的, 积极向上的 PHP 中文社区, 欢迎 Laravel 爱好者加入. http://phphub.org . 网站是使用 Laravel4 编写的, 代码基于 MIT Licence 开源 http://github.com/summerblue/phphub · GitHub , 欢迎大家贡献代码.
shulongyixue 2014-08-07 16:30
mark
iefreer 2014-07-27 13:23
Yii2 在线中文权威指南 yii2.techbrood.com,框架之争还在于社区有多少人愿意为这个框架的使用、文档的积累做贡献。
荷塘小鱼 2014-07-23 15:13
没有听过啊
金色大街 2014-06-27 10:58
mark
小苗童鞋 2014-05-27 11:24
mark
猫头IT 2014-04-22 14:53
都没人认识 CSDN拿钱办事啊 垃圾框架 ,你知道有yii thinkphp吗
1票,来自Jerry_ChenJingchun 7票 回复
文吉 2014-08-06 09:48
你别那么逗好吗 不认识还好意思说
cccwwwcb 2015-03-11 09:45
回复@文吉:傻帽一样,这个sitepoint是国外的网站,统计排名很有局限性,真正的你要看谁用的多 google一下名称看搜索结果数量就知道了。 生活在国内还想装个外国B,现在很少人吃这一套了。
猫头IT 2014-04-22 14:52
草 骗人自己去查下数据
2票 回复
gkz1024 2014-04-05 11:13
推荐具有TP、CI两个框架所有优点的TPS-MVC框架:EQPHP(http://www.eqphp.com/file/html/manual/index.html)
qufo 2014-04-04 23:21
Laravel 纯粹就是反人类的,各种奇淫异技。你看,渲染模板用 View::make 是吧, View 指的是一个 Enviroment 类。而且类里没有 static 的 make 方法,他是普通的 public function make 。恕我实在搞不来。
2票,来自blizzf99lcfchd 1票 回复
lcfchd 2014-08-26 11:01
说得好,我不喜欢奇淫异技
tanji_an 2014-03-29 23:34
都没听过~
utf-888 2014-03-29 08:36
WEB开发就是要快速高效且性能稳定,个人觉得Phalcon才是最佳选择!
zhujianeng 2014-03-21 19:46
ThinkPHP、smarty这些都不是吗?
2票 回复
betwolife 2014-04-15 17:23
全球范围内,thinkphp排不上名。
2票,来自shamiaopj_2011 回复
文吉 2014-08-06 09:48
这些只有学生用
cccwwwcb 2015-03-11 09:35
回复@betwolife:动不动就来个“全球范围内”,你知道国内网站在“全球范围内”占多少吗? 这个统计压根就没有统计thinkphp,硬是要上纲上线外国的月亮比较圆。
恩点创意 2014-02-12 14:54
前三只听过一个,是不是太孤陋寡闻了
xdavid 2014-01-28 10:16
good
O溺水的鱼0 2014-01-24 15:07
收藏
神灵舞师 2014-01-15 17:43
mark
amberbn 2014-01-14 09:25
mark
icetofyt 2014-01-10 16:12
现在一直用的CI,有时间研究一下laravel
1票,来自shamiao 回复
hunanjun000 2014-01-10 09:33
怎么收藏
hzexe 2014-01-09 22:56
标题党
zhaoll1 2014-01-08 09:06
laravel很好很强大。 用过都说好。 Phalcon也不错
eternal403 2014-01-07 09:19
几个框架都用过,laravel很好很强大。 用过都说好。 Phalcon也不错。 一般的网站,稍微优化,加上缓存这些,laravel性能根本不是问题。
流口水的姿势 2014-01-07 08:27
更好
阳光岛主 2014-01-06 12:22
好东西,收藏了
oliver102 2014-01-06 10:24
顶下
DevMark 2014-01-05 21:19
習慣CI… 有機會再嘗試別的
fang4084 2014-01-05 10:12
前三一个也木有听说过,汗
1票,来自luckyquan 回复
luckyquan 2014-01-06 17:51
我也没听说过,汗
adiosnino 2014-01-06 21:37
回复@luckyquan:我也没听说过,汗
xushengbin888 2014-01-07 10:52
在学习第三个,听领导之前推荐过,说代码写的非常优雅。
zifeng_chen 2014-01-09 22:53
回复@adiosnino:我也没听说过,汗
iefreer 2014-01-05 04:16
1.laravel性能不如yii,可以自己benchmark个helloworld,rps大概一半的样子 2.laravel用了5.3+如闭包语法,对主机/虚拟机PHP最低版本有要求 3.laravel另外使用了IoC、Facade模式,让代码阅读/查找起来比较麻烦 4.laravel只有英文文档,且其文档更多只是代码展示而已,yii的中文文档比较全面 5.laravel的社区不如yii 上述投票,原文中暗示了laravel投票的水分较大,另外也没考虑中国这边大量使用yii的用户,我的观点是PHP语言很活跃,框架竞争是好事,不过已经使用了yii的项目,毫无理由转向laravel或其他框架,因为至少目前在国内yii仍然是最佳选择
1票,来自luckyquan 回复
ruanchao 2014-01-05 20:32
峰哥,可以就这个测试结果发一篇blog,让我等学些学习,呵呵
iefreer 2014-01-05 20:58
回复@ruanchao:Phalcon网站有ab的详细数据,可以去看下
lericzhang 2014-01-06 10:02
性能没啥说的,确实挺慢 5.3之前已经是不维护的版本,作为一个新框架新项目完全没必要支持 使用Facade的优劣尚存争议,不过IoC是绝对是一个优秀框架必备的特性 Laravel的简单直接不需要文档中那么多废话 中国的PHP社区大部分人还没听说过composer,参与讨论之前还得补补课
zhoujingk_49 2014-01-07 21:31
http://www.golaravel.com/docs/4.1/introduction/
1票 回复
iefreer 2014-01-08 02:21
回复@zhoujingk_49:和laravelchina.com这些cheap copy网站类似, 说不清是谁copy了谁。laravel网站应该像symfony/yii/cake一样写明文档贡献的方式,并在官方网站上支持多语言文档,至少可以列出贡献声明,链入翻译站点。
bluetooth_swh 2014-07-27 12:44
yii很一般 不太喜欢
iefreer 2014-07-27 14:13
回复@bluetooth_swh:技术人员切忌言语轻浮。Yii2引入了PHP社区里面一些新的、好的编程实践比如依赖管理Composer(借鉴自Java的maven/gradle)、集中式调试工具栏、PHP5.4+的语法特性(如类js的数组表达)、命名空间、内置RESTful支持,增强的界面组件(如GridView),批数据查询,等等。这些都值得好好学习。
1票 回复
kysnail 2014-01-05 00:53
Yii = 7.62%
快餐店长 2014-01-04 18:06
yii 只听说过symfony ->_->
codepat 2014-01-04 16:15
yaf呢
songxinkai2010 2014-01-04 16:10
sb文章
酒徒词客 2014-01-04 14:29
Mark
Vanson 2014-01-04 12:36
下载一个试试
HHuiHao 2014-01-04 11:19
怎么没有thinkphp呢???国内很多人用呢。这准确吗
576587876874 2014-11-22 22:46
去大点的公司看看 好像没见有人用啊
bingjianguo007 2014-01-03 21:51
最多的应该是yii吧,这也太软文了吧
1票,来自qq_16230757 回复
zl8522115 2014-01-03 21:14
公司几十个web项目,全部laravel 12年就已经在用Laravel了.这个框架的设计思想可以说是无懈可击. 目前正试图拿Laravel的思想用在node上面.
1票,来自lericzhang 回复
普世编程技术 2014-01-03 21:10
asp.net更新的再快, 封装的再好, 也不如人家PHP十年不变. 你asp.net效率再高, 也比不上人家PHP用十年, 闭着眼都能把代码打出来啊.
1票,来自Big叔 4票 回复
codepat 2014-01-06 10:01
@蒋涛,怎么才能不看到这货,烦死了。
f8cncn 2014-01-03 19:37
用yii的不多吗,难道?
幸福男孩 2014-01-03 17:48
好多都没见过
t200750080225 2014-01-03 17:04
基本没用过,留下来以后开发的时候来参考参考
1票,来自gaoxx 回复
邪恶泡泡 2014-01-03 16:25
明显是Laravel的软文

下载编译安装python 2.6.6

下载编译安装python 2.6.6

Shell代码 
  1. # wget -c http://www.python.org/ftp/python/2.6.6/Python-2.6.6.tar.bz2   
  2. # tar jxvf Python-2.6.6.tar.bz2   
  3. # cd Python-2.6.6  
  4. # ./configure     
  5. # make && make install  

 

更改系统默认版本

Shell代码 
  1. # mv /usr/bin/python /usr/bin/python.bak   
  2. # ln -s /usr/local/bin/python2.6 /usr/bin/python  

修复不能正常工作的yum

因为yum是基于python 2.4.3,所以现在是不可以用的

  1. # vi /usr/bin/yum  

把首行显示的 !#/usr/bin/python 修改为 !#/usr/bin/python2.4

保存搞定。

mod_python使apache2.2与python2.6的结合, 并使trac0.12运行

先是将这个装了,

http://www.vixual.net/blog/archives/232

然后发现使用的mod_python使用的是python2.4
然后yum remove httpd
手动安装apache
参见文章:

http://www.vimer.cn/2010/05/linux%E4%B8%8B%E6%90%AD%E5%BB%BApythonapache%E7%8E%AF%E5%A2%83.html

apache 安装
./configure –prefix=/usr/local/apache –enable-track-vars –enable-cgi –with-config-file-path=/opt/apache/conf –enable-modules=all –enable-mods-shared=all –enable-file-cache –enable-disk-cache –enable-cache –enable-mem-cache –enable-dumpio –enable-logio –enable-mime-magic –enable-headers –enable-usertrack –enable-version –enable-ssl –enable-http –enable-rewrite –enable-proxy –enable-proxy-connect –enable-proxy-http –enable-proxy-ftp –enable-proxy-ajp –enable-proxy-balancer –enable-so

make && make install

安装mod_python3.3.1
wget http://archive.apache.org/dist/httpd/modpython/mod_python-3.3.1.tgz
./configure –with-apxs=/usr/local/apache/bin/apxs –with-python=/usr/local/bin/python
在这里编译会有报错,到

https://bugzilla.redhat.com/show_bug.cgi?id=465246

下载patch,并执行
patch -p1 文件
make install
会在/usr/local/lib/python2.6/site-packages/下生成一个mod_python目录
同时在./src/.libs/下生成了一个mod_python.so,将这个so拷贝到apache的modules目录,并在httpd.conf中加入
LoadModule python_module modules/mod_python.so

然后.

cd /var
mkdir trac
chown apache.apache trac

trac-admin hello_project initenv

<Location /trac>
SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir /var/www/trac
PythonOption TracUriRoot /trac/
PythonOption PYTHON_EGG_CACHE /tmp/egg-cache
</Location>

/usr/local/apache/bin/apachectl restart

trac安装

trac最佳配置 python2.6.6 apr1.5.0 apr-util-1.5.3 apr-util-1.5.1 apache2.2.21; subversion-1.6.12,  subversion-deps-1.6.20,  swig-2.0.12, Genshi-0.6,  mod_python-3.3.1, mod_python-3.3.1-apr.patch, Trac-0.12.6

 

1. 安装python2.6

2. 安装lnmp

3.安装settools

4. 安装svn

5. 安装python-mysql

tar zxvf MySQL-python-1.2.5.tar.gz
cd MySQL-python-1.2.5
python setup.py install
6. 中文trac安装

在 PyPI 可以找到 setuptools 的安装文档:

http://pypi.python.org/pypi/setuptools

 

下载

setuptools-0.6c11-py2.6.egg

 

然后运行:

sh setuptools-0.6c11-py2.6.egg

 

报了一个错误:

zlib not available

 

需要去下载 zlib-1.2.3.tar.gz 然后编译安装。

完成后, 重新编译安装 Python 2.6.

再运行

sh setuptools-0.6c11-py2.6.egg

 

一. 中文支持

首先安装:easy_isntall babel==0.6
其次下载:Trac-0.12.5.tar.gz 【记住是tar.gz】 http://trac.edgewall.org/wiki/TracDownload#PreviousStableRelease
安装中文支持
1. 生成pot
python setup.py extract_messages
2. 编译po(这里可以指定编译为哪种语言,不指定就是全部)
python setup.py update_catalog -l zh_CN
3. 编译为mo
python setup.py compile_catalog -f
4. 安装trac
python setup.py install

 

先是将这个装了,

http://www.vixual.net/blog/archives/232

然后发现使用的mod_python使用的是python2.4
然后yum remove httpd
手动安装apache
参见文章:

http://www.vimer.cn/2010/05/linux%E4%B8%8B%E6%90%AD%E5%BB%BApythonapache%E7%8E%AF%E5%A2%83.html

apache 安装
./configure –prefix=/usr/local/apache –with-apr=/usr/local/apr/bin/apr-1-config –enable-dav –enable-maintainer-mode –with-apr-util=/usr/local/apr-util/bin/apu-1-config –enable-track-vars –enable-cgi –with-config-file-path=/opt/apache/conf –enable-modules=all –enable-mods-shared=all –enable-file-cache –enable-disk-cache –enable-cache –enable-mem-cache –enable-dumpio –enable-logio –enable-mime-magic –enable-headers –enable-usertrack –enable-version –enable-ssl –enable-http –enable-rewrite –enable-proxy –enable-proxy-connect –enable-proxy-http –enable-proxy-ftp –enable-proxy-ajp –enable-proxy-balancer –enable-so

make && make install

安装mod_python3.3.1
wget http://archive.apache.org/dist/httpd/modpython/mod_python-3.3.1.tgz
./configure –with-apxs=/usr/local/apache/bin/apxs –with-python=/usr/local/bin/python
在这里编译会有报错,到

https://bugzilla.redhat.com/show_bug.cgi?id=465246

下载patch,并执行
patch -p1 文件
make install
会在/usr/local/lib/python2.6/site-packages/下生成一个mod_python目录
同时在./src/.libs/下生成了一个mod_python.so,将这个so拷贝到apache的modules目录,并在httpd.conf中加入
LoadModule python_module modules/mod_python.so
cd /var
mkdir trac
chown apache.apache trac

trac-admin knowledge initenv

<Location /trac>
SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir /var/www/trac
PythonOption TracUriRoot /trac/
PythonOption PYTHON_EGG_CACHE /tmp/egg-cache
# HTTP 用戶驗證
AuthType Basic
AuthName “Trac Project”
AuthUserFile /etc/svn/account
Require valid-user
</Location>

/usr/local/apache/bin/apachectl restart

安装Subversion
Subversion
Subversion需要需要下载两个文件subversion-1.6.17.tar.bz2和subversion-deps-1.6.17.tar.bz2,它们的下载地址是

http://subversion.tigris.org/downloads/subversion-1.6.17.tar.bz2

http://subversion.tigris.org/downloads/subversion-deps-1.6.17.tar.bz2

分别解压subversion-1.6.17.tar.bz2和subversion-deps-1.6.17.tar.bz2,解压后他们都在subversion-1.6.17这个文件夹下,然后执行configure,命令如下

./configure –with-apxs=/usr/local/apache/bin/apxs –with-apr=/usr/local/apache –with-apr-util=/usr/local/apache –prefix=/usr/local/subversion

./configure –prefix=/usr/local/svn –with-apxs=/usr/local/apache/bin/apxs –with-apr=/usr/local/apr/bin/apr-1-config –with-apr-util=/usr/local/apr/bin/apu-1-config –with-ssl –with-zlib –enable-maintainer-mode PYTHON=/usr/bin/python –with-swig=/usr/bin/swig –enable-shared –enable-static –enable-swig-binding=python

./configure –with-apxs=/usr/local/apache/bin/apxs –prefix=/usr/local/subversion –with-apr=/usr/local/apr/bin/apr-1-config –with-apr-util=/usr/local/apr-util/bin/apu-1-config –with-ssl –with-zlib=/usr/local/lib –without-berkeley-db PYTHON=/usr/bin/python –with-swig=/usr/local/swig/bin/swig –enable-shared –enable-static –enable-swig-binding=python
make && make install

Swig-py的安装说明在subversion-1.6.12/subversion/bindings/swig/INSTALL文件里说的比较详细,安装过程如下:
cd subversion-1.6.12
make swig-py
make install-swig-py
那么你可以看到swig-py的install目录是/usr/local/services/subversion/lib/svn-python。用如下命令将这个扩展包扩展到python:
echo /usr/local/lib/svn-python >/usr/local/lib/python2.6/site-packages/subversion.pth
剩下的就是测试svn的swig-py包是不是能work了,很简单。
python
回车后键入下面一行命令
import svn.repos
如果不报错,就完事大吉了。(按ctrl+\退出)
如果报错,那么检查几件事情:
I. subversion的configure是不是enable了shared和static,是不是带–with-swig;
II. libsvn_swig_py-x.so是否存在于/usr/local/services/subversion/lib目录;
III. /usr/local/services/subversion/lib是否已经增加到ld.so.conf文件 (/etc/ld.so.conf)
IV. 请使用ldconfig -v |grep swig来检查是否有swig的下列动态库
libsvn_swig_py-1.so.0 -> libsvn_swig_py-1.so.0.0.0
如果一切正常,这个安装就完成了。
安装完成后,运行svnserver –version确认版本为1.6.12。
开始建立版本库
#/usr/local/svn/bin/svnadmin create /home/svn/knowledge /*创建仓库”www”
#ls /home/svn/knowledge /*查看有没有创建好,如果多了一些文件则说明版本库已经创建好
导入项目文件到版本库
下面这条语句将把路径/share/www下找到的项目文件导入到你创建的/svn/project/www 仓库中去,
提交后的修订版为1
#/usr/local/svn/bin/svn import /root/test file:///home/svn/knowledge -m “注释”
配置提高svn版本库的安全性
#chmod –R 700 /home/svn /*不让其他人有该目录的权限
注意: 直接这么chmod会导致svn客户端无法访问,同时需要修改apache配置文件./conf/httpd.conf文件,(如果你的水平不够高的话,这一步可以先跳过,以免给自己找麻烦!等把服务完全搞定后再来进一步提高安全性) 在httpd.conf文件中有这么一段内容:
User daemon
Group daemon
把上述内容改成:
User apache
Group apache
(我的系统在安装apache的时候,自动增加了apache用户和apache组,如果你系统没有这个用户和组,则请自己添加该用户和组)
修改svn仓库的所有者
#chown -R daemon:daemon /home/svn
/usr/local/apache/bin/htpasswd –c /home/svn/passwd yjj

easy_install –prefix=/usr –force-installation-into-system-dir –install-dir /usr/lib/python2.6/dist-packages http://svn.edgewall.org/repos/genshi/tags/0.6.0
apr apr-util安装
tar -zxvf apr-1.5.0.tar.gz
tar -zxvf apr-util-1.5.3.tar.gz
./configure –prefix=/usr/local/apr
make && make install

cd ../apr-util-1.5.3
./configure –prefix=/usr/local/apr-util –with-apr=/usr/local/apr
make && make install

 

 

 

 

 

 

 

 

 

 

 

 

 

lnmp

lnmp一键安装方法

wget -c http://soft.vpser.net/lnmp/lnmp1.1-full.tar.gz && tar zxf lnmp1.1-full.tar.gz && cd lnmp1.1-full && ./centos.sh

ImportError: No module named setuptools 解决方法

在python运行过程中出现如下错误:
python错误:ImportError: No module named setuptools
这句错误提示的表面意思是:没有setuptools的模块,说明python缺少这个模块,那我们只要安装这个模块即可解决此问题,下面我们来安装一下:
在命令行下:
下载setuptools包
shell# wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz
解压setuptools包
shell# tar zxvf setuptools-0.6c11.tar.gz
shell# cd setuptools-0.6c11
编译setuptools
shell# python setup.py build
开始执行setuptools安装
shell# python setup.py install安装完成

 

 

查看linux机器是32位还是64位的方法:

file /sbin/init 或者 file /bin/ls
/sbin/init: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

如果显示 64-bit 则为64位;

file /sbin/init
/sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped
如果显示为32 bit 则为32bit;

uname -a:
uname -a
Linux pmx002**.**.**  2.6.32-71.el6.x86_64 #1 SMP Wed Sep 1 01:33:01 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

x86_64表示64位机器

uname -a
Linux pmx0**.**.**    2.6.9-5.ELsmp #1 SMP Wed Jan 5 19:30:39 EST 2005 i686 i686 i386 GNU/Linux

 
i686表示32位机器

i686 只是i386的一个子集,支持的cpu从Pentium 2 (686)开始,之前的型号不支持.

备注:

1. i386 适用于intel和AMD所有32位的cpu.以及via采用X86架构的32的cpu.

intel平台包括8086,80286,80386,80486,奔腾系列(1.2.3.4)、赛扬系列,Pentium D系列

以及centrino P-M,core duo 等.

2. X86_64 适用于intel的Core 2 Duo, Centrino Core 2 Duo, and Xeon 和AMD Athlon64/x2, Sempron64/x2, Duron64等采用X86架构的64位cpu.

3. PPC   适用于Apple Macintosh G3, G4, G5, PowerBook, and other non-Intel models

安装DVD包括的软件要比安装光盘多一些,安装DVD也包括了两种图形界面(KDE和gnome).

4.Jigdo

也可以通过 Jigdo 下载 Fedora 发行版。Jigdo 可以加速下载安装盘的 ISO 镜像。同 BT 下载等待任务完全完成所不同,Jidgo 自动定位最快的镜像服务器(通过 Fedora 镜像管理器),并且从中下载所需要的文件。为了减少所需的网络流量,可以让 Jigdo 扫描现存的 DVD 或 CD 介质。这个功能对于以下用户特别有用。

 

getconf LONG_BIT
在32位和64位机器上运行如下命令,结果如下:
[b@002 ~]$ getconf LONG_BIT
64

[root@pmx4 /]# getconf LONG_BIT
32

CentOS升级Python到2.6

1.查看python的版本

  1. [root@localhost ~]# python  -V
  2. Python 2.4.3

由此可知CentOS默认的python是2.4.3的,
需要将python升级到2.6版本

2.下载Python2.6.7.tar.bz2
http://www.python.org/ftp/python/2.6.7/Python-2.6.7.tar.bz2
安装:

  1. $tar jxvf  Python2.6.7.tar.bz2
  2. $cd Python2.6.7
  3. $./configure
  4. $make && make install

自此,python2.6安装后路径默认是在/usr/local/lib/python2.6

查看Python版本:

  1. $ /usr/local/bin/python2.6 -V

3.建立软连接,使系统默认的python指向python2.6
正常情况下即使python2.6安装成功后,系统默认指向的python仍然是2.4.3版本,考虑到yum是基于python2.4.3才能正常工作,不敢轻易卸载。
如何实现将系统默认的python指向到2.6版本呢?

  1. mv /usr/bin/python  /usr/bin/python.bak
  2. ln -s //usr/local/bin/python2.6 /usr/bin/python

检验python指向是否成功 4.解决系统python软链接指向python2.6版本后,yum不能正常工作

vi /usr/bin/yum
将文本编辑显示的#/usr/bin/python修改为#/usr/bin/python2.4,保存修改
CentOS升级Python到2.6

于金家的个人博客