存档在 2015年7月

两难全

2015年7月30日

你说你 从来未爱恋过
但很珍惜 跟我在消磨
我笑我 原来是我的错
裂开的心 还未算清楚
如此天真 竟得我一个
付出的心 你收不到麽
如果你知我苦衷 何以没一点感动
谁想到这样凝望你 竟看不到认同
明知我心里苦衷 仍放任我做好梦
难得你这个朋友 极陶醉 但痛
你笑我 为何没答一句
像不开心 心里在想谁
我说你 为何没法猜对
未得到的 从未怕失去
如此相亲 竟不算一对
从不相恋 怎麽可再追
如果你知我苦衷 何以没一点感动
谁想到这样凝望你 竟看不到认同
明知我心里苦衷 仍放任我做好梦
难得你这个朋友 极陶醉 但痛
如果你知我苦衷 何以没一点感动
谁想到这样凝望你 竟看不到认同
明知我心里苦衷 仍放任我做好梦
难得你这个朋友 极陶醉 但痛

今天,我很想你。名字在心里摸不去。心里尽是你,怎容他人。孤单是一个人的决绝,听黄耀明的音乐,心里变得幸福。或许所有的音乐、艺术、文学都尽属于忧伤孤寂的灵魂。他们在人间截取人情温红的小煤球,以不断燃烧起人间的希望,对天国的梦想。
没有理由破坏你的幸福快乐。所以只好快乐和你分享,忧伤自己体谅。那舍得你痛苦烦愁,每次贪心的时候,看到两难的绝境就只得如此了。如何守候你,守候一个人的承诺。这守候的距离需要何等小心翼翼的心思,思前想后的考量。
不论最后是怎样的结局,我总是相信现在和将来,你我都是幸福的。不论今天多么痛楚,我相信这也是基督给我的考验,和体行。他们让我此刻饱满,将来强大。之前走来的路上,同样的跌跌撞撞,事到如今,才发现自己确实一次次的爱得深沉了。是自己的收获,何以嫉妒纷扰。
亲爱的,你在你的幸福里。我在我的思恋心疼中看着开心。

如若有一天我也得到爱情,我定会停下来静静的用心体会——人间如此难得的真意。一息尚存的生命,我们在为什么竭尽全力。这真心真意的情爱还不足以。我们竭力找认同,找无数的另一个自己。为何不停下来想想看看自己,和自己聊上一夜。爱,需要看到自己所拥有的,也看到自己不足的,然后找来他弥补了自己的不足,贡献了自己的全部,如此相爱。
如果漫天的繁星可以看看我与我低语,我是不是就不那么寂寞。
如果划过耳边的风可以聆听我的声音,是不是风儿也就可以为远方的另一个我带去寻觅的信息。
如果风儿带我飞,繁星为我护航,让我漫游天际,忧伤的我也就可以欢愉。
流动的风,飘摇的云。欢喜时你们太多变,忧伤时你们太虚渺。

这是一个怎样的时代,快乐忧伤都来去匆忙,悠长的人生尽多是荒茫空白,了无生趣的乏味。大家被转瞬的繁荣,千古的争斗,层级的道德所困其中。其实生命的美丽不是表面的浮云,也非别人眼中的华丽。。。每个人应该都有他与宇宙连接的门,当他得到此门或找到寻觅其的正确方向时,他应该就拥有了永恒的青春幸福。只是这个时代,烟云太重,难寻觅。

亲,天下的事情为何总是两难全。我总是被情绪左右做些傻事情。对不起。
如此深情的热爱这片土地!如此深切的呼喊着血气模糊的众生。

Java加密算法-示例

2015年7月29日

加密类:

import java.security.MessageDigest;
 
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
 
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
 
/**
 * 基础加密组件
 * 
 */
public abstract class Coder {
    public static final String KEY_SHA = "SHA";
    public static final String KEY_MD5 = "MD5";
 
    /**
     * MAC算法可选以下多种算法
     * 
     * <pre>
     * HmacMD5 
     * HmacSHA1 
     * HmacSHA256 
     * HmacSHA384 
     * HmacSHA512
     * </pre>
     */
    public static final String KEY_MAC = "HmacMD5";
 
    /**
     * BASE64解密
     * 
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] decryptBASE64(String key) throws Exception {
        return (new BASE64Decoder()).decodeBuffer(key);
    }
 
    /**
     * BASE64加密
     * 
     * @param key
     * @return
     * @throws Exception
     */
    public static String encryptBASE64(byte[] key) throws Exception {
        return (new BASE64Encoder()).encodeBuffer(key);
    }
 
    /**
     * MD5加密
     * 
     * @param data
     * @return
     * @throws Exception
     */
    public static byte[] encryptMD5(byte[] data) throws Exception {
 
        MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
        md5.update(data);
 
        return md5.digest();
 
    }
 
    /**
     * SHA加密
     * 
     * @param data
     * @return
     * @throws Exception
     */
    public static byte[] encryptSHA(byte[] data) throws Exception {
 
        MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
        sha.update(data);
 
        return sha.digest();
 
    }
 
    /**
     * 初始化HMAC密钥
     * 
     * @return
     * @throws Exception
     */
    public static String initMacKey() throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
 
        SecretKey secretKey = keyGenerator.generateKey();
        return encryptBASE64(secretKey.getEncoded());
    }
 
    /**
     * HMAC加密
     * 
     * @param data
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] encryptHMAC(byte[] data, String key) throws Exception {
 
        SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());
        mac.init(secretKey);
 
        return mac.doFinal(data);
 
    }

测试类:
import static org.junit.Assert.*;
import org.junit.Test;
public class CoderTest {
@Test
public void test() throws Exception {
String inputStr = “简单加密”;
System.err.println(“原文:\n” + inputStr);

byte[] inputData = inputStr.getBytes();
String code = Coder.encryptBASE64(inputData);

System.err.println(“BASE64加密后:\n” + code);

byte[] output = Coder.decryptBASE64(code);

String outputStr = new String(output);

System.err.println(“BASE64解密后:\n” + outputStr);

// 验证BASE64加密解密一致性
assertEquals(inputStr, outputStr);

// 验证MD5对于同一内容加密是否一致
assertArrayEquals(Coder.encryptMD5(inputData), Coder
.encryptMD5(inputData));

// 验证SHA对于同一内容加密是否一致
assertArrayEquals(Coder.encryptSHA(inputData), Coder
.encryptSHA(inputData));

String key = Coder.initMacKey();
System.err.println(“Mac密钥:\n” + key);

// 验证HMAC对于同一内容,同一密钥加密是否一致
assertArrayEquals(Coder.encryptHMAC(inputData, key), Coder.encryptHMAC(
inputData, key));

BigInteger md5 = new BigInteger(Coder.encryptMD5(inputData));
System.err.println(“MD5:\n” + md5.toString(16));

BigInteger sha = new BigInteger(Coder.encryptSHA(inputData));
System.err.println(“SHA:\n” + sha.toString(32));

BigInteger mac = new BigInteger(Coder.encryptHMAC(inputData, inputStr));
System.err.println(“HMAC:\n” + mac.toString(16));
}
}

测试结果:

原文:
简单加密
BASE64加密后:
566A5Y2V5Yqg5a+G

BASE64解密后:
简单加密
Mac密钥:
uGxdHC+6ylRDaik++leFtGwiMbuYUJ6mqHWyhSgF4trVkVBBSQvY/a22xU8XT1RUemdCWW155Bke
pBIpkd7QHg==

MD5:
-550b4d90349ad4629462113e7934de56
SHA:
91k9vo7p400cjkgfhjh0ia9qthsjagfn
HMAC:
2287d192387e95694bdbba2fa941009a

注意
编译时,可能会看到如下提示:

引用

警告:sun.misc.BASE64Decoder 是 Sun 的专用 API,可能会在未来版本中删除

import sun.misc.BASE64Decoder;
^
警告:sun.misc.BASE64Encoder 是 Sun 的专用 API,可能会在未来版本中删除

import sun.misc.BASE64Encoder;
^

BASE64Encoder 和BASE64Decoder是非官方JDK实现类。虽然可以在JDK里能找到并使用,但是在API里查不到。JRE 中 sun 和 com.sun 开头包的类都是未被文档化的,他们属于 java, javax 类库的基础,其中的实现大多数与底层平台有关,一般来说是不推荐使用的。

MyEclipse优化方案

2015年7月24日

1、myeclipse字体设置
Window->Preferences->General->Appearance->Colors and Fonts
在右侧找到”Aa Test Font”双击或者点击Edit按钮修改字体;建议字体设置如下:Courier New字体常规四号

2、Myeclipse编码方式(JSP+Text)
设置JSP编码格式
Window->Preferences->MyEclipse->Files and Editors->JSP->Encoding->UTF-8
设置其他文本编码格式
Window->Preferences->General->Workspace->Text file encoding->Other->UTF-8

3、Myeclipse自动文本验证
Window->Preferences->MyEclipse->Validation
保留manual(手动)部分,build下只留”classpath dependencyValidator”,手动验证:选中文件右击MyEclipse->Run Validation
» 阅读更多: MyEclipse优化方案

记四川师范大学教师岗位培训几天生活

2015年7月23日

19号上午11点半出发,坐野的,到新区41栋接刘洋,1点半坐火车到达成都,再1个半小时到达川师大。20号开始了正式的岗培生活。

1.#####

这几天挺闲的,不太习惯在成都的生活,在绵阳、在西科大呆惯了,还是喜欢西科大的一切。宿舍几个老师也挺好接触的,大家相处都很愉快,我觉得对于我来说这是一个很好与人交流的渠道,我算一个不折不扣的没进入社会的青年,从学校到学校,从学生到教师,我觉得我没有什么变化,还是那么单纯、不成熟,也想自己能够变得老练、圆滑、富有心计,但是发现这真不是我。

2.@@@@@

虽然自己已经上了一年的课了,但是在公众场合还是紧张、怯场,但是我觉得比起一年前我进步还是挺大的,尤其在说话调理上,我觉得我进步了很多,得益于平时上课的锻炼。希望在接下来的日子里自己能够进步多多,也不枉费在这里的一月时间。今天上课,老师问有没有上课后能记得所有学生的名字,我觉得这点我做到了,至少我带的《C++程序设计》《软件技术基础》这两门课的百号人,我基本都能叫出名字,甚至很多人和我做了朋友。老师还提问一个优秀的大学老师是什么样子的?我举手回答了,给的答案是“能教书、会育人、搞得了科研,能够和领导处好关系”,这是我一年工作来的经验,也是我实实在在的体会,但是重要性并不是我给出的顺序,而是逆序。但是我做得并不好。

2.*****

心里蛮不放心的,项目、上学期试卷成绩还需要进一步整理、下学期《微机》原理备课,感觉很多事情都去做,但是目前又提不起精神,等到开学又够我忙了。

Java加密算法-BASE64

2015年7月20日

如基本的单向加密算法:

  • BASE64 严格地说,属于编码格式,而非加密算法
  • MD5(Message Digest algorithm 5,信息摘要算法)
  • SHA(Secure Hash Algorithm,安全散列算法)
  • HMAC(Hash Message Authentication Code,散列消息鉴别码)

复杂的对称加密(DES、PBE)、非对称加密算法:

  • DES(Data Encryption Standard,数据加密算法)
  • PBE(Password-based encryption,基于密码验证)
  • RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)
  • DH(Diffie-Hellman算法,密钥一致协议)
  • DSA(Digital Signature Algorithm,数字签名)
  • ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)

 

BASE64
按 照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。
20140412114509_299

/**
     * BASE64解密
     * 
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] decryptBASE64(String key) throws Exception {
        return (new BASE64Decoder()).decodeBuffer(key);
    }
 
    /**
     * BASE64加密
     * 
     * @param key
     * @return
     * @throws Exception
     */
    public static String encryptBASE64(byte[] key) throws Exception {
        return (new BASE64Encoder()).encodeBuffer(key);
    }

主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。另,BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。

BASE64的加密解密是双向的,可以求反解。
MD5、SHA以及HMAC是单向加密,任何数据加密后只会产生唯一的一个加密串,通常用来校验数据在传输过程中是否被修改。其中HMAC算法有一个密钥,增强了数据传输过程中的安全性,强化了算法外的不可控因素。
单向加密的用途主要是为了校验数据在传输过程中是否被修改。

对Json进行格式化缩进

2015年7月17日

如果不对Json进行缩进格式化,看起来非常吃力,因此对Json进行格式化缩进后则调试变得容易,缩进后如下所示。

[
  {
    "id": 100,
    "topicIsReposted": 0,
    "topicTitle": "User1_NodeId1",
    "topicContent": "User1_NodeId1_CONTENT",
    "topicPublishTime": 0,
    "topicModifyTime": 0,
    "topicIsTop": false,
    "topicIsGood": false,
    "topicIsEnabled": false,
    "topicReplyNums": 0,
    "topicViewNums": 0,
    "topicLikeNums": 0,
    "topicHateNums": 0,
    "user": {
      "id": 1,
      "userName": "user1",
      "userSex": false,
      "userUrl": "/u/1",
      "userRegisterTime": 0,
      "attrs": {}
    },
    "node": {
      "id": 2,
      "nodeName": "This is Node1",
      "nodeTopics": 0,
      "nodeAvatarMini": "/images/node/avatar/mini.png",
      "nodeAvatarNormal": "/images/node/avatar/normal.png",
      "nodeAvatarLarge": "/images/node/avatar/large.png"
    }
  }
]

实现:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
	String json = gson.toJson(obj);
	System.out.println(json);

另外需要google gson,下载后天就到WEB-INF/lib下,再添加external lib即可使用。
gson

MySQL Workbench建表时 PK NN UQ BIN UN ZF AI 的含义

2015年7月16日

PK
Belongs to primary key
作为主键

NN
Not Null
非空

UQ
Unique index
不能重复

BIN
Is binary column
存放二进制数据的列

UN
Unsigned data type
无符号数据类型(需要整数形数据)

ZF
Fill up values for that column with 0’s if it is numeric
填充0位(例如指定3位小数,整数18就会变成18.000)

AI
Auto Incremental
自增长

Jfinal Json测试

2015年7月13日

首先定义一个实体类User用于测试,还有一个Info类。

package com.demo.bean;

public class Info {
	public int id;
	public String addr;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	public String getSchool() {
		return school;
	}
	public void setSchool(String school) {
		this.school = school;
	}
	public String school;
}
package com.demo.bean;

import java.util.ArrayList;
import java.util.List;

public class User {

	private static final long serialVersionUID = 1L; 
	  public int id;
	  public String name;
	  public String title;
	  public List<Info> info = new ArrayList<Info>();

	public List<Info> getInfo() {
		return info;
	}
	public void setInfo(List<Info> info) {
		this.info = info;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
}

在IndexController中展开测试:
1.

		user.id = 1;
		user.name = "Creater";//or set
		user.title = "Love Linux";
		user.info.setAddr("四川绵阳");
		user.info.setId(2);
		user.info.setSchool("SWUST");
		setAttr("user",user);
		renderJson();

测试结果:

{"user":{"id":1,"title":"Love Linux","name":"Creater","info":{"id":2,"school":"SWUST","addr":"四川绵阳"}}}

2.

		User user = new User();
		user.id = 1;
		user.name = "Creater";//or set
		user.title = "Love Linux";
		user.info.setAddr("四川绵阳");
		user.info.setId(2);
		user.info.setSchool("SWUST");
		setAttr("user",user);
		
		User user1 = new User();
		user1.id = 1;
		user1.name = "Creater1";//or set
		user1.title = "Love Linux1";
		user1.info.setAddr("四川绵阳1");
		user1.info.setId(2);
		user1.info.setSchool("SWUST1");
		setAttr("user1",user1);
		renderJson();

测试结果:

{"user1":{"id":1,"title":"Love Linux1","name":"Creater1","info":{"id":2,"school":"SWUST1","addr":"四川绵阳1"}},"user":{"id":1,"title":"Love Linux","name":"Creater","info":{"id":2,"school":"SWUST","addr":"四川绵阳"}}}

3.

		setAttr("user","creater");
		setAttr("name","renzhenwen");
		renderJson(new String[]{"user","name"});

测试结果:

{"name":"renzhenwen","user":"creater"}

4.

		user.id = 1;
		user.name = "Creater";//or set
		user.title = "Love Linux";
		user.info.setAddr("四川绵阳");
		user.info.setId(2);
		user.info.setSchool("SWUST");
		renderJson(user);

测试结果:

{"id":1,"title":"Love Linux","name":"Creater","info":{"id":2,"school":"SWUST","addr":"四川绵阳"}}

4.

renderJson("{\"age\":18} ");

测试结果:

{"age":18} 

4.

User user = new User();
		
		user.id = 1;
		user.name = "Creater";//or set
		user.title = "Love Linux";
		for(int i = 0; i < 3; ++i){
			Info info = new Info();
			info.setAddr("四川绵阳"+i);
			info.setId(i);
			info.setSchool("SWUST"+i);
			user.info.add(info);
		}
		setAttr("user",user);
		renderJson();

测试结果:

{"user":{"id":1,"title":"Love Linux","name":"Creater","info":[{"id":0,"school":"SWUST0","addr":"四川绵阳0"},{"id":1,"school":"SWUST1","addr":"四川绵阳1"},{"id":2,"school":"SWUST2","addr":"四川绵阳2"}]}}

5.

		User user = new User();
		
		user.id = 1;
		user.name = "Creater";//or set
		user.title = "Love Linux";
		for(int i = 0; i < 3; ++i){
			Info info = new Info();
			info.setAddr("四川绵阳"+i);
			info.setId(i);
			info.setSchool("SWUST"+i);
			user.info.add(info);
		}
		renderJson("test",user);

测试结果:

{"test":{"id":1,"title":"Love Linux","name":"Creater","info":[{"id":0,"school":"SWUST0","addr":"四川绵阳0"},{"id":1,"school":"SWUST1","addr":"四川绵阳1"},{"id":2,"school":"SWUST2","addr":"四川绵阳2"}]}}

jfinal_demo