Maven简介

1.1 何为Maven

Maven这个词可以翻译为“知识的积累”,也可以翻译为“专 家”或“内行”。本书将介绍Maven这一跨平台的项目管理工具。作为Apache组织中的一个颇为成功的开源项目,Maven主要服务于基于Java平 台的项目构建、依赖管理和项目信息管理。无论是小型的开源类库项目,还是大型的企业级应用;无论是传统的瀑布式开发,还是流行的敏捷模式,Maven都能 大显身手。

1.1.1  何为构建

不管你是否意识到,构建(build)是每一位程序员每天都在做的工作。早上来 到公司,我们做的第一件事情就是从源码库签出最新的源码,然后进行单元测试,如果发现失败的测试,会找相关的同事一起调试,修复错误代码。接着回到自己的 工作上来,编写自己的单元测试及产品代码,我们会感激IDE随时报出的编译错误提示。
忙到午饭时间,代码编写得差不多了,测试也通过了,开心地享 用午餐,然后休息。下午先在昏昏沉沉中开了个例会,会议结束后喝杯咖啡继续工作。刚才在会上经理要求看测试报告,于是找了相关工具集成进IDE,生成了像 模像样的测试覆盖率报告,接着发了一封电子邮件给经理,松了口气。谁料QA小组又发过来了几个bug,没办法,先本地重现再说,于是熟练地用IDE生成了 一个WAR包,部署到Web容器下,启动容器。看到熟悉的界面了,遵循bug报告,一步步重现了bug……快下班的时候,bug修好了,提交代码,通知 QA小组,在愉快中结束了一天的工作。

仔细总结一下,我们会发现,除了编写源代码,我们每天有相当一部分时间花在了编 译、运行单元测试、生成文档、打包和部署等烦琐且不起眼的工作上,这就是构建。如果我们现在还手工这样做,那成本也太高了,于是有人用软件的方法让这一系 列工作完全自动化,使得软件的构建可以像全自动流水线一样,只需要一条简单的命令,所有烦琐的步骤都能够自动完成,很快就能得到最终结果。

1.1.2  Maven是优秀的构建工具

前面介绍了Maven的用途之一是服务于构建,它是一个异常强大的构建工具,能 够帮我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。我们不需要也不应该一遍又一遍地输入命令,一次又一次地点击鼠标,我们要做的是 使用Maven配置好项目,然后输入简单的命令(如mvn clean install),Maven会帮我们处理那些烦琐的任务。

Maven是跨平台的,这意味着无论是在Windows上,还是在Linux或者Mac上,都可以使用同样的命令。

我们一直在不停地寻找避免重复的方法。设计的重复、编码的重复、文档的重复,当 然还有构建的重复。Maven最大化地消除了构建的重复,抽象了构建生命周期,并且为绝大部分的构建任务提供了已实现的插件,我们不再需要定义过程,甚至 不需要再去实现这些过程中的一些任务。最简单的例子是测试,我们没必要告诉Maven去测试,更不需要告诉Maven如何运行测试,只需要遵循Maven 的约定编写好测试用例,当我们运行构建的时候,这些测试便会自动运行。

想象一下,Maven抽象了一个完整的构建生命周期模型,这个模型吸取了大量其 他的构建脚本和构建工具的优点,总结了大量项目的实际需求。如果遵循这个模型,可以避免很多不必要的错误,可以直接使用大量成熟的Maven插件来完成我 们的任务(很多时候我们可能都不知道自己在使用Maven插件)。此外,如果有非常特殊的需求,我们也可以轻松实现自己的插件。

Maven还有一个优点,它能帮助我们标准化构建过程。在Maven之前,十个项目可能有十种构建方式;有了Maven之后,所有项目的构建命令都是简单一致的,这极大地避免了不必要的学习成本,而且有利于促进项目团队的标准化。

综上所述,Maven作为一个构建工具,不仅能帮我们自动化构建,还能够抽象构建过程,提供构建任务实现;它跨平台,对外提供了一致的操作接口,这一切足以使它成为优秀的、流行的构建工具。

1.1.3  Maven不仅仅是构建工具

Java不仅是一门编程语言,还是一个平台,通过JRuby和Jython,我 们可以在Java平台上编写和运行Ruby和Python程序。我们也应该认识到,Maven不仅是构建工具,还是一个依赖管理工具和项目信息管理工具。 它提供了中央仓库,能帮我们自动下载构件。

在这个开源的年代里,几乎任何Java应用都会借用一些第三方的开源类库,这些 类库都可通过依赖的方式引入到项目中来。随着依赖的增多,版本不一致、版本冲突、依赖臃肿等问题都会接踵而来。手工解决这些问题是十分枯燥的,幸运的是 Maven提供了一个优秀的解决方案,它通过一个坐标系统准确地定位每一个构件(artifact),也就是通过一组坐标Maven能够找到任何一个 Java类库(如jar文件)。Maven给这个类库世界引入了经纬,让它们变得有秩序,于是我们可以借助它来有序地管理依赖,轻松地解决那些繁杂的依赖 问题。

Maven还能帮助我们管理原本分散在项目中各个角落的项目信息,包括项目描 述、开发者列表、版本控制系统地址、许可证、缺陷管理系统地址等。这些微小的变化看起来很琐碎,并不起眼,但却在不知不觉中为我们节省了大量寻找信息的时 间。除了直接的项目信息,通过Maven自动生成的站点,以及一些已有的插件,我们还能够轻松获得项目文档、测试报告、静态分析报告、源码版本日志报告等 非常具有价值的项目信息。

Maven还为全世界的Java开发者提供了一个免费的中央仓库,在其中几乎可以找到任何的流行开源类库。通过一些Maven的衍生工具(如Nexus),我们还能对其进行快速地搜索。只要定位了坐标,Maven就能够帮我们自动下载,省去了手工劳动。

使用Maven还能享受一个额外的好处,即Maven对于项目目录结构、测试用 例命名方式等内容都有既定的规则,只要遵循了这些成熟的规则,用户在项目间切换的时候就免去了额外的学习成本,可以说是约定优于配置 (Convention Over Configuration)。

1.2 为什么需要Maven

Maven不是Java领域唯一的构建管理的解决方案。本节将通过一些简单的例子解释Maven的必要性,并介绍其他构建解决方案,如IDE、Make和Ant,并将它们与Maven进行比较。

1.2.1  组装PC和品牌PC

笔者初中时开始接触计算机,到了高中时更是梦寐以求希望拥有一台自己的计算机。我的第一台计算机是赛扬733的,选购是一个漫长的过程,我先阅读了大量的杂志以了解各类配件的优劣,CPU、内存、主板、显卡,甚至声卡,我都仔细地挑选,后来还跑了很多商家,调货、讨价还价,组装好后自己装操作系统和驱动程序……虽然这花费了我大量时间,但我很享受这个过程。可是事实证明,装出来的机器稳定性不怎么好。

一年前我需要配一台工作站,这时候我已经没有太多时间去研究电脑配件了。我选择了某知名PC供应商的在线商店,大概浏览了一下主流的机型,选择了我需要的配置,然后下单、付款。接着PC供应商帮我组装电脑、安装操作系统和驱动程序。一周后,物流公司将电脑送到我的家里,我接上显示器、电源、鼠标和键盘就能直接使用了。这为我节省了大量时间,而且这台电脑十分稳定,商家在把电脑发送给我之前已经进行了很好的测试。对了,我还能享受两年的售后服务。

使用脚本建立高度自定义的构建系统就像买组装PC,耗时费力,结果也不一定很好。当然,你可以享受从无到有的乐趣,但恐怕实际项目中无法给你那么多时间。使用Maven就像购买品牌PC,省时省力,并能得到成熟的构建系统,还能得到来自于Maven社区的大量支持。唯一与购买品牌PC不同的是,Maven是开源的,你无须为此付费。如果有兴趣,你还能去了解Maven是如何工作的,而我们无法知道那些PC巨头的商业秘密。

1.2.2  IDE不是万能的

当然,我们无法否认优秀的IDE能大大提高开发效率。当前主流的IDE如Eclipse和NetBeans等都提供了强大的文本编辑、调试甚至重构功能。虽然使用简单的文本编辑器和命令行也能完成绝大部分开发工作,但很少有人愿意那样做。然而,IDE是有其天生缺陷的:

  • IDE依赖大量的手工操作。编译、测试、代码生成等工作都是相互独立的,很难一键完成所有工作。手工劳动往往意味着低效,意味着容易出错。

  • 很难在项目中统一所有的IDE配置,每个人都有自己的喜好。也正是由于这个原因,一个在机器A上可以成功运行的任务,到了机器B的IDE中可能就会失败。

我们应该合理利用IDE,而不是过多地依赖它。对于构建这样的任务,在IDE中一次次地点击鼠标是愚蠢的行为。Maven是这方面的专家,而且主流IDE都集成了Maven,我们可以在IDE中方便地运行Maven执行构建。

1.2.3  Make

Make也许是最早的构建工具,它由Stuart Feldman于1977年在Bell实验室创建。Stuart Feldman也因此于2003年获得了ACM国际计算机组织颁发的软件系统奖。目前Make有很多衍生实现,包括最流行的GNU Make和BSD Make,还有Windows平台的Microsoft nmake等。

Make由一个名为Makefile的脚本文件驱动,该文件使用Make自己定义的语法格式。其基本组成部分为一系列规则(Rules),而每一条规则又包括目标(Target)、依赖(Prerequisite)和命令(Command)。Makefile的基本结构如下:

<span style="font-size: small;">TARGET… : PREREQUISITE…  
COMMAND  
…  
…  
</span>

     Make通过一系列目标和依赖将整个构建过程串联起来,同时利用本地命令完成每个目标的实际行为。Make的强大之处在于它可以利用所有系统的本地命令,尤其是UNIX/Linux系统,丰富的功能、强大的命令能够帮助Make快速高效地完成任务。

但是,Make将自己和操作系统绑定在一起了。也就是说,使用Make,就不能实现(至少很难)跨平台的构建,这对于Java来说是非常不友好的。此外,Makefile的语法也成问题,很多人抱怨Make构建失败的原因往往是一个难以发现的空格或Tab使用错误。

1.2.4  Ant

Ant不是指蚂蚁,而是意指“另一个整洁的工具”(Another Neat Tool),它最早用来构建著名的Tomcat,其作者James Duncan Davidson创作它的动机就是因为受不了Makefile的语法格式。我们可以将Ant看成是一个Java版本的Make,也正因为使用了Java,Ant是跨平台的。此外,Ant使用XML定义构建脚本,相对于Makefile来说,这也更加友好。

与Make类似,Ant有一个构建脚本build.xml,如下所示:

<?xml version="1.0"?>
<project name="Hello" default="compile">
<target name="compile" description="compile the Java source code to class files">
<mkdir dir="classes"/>
<javac srcdir="." destdir="classes"/>
</target>
<target name="jar" depends="compile" description="create a Jar file ">
<jar destfile="hello.jar">
<fileset dir="classes" includes="**/*.class"/>
<manifest>
<attribute name="Main.Class" value="HelloProgram"/>
</manifest>
</jar>
</target>
</project>

build.xml的基本结构也是目标(target)、依赖(depends),以及实现目标的任务。比如在上面的脚本中,jar目标用来创建应用程序jar文件,该目标依赖于compile目标,后者执行的任务是创建一个名为classes的文件夹,编译当前目录的java文件至classes目录。compile目标完成后,jar目标再执行自己的任务。Ant有大量内置的用Java实现的任务,这保证了其跨平台的特质,同时,Ant也有特殊的任务exec来执行本地命令。

和Make一样,Ant也都是过程式的,开发者显式地指定每一个目标,以及完成该目标所需要执行的任务。针对每一个项目,开发者都需要重新编写这一过程,这里其实隐含着很大的重复。Maven是声明式的,项目构建过程和过程各个阶段所需的工作都由插件实现,并且大部分插件都是现成的,开发者只需要声明项目的基本元素,Maven就执行内置的、完整的构建过程。这在很大程度上消除了重复。

Ant是没有依赖管理的,所以很长一段时间Ant用户都不得不手工管理依赖,这是一个令人头疼的问题。幸运的是,Ant用户现在可以借助Ivy管理依赖。而对于Maven用户来说,依赖管理是理所当然的,Maven不仅内置了依赖管理,更有一个可能拥有全世界最多Java开源软件包的中央仓库,Maven用户无须进行任何配置就可以直接享用。

1.2.5  不重复发明轮子

【该小节内容整理自网友Arthas最早在Maven中文MSN的群内的讨论,在此表示感谢】

小张是一家小型民营软件公司的程序员,他所在的公司要开发一个新的Web项目。经过协商,决定使用Spring、iBatis和Tapstry。jar包去哪里找呢?公司里估计没有人能把Spring、iBatis和Tapstry所使用的jar包一个不少地找出来。大家的做法是,先到Spring的站点上去找一个spring.with.dependencies,然后去iBatis的网站上把所有列出来的jar包下载下来,对Tapstry、Apache commons等执行同样的操作。项目还没有开始,WEB.INF/lib下已经有近百个jar包了,带版本号的、不带版本号的、有用的、没用的、相冲突的,怎一个“乱”字了得!

在项目开发过程中,小张不时地发现版本错误和版本冲突问题,他只能硬着头皮逐一解决。项目开发到一半,经理发现最终部署的应用的体积实在太大了,要求小张去掉一些没用的jar包,于是小张只能加班加点地一个个删……

小张隐隐地觉得这些依赖需要一个框架或者系统来进行管理。

小张喜欢学习流行的技术,前几年Ant十分流行,他学了,并成为了公司这方面的专家。小张知道,Ant打包,无非就是创建目录,复制文件,编译源代码,使用一堆任务,如copydir、fileset、classpath、ref、target,然后再jar、zip、war,打包就成功了。

项目经理发话了:“兄弟们,新项目来了,小张,你来写Ant脚本!”

“是,保证完成任务!”接着,小张继续创建一个新的XML文件。target clean; target compile; target jar; …… 不知道他是否想过,在他写的这么多的Ant脚本中,有多少是重复劳动,有多少代码会在一个又一个项目中重现。既然都差不多,有些甚至完全相同,为什么每次都要重新编写?

终于有一天,小张意识到了这个问题,想复用Ant脚本,于是在开会时他说:“以后就都用我这个规范的Ant脚本吧,新的项目只要遵循我定义的目录结构就可以了。”经理听后觉得很有道理:“嗯,确实是个进步。”

这时新来的研究生发言了:“经理,用Maven吧,这个在开源社区很流行,比Ant更方便。”小张一听很惊讶,Maven真比自己的“规范化Ant”强大?其实他不知道自己只是在重新发明轮子,Maven已经有一大把现成的插件,全世界都在用,你自己不用写任何代码!

为什么没有人说“我自己写的代码最灵活,所以我不用Spring,我自己实现IoC;我不用Hibernate,我自己封装JDBC”?

 

常用CI工具汇总

为了实施CI,必须使用工作的支持,以使整个过程的自动化进行,以下把该过程涉及的各种工具汇集一下

必须的工具和功能

源代码控制系统

微软的工具: Microsoft Team Foundation Server (TFS) 或VSS

开源工具:

服务端:

Subversion:http://subversion.apache.org/

AnkhSVN (http://ankhsvn.open.collab.net/)

Visual SVN Server: http://www.visualsvn.com/server/download

客户端:

VisualSVN (www.visualsvn.com/visualsvn/) 和VS集成,需要付费

TortoiseSVN (http://tortoisesvn.tigris. org ) 很流程的Shell工具

现在很流行的分布式代码管理:

GIt,一个很好的中文参考资料: http://wenku.baidu.com/view/78898a1fa76e58fafab00377.html

持续集成服务器

反馈机制

团队成员需要知道构建的状态,如邮件、门户信息、SMS等

构建管理 BUILD MANAGER

NAnt

MSBuild

或sln等各种构建脚本等

单元测试框架UNIT TEST FRAMEWORK

NUnit  MbUnit and  xUnit.net

MSTest

各种的测试框架集成

其他工具

代码分析

构建的过程对于代码规范等各方面进行自动分析也很重要,这样可以持续保持代码的质量

FxCop代码静态分析工具  http://code.msdn.microsoft.com/codeanalysis

StyleCop 代码风格检查工具http://code.msdn.microsoft.com/sourceanalysis

http://stylecop.codeplex.com/

NDepend静态分析 www.ndepend.com 商业/开源

覆盖率工具

NCover:商业软件

PartCover :http://sourceforge.net/projects/partcover/)

VS2010自带的覆盖率测试工具

TeamCity 的代码重复分析工具

http://www.jetbrains.com/teamcity/download/download_thanks.jsp

http://www.harukizaemon.com/simian/

测试工具

工具 目的
NUnit

MSTest

Performing integration tests
Mocking framework Simulating the behavior of some objects while unit testing others

mocking framework that comes with NUnit. Many other good mock

ing frameworks are available, such as Rhino Mocks, Moq, and Typemock Isolator.

White Testing Windows Forms and Silverlight applications
Selenium Testing web applications

seleniumhq.org

FitNesse Performing acceptance testing in a highly sophisticated manner

fitnesse.org/

文档生成

GhostDoc是VS的一个扩展,可以自动编写XML的注释,可一定程度的提高编写效率,安装后根据提示设置,默认在方法上按Shift-Ctrl-D即可以看到自动的注释(http://submain.com/GhostDoc/)

Sandcastle工具:

Sandcastle Help File Builder (SHFB)

www.codeplex.com/Sandcastle

SHFB at http:// shfb.codeplex.com/

安装以上两个,把生成的XML文件和库加入建立工程即可生成文档

安装

WIX开源工具:

http://wixtoolset.org/

http://wix.sourceforge.net/

Visual Stuido的工具:

ClickOnce

Visual Studio Installer

Web Deploy

数据库CI

开源工具 :

http://code.google.com/p/roundhouse/

Visual Studio:

Visual Studio 的Database项目功能很强, 可进行存储过程的单元测试

 

VideoInspector 检测视频编码

VideoInspector 是一款免费的编码器检测程序,能为您快速解析各种影片格式,例如 AVI、DivX、XviD、MPEG、QuickTime 等,只要使用 VideoInspector 载入需要测试的影片,程序马上就能告诉您该影片是由何种视频以及音频编码方式组成,当计算机缺少该解码器时,程序会自动开启解码器下载功能,按下载后即可连接到解码器下载网页。

 

 

如今在线视频和万能视频播放器已经让大多数人省心到不需要理会视频文件的编解码问题了,但还会有少部分人需要。

VideoInspector 与 SUMo – 获取已安装软件列表及更新 出自同门,其官方还有许多小巧实用的软件工具。

VideoInspector 用起来就非常简单了,自带有中文,只需加载视频文件就能看到详细信息了,支持 AVI, Matroska, MPEG I, MPEG II, QuickTime 格式。

其中视频包括解析度、帧速、比特率、品质因数、编解码器,音频包括声道数、采样率、比特率、编解码器。还能显示视频时间以及电影完整性与否。会自动检测电脑里是否已经安装了相应的编解码器。

 

下载地址:

官网

注册信息:

name:lengxue
code: 50083090086072095106077

Git基础

Git是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点在于介绍Git的基本命令和使用技巧,让你尝试使用Git的同时,体验到原来一个版本控制工具可以对开发产生如此之多的影响。

1、Git是什么

Git在Wikipedia上的定义:它是一个免费的、分布式的版本控制工具,或是一个强调了速度快的源代码管理工具。Git最初被Linus Torvalds开发出来用于管理Linux内核的开发。每一个Git的工作目录都是一个完全独立的代码库,并拥有完整的历史记录和版本追踪能力,不依赖 于网络和中心服务器。

Git的出现减轻了许多开发者和开源项目对于管理分支代码的压力,由于对分支的良好控制,更鼓励开发者对自己感兴趣的项目做出贡献。其实许多开源项目 包括Linux kernel, Samba, X.org Server, Ruby on Rails,都已经过渡到使用Git作为自己的版本控制工具。对于我们这些喜欢写代码的开发者嘛,有两点最大的好处,我们可以在任何地点(在上班的地铁 上)提交自己的代码和查看代码版本;我们可以开许许多多个分支来实践我们的想法,而合并这些分支的开销几乎可以忽略不计。

2、Git 1+1

现在进入本篇文章真正的主题,介绍一下Git的基本命令和操作,会从Git的版本库的初始化,基本操作和独有的常用命令三部分着手,让大家能够开始使用Git。

Git通常有两种方式来进行初始化:

git clone: 这是较为简单的一种初始化方式,当你已经有一个远程的Git版本库,只需要在本地克隆一份,例如’git clone git://github.com/someone/some_project.git some_project’命令就是将’git://github.com/someone/some_project.git’这个URL地址的远程版 本库完全克隆到本地some_project目录下面

git init和git remote:这种方式稍微复杂一些,当你本地创建了一个工作目录,你可以进入这个目录,使用’git init’命令进行初始化,Git以后就会对该目录下的文件进行版本控制,这时候如果你需要将它放到远程服务器上,可以在远程服务器上创建一个目录,并把 可访问的URL记录下来,此时你就可以利用’git remote add’命令来增加一个远程服务器端,例如’git remote add origin git://github.com/someone/another_project.git’这条命令就会增加URL地址为’git: //github.com/someone/another_project.git’,名称为origin的远程服务器,以后提交代码的时候只需要使用 origin别名即可

3、Git的基本命令

现在我们有了本地和远程的版本库,让我们来试着用用Git的基本命令吧:

git pull:从其他的版本库(既可以是远程的也可以是本地的)将代码更新到本地,例如:’git pull origin master’就是将origin这个版本库的代码更新到本地的master主枝,该功能类似于SVN的update

git add:是将当前更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示记入了版本历史中,这也是提交之前所需要执行的一步,例如’git add app/model/user.rb’就会增加app/model/user.rb文件到Git的索引中

git rm:从当前的工作空间中和索引中删除文件,例如’git rm app/model/user.rb’

git commit:提交当前工作空间的修改内容,类似于SVN的commit命令,例如’git commit -m “story #3, add user model”‘,提交的时候必须用-m来输入一条提交信息

git push:将本地commit的代码更新到远程版本库中,例如’git push origin’就会将本地的代码更新到名为orgin的远程版本库中

git log:查看历史日志

git revert:还原一个版本的修改,必须提供一个具体的Git版本号,例如’git revert bbaf6fb5060b4875b18ff9ff637ce118256d6f20’,Git的版本号都是生成的一个哈希值、

上面的命令几乎都是每个版本控制工具所公有的,下面就开始尝试一下Git独有的一些命令:

4、Git独有的一些命令

git branch:对分支的增、删、查等操作,例如’git branch new_branch’会从当前的工作版本创建一个叫做new_branch的新分支,’git branch -D new_branch’就会强制删除叫做new_branch的分支,’git branch’就会列出本地所有的分支

git checkout:Git的checkout有两个作用,其一是在不同的branch之间进行切换,例如 ‘git checkout new_branch’就会切换到new_branch的分支上去;另一个功能是还原代码的作用,例如’git checkout app/model/user.rb’就会将user.rb文件从上一个已提交的版本中更新回来,未提交的内容全部会回滚

git rebase:用下面两幅图解释会比较清楚一些,rebase命令执行后,实际上是将分支点从C移到了G,这样分支也就具有了从C到G的功能

Git使用基础篇

git reset:将当前的工作目录完全回滚到指定的版本号,假设如下图,我们有A-G五次提交的版本,其中C 的版本号是 bbaf6fb5060b4875b18ff9ff637ce118256d6f20,我们执行了’git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20’那么结果就只剩下了A-C三个提交的版本

Git使用基础篇

git stash:将当前未提交的工作存入Git工作栈中,时机成熟的时候再应用回来,这里暂时提一下这个命令的用法,后面在技巧篇会重点讲解

git config:利用这个命令可以新增、更改Git的各种设置,例如’git config branch.master.remote origin’就将master的远程版本库设置为别名叫做origin版本库,后面在技巧篇会利用这个命令个性化设置你的Git,为你打造独一无二的 Git

git tag:可以将某个具体的版本打上一个标签,这样你就不需要记忆复杂的版本号哈希值了,例如你可以使用 ‘git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20’来标记这个被你还原的版本,那么以后你想查看该版本时,就可以使用 revert_version标签名,而不是哈希值了

Git之所以能够提供方便的本地分支等特性,是与它的文件存储机制有关的。Git存储版本控制信息时使用它自己定义的一套文件系统存储机制,在代码根目录下有一个.git文件夹,会有如下这样的目录结构:

Git使用基础篇

有几个比较重要的文件和目录需要解释一下:HEAD文件存放根节点的信息,其实目录结构就表示一个树型结构,Git采用这种树形结构来存储版本信息, 那么HEAD就表示根;refs目录存储了你在当前版本控制目录下的各种不同引用(引用指的是你本地和远程所用到的各个树分支的信息),它有heads、 remotes、stash、tags四个子目录,分别存储对不同的根、远程版本库、Git栈和标签的四种引用,你可以通过命令’git show-ref’更清晰地查看引用信息;logs目录根据不同的引用存储了日志信息。因此,Git只需要代码根目录下的这一个.git目录就可以记录完 整的版本控制信息,而不是像SVN那样根目录和子目录下都有.svn目录。那么下面就来看一下Git与SVN的区别吧

5、Git与SVN的不同

SVN(Subversion)是当前使用最多的版本控制工具。与它相比较,Git最大的优势在于两点:易于本地增加分支和分布式的特性。

下面两幅图可以形象的展示Git与SVN的不同之处

Git使用基础篇

Git使用基础篇

对于易于本地增加分支,图中Git本地和服务器端结构都很灵活,所有版本都存储在一个目录中,你只需要进行分支的切换即可达到在某个分支工作的效果。 而SVN则完全不同,如果你需要在本地试验一些自己的代码,只能本地维护多个不同的拷贝,每个拷贝对应一个SVN服务器地址。举一个实际的例子,以前我所 在的小组使用SVN作为版本控制工具,当我正在试图增强一个模块,工作做到一半,由于会改变原模块的行为导致代码服务器上许多测试的失败,所以并没有提交 代码。这时候上级对我说,现在有一个很紧急的Bug需要处理, 必须在两个小时内完成。我只好将本地的所有修改diff,并输出成为一个patch文件,然后回滚有关当前任务的所有代码,再开始修改Bug的任务,等到 修改好后,在将patch应用回来。前前后后要完成多个繁琐的步骤,这还不计中间代码发生冲突所要进行的工作量。可是如果使用Git, 我们只需要开一个分支或者转回到主分支上,就可以随时开始Bug修改的任务,完成之后,只要切换到原来的分支就可以优雅的继续以前的任务。只要你愿意,每 一个新的任务都可以开一个分支,完成后,再将它合并到主分支上,轻松而优雅。

分布式对于Git而言,你可以本地提交代码,所以在上面的图中,Git有利于将一个大任务分解,进行本地的多次提交,而SVN只能在本地进行大量的一 次性更改,导致将来合并到主干上造成巨大的风险。Git的代码日志是在本地的,可以随时查看。SVN的日志在服务器上的,每次查看日志需要先从服务器上下 载下来。我工作的小组,代码服务器在美国,每次查看小组几年前所做的工作时,日志下载就需要十分钟,这不能不说是一个痛苦。后来我们迁移到Git上,利用 Git日志在本地的特性,我用Ruby编写了一个Rake脚本,可以查看某个具体任务的所有代码历史,每次只需要几秒钟,大大方便我的工作。当然分布式并 不是说用了Git就不需要一个代码中心服务器,如果你工作在一个团队里,还是需要一个服务器来保存所有的代码的。

    总结

本篇介绍了Git的基本概念、一些常用命令和原理,大家可以尝试动手体会一下,下一篇会重点介绍Git命令的使用技巧,Git附带的工具,最后会在Git Hub上创建一个开源项目。

备份工具tar详细用法

tar是Linux环境下最常用的备份工具之一。tar(taparchive)原意为操作磁带文件,但基于Linux的文件操作机制,同样也可适用于普通的磁盘文件。
tar可用于建立、还原、查看、管理文件,也可方便的追加新文件到备份文件中,或仅更新部分的备份文件,以及解压、删除指定的文件。
熟悉其常用参数,能方便日常的系统管理工作。

一、版本

还是那句,不同的操作系统,tar的命令参数是有点区别的:
[codesyntax lang=”bash”]

# tar --version
tar (GNU tar) 1.14

[/codesyntax]

二、简单操作

命令格式:
[codesyntax lang=”bash”]

tar [options] [tarfile] [other-files]
tar--long-option -function-options files

[/codesyntax]

tar可使用的参数非常多,先列举几个最常用的参数:
[codesyntax lang=”text”]

-t, --list
	列出归档文件内容目录
-x, --extract, --get
	从归档文件中解析文件
-c, --create
	创建新的归档文件
上面三个参数,不能同时存在,仅能使用其中一个,即t/x/c
-f file, --file=file
	指定备份文件,或设备,例如磁带机/dev/st0
-v, --verbose
	显示命令的执行过程
-Z, --compress, --uncompress
	使用compress命令处理备份文件
-z, --gzip, --gunzip, --ungzip
	使用gzip命令处理备份文件
-j, --I, --bzip
	使用bzip2命令处理备份文件
	-z和-j都是在备份文件打包后才进行压缩的操作的,并且,该操作会影响其他的参数。
-C directory, --directory=directory
	先进入指定的目录,再释放

[/codesyntax]

举例:
把/etc目录中所有的文件打包为etc.tar文件
[codesyntax lang=”bash”]

tar -cvf /tmp/etc.tar /etc

[/codesyntax]
把/etc目录中所有的文件打包并使用gzip压缩为etc.tar.gz文件
[codesyntax lang=”bash”]

tar -zcvf /tmp/etc.tar.gz /etc

[/codesyntax]
把/etc目录中所有的文件打包并使用bzip2压缩为etc.tar.bz2文件
这里的tar.gz或tar.bz2都是惯例,并不是特定条件。它仅为方便标识,也可将其设置成如tgz等。但建议遵循惯例
[codesyntax lang=”bash”]

tar -jcvf /tmp/etc.tar.bz2 /etc

[/codesyntax]
查看备份包中的内容,若为已经压缩的文件,需加上-z或者-j参数
[codesyntax lang=”bash”]

tar -ztvf /tmp/etc.tar.gz

[/codesyntax]
默认情况下,tar打包时都是使用相对路径的。所以释放时需要先进入目录目录,然后再解压。
同样的,根据使用的压缩方式,应加上-z或者-j参数
[codesyntax lang=”bash”]

cd /tmp && tar -zxvf /tmp/etc.tar.gz

[/codesyntax]
PS:这是另一种写法,结果和上面的相同,其会先进入/tmp目录,然后再释放包的
[codesyntax lang=”bash”]

tar -zxvf /tmp/etc.tar.gz -C /tmp

[/codesyntax]
释放单个etc/passwd文件,正如前面提到的,tar包中的是相对路径,所以不能使用“/etc/passwd”
并且,这里不能使用-C参数,释放文件是当前路径的相对路径,并带目录释放
[codesyntax lang=”bash”]

tar -zxvf /tmp/etc.tar.gz etc/passwd

[/codesyntax]
tar还可以支持很多额外的参数,方便我们在备份和释放的时候进行控制。

三、更多参数

1、备份

[codesyntax lang=”text”]

-d, --diff, --compare
	找出归档文件和文件系统的不同之处
-r, --append
	将文件附加到归档文件之后
-u, --update
	只附加比归档中新的文件
-A, --catenate
	将 tar 文件附加到归档文件之后
--concatenate
	与 -A 相同
--delete
	从归档文件中删除 (不能在磁带上!)
-N date, --newer=date, --after-date=date
	只将比指定日期更新的文件保存到备份文件
--exclude=pattern
	排除符合查找模式的文件
-P, --absolute-names
	备份文件中的文件名使用绝对路径,而不移除文件名前的“/”,默认是相对路径的
-l, --one-file-system
	复制文件或目录存放的文件系统必须和tar命令当前执行的文件系统相同,否则不执行;也就是讲,不处理其他分区的文件。(可忽略mount挂载分区的问题)
--mode=permissions
	备份时,把加入备份文件中的文件属性修改为指定的属性,格式和chmod命令接受的格式相同
--group=group
	备份时,把加入备份文件中的文件所属组设定成指定的组
--owner=owner
	备份时,把把加入备份文件中的文件所有者设定成指定的用户
--numeric-owner
	以UID和GID代替用户名和组名
--recursion
	递归模式(默认)
--no-recursion
	不进行递归处理,即不把指定目录下的所有文件和文件夹都备份
--newer-mtime=date
	仅增加指定日期后修改过内容的文件到备份文件中
--anchored
	排除时,排除匹配式中匹配整个文件路径(默认)
--no-anchored
	排除时,排除匹配式中可匹配“/”后的路径
--ignore-case
	排除时,排除匹配式中忽略大小写
--no-ignore-case
	排除时,排除匹配式中大小写敏感(默认)
--wildcards
	排除匹配式支持通配符(默认)
--no-wildcards
	排除匹配式不支持通配符
--wildcards-match-slash
	排除匹配式的通配符匹配“/”(默认)
--no-wildcards-match-slash
	排除匹配式的通配符不匹配“/”
-X file, --exclude-from file
	指定样式文件,供程序执行时剔除符合条件的文件
--remove-files
	删除已经加入到备份文件中的文件

[/codesyntax]
举例:
创建当前目录的全备份到backup.tar文件
(使用find的原因是,这样可以打包所有隐含文件或不符合命令规范的文件和目录)
[codesyntax lang=”bash”]

tar cvf - `find . -print` > backup.tar

[/codesyntax]
比2005年6月1日新的文件才会备份
[codesyntax lang=”bash”]

tar -N '2005/06/01' -zcvf home.tar.gz /home

[/codesyntax]
除/home/dmtsai目录外,/home和/etc目录的所有东西都打包
[codesyntax lang=”bash”]

tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc

[/codesyntax]
删除etc.tar文件中的etc/pbm2ppa.conf文件
[codesyntax lang=”bash”]

tar --delete etc/pbm2ppa.conf -vf etc.tar

[/codesyntax]
把tmp.tar文件附加到etc.tar后面
[codesyntax lang=”bash”]

tar -A tmp.tar -vf etc.tar

[/codesyntax]
根据-T参数后的样式文件list.txt,打包/etc中指定的文件,同样的,list.tx默认也是相对路径的
[codesyntax lang=”bash”]

find . -name "*.d" -o -name "*.conf" > list.txt
	tar -T list.txt -czvf etc.tar.gz /etc

[/codesyntax]
通过管道,使用一条命令实现上面相同的功能
[codesyntax lang=”bash”]

find . -name "*.d" -o -name "*.conf" | tar -czvf etc.tar.gz -T -

[/codesyntax]

值得注意几个地方:
1)-f后面必须紧跟备份文件,xxx.tar或者xxx.tar.gz
2)使用–delete、-u、-r、-A的时候,后面跟的备份文件都必须为未压缩的,若备份文件已经压缩,需要使用gunzip先解压,操作完后再gzip;
也就是说,不能对tar.gz、tar.bz2等文件直接操作的;
3)备份打包时,默认为相对路径;而排除匹配式默认也是全路径匹配的
所以,在打包时,会提示:“tar: Removing leading `/’ from member names”
除非你使用-P参数或特定的参数指定

2、释放

[codesyntax lang=”text”]

-k, --keep-old-files
	还原备份文件时,不覆盖已存在的文件
-m, --modification-time, --touch
	还原文件时,不变更文件的更改时间
-p, --same-permissions
	解析许可权限信息,即保留备份文件中的权限信息
-s, --same-order, --preserve-order
	以与备份文件相同的顺序还原文件
--preserve
	等于同时设置-p和-s
--no-same-permissions
	不解析许可权限信息,这是普通用户的默认设置,仅对影响管理员的操作有影响
--no-same-owner
	不使用备份文件中的所有者信息,而以您自己的身份解析文件
--same-owner
	使用相同的文件所有者还原文件
--overwrite
	覆盖已经存在的文件和目录
--overwrite-dir
	覆盖已经存在的目录
--recursive-unlink
	释放前,先删除整个目录下所有文件的连接

[/codesyntax]
举例:
释放文件时,设置为备份文件中的相同所有者(仅对管理员而言)
[codesyntax lang=”bash”]

tar --same-owner -xzvf etc.tar.gz

[/codesyntax]
通过管道,把/etc目录用tar整个“拷贝”到/backup/etc,而不用建立任何临时文件
因为根本不需要生成备份包文件,所以这里不需要-z参数
[codesyntax lang=”bash”]

tar cvf - /etc | tar xvf - -C /backup/etc

[/codesyntax]
这里同上面的原理是一样的,只不过通过ssh直接“拷贝”到远端机器上而已
配合ssh密钥匹配,可实现不用人工干预的备份工作
[codesyntax lang=”bash”]

tar cvf - /etc | (ssh root@192.168.228.244 'tar xvf - -C /backup/etc')

[/codesyntax]

3、操作磁带设备

部分参数只适用于磁带设备,不适用于常规的磁盘文件。
[codesyntax lang=”text”]

-K file, --starting-file=file
	从指定的文件开始还原(按顺序)
-L length, --tape-length=length
	设置磁带的容量,单位为1024字节(bytes)
-M, --multivolume
	在建立、还原备份文件或列出其中内容时,采用多卷模式(不能对文件操作)
-V name, --label=name
	建立使用指定卷标的备份文件
-W, --verify
	写入备份文件后,校验文件是否正常
-F script, --info-script=script, --new-volume-script=script
	更换磁带时执行指定的脚本文件,必须与参数-M同时使用

[/codesyntax]
举例:
把/bin、/usr/bin目录都打包到st0磁带设备中
[codesyntax lang=”bash”]

	tar cvf /dev/st0 /bin /usr/bin

[/codesyntax]
把old.dmp文件追加到st0磁带中(使用cvf,会删除原来的文件的)
[codesyntax lang=”bash”]

	tar rvf /dev/st0 old.dmp

[/codesyntax]

4、其他

还有一些控制参数这里不详细讨论了,请自行测试。
但提醒一句,-T参数比较重要哦。
[codesyntax lang=”text”]

--null
-T
	从null设备读取文件名,覆盖-C的设置
-o, --old-archive, --portability
	将数据写入备份文件时使用V7格式
--posix
	将数据写入备份文件时使用POSIX格式
-G, --incremental
	处理旧GNU格式的增量备份
--rsh-command=command
	不使用rsh命令连接远程主机,而使用指定的命令进行
--suffix=suffix
	指定要删除文件前备份文件,该备份文件使用的后缀,默认是“~”
--totals
	创建备份文件时,列出已建立的备份文件的大小
tar --totals -cvf tmp.tar tmp/
-R, --block-number
	在输出信息时,一同block number信息
-S, --sparse
	若文件中有大量连续0字节时,将该文件保存成稀疏文件
-T file, --files-from=file
	指定样式文件,文件内容为一个或多个条件样式,供程序还原或创建符合指定条件的文件
--use-compress-program=program
	使用指定的压缩程序对备份文件压缩或解压
--volno-file=FILE
	使用或更新FILE文件中指定的卷号码
-w, --interactive, --confirmation
	当遇到问题时,要求用户先确认
-B, --read-full-records
	读取数据是重设扇区大小,仅适用于BSD 4.2的管道操作
-O, --to-stdout
	把从备份文件里还原的文件输出到标准输出设备
--version
	版本信息
--help
	帮助信息

[/codesyntax]

免费在线网站速度测试服务

新上线的服务器,或许自个儿访问速度飞快,然而还是有人会抱怨网站打开缓慢,甚至是打不开。
为了能够准确评估网站在联通、电信、移动等不同网络环境的访问速度,以及在国内外不同地区的访问速度,虽然我们可以采用分布式ping的方法来进行验证服务器的访问速度,但是其实我们更需要一个专业的网站速度测试平台。

众所周知,一个网页会包含图片、CSS、JS等各种各样的因素。
而我们在打开网页时经常会遇到卡、顿等现象,排除本地网络不稳定的情况,多数是由于网页中的JS和图片等外在因素导致的。
尤其是那些外部设定的JS及图片,虽然他们可能用到了云加速,但只要一个节点出问题,站点的访问效果一下在就给拉下来了~~~

通过专业的网站速度测试平台,我们可以掌握不同的网络环境访问网站的速度效果,根据网站速度测试服务提供了网页加载过程分析数据,从而找出导致网页打不开或者加载缓慢的“罪魁祸首”。根据所反馈出来的结果,最终我们可以从调整网站服务器网络环境、修改和完善程序代码来达到网站加速的目的。

本篇文章就来介绍八个免费的在线网站速度测试服务,帮助你全面分析自己的网站在世界各地和国内各个省份地区的访问情况,找出拖慢网页加载速度的“因子”,对症下药,让网站访问速度飞一会儿。

一、PageSpeed Insights 谷歌网站性能工具可优化PC和手机网页

1、PageSpeed Insights 网站:

官网:https://developers.google.com/speed/pagespeed/insights/

免费在线网站速度测试服务

PageSpeed Insights是谷歌推出的网站性能优化工具,它可以分析网页的性能并给出提升性能的建议和措施,PageSpeed Insights还提供Chrome浏览器插件。利用它可以帮助网站开发者找出到底是哪些地方影响的了网站的载入速度。

免费在线网站速度测试服务

根据PageSpeed Insights 给出的网站速度优化建议,我们就可以有针对性调整程序代码了。不过个人建议,PageSpeed Insights 只能是作为网站速度优化的参考,有些修改建议不是很准确。

免费在线网站速度测试服务

PageSpeed Insights 另一大特色就是专门为手机浏览网页提供优化建议,预览图可以实时看到网页在手机中的展示效果,点击修复建议,可以直观地看到要修改的地方,一目了然,非常地方便。

免费在线网站速度测试服务

二、Load Impact 在线网站服务器压力测试和网页分析工具

官网:http://loadimpact.com

免费在线网站速度测试服务

Load Impact是一个在线的网站压力测试服务,它会自动生成模拟用户去访问你的网站,并记录网站在不同的模拟用户访问的情况下,网站服务器响应时间和网页加载时间。Load Impact在世界各地都有测试节点,完全可以通过对比,综合评定网站响应速度。

免费在线网站速度测试服务

下图表示模拟用户从0增加到24时网站的响应时间。

免费在线网站速度测试服务

Load Impact还会给出网页加载数据分析,帮助你找出网页加载最慢的部分。
Load Impact还可以为电子商务网站和B2B网站进行负载测试和报告。

免费在线网站速度测试服务

免费在线网站速度测试服务

三、Gtmetrix 老牌优秀的网页性能测试网站-整合了Yahoo! YSlow

官网:http://gtmetrix.com/

免费在线网站速度测试服务

Gtmetrix 是国外一个老牌的网页性能测试网站。以前他主要用来做网站页面载入速度因素免费在线分析,现在Gtmetrix整合了Google Page Speed 和 Yahoo! YSlow 来对你的网站进行评级。

根据Gtmetrix 提供的可行性建议,来帮助改善你的网站性能。

四、奇云测 360站长工具网速测试平台

官网:http://ce.cloud.360.cn/

免费在线网站速度测试服务

奇云测是360推出的在线网站测试平台,有GET检测和PING检测,目前监测节有76个,覆盖了25个省份,同时根据检测结果,还会给网站打出综合分。所以,如果你的站点主要访问对象为国内用户的话,不妨试试看这个工具哦~~
虽然360总闹出一些新闻,但是不可否认的是他在中国IT业内也还是带来了一些积极方面的影响的……

奇云测网站速度测试还加入了瀑布流图,能精确地描述每一个页面元素的加载情况,能够方便你找出网页中哪些部分加载的速度比较慢。

免费在线网站速度测试服务

五、17CE 国内免费的网速测试平台

官网:http://www.17ce.com/

免费在线网站速度测试服务

17CE是国内一个提供网站速度测试服务的网站,目前节点有82个,覆盖了24个省份。除了GET网站速度测试、PING速度测试、DNS解析检查、TraceRoute路由跟踪。

免费在线网站速度测试服务

17CE有全面的报表功能、对比功能、地图展示、柱型图展示等,基本上可以直观地看出自己的网站在哪些地方访问得快,哪些地方访问得慢。

免费在线网站速度测试服务

六、Webkaka 卡卡网即时测试网站访问速度

官网:http://www.webkaka.com/

免费在线网站速度测试服务

Webkaka 卡卡网算是一个比较老牌的网站速度测试网站了网,站功能比较齐全。包括网站测速、压力测试、ping测试、DNS查询等等,唯一吐槽的就是Webkaka的网页广告是这十个在线网站速度测试网站中最多的。

免费在线网站速度测试服务

Webkaka 卡卡网网站测速分为国内节点和国外节点,国内又可以分为移动、联通、电信等线路统计数据。

免费在线网站速度测试服务

七、WebPagetest 多节点全方位地测试网站加载速度

官网:http://www.webpagetest.org/

免费在线网站速度测试服务

WebPagetest是国外一个网站速度测试平台,支持选择测试地点和浏览器种类的网站速度测试工具。而且更让人惊奇的是,在这里居然能找到国内的节点。
你可以更真实的测试你网站的目标群体打开你网站的速度和看到的界面,也可以更有针对性的优化你的网站,WebPagetest测试还包括视频采集、内容拦截等其他测试项目。

八、Whichloadsfaster 快速对比网页加载速度

官网:http://whichloadsfaster.com/

免费在线网站速度测试服务

Whichloadsfaster是一个能够快速对比网页加载速度的网站,功能很简单,但是却非常地有用。
例如当你对某一个网站优化后,想要知道优化手段有没有效果,这时用Whichloadsfaster测试一下即可。

打开Whichloadsfaster,直接输入你想要对比两个网站地址,点击Go按钮,Whichloadsfaster会给出两个网站的打开时间,多次测试后,取平均值。

免费在线网站速度测试服务

在线网站速度测试平台使用小结

1、奇云测、17CE 、Webkaka这三个适合国内的网站主机进行速度测试,也可以作为国内用户访问网站的速度参考依据,PageSpeed Insights 、Load Impact、Gtmetrix 则可以用来改善网页加载效率。

2、在线的网站速度测试平台的测试数据还会受到网络环境因素的影响,为了能够更加准确地得出网站的客户访问体验,我们可以整合本地与在线、国内与国外、多个测试平台等测试数据,综合测出网站速度。