-
[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,参照代码最下方的示例 测试结果 Some(Hello, XnnYygn!) Some(Hello, XnnYygn!!!) Some(你好,XnnYygn!) default message
-
[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()))) 代码如下:
-
时间管理实践小记
最近重新读了《时间管理-给系统管理员》,虽然我不是系统管理员,但是里面的内容对我来说并不是不适用,而且在尝试应用之后感觉自己的时间掌控力立马上升了一个阶层。下面就讲讲我阅读和实践中的想法。 在重读之前,个人尝试了很多个人时间任务管理的方式,比如在学N2的时候,早起半小时学习;工作中并发比较大时,按照完成时间长度优先完成时间短的,使得一天做的事情最多;手机上的AnyToDo等。感觉不管哪个缺少点什么,面对新来的任务,长期的计划没有一个比较好的处理方案。现在看来,原先的方式对当天任务的处理还行,但是对几天的,时间跨度更长的计划就难以承受了。
-
读书笔记 – 高性能网站建设进阶指南(2)简化CSS选择符
css selectors 性能消耗从低到高: ID selectors #modal { overflow: hidden; } class selectors .container { margin: 0 atuo; } type selectors a { color: #999; } adjacent sibling selectors input + label { display: inline; } child selectors label > input { display: none; } descendant selectors .foo a { text-decoration: none; } universal selectors *…
-
读书笔记 – 高性能网站建设进阶指南(1)图像优化
优化工具: 跨平台png压缩工具:Pngcrush,OptiPNG 跨平台剥离jpeg的元数据工具:jpegtran 在线多格式压缩工具:smush.it 对动画gif优化,gifsicle可以将动画里连续帧中的重复像素移除,来达到优化。
-
GetBeanProperties via Scala
一个简单的用Scala写的获取bean属性的例子。核心方法是Introspector#getBean(Class)。 import java.beans.Introspector object GetBeanProperties { class Person(id: Long, name: String) { def getId = id def getName = name } def main(args: Array[String]): Unit = { println(GetBeanProperties(null)) println(GetBeanProperties(new Person(1L, “xnnyygn”))) } def apply[T](bean: T): Map[String, Any] = Option(bean) match { case None => Map[String, Any]() case _ => doApply(bean) } private def doApply[T](bean: T):…