Arganzheng's Blog

stay hungry, stay foolish

如何往HttpServletRequest中塞请求参数

需求 假如用户没有传递cooperatorId,那么默认等于uin。 常规做法是在interceptor或者filter或者action中判断如果没有cooperatorId参数,则设置到request的parameterMap中: String cooperatorId = request.getParameter("cooperatorId"); if(cooperatorId == null){ request.getParameterMap().put("cooperatorId",request.getParameter("uin")) ; } 问题 public interface ServletRequest { ...

URL encoding学习笔记

最近在搞一个Open API在线测试工具,出现一些问题,因此接触到了URL Encoding相关方面的东西。 首先要了解一下什么是URL Encoding: URL Encoding is the process of converting string into valid URL format. Valid URL format means that the URL contains only what is termed “alpha digit safe extra escape” characters. 然...

海量图片存储思考

最近在学习分布式存储和数据分析相关的东西,特别是看了Facebook的这篇论文:Finding a needle in Haystack: Facebook’s photo storage,感觉特别与阿里巴巴现在的现状类似。阿里现在的图片存储正处于Facebook的原始阶段——CDN(中美有各自的CDN) ==> imageServer(apache+squid) ==> NFS共享存储。 说明 CDN的作用 CDN只适合于缓存popular static content(images, html, css, js, etc.)。对于long tail(长尾)文件,并不适合。这就是我们上次ASC从前台dump图片,将存储搞挂的原因。faceboo...

构建可伸缩的大型网站

语言与框架 php: Zend python: django ruby: rail java: springMVC 开发环境与服务器环境 linux 机房 服务器硬件 服务器软件: webServer: apache, lightd, nginx appServer: tomcat, jboss, jetty, nodejs 代码版本控制 svn git 自动化构建工具 ...

工欲善其事,必先利其器——从零打造你的vim

内功心法 预练此功,必先自宫。 1、源码安装编辑器 vim 发行套件的软件源中预编译的vim很多时候版本太老旧,但是有些插件,比如YCM插件,对VIM版本有很严格的要求,所以如果你的版本实在太低,还是建议先升级一下。可以采用源码安装: git clone git@github.com:vim/vim.git cd vim/ ./configure --with-features=huge --enable-pythoninterp --enable-rubyinterp --enable-luainterp --enable-perlinterp --with-python-config-dir=/usr/lib/python2.7/config/ --en...

使用github搭建个人博客

一直喜欢写文章。大概一年多前吧,在CSDN和javaeye(哦,现在叫做iteye..)注册了帐号,写了几篇博文,但是看着javaeye老土的界面和窄小的编辑区域就没有写的兴致了,CSDN相对大方点,但是速度老慢。还不如我用QQ记事本编辑方便和有意思。想自己写个博客系统,实在是没有抽不出空闲的时间,而且本人前端美工比较烂,所以一直是QQ记事本将就着用。直到最近看到很多人用jekyll搭建了自己的博客系统,所以在这周抽出时间也搞了一个,就是大家现在看到的这个。本博客是在其他文章的帮助搭建成功的,怀着感恩的心,本博的第一篇文章就是详细介绍如何用jekyll搭建一个个人博客。虽然文章很长,但是请相信我,整个过程只需要一天左右。 What: 什么是jekyll jeky...

使用rsync进行文件同步

以前一直用scp,但是rsync更强大。最常见的应用场景是需要将开发机的代码发布到测试机上编译和运行,确认没有问题之后再提交svn。以前的standalone发布程序做的其实就是这样的事情,里面的核心发布函数就是利用了rsync: Release(){ echo_red `nchar = 25` "[$APP]:Press any key to release on $CONTAINER, or Ctrl+c to quit !" `nchar = 25` read _xx ssh $CONTAINER "mkdir -p $TARGETDEPLOYDIR" rsync -avz --delete $SOURCEDEPLOYDIR/...

shell模块的另一种组织方式

在前面一篇文章里shell如何模块化和复用——shell深入学习,我介绍了一种shell的模块化做法,但是在实际的代码中我估计很少人会这么处理,相反,有另一种组织方式(或者称为模块化方式吧)在一些开源代码中可以见到,感觉更符合shell的语言特性。 由于shell的source语句(. 语句)本质上是在当前的shell进程中执行script脚本文件,所以如果这个脚本文件中不是单纯的定义子函数被导入上调用(也就是我们所谓的子模块或者库),那么他就类似于VM中的一个子control,仅仅是为了避免重复代码,而且往往需要导入多次(因为导入就是为了执行该子shell)。而对于作为子模块的子shell文件,我们其实是希望他只被导入一次的(因为我们是要导入他定义的子函数)。这...

shell如何模块化和复用——shell深入学习

基本上所有的编程语言都支持模块化,以达到功能复用的效果。比如java和python的import xxx。C/C++的include。那么shell支持模块化吗? shell本质上并不支持模块化,但是有些机制可以使它达到类似的效果。 一些背景知识 首先要了解有两种方式可以执行一个shell脚本: 1. 一种是新产生一个shell,然后执行相应的shell脚本 方法是在scripts文件开头加入以下语句 #!/bin/bash 一般的script文件(.sh)即是这种用法。这种方法先启用新的sub-shell(新的子进程),然后在其下执行命令。 也可以直接在命令行中指定shell类型,如: $ sh script文件 2. 一种是在当前shel...

python2.x的一个需要注意的地方

今天晚上过来跑图片dump python脚本,无意中发现python的OptParse的一个小“问题”,很容易中招,就像python的range一样,不小心就容易出问题。 程序主体逻辑如下: def main(): p = optparse.OptionParser(description=”dump summ img in a dir that matches the given patten”, prog=”dump_summ_img”, usage=”%prog dir”) p.add_option('--destdir', '-o', action="store", dest="destdir", d...

×