最近在用Spring MVC做一个Restful的Web Service,在HTTP的各类method中,除了非常常用的GET和POST之外,还有PUT、DELETE、PATCH等可以使用。这次遇到问题的是PUT方法,在REST风格中,PUT一般表示对原有资源的修改,但是在CLIENT端编程发出PUT请求后,却总是会遇到400错误,在用另外一个REST测试工具(IDEA中集成)的时候却一切正常。
分析了一下原因,发现几点:
最近在用Spring MVC做一个Restful的Web Service,在HTTP的各类method中,除了非常常用的GET和POST之外,还有PUT、DELETE、PATCH等可以使用。这次遇到问题的是PUT方法,在REST风格中,PUT一般表示对原有资源的修改,但是在CLIENT端编程发出PUT请求后,却总是会遇到400错误,在用另外一个REST测试工具(IDEA中集成)的时候却一切正常。
分析了一下原因,发现几点:
在Gradle的官方网站,学习的话首要看的是User Guide,其次就是DSL Reference,我觉得后者其实更加重要,前者的内容比较基础,示例也比较精简,所以推荐到DSL里去看示例。
例如关于任务类型Copy和Exec的介绍。
task stopTomcat(type:Exec) { workingDir '../tomcat/bin' //on windows: commandLine 'cmd', '/c', 'stop.bat' //on linux commandLine './stop.sh' //store the output instead of printing to the console: standardOutput = new ByteArrayOutputStream() //extension method stopTomcat.output() can be used to obtain the output: ext.output = { return standardOutput.toString() } }
这个示例就很好的介绍了在Gradle中如何执行外部命令。
Liu Xi:
You will never know how many time I met with you in my dream, even like last night.
I really want to be together with you, just like back in my childhood. You can’t imagine,
when I was really bold enough to say your name in front of the class and our teacher. I
know what your really name is, of course I know. I can’t just mention your really name any
more. I’m so sorry. Even in my dream, that’s just one day.I ran after you, I know your face,
it’s still like 20 years ago. I really wish you could stay with me for a little longer. But
I can’t find you in the end and I was back at my college.
Still like the past, if I could choose again, I would choose to stay with you all. It’s not
my choise, and I could not blame my father. And now, I know you are married, you have a happy
life. And I know it’s better that way than with me.
I wish I could meet you again in my dream.
Best Wishes
Farewell
Yours,
Lei
2015/5/21
最近使用Gradle来构建一个Spring Project,相比于传统的maven,Gradle确实有不少优点,但由于Gradle是基于Groovy语音,初用起来还是有许多不熟悉的地方,其实在简单的使用时,IDE会帮我们完成build.gradle中大多数的内容,我们也就可以直接完成构建构成了,再加上我的项目使用了Spring-boot,加上Gradle插件后,并不需要自己去写太多的脚本。总之,即使你没接触过maven,Gradle也是很容易使用和上手的。
今天遇到的一个问题,就是在脚本中判断你当前使用的操作系统,因为我这里要设置Tomcat的路径,在windows和Linux之间还是有很大区别的,基本方法如下:
利用ant
ant.condition(property: "os", value: "windows") { os(family: "windows") } ant.condition(property: "os", value: "unix" ) { os(family: "unix") } task checkOS << { switch(ant.properties.os){ case 'windows': println 'This is windows.' break case 'unix': println 'This is unix.' break } }
import org.apache.tools.ant.taskdefs.condition.Os task checkWin() << { if (Os.isFamily(Os.FAMILY_WINDOWS)) { println "WINDOWS " } }
利用系统属性
task checkOS << { if (System.properties['os.name'].toLowerCase().contains('windows')) { println "it's Windows" } else { println "it's not Windows" } }
查看内核版本号
cat /proc/version Linux version 3.2.0-29-generic (buildd@allspice) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #46-Ubuntu SMP Fri Jul 27 17:03:23 UTC 2012
uname -a Linux 3.2.0-29-generic #46-Ubuntu SMP Fri Jul 27 17:03:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
查看Linux发行版的相关信息
lsb_release-a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.2 LTS Release: 14.04 Codename: trusty
cat /etc/issue Ubuntu 14.04.2 LTS \n \l
JavaScript的new Date(),传入格式化日期参数,在Firefox中会比较严格,例如以下代码
var date = new Date("2015-4-30");
在Chrome下运行成功,在Firefox下则是“Invalid Date”。
显然以下代码才是标准的格式
var date = new Date("2015-04-30");
或者
var date = new Date("2015/4/30");
之前看了一篇文章,讲5个比较优秀的Java项目,文章虽然比较老,但是对里面的Neo4J,Gradle和JRebel都有了不少了解。
最近开发一个Java Web项目,经常需要部署到Tomcat上进行调试,但是每次修改代码或者配置文件后,都需要重新部署并重启Tomcat容器,实在是很浪费时间的一项操作。于是决定尝试一下JRebel,实现热部署,对程序的修改可以直接反应在部署的程序上。
可惜的是,JRebel是一个收费软件,个人可以申请30天的免费试用,可以使用myJRebel,https://my.jrebel.com/,是JRebel的一个社区计划,会要求你允许分享一些使用信息,在这里可以免费申请一个key,但需要定期联网激活。
JRebel对各种IDE都有相应的插件,使用起来非常方便,具体的信息可以查看http://zeroturnaround.com/software/jrebel/learn/。选择JRebel monitor的项目,并在Tomcat server中配置使用即可。启动Tomcat后可以看到JRebel的信息,例如
2015-04-30 10:26:45 JRebel: 2015-04-30 10:26:45 JRebel: ############################################################# 2015-04-30 10:26:45 JRebel: 2015-04-30 10:26:45 JRebel: JRebel Agent 6.1.2 (201504061000) 2015-04-30 10:26:45 JRebel: (c) Copyright ZeroTurnaround AS, Estonia, Tartu. 2015-04-30 10:26:45 JRebel: 2015-04-30 10:26:45 JRebel: Over the last 6 days JRebel prevented 2015-04-30 10:26:45 JRebel: at least 166 redeploys/restarts saving you about 6.7 hours. 2015-04-30 10:26:45 JRebel: 2015-04-30 10:26:45 JRebel: Licensed to Mingshan Lei (using myJRebel). 2015-04-30 10:26:45 JRebel: 2015-04-30 10:26:45 JRebel: 2015-04-30 10:26:45 JRebel: ############################################################# 2015-04-30 10:26:45 JRebel:
使用效果确实非常好,JRebel支持许多框架,常用的Spring、myBatis、Struts等等,可以monitor这些框架的配置文件,修改之后会在控制台显示提示信息,Reload class或者Reload SQL map等,确实可以节约许多用于部署的时间。
#include <stdio.h> int main() { printf("Hello World\n"); return 0; }
测试一下这个代码显示插件,Crayon Syntax Highlighter是我在wordpress使用过的最好用方便的代码插件,推荐使用。
#include <stdio.h> /* 关于字节序: 对于一个整数0x12346=5678,在内存中占4个字节 从低地址开始,每个字节分别存的是 12,34,56,78就说明是大端CPU; 用于网络编程,JAVA 从低地址开始,每个字节分别存的是 78,56,34,12就说明是小端CPU; x86架构是小端 下面判断在内存的单个字节中二进位是按什么顺序排的? */ //定义位域 typedef struct bit_field { unsigned char b0:1; //b0指向低地址那一端的第一位,b1、b2依次排列下去 unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char b4:1; unsigned char b5:1; unsigned char b6:1; unsigned char b7:1; }BIT_FIELD; int main() { int i = 0xFF00001B; //小端存放方式 1B 00 00 FF BIT_FIELD * p = ( BIT_FIELD * )&i; // p指向 1B printf("%u ",p->b0); printf("%u ",p->b1); printf("%u ",p->b2); printf("%u ",p->b3); printf("%u ",p->b4); printf("%u ",p->b5); printf("%u ",p->b6); printf("%un",p->b7); getchar(); return 0; }
输出结果:1 1 0 1 1 0 0 0
在小端机器上验证得到, 在一个字节内部, 低位放在靠近低地址这个方向上。大端方式的高位靠近低地址方向存放。
前不久,Ubuntu的长期支持版LTS已经发布了14.04,本站搭建在基于Xen的Linode VPS上,最开始创建系统时选择的是Ubuntu12.04,在VPS中有rebuild的选项可以帮助你重装系统,直接安装最新的Ubuntu14.04,但是数据会丢失,备份和恢复比较费时。其实这里完全可以自己升级,Linode VPS支持我们自己升级内核和整个Linux的系统版本。对于其他的VPS,最好询问一下是否支持这样的升级。
为了数据安全,请在升级前对自己的数据进行完全备份。我这里采用了Linode的Backup服务,基础收费是每月5刀,可以定时或者手动对系统做快照进行备份。
Ubuntu的升级命令很简单,如下所示(需要sudo或root权限):
# apt-get update # apt-get upgrade # do-release-upgrade -d
升级过程中请一定遵照系统的提示,例如系统会新建一个ssh daemon,防止连接中断对升级的影响。基本上按照步骤进行就可以升级成功。