0%

最近在用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

在小端机器上验证得到,  在一个字节内部,  低位放在靠近低地址这个方向上。大端方式的高位靠近低地址方向存放。

http://blog.csdn.net/ce123_zhouwei/article/details/6971544

前不久,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,防止连接中断对升级的影响。基本上按照步骤进行就可以升级成功。