本文介绍3种不同的方法创建随机缓存文件名。在编写需要创建唯一的缓存文件的脚本时非常有用。

1.使用$RANDOM shell变量

在控制台执行如下命令

echo $RANDOM

每次都获得一个随机数,借用这个变量可用来生成一个随机的文件名

#!/bin/bash
echo "List of temporary files : "
for i  in 1 2 3 4 5
do
   		FILE="/tmp/$(basename $0).$RANDOM.txt"
   		echo $FILE # show file name
   		> $FILE # create files
done 

2.使用$$变量

这是一个经典的方法,$$变量返回当前进程的进程号,对于整个系统来说这是一个唯一数字。

#!/bin/bash
TFILE="/tmp/$(basename $0).$$.tmp"
ls > $TFILE
echo "See diretory listing in $TFILE"

3.使用mktemp和tempfile命令

通过mktemp和tempfile命令是最佳的方式

$ mktemp

输出

/tmp/tmp.IAnO5O

或者

$ tempfile

输出

/tmp/IAnO5O

当然还能生成随机文件夹

$ mktemp -d
$ tempfile -d

参考阅读

  1. Shell scripting (BASH) : How to create temporary random file name

终于搞定了困扰已久的nginx反向代理子路径映射问题

多个web应用共享一个域名和端口时,可以考虑把不同的web应用映射成不同的子路径,这个子路径在Java EE里称作ContextPath。下面的配置片段解决nginx作为前端,反向代理多个tomcat主机,通过不同子路径共享一个域名的情况。

server {
    listen       80;
    server_name  _;
    index index.html index.htm index.php;
    root /home/dashboard;

    location /dashboard {
     	rewrite /dashboard/(.*) /$1 break;
      	rewrite ^/dashboard$ /dashboard/ permanent;
      	proxy_pass http://127.0.0.1:9082;
      	proxy_redirect off;
      	proxy_set_header Host $host;
      	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}
}

参考阅读

  1. Nginx_As_a_Reverse_Proxy
  2. How do I reverse proxy etherpad-lite with nginx to a subdirectory

web应用程序重要的功能的URL通过需要达到可访问,可收藏和可分享的需求。Backbone.Router正是检测客户端url变化触发相应动作和事件的实现框架。对于没有实现HTML5 History API的浏览器,Router提供了优雅和透明的兼容实现,通过控制hash的变化。

Route的例子

var Workspace = Backbone.Router.extend({
routes: {
		"help":                 "help",    // #help
		"search/:query":        "search",  // #search/kiwis
		"search/:query/p:page": "search"   // #search/kiwis/p7
  		},
help: function() {
		...
  		},
search: function(query, page) {
		...
  		}

});
继续阅读 →

Mixin和Inheritance是两种主要的代码复用和封装的方式。Java流行的时候,大家都努力的把javascript写得像java,各大框架努力给javascript加上类继承的特性。当下是Ruby春暖花开的日子,coffeescript让开发者可以以更ruby的方式写js。javascript在不同的时期能适应潮流,足以见得原型链继承型语言的强大之处。

用coffeescript实现Mixin

Coffescript原生并不支持Mixin,《CoffeeScript小书》第三章提到一种Mixin的实现方式

```coffeescript moduleKeywords = [‘extended’, ‘included’]

class Module @extend: (obj) -> for key, value of obj when key not in moduleKeywords @[key] = value

obj.extended?.apply(@)
this

@include: (obj) -> for key, value of obj when key not in moduleKeywords # Assign properties to the prototype @::[key] = value

obj.included?.apply(@)
this ```
继续阅读 →

当打开文件数量很多时,Eclipse编辑器的标签栏右边会出现一个菜单,把标签栏显示不下的标签页放到一个下拉菜单里,这是一个不错的设计,解决了标签页过多以后标签栏显示不下的问题。(Chrome 的标签页显示采用了另外一种方式,缩写标签页的宽度,以容纳更多的标签页,这种方式对于eclipse不可取,因为网页标签可以借助favicon来区分,而文件标签依赖文件名区分,文件名往往比图标长得多。) Indigo之前版本的eclipse显示标签页采用MRU(Most recently Used)算法来决定标签页的顺序,效果是最近使用过的标签页相对排在前面,显示在标签栏上,很久没有使用过的标签页显示在菜单里。从Eclipse Juno开始标签页的排序算法变了,找到最近打开的标签页变得不方便。

Eclipse Juno的界面样式引入了CSS样式表,SWT的界面元素也可以像网页元素一样,方便的通过CSS进行调整。SWT在CSS规范的基础上进行了一下扩展,引入了一些“swt-”为前缀的属性,用于精细化调整界面里控件元素的显示样式。

其中,swt-mru-visible就是一个可以开启MRU算法排序的样式。

继续阅读 →

GitHub和许多Git服务依赖的Git版本不低于1.7.10,而CentOS 6.4通过epel安装的git版本为1.7.1。rpmforge源里的二进制包比epel更新,本文介绍如果通过epel源升级git到1.7.11版本。

安装rpmforge源

# rpm -i http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

安装证书

# rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt

更新rpmforge-extra源

# yum --enablerepo=rpmforge-extras update
继续阅读 →

国内网络环境下载rubygems那叫一个痛苦,最近把https改成http也不好用了。百般无耐,考虑在服务器环境下装个PPTP Client连接国外的PPTPD服务。

安装pptp和pptp-setup

pptp就不用解释了,pptp-setup是一个设置脚本,通过该脚本可以使用方便地进行初始化设置,生成配置文件。

# yum install pptp pptp-setup

创建配置

# pptpsetup --create codelife --server vpn.codelife.me \
--username codelife --password me --encrypt
继续阅读 →

亚马逊中国的kindle paperwhite开卖了,与之前坊间谣传的500块的价格相比,849元真的很不给力。正好碰上有个朋友去日本,托人捎了台过来,¥7980,是日元,折合人民币550左右。kindle paperwhite的屏幕已经比较细腻了,翻页时屏幕依然闪烁,电子墨水的通病。但是这个版本的kindle已经内置了光源,一个非常人性化的功能,这么多年以后才加有,不知道亚马逊怎么想的。亚马逊的用户体验那个差呀,不知道是不是老外的思维和我们不一样,反正个人觉得京东和淘宝的页面看上去要顺眼得多。

Kindle支持阅读PDF文档,只是效果不怎么好,特别显示扫描版本时。Kindle PaperWhite可以安装第三方的KOReader阅读器改进PDF文档的阅读体验,KOReader支持多种电子书格式,包括DJVU,FB2,EPUB,TXT,CBZ,HTML。在PDF显示方面KOreader得益于开源项目K2pdfopt

K2pdfopt也是为了解决PDF文档在小屏幕Kindle上阅读的排版问题而开发的。与其它PDF预处理软件相比,它有很多独一无二的特性,比如自动化程度很高,能够自动识别多栏排版的文档进行分栏,自动去除页面白边,自动对扫描文档进行水平校正,以及最重要的基于图像分割的重排版算法。

K2pdfopt使用完全基于图像处理的方法对文字重新排版,软件处理时会把原始PDF/DJVU页面放大再分割成以词为单位的像素区域,把这些像素区域重新排列到目标宽度的页面中,所以理论上只要能够读取文档的页面像素就可以对其中的文字进行重新排版。这个算法的前提是页面中的文字之间需要有一定的空隙,以提供分割像素区域的位点。

K2pdfopt被移植到Koreader/Kindlepdfviewer以后就可以在阅读时让PDF重新排版。实时重排可以省去电脑上处理PDF的步骤,并且可以在kindle上交互式地微调排版参数,尽可能地生成满意的排版。使用Koreader的重排模式阅读时,软件会自动把当前页和下一页重排版成适应屏幕的尺寸。

安装KOrader需要先越狱,然后安装KPVBooklet。具体步骤如下

继续阅读 →

最近学习了一些账户登录和验证相关的知识,了解了OpenId机制的一些技术细节,发现OpenId的验证机制和某些基于Web的SSO验证机制非常类似,但不知道这些验证机制的原型和出处,于是开始转向学习Kerberos - Unix平台上一个老牌的单点登录验证系统。在《Kerberos权威指南》里找到了“Needham-Schroeder协议”,虽然不知道这个协议与其后出现的Web SSO和OpenId有没有渊源,但是学习这个协议对于理解SSO非常有帮助。

借助受信任的第三方相互验证

《在大型计算机网络中使用加密身份验证》是Roger Needham和Michael Schroeder 1978年在施乐帕罗奥多研究中心(当年乔布斯偷师的地方)工作时发表的一篇论文。该论文讨论了在非安全网络环境下,通讯双方如果借助一个共同信任的第三方相互验证的方法。

协议假设有三方参与,一个客户机,一个应用服务器和一个验证服务器。客户机可以是某台请求验证的机器,通常是个人电脑。服务器提供客户机希望访问的服务,比如邮件服务。而验证服务器是一台专门的服务器,用于存储网络上用户和服务器的密钥(受信任的第三方)。

继续阅读 →

微信越来越火,信息、语音短信、视频电话等非常实用OTT业务加上QQ好友和通讯录的导入一时间吸引了大量的用户。前段时间各大运营商开始吵着要收微信的费用。所谓“发现即晚期”,当运营商发现苗条不对的时候,已经来不及了。微信除了提供了好用的通讯替代功能,还是一个可扩展的平台,比如:微信公众平台,一种账号层面的扩展,可以理解为一种微信的公众账号区别于个人账号,通常可作为一种的资讯发布渠道,也可被实现成机器人程序与用户互动。本文介绍如何基于微信公众平台的Open API使用NodeJs开发一个HelloWord程序。

Nodejs + WeiChat

继续阅读 →