Permission denied when pushing to Github

现象

添加 remote 后,通过 git 协议 push 代码

1
2
$ git remote add origin git@github.com:angryz/icloudaegis_ejbca.git
$ git push -u origin master

此时出现错误提示

1
2
3
4
5
6
Warning: Permanently added the RSA host key for IP address '192.30.252.131' to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

处理

调试 ssh 连接

1
$ ssh -vT git@github.com

查看结果,连接正常,仍然报错 Permission denied (publickey).

检查 ssh 校验key是否是正常的

1
2
$ ssh-add -l
The agent has no identities.

没有打印出 key 信息,说明 ssh 连接时没有正确使用 key。

查看自己的 key 文件

1
$ ls ~/.ssh

在该目录下发现 github_rsa,接下来将其添加到 ssh

1
$ ssh-add ~/.ssh/github_rsa

然后再运行 ssh -vT git@github.com,正常。

总结

通常系统使用 ssh 协议时默认使用的 key 文件是 ~/.ssh/id_rsa,如果你针对某些 ssh 连接的 key 文件没有覆盖系统默认的 id_rsa,而是保存为自定义的文件名,那么就需要手动通过 ssh-add 将其添加到 ssh 协议的查找对象中。

参考 Github help: Error: Permission denied (publickey)

MySQL vs PostgreSQL

查阅了很多资料,没有一个能明确告诉你用哪个更好,抛开两者一部分技术上的不同优势,整理了几点区别如下,

  1. MySQL诞生于1994年,支持多种存储引擎,常见的有 MyISAM 和 InnoDB,前者实现了高速读但不支持ACID,后者实现了ACID。MySQL在所有权归于Oracle之后,提供了多个版本,其中有免费的也有收费的。

  2. PostgreSQL诞生于1985年,以稳定著称,可靠性、数据一致性与完整性是PostgreSQL的最高优先级特性,完全支持ACID,它只提供单个完整功能的版本。

  3. MySQL在国内更为流行,一个很大的原因在于PostgreSQL在早期不提供Windows版本。

  4. MySQL能够进行快速的读取和大量的查询操作,不过在复杂特性与数据完整性检查方面不太尽如人意。MyISAM引擎是最快的,因为它只执行很少的数据完整性检查,适合于后端读操作较多的站点,不过对于包含敏感数据的读/写数据库来说就是个灾难了,因为MyISAM表最终可能会损坏。

  5. PostgreSQL的可靠性好,在保护数据方面很擅长,而且是个社区项目,不会陷入厂商的牢笼之中。MySQL更加灵活,提供了更多选项来针对不同的任务进行裁剪。

  6. 一个常见的误解就是MySQL要比PostgreSQL更容易学习。关系数据库系统都是非常复杂的,这两个数据库的学习曲线其实是差不多的。

  7. PostgreSQL与Oracle数据库很相似,同为多进程框架,所以能支持高并发的应用场景,所以熟悉Oracle的话转到PostgreSQL数据库上是比较容易的。

  8. MySQL从5.5版本开始性能提升很大,单机性能强于PostgreSQL。

想多了解一点可以看看 http://www.wikivs.com/wiki/MySQL_vs_PostgreSQL

sudo执行命令时提示"command not found"

场景

当前用户是一个 sudoer,用 sudo 执行了一个命令,比如:sudo java -version,系统提示”command not found”。

原因

系统安装的 sudo 在编译时缺省使用了 —with-secure-path 参数,导致当前用户的 $PATH 环境变量在 sudo 时被覆盖掉了。

解决

方法一:简单的临时解决办法

编辑 ~/.bashrc,添加下面这行:

1
alias sudo="sudo env PATH=$PATH"

这个办法是在执行 sudo 时套用上当前的 $PATH 的值来达到目的。

方法二:另一个临时解决办法

编辑 etc/sudoers,添加下面这行:

1
Defaults secure_path="/bin:/usr/bin:/usr/local/bin:…"

方法三:根本解决办法

重新编译安装 sudo,不带 -–with-secure-path 参数。

修改 MySQL 的 root 密码

使用 mysqladmin 命令

  1. root 尚未设置过密码的情况
1
mysqladmin -u root password "newpassword"
  1. root 已经设置过密码的情况
1
mysqladmin -u root password oldpassword "newpassword"

使用 MySQL 内的 set password 命令

1
2
3
mysql -u root -p
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpassword');

直接修改 user 表数据

1
2
3
4
5
mysql -u root -p
mysql> use mysql;
mysql> UPDATE `user` SET `password`=PASSWORD('newpassword') WHERE `user`='root';
mysql> FLUSH PRIVILEGES;

Spring 内置的 multipart 文件上传支持

Spring build-in multipart fileupload support

Spring 内置了对 web 应用 multipart(文件上传) 的支持,即通过可拔插的 MultipartResolver 对象实现对 multipart 的处理。该对象定义在 org.springframework.web.multipart 包内,它是按照 RFC 1867 设计的一个策略接口,自 Spring 2.5 开始,Sping 内包含了一个它的具体实现类,即 org.springframework.web.multipart.commons.CommonsMultipartResolver,该实现类是建立在 Jakarta Commons FileUpload 基础上的,因此在使用时需要引入对 ‘commons-fileupload.jar’ 的依赖。

默认情况下,Spring 是不对 multipart 进行处理的,你可以在你的 web 应用上下文配置中添加一个 MultipartResolver 的实现来启用对 multipart 的支持,这样容器就会对每个请求进行检查,如果发现请求包含了 multipart 数据,就会使用配置的 MultipartResolver 实现来对请求进行处理。

MultipartResolver 的用法

下面例子演示了如何使用 Sping 自带的实现类 CommonsMultipartResolver 来启用 multipart 处理,在 Spring 应用上下文中添加如下配置:

1
2
3
4
5
6
7
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- one of the properties available, the maximum file size in bytes, here is 100KB -->
<property name="maxUploadSize" value="100000"/>
</bean>

添加了该配置,当 Spring 的 DispatcherServlet 收到包含 multipart 的请求后,配置的 MultipartResolver 就会被调用来处理这类请求,它会将当前的 HttpServletRequest 包装成一个 MultipartHttpServletRequest 来支持 multipart 的处理。从 MultipartHttpServletRequest 中你可以获取到 multipart 的数据内容,从而让你的 Controller 能够直接访问请求中包含的文件。

处理表单上传文件请求示例

假设我们创建的表单页面如下:

1
2
3
4
5
6
7
8
9
10
<html>
<head><title>File Upload</title></head>
<body>
<form method="post" action="upload.do" enctype="multipart/form-data">
<input type="text" name="fileName" />
<input type="file" name="fileData" />
<input type="submit" />
</form>
</body>
</html>

我们给 form 标签添加了 enctype 属性,其值为 multipart/form-data,该属性是用来告知浏览器用什么方法对 multipart 字段内容进行编码。

阅读全文

在 CentOS5.3 上安装 Tomcat6 记录

为 Tomcat 创建专门的用户

考虑到安全问题,不建议用 root 用户运行 Tomcat,所以我们为 Tomcat 创建一个独立用户,

1
2
$ sudo useradd -d /usr/local/tomcat6 -s /sbin/nologin
$ sudo chown -R tomcat:tomcat /usr/local/tomcat6

安装和配置 JDK1.6

从 Oracle 下载 jdk-6u45-linux-x64.bin,拷贝到 /usr/local/jdk 下,

1
2
$ sudo chmod +x jdk-6u45-linux-x64.bin
$ sudo ./jdk-6u45-linux-x64.bin

会生成路径 /usr/local/jdk/jdk1.6.0_45,jdk文件都在其中。

安装和配置 Tomcat6

从 Apache 下载 apache-tomcat-6.0.37.tar.gz,

1
2
3
4
$ sudo tar zxvf apache-tomcat-6.0.37.tar.gz
$ sudo cp apache-tomcat-6.0.37/* /usr/local/tomcat6
$ sudo cd /usr/local/tomcat6
$ sudo chown -R tomcat:tomcat .

编辑环境变量

1
2
$ sudo vim /etc/profile

export PATH USER ... 上方添加以下变量声明,

1
2
3
4
5
JAVA_HOME=/usr/local/jdk/jdk1.6.0_45
JRE_HOME=/usr/local/jdk/jdk1.6.0_45/jre
CLASS_PATH=.:$JAVA_HOME/lib
CATALINA_HOME=/usr/local/tomcat6
CATALINA_BASE=$CATALINA_HOME

并在 export 后面追加新的内容,如下,

1
2
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL JAVA_HOME CATALINA_HOME
export PATH=$PATH:/usr/local/bin:$JAVA_HOME/bin

使环境变量生效,

1
$ source /etc/profile

阅读全文

使用 Spring 3 构建基于 HTTP 的RESTful Web Services

本文不讲述 RESTful Web Services 的概念和理论,你需要了解什么是 RESTful Web Services。

本文不讲述 Spring Framework 的使用和技巧,你需要熟悉 Spring Framework 和 Spring MVC。

本文内容主要是简单说明使用 Spring 3 来构建一个简易的 RESTful Web Service 相关内容。

Spring 自版本3开始增加了对 RESTful Web Services 开发的支持,且 REST 已被无缝整合到了 Spring 的 MVC 框架中,因此在 Spring 中创建 RESTful Web Services 是十分容易的。这主要体现在:

  • 通过 @RequestMapping, @PathVariable, @RequestBody, @ResponseBody 等注解(Annotation)可以简单的创建资源标识和URI映射
  • 丰富的数据载体支持,比如 XML、JSON
  • 完全采用 Spring MVC 模型进行开发,使用 Spring 开发的应用可无缝过渡到 REST


下面通过一个例子来说明使用 Spring 3 创建一个 RESTful Web Service 需要的操作。

对于本例的几点说明:

  1. 通信协议为 HTTP 协议;
  2. 参数类型为 JSON 格式;
  3. 例子中的代码均采用省略的写法,只写出需要注意的部分;

代码依赖

  • spring-webmvc
  • jackson-core-asl
  • jackson-mapper-asl

如果使用 Maven 的话可以参考如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>


Java 实现

本例中我们假设只有一个 Entity 对象 Customer,实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
package demo.rest.model;
public class Customer {
private long id;
private String name;
private String mobile;
private String address;
private String email;
// omit implementation of Getters and Setters below
// ......
}


同时,针对 Customer 的持久化操作实现 CustomerRepository 大致如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package demo.rest.repo;
public class CustomerRepository {
public Customer query(long id) {
// omitted
}
public List<Customer> queryAll() {
// omitted
}
public void add(Customer customer) {
// omitted
}
public void update(Customer customer) {
// omitted
}
public void remove(long id) {
// omitted
}
}



阅读全文