IE与P3P

首先说下背景。IE下第三方cookie默认是被禁用的,假如你通过iframe引入别的网站的页面并且想要设置cookie的话,默认IE会阻止,导致某些网站的逻辑无法执行下去。
解决这个问题的一种方法是使用P3P。简单来说就是iframe对应的网站在返回的响应中包含一个名字为P3P,值为CP=开头的响应头。具体值网上有很多,但也有说IE只检查是否CP=开头。
但是问题到此没有结束,个人在尝试使用P3P的时候遇到了问题。

Read More

[scala]基于resourcebundle的messagesource

之前写了一篇模拟spring的messagesource实现,后来了解到spring使用的是resourcebundle,于是稍微了解resourcebundle之后改进了实现,可能比以前简化很多。

[个人时间管理]线程饥饿与动态任务管理

虽然主标题有点像开发上的内容,但实际上不是那样的,讨论程序开发上的内容的目的是为了解决个人时间管理上的“动态任务管理”。

首先说下“动态任务管理”是什么。当你早上制定了一天的计划并付诸实施的话,很有可能遇到干扰或者未曾预期的新任务。处理这些干扰或者任务的过程我个人称为“动态任务管理”。不用说,动态任务管理是个人时间管理很重要的一项内容,如果你处理不好的话,会使得你早些安排的任务一团糟。

Read More

[scala]spring messagesource的功能模仿实现

原理

  • 遍历目录下messages*.properties文件
  • 从文件名中取出locale,比如messages_en_US.properties中en和US分别为语言名和国家名
  • 解析properties文件的k=v键值对,有等号,k和v不为空的情况下构造一个Map,k其实为messageCode, v为messageFormat
  • 最后是根据locale和messageCode查询messageFormat

由于scala有强大的option,flatMap等方法,spring的messageSource的defaultMessage作为调用者的可选项,即Option.getOrElse,参照代码最下方的示例

测试结果

Read More

[java]内存缓存和weakreference

背景

  • Java中直接给变量赋值(原始类型和null除外)时是强引用
  • 假设简单的内存缓存使用ConcurrentHashMap

问题

虽然使用内存缓存可以方便的加速程序,但是存在不知道条目何时失效的问题。不管是放入时遍历还是去除时判断甚至守护线程,实际上都是在做类似GC的事情。

另一种方案

Java提供了java.lang.ref包,其中有weakreference等类。这些类提供了一种不用模仿GC但是可以提示GC的解决方案。
比如softreference,假如你在内存缓存中放置的是softreference的话,程序在内存不足的情况,会把一些softreference回收掉,这样的话,至少不会发生OutOfMemory的异常。
而weakreference,在GC执行时会被回收,如果对象比较复杂的话,GC多次执行后才会被回收。另外,有一个类叫做WeakHashMap,基于WeakReference,如果你愿意,你可以用WeakHashMap作为内存缓存的非线程安全的实现。
如果你对java.lang.ref包中其他的类有兴趣,建议阅读javadoc或者google一下相关文章。

建议

建议内存缓存至少使用softreference或者weakreference。
理论上WeakHashMap也可以用,但是就像HashMap并不是用来做缓存的一样,WeakHashMap并不是设计来作为缓存的。所以,最好多了解一些缓存实现并使用,比如jcache/ehcache/oscache etc。

[scala]50行实现web表单验证器

思路是这样,每个表单实现Validatable特质。这个特质要求实现返回一个属性名到验证器列表的映射。

表单验证器执行时首先获取表单所有的属性(除去class),然后遍历这个映射,运行字段对应的验证器变成响应的验证错误(如果有的话),否则最后是个空集合。

FormValidatorRunner(代码最下方)是测试类,执行结果是

Map(name -> List(ValidateError(default.notBlank,List())))

代码如下:

Read More

时间管理实践小记

最近重新读了《时间管理-给系统管理员》,虽然我不是系统管理员,但是里面的内容对我来说并不是不适用,而且在尝试应用之后感觉自己的时间掌控力立马上升了一个阶层。下面就讲讲我阅读和实践中的想法。

在重读之前,个人尝试了很多个人时间任务管理的方式,比如在学N2的时候,早起半小时学习;工作中并发比较大时,按照完成时间长度优先完成时间短的,使得一天做的事情最多;手机上的AnyToDo等。感觉不管哪个缺少点什么,面对新来的任务,长期的计划没有一个比较好的处理方案。现在看来,原先的方式对当天任务的处理还行,但是对几天的,时间跨度更长的计划就难以承受了。

Read More