test

北京按摩女之啪啪不着

 

十三狼

 

 

问世间情为何物,直教生死相许?天南地北双飞客,老翅几回寒暑。欢乐趣,离别苦,就中更有痴儿女。君应有语:渺万里层云,千山暮雪,只影向谁去?

横汾路,寂寞当年箫鼓,荒烟依旧平楚。招魂楚些何嗟及,山鬼暗啼风雨。天也妒,未信与,莺儿燕子俱黄土。千秋万古,为留待骚人,狂歌痛饮,来访雁丘处!

初识这些词时, 是一个同学抄给我的, 我看着不错, 虽然不理理解其中的含义, 但好像其中含有很深的意思, 原文我就不去解释了, 大家愿意的话自已去度娘上去查一下就好, 而我只是说我所想的。

问世间情是什么呢, 为什么会教人生, 也可以让人死, 天南地北的人们, 经历了那么多的时间, 相聚时开心, 离别时痛哭, 其中有多多少少痴男怨女。 你可能已经看到了, 天上的云彩, 山上的雪花, 一个人到底是为了谁呢? 路还是那条路, 还记得一个人时间, 寂莫天天与你相伴, 一天天日子会过去, 没有你的日子心中是那样的难过, 天公也不做美, 也不帮忙, 也不给喜欢的人传个信息, 多少个春秋过去了, 人也老了, 心爱的人也嫁人了, 只有诗还是那个诗, 句还是那个句, 人还是那个人, 为了不让这些没有人知道, 只有让那些有情怀的人, 唱着歌, 踩着大地, 喝着酒水, 醉着自已, 听着那些别人的故事.

  • 博爱

我不知道你们有没有听过这个词语, 反正我是有, 我叫折扇, 人给代号猪猡, 当然不是我想叫这个名子的, 实在是因为他们实在是太蠢了, 不得不承认有些低学校的同学的水平的确低那么一点点, 不过, 你得学得跟他们一样才行, 不然的话就会反噬, 这个代号的来源就是这样的, 因为我天天叫他们猪啊, 真是个猪猡,很重的口气, 久而久之, 他们没记住我的名子, 倒是把我骂他们的话给记住了。

于是乎, 我就成了猪猡,

往事不堪回首!

职业学校, 不像高中那么的努力备考, 只是五个专业的班级里面每个班挑出了十个来进行抢高校的名额进行万里挑一的备考, 我们是五个班级, 机电一, 机电二, 机电三, 微机, 财会, 每个班有50个人, 每个班挑前十名,而我们班其中就有我, 其他的都是女生, 大课, 每个班的人聚在一起学主科, 语文数学政治, 两门专业课, 专业课专业老师去教。

于是乎故事就开始了, 十个人只有我是男的, 介绍一下我, 身高165, 满脸的青春痘, 或许是女多男少的原因, 或者是我太有才, 或者是我高高在上, 因为第一我是四科课代表, 同时又管理着两 个微机室, 同时在同级与上级的考试中名列第二, 让她们可望不可及, 我就是那个神一般的存在。

像周总歌那样, 无敌。。。是多么, 多么的寂寞, 无敌。。。是多么, 多么的空虚, 。。。。。

在这种心态下, 第一封情书产生了,

第一页, 你好 ,请番下一页。 第二页, 这是一封给你的情书, 请番下一页。 第三页, 你是多么的清亮, 我是多么的喜欢你, 如果你喜欢我的话, 请做完下一页的那道题, 还给我, 如果不愿意, 那就不要做了, 空白的还给我就好了, 谢谢, 打拢了, 第四页, 我出了一道, 不容易但肯定她能做出来的一道题。 之所以这么多页, 第一, 我不能让人发现我给她写情书, 第二, 我要能看到她有没有在看我写的情书, 第三, 她做题时, 我就已经知道了答案。 哈哈哈。。。。。这也是造成后来悲剧之一的原因, 因为我的本心是一个负责任的人, 就是因为这个我与她好像缔结了一种关系, 认定是她, 以至于后来的变化, 变化再变化, 再再变化, 再再再变化, 成了一系列的悲剧的源头。

她成了我的女友之后, 我倒是不知道如何去办了, 没法约会, 因为学校的校门紧闭, 没有钱去开房, 在那个年代, 外面也没有房可开。 到了放学时, 大家想回家的那种心情比任何人都着急, 都找不到人到哪里。 于是乎她就成了名义上的女朋友, 只有我与她知道的。 名不副实的一对,

相遇时, 我与她在返回宿舍的路上, 想说什么, 只是停一下, 她就红了脸然后就跑过去了, 我想, 你跑什么呢, 怕我, 不喜欢我?

学校有学生会, 晚上会查一次宿舍, 查过后, 一宿舍的人就会聊天, 聊女生, 哪个漂亮了, 哪个和哪个有关系了, 和我一起的一个是个财会班的男孩, 他跟我讲, 他啪过他们班的一个女的, 而那个女的正好是我上大课时的同桌, 不就是她吗, 哈哈, 我也想,

 

等到了上大课,我说, 我叫猪猡, 她卟一下就笑了, 笑的花枝乱动,我呆呆的看着她的脖子, 好白啊, 摸上去肯定好有手感的样子, 在我的右手边是我从初中升上来的校友, 当时择专业时, 我择了机电专业, 和我的两 个朋友一起分到了一, 二, 三班, 进班一看, 晕, 全是男生, 我还怎么活啊, 恰恰 这时, 班主任跑来说, 学校呢给你们一个再择专业的机会, 于是我就跳出来说, 我想换, 因为我看到四班的美女实在太多了, 于是我为了讨好美女努力学习专业知识, 屁啊屁的, 跑到她们前面, 搂着她们手把手的教她们这个怎么做, 那个怎么做, 没有专业的知识, 肯定的是没有把妹的机会的, 右边升上来的校友, 叫小娜, 个子高挑, 说起话来极不稳定, 见了谁都想吃一瓶醋, 就在这时, 她就跳了出来, 指着我说, 咱们班这么多女的, 你不沟引, 你又想沟引财会班的女的啊, 我说, 没有啊, 她只是我的同桌而已 , 认识一下有什么不行的, 她又笑了, 捂着嘴吃吃的笑着, 说, 我叫小敏, 你也叫我小敏, 好了, 哦,, 小敏。。。。。

九个女生里面, 我最喜欢的是萍儿, 而我给她写情书的一个却是因为她太白了, 白的漂亮, 白的无暇, 像玉一样, 不敢让人去碰, 当她抱着我的胳膊的在路上走时, 我有一种错觉, 我是天上的神仙, , , 直到走完最后那阶, 她问我, 你去哪, 我。。。说, 想去厕所, 因为学校是封锁的, 我没地可去, 难道在草地上? 现在想像也不是不行,她的名子我现在居然选择性的忘记了, 我给她起个名子, 叫彩霞吧。

我们的专业课在专门的一间小教室里上, 小的有不到二十个平方的样子, 以至于, 我们放个屁, 互相都能闻到, 虽然没有那么夸张, 但就是很小, 直到有一天, 我闻到了一种味道, 是男生的那种特有的自已撸过的味道, 而小教室里除了我又没有别的男的, 可以肯定的说, 其中的有一个女的带一个男的进来过了, 而经过调查后, 让人心痛的是却是萍儿, 后为萍儿与她的男生没有升到同一所学校, 分开了, 两 个人也分开了, 那恰恰 是我所希望的, 而当萍儿叫我一起走时, 我却坚决的拒绝, 可能伤了她的心, 所以她选择了他, 但她现在也不知道, 我当年真正喜欢的是她, 如今我打电话过去, 她依然是一副 冷冰冰的样子, 我已经愿谅了你, 如果重新再来, 我想那封情书, 应是你的, 错!错!错!如何让我重新来过!我们迷乱在爱的海洋, 爱如水般的流过后, 又无法回头, 心结难解, 当人去结时, 已不能再结。

“咯, 咯, 咯, 我是咱们班里最漂亮的”, 是的她的确是最漂亮的, 就是那样, 我最讨厌的是自已夸自已 的人, 她也是九人之中的一个, 她喜欢带好吃的给我, 当着好多人的面给我, 我将那些扔到一边, 分给其他的女生吃, 别的都不敢吃, 她就生气的抓我的胸, 用力的, 很痛, 我很生气, 想以其人之道还至其人之身, 她瞪起眼睛来怒目而视的说, 你, 你敢。。。我软了, 的确, 我不敢, 就不了了知了,

我说我可会看手相了, 一个一个的将小手伸过来, 让我解释, 我摸个不停, 原来女生的手是这样白, 好软, 好软, 好软, 后面的女生叫道, 不要让他看啊, 他是想赚你们便宜, 想摸你们的手的, 我说, 屁, 你们的手有什么好摸的, 还不如我自已 的好看, 只是看手相而已 , 于是后面的不说话了, 好像很有道理的样子, 于是她们排成一排我摸了过去。

慢慢的, 我也不知道喜欢谁, 之所以说喜欢不说爱, 是为了好耍赖, 不承认跟她的关系而已,

我在想, 这些女的我都喜欢怎么办, 哪一个跟我在一起, 我都是开心的, 哪一个跟我一生我都愿意, 好像有个韩剧, 有个女主都适应了男二号阿爸啊, 男二号还是为了女主的幸福将女主推到男一号面前, 还挨了男一号的打, 还为女主去死, 连女主都说, 阿爸啊, #¥·%·#¥%·#(就这样一辈子吧), 就像我那时的心态, 最后我查了一下, 愿来这个词叫博爱。

  • 一爱
  • 二爱
  • 三爱
  • 四爱
  • 五爱
  • 六爱
  • 七爱
  • 八爱
  • 九爱
  • 十爱
  • 十一爱
  • 十二爱
  • 十三爱

 

 

 

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