置顶随笔

[置顶]play framework之事务管理

摘要: play!中持久层采用jpa,它的事务管理不需要用户进行控制:Play will automatically manage transactions for you. It will start a transaction for each HTTP request and commit it when the HTTP response is sent. If your code throws an exception, the transaction will automatically rollback.但是只限制在它本身的一个线程内。有时候,我们需要自己另外重起一个线程(可以理解为:不阅读全文

posted @ 2011-12-31 12:59 左手写 阅读(220) 评论(0) 编辑

[置顶]openflashchart2柱状图&饼状图的数据结构

摘要: 1. 柱状图所需要的数据格式举例柱状图数据格式/** open flash chart 所需要的标准数据格式及属性 { y_axis: { max: 29.158804 steps: 4.158804 } y_legend: { text: "s" style: "{font-size: 20px; color:#FF0000;}" } bg_colour: "#FFFFFF" offset: 5 x_axis: { co...阅读全文

posted @ 2011-11-24 11:26 左手写 阅读(275) 评论(0) 编辑

2012年3月13日

java card 常用包

声明:转自-http://blog.csdn.net/chendf_20

整理了一下常用到的Java卡开发包里的方法,以后就能加快开发速度了。

//Java Card开发方法查询
import java.lang.*;
import javacard.framework.*;
import javacard.security.*;
import javacardx.crypto.*;     //该包为扩展包

//install方法
public static void install(byte[] bArray, short offset, byte length)
{
new wallet().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}


/************************************************************************************/
//建立类JCSystem中的临时数组的方法
/*每个方法调用中的第一个参数 length 指出所请求的临时数组的长度。
第二个参数 event 指出哪种事件清除该对象。因此,方法调用指出临
时数组的类型,CLEAR_ON_RESET 或CLEAR_ON_DESELECT。
*/
//建立一个临时布尔数组
Public static boolean[] MakeTransientBooleanArray(short length,byte event);

//建立一个临时字节数组
Public static byte[] MakeTransientByteArray(short length,byte event);

//建立一个临时short数组
Public static short[] MakeTransientShortArray(short length,byte event)

//建立一个临时对象数组
Public static object[] MakeTransientObjectArray(short length,byte event)

/*
方法 isTransient 返回一个临时类型常数(CLEAR_ON_RESET 或 CLEAR_ON_DESELECT),
或者返回常数 JCSystem.NOT_A_TRANSIENT_OBJECT 指出该对象是 null 或者是一个永久对象
*/
public static byte isTransient(Object theObject);


/************************************************************************************/
//原子性
/*
Util.arrayCopy方法保证要么所有的字节被正确地拷贝,要么目标数组被恢复为其原来的字节值。
如果该目标数组是临时的,就不具有原子特性。
*/
public static short arrayCopy(byte[] src,short srcOff,byte[] dest,short desOff,short length);

//方法arrayCopyNonAtomic在拷贝操作过程中不使用事务设施,即使一个事务正在执行之中。
public static short arrayCopyNonAtomic(byte[] src,short srcOff,byte[] dest,short desOff,short length);

//用指定的值填入一个字节数组的诸元素:
public static short arrayFillNonAtomic(byte[] bArray,short bOff,short bLen,byte bValue);


//事务的提交
//开始一个交易
JCSysten.beginTransaction();
//在该交易提交之前,一组永久数据的修改中的全部修改都是暂时的
//提交一个事物
JCSysten.commitTransaction();

//返回一个commit buffer中的字节总数
JCSystem.getMaxCommitCapacity();
//返回在该commit buffer中剩下未用的字节数
JCSystem.getUnusedCommitCapacity()


/************************************************************************************/
javacard.framework.Applet 中的方法
//JCRE调用这个静态方法建立Applet子类的一个实例
Public static void Install(byte[] bArray,short bOffset,byte bLength)
//示例
public class WalletApp extends Applet{
private log transaction_log;
private byte[] wallet_id;
private byte wallet_balance;
public static void install(byte[] bArray, short bOffset,byte bLength){

   new WalletApp();

}
private WalletApp(){
   //建立一个具有指定事物记录数的事物日志
   transaction_log = new Log(TRAN_RECORD_NUM);
   //建立一个字节数组用以存储钱包wallet的ID
   wallet_id = new byte[ID_LENGTH];
   //初始化钱包wallet的余额
   wallet_balance = INITIAL_BALANCE;
   //向JCRE注册该applet实例
   register();
}
}

//安装参数处理示例
private walletApp(byte[] bArray,short bOffset,byte bLength){
//建立一个事物日志并指出最大的日志记录数 max_record_num = bArray[bOffset]
transaction_log = new Log(bArray[bOffset++]);
//设置钱包ID
wallet_ID = new byte[ID_LENGTH];
Util.arrayCopy(bArray,bOffset,wallet_id,(byte)0,ID_LENGTH);
//bOffset前进ID_LENGTH个字节
bOffset += ID_LENGTH;
//初始化钱包余额
wallet_balabce = bArray[bOffset++];
//检查AID
byte AID_len = bArray[bOffset++];
if (AID_len = =0){
      //利用缺省AID向LCRE注册applet实例
      this.register();
}else{
      //利用安装参数中指出的AID向JCRE注册applet实例
      //bArray中的AID字节从索引bOffset开始,由AID_len个字节组成
      this.register(bArray,bOffset,AID_len);
}
}


//该方法由applet用来向JCRE注册本applet实例并指定CAP文件中的缺省AID给本applet实例
Protected final void Register()

//该方法由applet用来向JCRE注册本applet实例并将数组bArray中指出的AID赋予该applet实例。
Protected final void Register(byte[] bArray,short bOffset,byte bLength)


/************************************************************************************/
//JCRE调用这个方法通知该applet它已经被选择。
Public boolean Select()

//JCRE调用这个方法指示该applet处理一个输入的APDU命令。
Public abstract void Process(APDU apdu)

//JCRE调用这个方法通知当前选择的applet另一个(或同一个)applet将被选择。
Public void deselect()

//索取APDU buffer
public void process(APDU apdu){
byte[] apdu_buffer = apdu.getBuffer();
}

//设置JCRE为数据接受模式,返回它所读入的字节数,如果无数据,则返回0
public short setIncomingAndReceive()throws APDUExcetion;

//数据读示例
public void process(APDU apdu){
byte[] apdu_buffer = =apdu.getbuffer();
    short total_bytes = (short)(apdu_buffer[ISO7816.OFFSET_LC] & 0xFF);

    //读数据至APDU buffer  
    short read_count = apdu.setIncomingAndReceive();

    //获得剩余字节数
    short bytes_left = (short)(total_bytes – read_count);

    while(true){

   //处理APDU Buffer中的数据或者将数据拷贝到内部buffer
   ……

   //检查是否还有剩余数据,如果无,跳出循环。
   If (bytes_left <=0) break;
   //如果有剩余数据,在读数据。
   Read_count = apdu.receiveBytes((short)0);

   Bytes_left -= read_count;

}
    //执行其它任务和向host送回响应
    ……
}

//重新设置数据传送方向为输出,置JCRE为数据发送模式.剩余的输入数据将被丢弃,并且applet就不能再继续接收命令数据
Public short setOutgoing() throws APDUException;

//调用了setOutgoing方法之后,applet必须调用setOutgoingLength方法,以向host指出它将实际发送总共多少响应数据字节(不包括SW)
public void setOutgoingLength(short length) throws APDUException;

//sendBytes方法从APDU Buffer中指定位移bOff处发送len个数据字节.因此,applet在调用这个方法之前,必须在APDU Buffer中生成响应数据或从别处拷贝过来。
public void sendBytes(short bOff,short len) throws APDUException;

//示例
public void process(APDU apdu){
    //接收和处理命令APDU
    ……
    //现在准备好发送响应数据  
    //首先设置JCRE为数据发送模式并获得期望的行应数据长度(Le)
    short le = apdu.setOutgoing();
    //接着通知host:applet将实际发送10个字节   
    apdu.setOugoingLength((short)10);
    //在APDU Buffer中准备数据,从位移0开始
    ……
    //准备结束时,发送数据
    apdu.sendBytes((short)0,(short)10);
}

//设置传输模式为发送,设置响应数据长度为len,从APDU Buffer 位移bOff起发送响应数据字节
public void setOutgoingAndSend(short bOff,short len) throws APDUException;

//sendBytesLong方法从字节数组outDATA中的位移bOff开始处发送len字节数据.仅当已经先调用了setOutgoing和setOutgoingLength方法之后,它才能被调用。
public void sendBytesLong(byte[] outDATA,short bOff,short len) throws APDUException;

//示例
//Get_Account_Info命令APDU要求applet发送账号拥有者的名字、账号,和截止日期。
//另外,要求applet发送由名字、账号,和截止日期计算的hash值,以确保数据正确传输。
//applet将账号持有者的名字、账号,和截止日期存储在独立的字节数组中。

Private byte[] name;           //20字节
Private byte[] account_number; //9字节
Private byte[] expiration+date;   //4字节

//在处理了命令APDU后,applet现在准备好发送响应数据。
//响应数据中的字节数为:
//total_bytes = 20(name)+9(account_number)+4(expiration_date)+8(hash值)=41字节

short total_bytes = (short)41;

//step1:
//设置数据传输方向为输出
short le = apdu.setOutgoing;
//step2:
//通知host响应中的实际字节数
apdu.setOutgongLength(nametotaal_bytes);
//step3:
//发送name
apdu.sendBytesLong(name,(short)0, (short)name.length);
//发送账号
apdu.sendBytesLong(account_number,(short)0, (short) account_number.length);
//发送机制日期
apdu.sendBytesLong(expiration_date,(short)0, (short) expiration_date.length);
//现在,在APDU Buffer中计算shah值,
//假定于位移0处生成hash值
//……
//发送shah值
apdu.sendBytes((short)0,HASH_VALUE_LENGTH);
//现在返回
return;
}

posted @ 2012-03-13 15:40 左手写 阅读(21) 评论(0) 编辑

2011年12月31日

play framework之事务管理

play!中持久层采用jpa,它的事务管理不需要用户进行控制:

Play will automatically manage transactions for you. It will start a transaction for each HTTP request and commit it when the HTTP response is sent. 
If your code throws an exception, the transaction will automatically rollback.

 但是只限制在它本身的一个线程内。

有时候,我们需要自己另外重起一个线程(可以理解为:不是由http请求而产生的动作)比如:定时发送邮件,而发送邮件所需要的参数配置什么的都存储在数据库中,我们需要连接数据库拿到这些配置,然后根据配置一条条去执行邮件发送。(当然原则上,如果只是读取的话,应该不需要什么事务控制,这里只是举例说明) 这时候就需要我们去手动控制事物:事物的开启,关闭,提交,回滚等。

下面是play中一个事物控制的工具类:

事物控制
package xxx.yyy.utils;

import javax.persistence.EntityManager;
import javax.persistence.FlushModeType;
import javax.persistence.PersistenceException;

import play.db.DB;
import play.db.jpa.JPA;
import play.exceptions.JPAException;

public class TransactionUtil {

/**
* 开启一个新事务
*/
public static void startTx() {
// Logger.debug("startTx for Thread: %s and waiting for new row insert for cds_conversion_queue ... ",
// Thread.currentThread());
if (JPA.local.get() != null) {
try {
JPA.local.get().entityManager.close();
} catch (Exception e) {
}
JPA.local.remove();
}
JPA jpa = new JPA();
jpa.entityManager = JPA.entityManagerFactory.createEntityManager();
jpa.entityManager.setFlushMode(FlushModeType.COMMIT);
jpa.entityManager.getTransaction().begin();
JPA.local.set(jpa);
}

public static void closeTx(boolean rollback, boolean ignoreQueue) {
// Logger.debug("closeTx(%s) for Thread: %s", rollback, Thread.currentThread());
if (JPA.local.get() == null) {
return;
}
EntityManager manager = JPA.local.get().entityManager;
try {
DB.getConnection().setAutoCommit(false);
} catch (Exception e) {
play.Logger.error(e, "Why the driver complains here?", new Object[0]);
}

if(!ignoreQueue){
manager.createNativeQuery("select queue_end()").getResultList();
}

if (manager.getTransaction().isActive()) if ((rollback) || manager.getTransaction().getRollbackOnly()) manager.getTransaction().rollback();
else try {
manager.getTransaction().commit();
} catch (Throwable e) {
for (int i = 0; i < 10; ++i) {
if ((e instanceof PersistenceException) && (e.getCause() != null)) {
e = e.getCause();
break;
}
e = e.getCause();
if (e == null) {
break;
}
}
throw new JPAException("Cannot commit", e);
}
}

/**
* 结束事务
*
*
@param rollback
*/
public static void closeTx(boolean rollback) {
closeTx(rollback, true);
}

}



posted @ 2011-12-31 12:59 左手写 阅读(220) 评论(0) 编辑

2011年11月24日

openflashchart2柱状图&饼状图的数据结构

1. 柱状图所需要的数据格式举例

 

柱状图数据格式
/** open flash chart 所需要的标准数据格式及属性
{

y_axis: {
max: 29.158804
steps: 4.158804
}

y_legend: {
text: "s"
style: "{font-size: 20px; color:#FF0000;}"
}
bg_colour: "#FFFFFF"
offset: 5

x_axis: {
colour: "#000000"
grid-colour: "#f0f0f0"
stroke: 1
labels: {
colour: "#030303"
labels: [
"bjshow"
"bjtest"
"caining"
]
size: 12
}
offset: 10
}

elements: [

{
colour: "#d01f3c"
text: "htc"
values: [
8.285714
7
9.594269
]
on-show: {
cascade: 1
}
type: "bar_glass"
tip: "htc 平均摘机时长#val#s"
}

{
colour: "#356aa0"
text: "moto"
values: [
4.875
17.5
4.1794124
]
on-show: {
cascade: 1
delay: 1.5
type: "pop"
}
type: "bar_glass"
tip: "moto 平均摘机时长#val#s"
}

{
colour: "#C79810"
text: "nokia"


values: [
3.2222223
5
0
]
on-show: {
cascade: 1
}
type: "bar_glass"
tip: "nokia 平均摘机时长#val#s"
}

{
colour: "#73880A"
text: "samsung"
values: [
5.5646257
2
24.158804
]

on-show: {
cascade: 1
delay: 1.5
type: "pop"
}
type: "bar_glass"
tip: "samsung 平均摘机时长#val#s"
}

{
colour: "#D15600"
text: "zte"
values: [
5.8107142
0
6.7753844
]
on-show: {
cascade: 1
}
type: "bar_glass"
tip: "zte 平均摘机时长#val#s"
}
]
}
*/

 

下面是通过java纯手工组装样例(具有分组功能):

View Code
Map<Object, Object> map = new HashMap<Object, Object>();
Map<Object,Object> submap = new HashMap<Object, Object>();
map.put("bg_colour", "#FFFFFF");
map.put("offset", 5);
Map tmpmap = new HashMap();
//设置柱状图的每个Bar
for(String key: datas.keySet()){
submap = new HashMap<Object, Object>();
tmpmap = new HashMap();
//显示全部柱状 所需要的时间秒数
tmpmap.put("cascade", 1);
if ((i%2) != 0){
//符合条件的bar延迟显示
tmpmap.put("delay", 1.5);
//动态显示方式 (pop or show-up)
//pop效果:柱状图跳跃出来
tmpmap.put("type", "pop");
}else{
//若手动设置为show-up 似乎无动态效果
//默认效果是:柱状图由下而上动态增长
//tmpmap.put("type", "show-up");
}
submap.put("on-show",tmpmap);
//柱状图bar的样式 (bar_glass or bar_3d...)
submap.put("type", "bar_glass");
//每组柱状bar的颜色
submap.put("colour", colors[i++]);
//标签说明 以颜色区分
submap.put("text", key);
//鼠标划过每个bar时的提示信息
if (type1.equals("numbers")){
submap.put("tip", key + " #val#%");
}else{
submap.put("tip", key + " \n平均摘机时长#val#s");
}
//设置每一组数据 同一色
submap.put("values", datas.get(key));
list.add(submap);
}
//设置所有数据
map.put("elements", list);
submap = new HashMap<Object, Object>();

//y轴的 说明 标签
if (type1.equals("numbers")){
submap.put("text", "%");
}else{
submap.put("text", "s");
}
submap.put("style", "{font-size: 20px; color:#FF0000;}");
map.put("y_legend", submap);

//x轴相关设置
submap = new HashMap<Object, Object>();
tmpmap = new HashMap();
//x轴label
if (labels.size() != 0){
tmpmap.put("labels", labels);
}else{
labels.add("暂无数据");
tmpmap.put("labels", labels);
}
//label的字体大小
tmpmap.put("size", 12);
//label颜色
tmpmap.put("colour","#030303");
submap.put("labels", tmpmap);
submap.put("offset", 10);
submap.put("stroke", 1);
//x轴的颜色
submap.put("colour","#000000");
//平行于y轴的背景网格线的颜色
submap.put("grid-colour","#f0f0f0");
map.put("x_axis", submap);

//y轴相关设置
submap = new HashMap<Object, Object>();
if (type1.equals("numbers")){
//y轴数据的步进值
submap.put("steps", 10);
//y轴数据的最大值
submap.put("max", 100);
}else{
submap.put("steps", max/5);
submap.put("max", max + 5);
}
map.put("y_axis", submap);

return map;

 

2. 饼状图数据格式:

饼状图数据格式
/**
{
"title":{
"text":"Pie for you sir?",
"style":"{font-size: 30px;}"
},

"elements":[
{
"type":"pie",
"colours":[
"0x336699", "0x88AACC", "0x999933", "0x666699",
"0xCC9933", "0x006666", "0x3399FF", "0x993300",
"0xAAAA77", "0x666666", "0xFFCC66", "0x6699CC",
"0x663366", "0x9999CC", "0xAAAAAA", "0x669999",
"0xBBBB55", "0xCC6600", "0x9999FF", "0x0066CC",
"0x99CCCC", "0x999999", "0xFFCC00", "0x009999",
"0x99CC33", "0xFF9900", "0x999966", "0x66CCCC",
"0x339966", "0xCCCC33"],
"alpha":0.8,
"animate":[
{
"type":"bounce",
"distance":20
},
{
"type":"fade"
}
],
"radius": 150,
"tip":"#val#<br>#total#<br>#percent#<br>#label#",
"gradient-fill":true,
"label-colour":"#0000ff",
"start-angle":90,
"no-labels":false,
"values":[
2,
3,
{"value":6.5,"label":"hello (#val#)", "tip":"99 bottles of beer","on-click":"
http://www.baidu.com"},
{"value":6.5,"on-click":"my_function"}
]
}
]
}
*/

java后台数据组装:

play-1.2
public static void pieData(){
Map map = new HashMap();
Map tmp = new HashMap();
tmp.put("text", "饼图测试");
map.put("title", tmp);
map.put("bg_colour", "#ffffff");
List list = new ArrayList();
Map elements = new HashMap();
elements.put("type", "pie");
elements.put("tip", "#val#<br>#total#<br>#percent#<br>#label#");
List colours = Arrays.asList(colors1);
elements.put("colours", colours);
elements.put("alpha", 0.5);
List animates = new ArrayList();
tmp = new HashMap();
tmp.put("type", "bounce");
tmp.put("distance", 20);
animates.add(tmp);
tmp = new HashMap();
tmp.put("type", "fade");
animates.add(tmp);
elements.put("animate", animates);
elements.put("radius", 150);
elements.put("start-angle", 90);
elements.put("gradient-fill", true);
elements.put("no-labe-ls", false);
List v = new ArrayList();
for (int i = 0; i <= 10; i++) {
tmp = new HashMap();
tmp.put("value", i+10);
tmp.put("label", "摘机次数统计占比xxxx");
v.add(tmp);

}

elements.put("values", v);
list.add(elements);
map.put("elements", list);
System.out.println(map);
renderJSON(map);
}







posted @ 2011-11-24 11:26 左手写 阅读(275) 评论(0) 编辑

2011年4月15日

SyntaxHighlighter3.0.83 配置

摘要: 为啥要用SyntaxHighlighter?为了看起来愉快一些!最新版本可以在这里下载到首先需要载入样式,脚本。如果是基于jQuery的,要载入jQuery。然后选择刷子载入,刷子支持PHP、JS、xml等等然后载入样式文件。样式很多挑一个就行了。下面是一个示例代码,3.0开始,你可以用拖动鼠标,或者双击代码区来选择复制代码,所以就没有工具条存在的必要了。<script type="text/javascript" src="/js/jquery.js" ></script><script type="text/j阅读全文

posted @ 2011-04-15 17:17 左手写 阅读(513) 评论(1) 编辑

google map或百度map 应用

摘要: 关于map的具体用法请参考各自官方API(感觉有点标题党o_O)google和百度map都提供了范围搜索的功能:比如搜索指定位置指定范围内的所有kfc店铺,它们使用的都是自己的店铺数据,可有时候我们只需要在地图上显示我们自己存储的店铺,并把它们标注在地图上,同样只给定两个参数:指定位置(某一处的经纬度lnglat)和搜索半径(r)。每个地图API都提供了计算两个坐标之间距离的方法,我们可以从库中拿出所有的店铺的经纬度(slnglat),然后逐一计算出lnglat到slnglat距离s,若s<r,则这个店铺就是我们想要的可以直接返回给前端标注在地图上。呃...这种方法当然不可行,不过当然也阅读全文

posted @ 2011-04-15 14:45 左手写 阅读(1523) 评论(4) 编辑

2011年4月14日

jstree简单应用 - v1.0

摘要: 第一篇文章,具体使用也过去很长时间了,直接贴码:1.代码中使用json数据格式(直接在页面中组装成的,并非后台组装,具体方法:function _callBack(d))2.提供右键菜单及功能实现3.具有checkbox,提供获取选中节点ID方法:function getMenuIds()<script type="text/javascript" src="@{'/public/javascripts/jquery-1.4.2.min.js'}"></script><script type="te阅读全文

posted @ 2011-04-14 14:31 左手写 阅读(4678) 评论(4) 编辑

仅列出标题  

导航

统计

公告