Java
20110709技术嘉年华论坛笔记
Jul 13th
我听到的第一场是《用户行为分析》
@吴英杰大概内容如下:
1、用户行为分析可以通过服务器端收集信息和客户端收集信息, 服务器端有分析日志为主,而客户端收集有浏览器插件(百度流氓插件)和Javascript为主。
2、淘宝最近启动了一个项目,叫“淘宝显微镜”,此项目是一个类似Google分析,百度点击的一个项目。
在做这个“淘宝显微镜”碰到的问题有
1、坐标校准的问题;
2、数据怎么发送到问题;new Image();
3、常见问题:
1》 浮动层重叠问题
2》 数据未发送,页面已经跳转的问题
4、数据体现
1》 点击图
2》 热感图
5、展望和改进
1》 更直观,能够理解数据,提交有用的数据
2》 更具体,细节决定成败
3》 更及时,“天下武功,无坚不摧,唯快不破”
@周峰
可视化的用户行为分析,显微镜项目刚刚起步
用户群: 设计师,产品经理,运营经理
@刘平川
点击分析,悬停分析,轨迹分析
绘图选型: Flash,php clickheart,canvas(html5)
百度选择的是canvas
分析采集时间和数据
采集频率:400MS~500MS
采集大小:<2K 数据筛选:
数据坐标:相对坐标,绝对坐标,重要的是确定原点位置,也可以使用栅格化确定位置;
PS: 可以总结为百度在分析用户行为的时候,使用了图论的知识点;
听了两天,其实比较累了,其他的场次讲的太快,只顾听和拍照了,笔记做不过来。看来大家还是等PPT发布吧。
JAVA GMT 时间
May 4th
GMT 格林尼治标准时间是指位于伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。 理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能和实际的太阳时相差16分钟。 地球每天的自转是有些不规则的,而且正在缓慢减速。所以,格林尼治时间已经不再被作为标准时间使用。现在的标准时间——协调世界时(UTC)——由原子钟提供。 自1924年2月5日开始,格林尼治天文台每隔一小时会向全世界发放调时信息。
下面就提供一下Java GMT时间的实现方法,对于GMT时间的用户,主要是用于COOKIE的过期时间计算。
/**
* 得到GMT时间字符串
*
* @param time
* 增加的时间毫秒数
* @return
*/
private static String getGMTDateStr(long time) {
Date d = new Date(System.currentTimeMillis() + time);
SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH);
dateFormat.setTimeZone(new SimpleTimeZone(0, "GMT"));
return dateFormat.format(d);
}
如何得到每天某时刻的时间戳
Nov 1st
public static long getDaybreakTime() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTimeInMillis();
}
其实代码是比较简单的,相信这段代码还是有很多用处的。
可以使用到的场景有:
- 设置在某一时刻之前,必须更新缓存里的数据;
- 在Quartz中,统计和分析昨天的数据;
- 合并某一天内发生的动态;
- ……
如何在Java中使用枚举
Oct 22nd
枚举(pascal) 随着计算机的不断普及,程序不仅只用于数值计算,还更广泛地用于处理非数值的数据。例如:性别、月份、星期几、颜色、单位名、学历、职业等,都不是数值数据。在其它程序设计语言中,一般用一个数值来代表某一状态,这种处理方法不直观,易读性差。如果能在程序中用自然语言中有相应含义的单词来代表某一状态,则程序就很容易阅读和理解。也就是说,事先考虑到某一变量可能取的值,尽量用自然语言中含义清楚的单词来表示它的每一个值,这种方法称为枚举方法,用这种方法定义的类型称枚举类型。
在没有使用枚举之前,我们可能会这样来定义变量:
private static final int GIRL = 0; private static final int BOY= 1;
这样一种实现的方式,看似好像很清晰,但是如果类型一多,类型的值就较难管理,而且在判断不同类型时,有较多的丑陋的代码,代码自然不够优雅。
下面来看下如何使用枚举。
可以这样来定义:
public enum GenderType {
Girl, Boy
}
利用枚举传递值:
public void updateGrade(long userId,GenderType gender);
这样传递的好处是,可以是参数的传入一定是正确的,是真实存在的类型值。
递归枚举:
for (GenderType g : GenderType.values()) {
System.out.println(g.name()); //得到枚举的名字
System.out.println(g.ordinal()); //得到枚举的序号
}
枚举和switch可以说是绝配:
for (GenderType g : GenderType.values()) {
System.out.println(g.name());
System.out.println(g.ordinal());
switch(g){
case Girl:
break;
case Man:
break;
}
}
比如:表示层传递参数值0,进入控制层,如何使用枚举呢?
if(GenderType.values().length>i){
GenderType.values()[i] //这样就得到了枚举类型
}
如果传递的是字符串”Girl”,就可以这样得到数据枚举:
GenderType.valueOf("Girl")