#
我们在一些著名开源项目的版本库中,通常可以看到trunk, branches, tags等三个目录。由于SVN固有的特点,目录在SVN中并没有特别的意义,但是这三个目录却在大多数开源项目中存在,这是因为这三个目录反映了软件开发的通常模式。
trunk是主分支,是日常开发进行的地方。
branches是分支。一些阶段性的release版本,这些版本是可以继续进行开发和维护的,则放在branches目录中。又比如为不同用户客制化的版本,也可以放在分支中进行开发。
tags目录一般是只读的,这里存储阶段性的发布版本,只是作为一个里程碑的版本进行存档。
比如一个项目有main.cpp, common.h两个文件,假设目前在开发的是最新的3.0版本,而且1.0/2.0版本也在进行维护,那么项目树将类似如下样子:
project
|
+-- trunk
+ |
+ +----- main.cpp (3.0版本的最新文件)
+ +----- common.h
+
+-- branches
+ |
+ +-- r1.0
+ + |
+ + +---- main.cpp (1.x版本的最新文件)
+ + +---- common.h
+ +
+ +-- r2.0
+ |
+ +---- main.cpp (2.x版本的最新文件)
+ +---- common.h
+
+-- tags (此目录只读)
|
+-- r1.0
+ |
+ +---- main.cpp (1.0版本的发布文件)
+ +---- common.h
+
+-- r1.1
+ |
+ +---- main.cpp (1.1版本的发布文件)
+ +---- common.h
+
+-- r1.2
+ |
+ +---- main.cpp (1.2版本的发布文件)
+ +---- common.h
+
+-- r1.3
+ |
+ +---- main.cpp (1.3版本的发布文件)
+ +---- common.h
+
+-- r2.0
+ |
+ +---- main.cpp (2.0版本的发布文件)
+ +---- common.h
+
+-- r2.1
|
+---- main.cpp (2.1版本的发布文件)
+---- common.h
要使用这样的文件夹结构,在建立项目版本库时,可首先建好项目文件夹,并在其中建立trunk, branches, tags三个空的子目录,再将项目文件夹连同这三个子目录一起导入版本库。
这样在trunk中开始进行开发,当需要建立branch或tag时,使用SVN的copy操作进行。
其中tags目录需要只读,可以使用SVN中的authz文件控制该目录的访问权限为只读。
Packt celebrates International Day Against DRM, May 6th 2014

According to the definition of DRM on Wikipedia, Digital Rights Management (DRM) is a class of technologies that are used by hardware manufacturers, publishers, copyright holders, and individuals with the intent to control the use of digital content and devices after sale.
However, Packt Publishing firmly believes that you should be able to read and interact with your content when you want, where you want, and how you want – to that end they have been advocates of DRM-free content since their very first eBook was published back in 2004.
To show their continuing support for Day Against DRM, Packt Publishing is offering all its DRM-free content at $10 for 24 hours only on May 6th – that’s all 2000+ eBooks and Videos. Check it out at: http://bit.ly/1q6bpha.
- 安装SVN客户端
apt-get install subversion subversion-tools
- 下载代码
svn co http://svn.shiwan.com/svn/shiwan/branches/program/
- 更新代码
cd 到欲更新代码的目录
svn update
- 安装MAVEN,下载安装包并解压
wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz
tar -zxf apache-maven-3.0.3-bin.tar.gz
- 编辑/etc/profile
export JAVA_HOME=/usr/lib/jvm/java-7-oracle
export STORM_HOME=/home/ubuntu/java/storm-0.8.1
export KAFKA_HOME=/home/ubuntu/java/kafka_2.9.2-0.8.1.1
export ZOOKEEPER_HOME=/home/ubuntu/java/zookeeper-3.4.6
export BIN_HOME=/home/ubuntu/java
export MAVEN_HOME=/home/ubuntu/java/apache-maven-3.2.1
export PATH=$JAVA_HOME/bin:$STORM_HOME/bin:$KAFKA_HOME/bin:$ZOOKEEPER_HOME/bin:$BIN_HOME/bin:$MAVEN_HOME/bin:$PATH
- 更新SOURCE
- CD到含有pom.xml的文件夹,运行
mvn package
- CD到target文件夹即可看到已编辑的文件
cd 到欲更新代码的目录
ll
-
install ZeroMQ
wget http://download.zeromq.org/historic/zeromq-2.1.7.tar.gz
tar -xzf zeromq-2.1.7.tar.gz
cd zeromq-2.1.7
./configure
//在configure时可能会报缺包,安装即可:sudo apt-get install g++ uuid-dev
make
sudo make install
-
install JZMQ
git clone https://github.com/nathanmarz/jzmq.git
cd jzmq
./autogen.sh
./configure
make
sudo make install
-
下载并解压STORM
-
编辑conf/storm.yaml
storm.zookeeper.servers:
- "1.2.3.5"
- "1.2.3.6"
- "1.2.3.7"
storm.local.dir: "/opt/folder"
nimbus.host: "54.72.4.92"
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 编辑/etc/profile
export JAVA_HOME=/usr/lib/jvm/java-7-oracle
export STORM_HOME=/home/ubuntu/java/storm-0.8.1
export KAFKA_HOME=/home/ubuntu/java/kafka_2.9.2-0.8.1.1
export ZOOKEEPER_HOME=/home/ubuntu/java/zookeeper-3.4.6
export PATH=$JAVA_HOME/bin:$STORM_HOME/bin:$KAFKA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH
-
制作启动命令: start-storm.sh
storm nimbus &
storm supervisor &
storm ui &
安装途中如果遇到问题
http://my.oschina.net/mingdongcheng/blog/43009
有时候不知道java安装在哪里了 通过whereis java命令不能知道java真是的安装路径
可以通过 update-alternatives --config java 命令察看
bean@ubuntu :~$ update-alternatives --config java
There is only one alternative in link group java: /usr/lib/jvm/java-7-oracle/jre/bin/java
Nothing to configure.
bean@ubuntu :~$
或者这种方法也可以:
进入到相应的目录:cd /usr/bin
查看java链接到了哪里:ls -l java
localhost:bin root# ls -l java
lrwxr-xr-x 1 root wheel 74 May 18 10:26 java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
Question: I’m unable to do su – on Ubuntu. It says “su: Authentication failure”. How do I fix it? Also, is it possible for me to login to Ubuntu using root account directly?
Answer: Let us address these two question one by one.
Warning: Enabling root is not recommended. If possible, you should always try to perform all administrative tasks using sudo.
Question 1: I’m unable to login using su command. How to fix this?
By default, root account password is locked in Ubuntu. So, when you do su -, you’ll get Authentication failure error message as shown below.
$ su - Password: su: Authentication failure
Enable super user account password on Ubuntu
First, set a password for root user as shown below.
$ sudo passwd root [sudo] password for ramesh: Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully
Now with the new password you can login as super user with su command
使用JERSEY框架输出JSON,需捕获所有的HTTP错误,如404等,业务错误及其他未定义的错误,将这些错误输出JSON,而不是TOMCAT的错误。
JERSEY已和SPRING整合。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee">
<display-name>Restful Web Application</display-name>
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>
com.sun.jersey.spi.spring.container.servlet.SpringServlet
</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>restfullapi.rest.service,restfullapi.common.provider,restful.web</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
</context-param>
<!-- spring logback -->
<context-param>
<param-name>logbackConfigLocation</param-name>
<param-value>classpath:logback.xml</param-value>
</context-param>
<listener>
<listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
</listener>
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>restfull-api</param-value>
</context-param>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
</web-app>
AbstractBaseRestfulException.java
public abstract class AbstractBaseRestfulException extends Exception{
private static final long serialVersionUID = 6779508767332777451L;
public AbstractBaseRestfulException()
{
}
public AbstractBaseRestfulException(String message)
{
super(message);
}
public abstract String getErrcode();
public abstract void setErrcode(String errcode);
public abstract String getDescription();
public abstract void setDescription(String description);
}
AbstractBaseRestfulExceptionMapper.java
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.paul.common.exception.AbstractBaseRestfulException;
import com.paul.common.json.DefaultJsonResponse;
@Provider
public class AbstractBaseRestfulExceptionMapper implements ExceptionMapper<AbstractBaseRestfulException>{
private Logger logger = LoggerFactory.getLogger(AbstractBaseRestfulExceptionMapper.class);
public Response toResponse(AbstractBaseRestfulException exception) {
logger.error(exception.getMessage(), exception);
DefaultJsonResponse<Object> response = new DefaultJsonResponse<Object>();
response.setDescription(exception.getDescription());
response.setErrcode(exception.getErrcode());
response.setResult(null);
return Response.status(Status.BAD_REQUEST)
.entity(response)
.type(MediaType.APPLICATION_JSON + ";charset=utf-8")
.build();
}
}
OtherExceptionMapper.java
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.paul.common.json.DefaultJsonResponse;
import com.paul.common.json.JsonResponseStatus;
@Provider
public class OtherExceptionMapper implements ExceptionMapper<Exception>{
private Logger logger = LoggerFactory.getLogger(OtherExceptionMapper.class);
public Response toResponse(Exception exception) {
logger.error(exception.getMessage(), exception);
DefaultJsonResponse<Object> response = new DefaultJsonResponse<Object>();
response.setDescription(JsonResponseStatus.OTHER_ERROR.getMessage() + exception.getMessage());
response.setErrcode(JsonResponseStatus.OTHER_ERROR.getCode());
response.setResult(null);
return Response.status(Status.BAD_REQUEST)
.entity(response)
.type(MediaType.APPLICATION_JSON + ";charset=utf-8")
.build();
}
}
WebApplicationExceptionMapper.java
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.paul.common.json.DefaultJsonResponse;
@Provider
public class WebApplicationExceptionMapper implements ExceptionMapper<WebApplicationException >{
private Logger logger = LoggerFactory.getLogger(WebApplicationExceptionMapper.class);
public Response toResponse(WebApplicationException exception) {
logger.error(exception.getMessage(), exception);
DefaultJsonResponse<Object> response = new DefaultJsonResponse<Object>();
response.setDescription(exception.getMessage());
response.setErrcode(String.valueOf(exception.getResponse().getStatus()));
response.setResult(null);
return Response.status(exception.getResponse().getStatus())
.entity(response)
.type(MediaType.APPLICATION_JSON + ";charset=utf-8")
.build();
}
}
Controller中无须再处理异常
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.paul.common.json.DefaultJsonResponse;
import com.paul.common.json.JsonResponseStatus;
import com.paul.program.stbstart.valueobject.StbStart;
import com.paul.stbstart.valueobject.StbStartRequest;
import com.paul.restfullapi.rest.service.AdvertisementRestfulService;
@Path("/advertisement")
@Controller
public class AdvertisementRestfulController {
private Logger logger = LoggerFactory.getLogger(AdvertisementRestfulController.class);
@Autowired
AdvertisementRestfulService advertisementRestfulService;
@Path("/getAdvertisement")
@Produces({MediaType.APPLICATION_JSON + ";charset=utf-8"})
@GET
public DefaultJsonResponse<StbStart> getAdvertisement(
@DefaultValue("") @QueryParam("version")String version,
@QueryParam("token")String token) throws Exception
{
DefaultJsonResponse<StbStart> response = new DefaultJsonResponse<StbStart>();
StbStartRequest request = new StbStartRequest();
logger.info(version);
request.setVersion(version);
request.setToken(token);
StbStart result = advertisementRestfulService.findByVersion(request);
response.setResult(result);
response.setDescription(JsonResponseStatus.SUCCESS.getMessage());
response.setErrcode(JsonResponseStatus.SUCCESS.getCode());
logger.info("----------------");
// double i = 1/0;
return response;
}
}
一、Mongodb数据更新命令
Mongodb更新有两个命令:update、save。
1.1update命令
update命令格式:
db.collection.update(criteria,objNew,upsert,multi)
参数说明:
criteria:查询条件
objNew:update对象和一些更新操作符
upsert:如果不存在update的记录,是否插入objNew这个新的文档,true为插入,默认为false,不插入。
multi:默认是false,只更新找到的第一条记录。如果为true,把按条件查询出来的记录全部更新。
示例:
Shell代码

- > db.classes.insert({"name":"c1","count":30})
- > db.classes.insert({"name":"c2","count":30})
- > db.classes.find()
- { "_id" : ObjectId("5030f3a3721e16c4ab180cd9"), "name" : "c1", "count" : 30 }
- { "_id" : ObjectId("5030f3ab721e16c4ab180cda"), "name" : "c2", "count" : 30 }
- >
示例1:把count大于20的class name修改为c3
Shell代码

- > db.classes.update({"count":{$gt:20}},{$set:{"name":"c3"}})
- > db.classes.find()
- { "_id" : ObjectId("5030f3a3721e16c4ab180cd9"), "name" : "c3", "count" : 30 }
- { "_id" : ObjectId("5030f3ab721e16c4ab180cda"), "name" : "c2", "count" : 30 }
- >
由于没有指定upsert和multi的值,所以全部默认为false,由结果可以看出,只修改了第一条符合条件的记录。
示例2:把count大于20的class name修改为c4,设置multi为true
Shell代码

- > db.classes.update({"count":{$gt:20}},{$set:{"name":"c4"}},false,true)
- > db.classes.find()
- { "_id" : ObjectId("5030f3a3721e16c4ab180cd9"), "name" : "c4", "count" : 30 }
- { "_id" : ObjectId("5030f3ab721e16c4ab180cda"), "name" : "c4", "count" : 30 }
- >
由于指定了multi为true,所以对两条符合条件的记录都进行了更新。
示例3: 把count大于50的class name修改为c5,设置upsert为true
Shell代码

- > db.classes.update({"count":{$gt:50}},{$set:{"name":"c5"}},true,false)
- > db.classes.find()
- { "_id" : ObjectId("5030f3a3721e16c4ab180cd9"), "name" : "c4", "count" : 30 }
- { "_id" : ObjectId("5030f3ab721e16c4ab180cda"), "name" : "c4", "count" : 30 }
- { "_id" : ObjectId("5030f589ce8fa8884e6cd441"), "name" : "c5" }
- >
在集合中没有count大于50的记录,但是由于指定了upsert为true,如果找不到则会插入一条新记录。
1.2save命令
Mongodb另一个更新命令是save,格式如下:
db.collection.save(obj)
obj代表需要更新的对象,如果集合内部已经存在一个和obj相同的"_id"的记录,Mongodb会把obj对象替换集合内已存在的记录,如果不存在,则会插入obj对象。
这条命令比较简单,示例就省略了。
二、数据更新操作符
1.$inc
用法:{$inc:{field:value}}
作用:对一个数字字段的某个field增加value
示例:将name为chenzhou的学生的age增加5
Shell代码

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 22 }
- #查询结果显示年龄为22
- > db.students.update({name:"chenzhou"},{$inc:{age:5}})
- #执行修改,把age增加5
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 27 }
- >
- #查询结果显示年龄为27,修改成功
2.$set
用法:{$set:{field:value}}
作用:把文档中某个字段field的值设为value
示例: 把chenzhou的年龄设为23岁
Shell代码

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 27 }
- > db.students.update({name:"chenzhou"},{$set:{age:23}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 23 }
- >
从结果可以看到,更新后年龄从27变成了23
3.$unset
用法:{$unset:{field:1}}
作用:删除某个字段field
示例: 将chenzhou的年龄字段删除
Shell代码

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 23 }
- > db.students.update({name:"chenzhou"},{$unset:{age:1}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou" }
- >
4.$push
用法:{$push:{field:value}}
作用:把value追加到field里。注:field只能是数组类型,如果field不存在,会自动插入一个数组类型
示例:给chenzhou添加别名"michael"
Shell代码

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$push:{"ailas":"Michael"}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael" ], "name" : "chenzhou" }
- >
由结果可以看到,记录中追加了一个数组类型字段alias,且字段有一个为"Michael"的值
5.pushAll
用法:{$pushAll:{field:value_array}}
作用:用法同$push一样,只是$pushAll可以一次追加多个值到一个数组字段内。
示例:给chenzhou追加别名A1,A2
Shell代码

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael" ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$pushAll:{"ailas":["A1","A2"]}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael", "A1", "A2" ], "name" : "chenzhou" }
- >
6.$addToSet
用法:{$addToSet:{field:value}}
作用:加一个值到数组内,而且只有当这个值在数组中不存在时才增加。
示例:往chenzhou的别名字段里添加两个别名A3、A4
Shell代码

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael", "A1", "A2" ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$addToSet:{"ailas":["A3","A4"]}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael", "A1", "A2", [ "A3", "A4" ] ], "name" : "chenzhou" }
- >
由结果可以看出,更新后ailas字段里多了一个对象,这个对象里包含2个数据,分别是A3、A4
7.$pop
用法:删除数组内第一个值:{$pop:{field:-1}}、删除数组内最后一个值:{$pop:{field:1}}
作用:用于删除数组内的一个值
示例: 删除chenzhou记录中alias字段中第一个别名
Shell代码

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael", "A1", "A2", [ "A3", "A4" ] ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$pop:{"ailas":-1}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2", [ "A3", "A4" ] ], "name" : "chenzhou" }
- >
由结果可以看书,第一个别名Michael已经被删除了。
我们再使用命令删除最后一个别名:
Shell代码

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2", [ "A3", "A4" ] ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$pop:{"ailas":1}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2" ], "name" : "chenzhou" }
- >
由结果可以看出,alias字段中最后一个别名["A3","A4"]被删除了。
8.$pull
用法:{$pull:{field:_value}}
作用:从数组field内删除一个等于_value的值
示例:删除chenzhou记录中的别名A1
Shell代码

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2" ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$pull:{"ailas":"A1"}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A2" ], "name" : "chenzhou" }
- >
9.$pullAll
用法:{$pullAll:value_array}
作用:用法同$pull一样,可以一次性删除数组内的多个值。
示例: 删除chenzhou记录内的所有别名
Shell代码

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2" ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$pullAll:{"ailas":["A1","A2"]}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ ], "name" : "chenzhou" }
- >
可以看到A1和A2已经全部被删除了
10.$rename
用法:{$rename:{old_field_name:new_field_name}}
作用:对字段进行重命名
示例:把chenzhou记录的name字段重命名为sname
Shell代码

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$rename:{"name":"sname"}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ ], "sname" : "chenzhou" }
- >
由结果可以看出name字段已经被更新为sname了。