linux命令使用小记1

bash的快捷键

现在碰到的服务器上的用户的默认shell都是bash,所以主要讲下bash的一些快捷键。
删除整行命令:Ctrl + u,对不回显的密码输入同样有效
向前删除单个单词:Ctrl + w,在vim里面同样有效
运行最近一条命令:!! 就是两个感叹号,个人是从sbt(scala下的一个构建工具)里面学来的
搜索最近的命令;Ctrl + r,输入关键字,比如你最近输入了vim /path/to/file,那么Ctrl + r,再输入vim,那么就可以显示出这条命令,回车就直接执行了
在搜索最近的命令的基础上,!vim 可以执行最近这条vim的命名。这个用在什么地方最好呢?如果你最近tail了某个文件,输入!tail就可以直接执行tail了,不用输入文件名
清屏命令:Ctrl + l,效果和clear一样
上一条命令和下一条命令:Ctrl + p,Ctrl + n,个人不是很喜欢用上下键,因为要移动右手,而且有些键盘需要按FN才有上下,比如hhkb-pro,不过这个仁者见仁,智者见智
暂停屏幕输出:Ctrl + s,恢复屏幕输入Ctrl + q,这个用来干嘛呢?类似tail时scroll lock
更多bash快捷键,请google

Read More

IE与P3P

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

Read More

关于rel=”nofollow”

Google在Webmaster Tools页面提到:

“Nofollow” provides a way for webmasters to tell search engines “Don’t follow links on this page” or “Don’t follow this specific link.”

What are Google’s policies and some specific examples of nofollow usage?

  1. Untrusted content
  2. Paid links
  3. Crawl prioritization

However, a solid information architecture — intuitive navigation, user- and search-engine-friendly URLs, and so on — is likely to be a far more productive use of resources than focusing on crawl prioritization via nofollowed links.

html5对rel=”nofollow”的解释道:

rel=nofollow “indicates that the link is not endorsed by the original author or publisher of the page, or that the link to the referenced document was included primarily because of a commercial relationship between people affiliated with the two pages.”

综上来看,不管是从搜索引擎爬虫的角度、还是html5对此的重新定义来看,rel=”nofollow”并不是单纯用来屏蔽搜索引擎抓取的。它包含的语义远大于原先的定义。

[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。