2015 4 月24
public String getTemplateStr(String template, Map para) {
StringWriter writer = new StringWriter();
try {
RuntimeServices runtimeServices = RuntimeSingleton.getRuntimeServices();
StringReader reader = new StringReader(template);
SimpleNode node = runtimeServices.parse(reader, "Template name");
Template t = new Template();
t.setRuntimeServices(runtimeServices);
t.setData(node);
t.initDocument();
VelocityContext context = new VelocityContext();
if (para.size() > 0) {
for (String key : para.keySet()) {
context.put(key, para.get(key));
}
}
t.merge(context, writer);
} catch (Exception e) {
throw new RuntimeException("Error commiting transaction! cause:"+ e.getMessage());
}
return writer.toString();
}
@At("/form")
@Ok("vm:template.private.test")
public void form(HttpServletRequest req, HttpServletResponse resp) {
Map formParams = new HashMap();
formParams.put("formKey", "form/waizhibiaodan/01/01.form");
int timeout = 60 * 1000;
String str = Http.post("http://127.0.0.1/test/getFormKey", formParams, timeout);
NutMap map = Json.fromJson(NutMap.class, str);
String formData = map.getString("data");
Map params = new HashMap();
params.put("startDate", "2015-04-21");
params.put("endDate", "2015-04-25");
req.setAttribute("formData", getTemplateStr(formData, params));
}
2015 4 月21
mvn package -Dmaven.test.skip=true
2015 4 月16
processEngineConfiguration.setActivityFontName(“宋体”);
processEngineConfiguration.setLabelFontName(“宋体”);
windows环境变量:
JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8
2015 3 月10
刚才给一位顾客剪完发,他对着镜子照了一番,脸上露出一丝笑意:“明天我叫我的兄弟一起过来!” 我很高兴,正要谢他,他却拍了拍我的肩膀:“你也叫点人吧,到时别说我人多欺负你!”
2015 2 月3
Wirank.cn
提供自助的微信文章阅读数查询功能,以及回溯公众号历史文章功能,并提供API接口供调用。
2015 1 月28
效果图:
源码不解释:
private void ResultToJpg(List list, String title, HttpServletResponse response) {
BufferedImage image;
int totalrow = list.size();
int totalcol = 7;
int imageWidth = 640;
int rowheight = 40;
int imageHeight = totalrow * rowheight + 105;
int startHeight = 20;
int startWidth = 10;
int colwidth = (int) ((imageWidth - 20) / totalcol);
int colwidth2 = (int) ((imageWidth - 20) / (totalcol + 1));
image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = (Graphics2D) image.getGraphics();
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, imageWidth, imageHeight);
Font font = new Font("微软雅黑", Font.BOLD, 20);
graphics.setFont(font);
graphics.setColor(new Color(112, 48, 158));
graphics.drawString(Strings.sNull(title), startWidth, startHeight + 10);
font = new Font("微软雅黑", Font.PLAIN, 13);
graphics.setColor(new Color(99, 99, 99));
graphics.setFont(font);
String subtitle1 = "欢迎访问";
graphics.drawString(subtitle1, startWidth, startHeight + 30);
font = new Font("Arial, Helvetica, sans-serif", Font.BOLD, 13);
graphics.setColor(new Color(112, 48, 158));
graphics.setFont(font);
String subtitle2 = "inm.xuetang.cn";
graphics.drawString(subtitle2, startWidth + 60, startHeight + 30);
font = new Font("微软雅黑", Font.PLAIN, 13);
graphics.setColor(new Color(99, 99, 99));
graphics.setFont(font);
String subtitle3 = "冲榜、制榜!";
graphics.drawString(subtitle3, startWidth + 165, startHeight + 30);
//画首行
graphics.setColor(new Color(112, 48, 158));
graphics.fillRect(startWidth, startHeight + rowheight, imageWidth - 20, rowheight);
font = new Font("微软雅黑", Font.PLAIN, 12);
graphics.setColor(Color.WHITE);
graphics.setFont(font);
graphics.drawString("#", startWidth + 10, startHeight + rowheight * 2 - 15);
graphics.drawString("公众号", startWidth + colwidth - 10, startHeight + rowheight * 2 - 15);
//画表头
String[] headCells = {"发布", "总阅读数", " 头条", " 平均 ", "总点赞数", " WCI"};
for (int m = 0; m < headCells.length; m++) {
graphics.drawString(headCells[m].toString(), startWidth + colwidth2 * m + colwidth * 2, startHeight + rowheight * 2 - 15);
}
//画行
for (int j = 0; j 0) {
String readnum_all = Strings.sNull(map.get("readnum_all"));
int t = NumberUtils.toInt(readnum_all.substring(readnum_all.length() - 4, readnum_all.length() - 3));
if (t > 0) {
readnum_all = readnum_all.substring(0, readnum_all.length() - 4) + "." + String.valueOf(t);
} else {
readnum_all = readnum_all.substring(0, readnum_all.length() - 4);
}
graphics.drawString(readnum_all + "万+", startWidth + colwidth2 + colwidth * 2 + 5, startHeight + (j + 3) * rowheight - 15);
} else {
graphics.drawString(Strings.sNull(map.get("readnum_all")), startWidth + colwidth2 + colwidth * 2 + 5, startHeight + (j + 3) * rowheight - 15);
}
if (NumberUtils.toInt(Strings.sNull(map.get("url_times_readnum"))) > 100000) {
String url_times_readnum = Strings.sNull(map.get("url_times_readnum"));
int t = NumberUtils.toInt(url_times_readnum.substring(url_times_readnum.length() - 4, url_times_readnum.length() - 3));
if (t > 0) {
url_times_readnum = url_times_readnum.substring(0, url_times_readnum.length() - 4) + "." + String.valueOf(t);
} else {
url_times_readnum = url_times_readnum.substring(0, url_times_readnum.length() - 4);
}
graphics.drawString(url_times_readnum+"万+", startWidth + colwidth2 + colwidth * 3 - 5, startHeight + (j + 3) * rowheight - 15);
} else {
graphics.drawString(Strings.sNull(map.get("url_times_readnum")), startWidth + colwidth2 + colwidth * 3 - 5, startHeight + (j + 3) * rowheight - 15);
}
if (NumberUtils.toInt(Strings.sNull(map.get("readnum_av"))) > 100000) {
String readnum_av = Strings.sNull(map.get("readnum_av"));
int t = NumberUtils.toInt(readnum_av.substring(readnum_av.length() - 4, readnum_av.length() - 3));
if (t > 0) {
readnum_av = readnum_av.substring(0, readnum_av.length() - 4) + "." + String.valueOf(t);
} else {
readnum_av = readnum_av.substring(0, readnum_av.length() - 4);
}
graphics.drawString(readnum_av+"万+", startWidth + colwidth2 + colwidth * 4 - 15, startHeight + (j + 3) * rowheight - 15);
} else {
graphics.drawString(Strings.sNull(map.get("readnum_av")), startWidth + colwidth2 + colwidth * 4 - 15, startHeight + (j + 3) * rowheight - 15);
}
graphics.drawString(Strings.sNull(map.get("likenum_all")), startWidth + colwidth2 + colwidth * 5 - 20, startHeight + (j + 3) * rowheight - 15);
graphics.drawString(Strings.sNull(map.get("wci")), startWidth + colwidth2 + colwidth * 6 - 40, startHeight + (j + 3) * rowheight - 15);
}
//末行
graphics.setColor(Color.WHITE);
graphics.fillRect(startWidth, startHeight + (totalrow + 1) * rowheight + 40, imageWidth - 20, startHeight + (totalrow + 1) * rowheight);
try {
response.setContentType("image/png");
OutputStream out = response.getOutputStream();
ImageIO.write(image, "png", out);
} catch (Exception e) {
e.printStackTrace();
}
}
2015 1 月3
关注微信,发送弹幕到电影院大屏幕,后台有审核和黑名单功能。
弹幕字体随机、颜色随机、大小随机、位置随机,都可以设置。
测试效果和当天影院现场图片:
2014 11 月14
String str = String.format(“%010d”, 1212);
2014 11 月10
ComboIocLoader loader = new ComboIocLoader(
new String[]{
“org.nutz.ioc.loader.json.JsonLoader”, “ioc/”,
“ org.nutz.ioc.loader.annotation.AnnotationIocLoader”, “cn.xuetang”}
);
ioc = new NutIoc(loader);
dao = ioc.get(Dao.class);
2014 11 月10
SELECT SUBSTRING_INDEX(SUBSTRING(url,LOCATE(“sn=”,url)+3),’&’,1),url FROM wx_kw_url_1111
2014 10 月24
adb shell
su
chmod 777 /data/local/tcpdump
/data/local/tcpdump -p -vv -s 0 -w /sdcard/capture.pcap
2014 9 月29
select a.*
from wx_nickname a
left join (select distinct nickname_id from wx_group_nickname )b on
a.id = b.nickname_id
where b.nickname_id is null
2014 9 月23
NutzWk
https://github.com/Wizzercn/NutzWk
基于Nutz的开源企业级开发框架。
文件编码全部为UTF-8,可以导入Eclispe、IDEA中,jdk7,tomcat 6/7.
创建空的数据库,首次启动项目会自动初始化数据.
本框架已成功应用于XX省交通厅网络问政平台、XX省交通厅CMS内容管理系统、XX公司舆情监测管理中心等项目。
使用条款:
1、个人开源,可以任意修改使用;
2、商业使用,必须更改后台菜单布局、CSS样式、界面颜色等元素(既:不可使用原始界面用于商业项目)。
2014 9 月15
/cron/
Java 解析Cron表达式,计算执行时间源码:
@At
@Ok("raw")
public String getCron(@Param("exp") String exp,HttpServletResponse response) {
response.setHeader("Content-Type", "text/javascript");//设置跨越访问 $.getScript()
List list = new ArrayList();
try {
exp= URLDecoder.decode(Strings.sNull(exp),"utf-8");
log.info(exp);
CronTriggerImpl cronTriggerImpl = new CronTriggerImpl();
cronTriggerImpl.setCronExpression(exp);
Calendar calendar = Calendar.getInstance();
Date now = calendar.getTime();
calendar.add(Calendar.MONTH, 1);//把统计的区间段
List dates = TriggerUtils.computeFireTimesBetween(cronTriggerImpl, null, now, calendar.getTime());//这个是重点
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (int i = 0; i 9) {//这个是提示的日期个数
break;
}
list.add(dateFormat.format(dates.get(i)));
}
} catch (Exception e) {
}
return "var data="+ Json.toJson(list);
}
2014 8 月28
第一步:编写插件类
package cn.xuetang.plugin;
import android.widget.Toast;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;
/**
* Created by Wizzer on 14-8-28.
*/
public class ToastPlugin extends CordovaPlugin {
public ToastPlugin() {
}
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
if (this.cordova.getActivity().isFinishing()) return true;
if (action.equals("show")) {
this.show(args.getString(0));
} else if (action.equals("showlong")) {
this.showlong(args.getString(0));
} else {
return false;
}
callbackContext.success();
return true;
}
public void show(String message) {
Toast.makeText(this.cordova.getActivity(), Toast.LENGTH_SHORT).show();
}
public void showlong(String message) {
Toast.makeText(this.cordova.getActivity(), message, Toast.LENGTH_LONG).show();
}
}
第二步:配置 res/xml/config.xml
注:这里的 feature name ,要和↓↓面讲的的js文件里一致。
第三步:创建js文件 plugins/toast.js
/**
* Created by Wizzer on 14-8-28.
*/
cordova.define("cn.xuetang.plugin.ToastPlugin", function(require, exports, module) {
var exec = require('cordova/exec');
module.exports = {
/**
* 一共5个参数
第一个 :成功回调
第二个 :失败回调
第三个 :将要调用的类的配置名字(在config.xml中配置↑↑)
第四个 :调用的方法名(一个类里可能有多个方法 靠这个参数区分)
第五个 :传递的参数 以json的格式
*/
show: function(message) {
exec(null, null, "ToastPlugin", "show", [message]);
},
showlong: function(message) {
exec(null, null, "ToastPlugin", "showlong", [message]);
}
};
});
注:js里两个方法,分别对应类中的两个方法
第四步:修改 cordova_plugins.js 引用 tocas.js
在 module.exports = [ ] 中追加如下代码:
{
"file": "plugins/toast.js",
"id": "cn.xuetang.plugin.ToastPlugin",
"merges": [
"navigator.toast"
]
}
最后:调用
navigator.toast.show("再点击一次退出");
navigator.toast.showlong("再点击一次退出");
2014 8 月28
/**
* Created by Wizzer on 14-8-28.
*/
var num = 0;
var login = {
initialize: function () {
this.bindEvents();
},
bindEvents: function () {
document.addEventListener('backbutton', this.eventBackButton, false);
},
eventBackButton: function () {
num++;
if (num > 1) {
navigator.app.exitApp();
}
navigator.toast.show("再点击一次退出");
// 3秒后重新计数
var intervalID = window.setInterval(function() {
num=0;
window.clearInterval(intervalID);
}, 3000);
}
};
浮动提示插件见:
/?p=3026
2014 8 月26
.replaceAll(“[^a-zA-Z_\u4e00-\u9fa5]”, “”)
只剩下中文和英文字母了,悲催。
Caused by: java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x98\xB7’ for column ‘description’
2014 7 月9
使用帝国CMS,花了近一个月时间开发了一个网站,开发完成后客户对后台非常不满意,决定换成PHPCMS找人重做。- –
怎么说呢,帝国CMS开发起来比较灵活,可是弊端也很多,比如模板、标签、自定义SQL、自定义列表、模型等等,
做起来是相当的麻烦,从这里转到那里,又要自定义函数又要这个那的,,否则怎么会要花近一个月时间做个网站呢?
做网站真的应该是分分钟的事情,而帝国CMS让我花费了超过1/3时间在折腾自定义标签、函数等,边学习边研究边开发 。
我不清楚PHPCMS开发要多久,另外那个人说一周加班加点可以搞定。
帝国CMS最人命的是,不光对开发人员不友好,对网站编辑人员更加不友好,,各种麻烦,各种功能不支持 ,
对不之下,PHPCMS编辑网站起来方便多了,可以裁剪标题图不变形、可以推送文章到广告位等等。
一直是从事JAVA开发的,PHP的CMS也就接触过Wordpress而已,,如果不是老板确定用帝国CMS,
如果不是自己看中帝国自带的商城,打死也不会选择帝国CMS。。。。
难怪官方都不再更新维护了,,体验不是一般的烂,算是浪费时间换得了个教训,望后者不要付后尘 。