博文

目前显示的是 四月, 2013的博文

2013-04-30

今天仔细看了一下,在eclipse 中调试webapp的时候,它用的是远程调试的方式。比如,eclipse 创建一个新的tomcat进程,启动的时候加上-agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:54258 这样的参数,然后eclipse 通过tcp连过去。所以,如果编译的时候要把调试符号加足了,debuglevel=lines,vars,source我以前在写j2se的时候喜欢用Singleton来管理配置文件,写好配置文件的路径,然后通过java.nio.files.Files里面的接口载入进去就行了。但是webapps要复杂点。当我在eclipse里调试时,tomcat的CWD竟然是eclipse的安装目录下的某个奇怪的子目录。在搞不清CWD在哪的时候,我就不知道该把配置文件放哪。然后我就利用classloader来载入,但是web应用有多个classloader,把我绕的晕乎乎的。最后写了一个servlet,让它尽早加载,然后在它的init方法中,通过ServletConfig的getServletContext().getResourceAsStream(filename)的方式载入war包里的文件。一般来说,配置文件要放在WEB-INF目录下,以免被人通过http直接下载走了。oracle官网上的jsf的文档主要是j2ee 6的教程中的,太简略了,只是一个教程而已。于是我从网上找到一本不错的书,"Core JavaServer Faces third Edition"。刚看了40多页。我最近刚刚发现,Mac OS X版的kindle阅读软件,其实也可以打开pdf。这个功能在这个软件自身的界面上看不到。要在Finder 中选中pdf点右键选打开方式,就找到了。不过还是有点可惜,不能通过cloud 传送这些文件。iphone的kindle app就可以。其实我觉得amazon才是站在了科技与人文的十字路口。没有iphone你也照样活,但是kindle真的对整个人类社会的改变都很大。比如它对中国来说,无形中打破了新闻和出版审查制度。在kindle中你可以很轻松的订阅全球主要媒体的newspaper,购买美国最新最畅销的书。目前中国国内的出版商也在纷纷和am…

2013-04-29

今天在学JSF。官方的java ee6教程中,web部分主推两种技术: servlet和jsf。也就是说,在oracle看来,jsf完全可以替代jsp?我没有实际经验不知道jsf/jsp这样的即时编译技术比freemarker这样的template系统到底要慢多少,但是我觉得即便再慢也比php效率高吧?话说html5有点不伦不类啊。我以为html标准会沿着xhtml的方向走下去,成为xml的扩展。但html5的发展方向明显不是这样。html5不仅不支持namespace,而且连xinclude这么实用的东西都没有包含进去。图形性能上被flash甩出去好几条街,唉…… 我真的不明白,在移动互联网如日中天的时候,adobe为什么要主动放弃flash移动版。 java程序员们,你们现在用什么显示层技术呢?freemarker应该是停止开发只补BUG了吧?最近3-4年很少更新。struts呢?struts2是否还像struts1那时那么辉煌?jetty的WTP项目不知道为什么被放弃掉了。也就是说,现在在eclipse中,无法选jetty做server来调试web应用了。我在官方的repos里面只找到了一个jetty 6的adaptor。tomcat虽然有jstl的api,但是没有jstl的implementation. 而jsf依赖于jstl,从这点来看,大部分人是完全不用jsf吧?不然tomcat为何如此傲慢。当初做梦幻诛仙的时候我是用xstream保存配置文件(如物品配置表、等级经验表等等),如果再有类似项目,我想换成Gson+rapidjson。虽然表现力没之前那么强(比如不支持object reference),但是解析起来很简单啊,格式是独立的标准,与实现语言无关,有大量的库可以选用。

更改了Blog的Search

tumblr自身的搜索实在是太差经,它只是基于tags的搜索,于是我就想换一个自己的搜索。amazon的aws提供的有搜索服务,但是它是按vm的方式卖,很贵。然后我今天恰好看见阿里云有搜索服务API,免费的,就试了下。它那个API的身份验证方式太让人崩溃了。自己发明了一套类似于oauth签名的东西,但是签名和提交的时候依赖于params的顺序。我整了好久一直是签名失败,无奈。手动把数据传上去,将就着用下。另外,我发现webdav很有趣。有了webdav是不是从此就再也不要用ftp了呢?ftp配置防火墙太麻烦了。

如何检查一个字符串的每个字符都在指定范围内?(比如验证用户名是否合法)

rfc 3986中规定,http url的域名部分,必须是由0-9、a-z、A-Z、"%"、"!" 、 "TMPL__XXXX_BODY_XXXXquot; 、 "&" 、 "'" 、 "(" 、 ")"、"*" 、 "+" 、 "," 、 ";" 、 "=" 这些字符组成。那么如何快速的验证一个字符串是否满足这个限定呢?conststd::string pattern = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKL""MNOPQRSTUVWXYZ-._~%!TMPL__XXXX_BODY_XXXXamp;'()*+,;="; conststd::string input = argv[1]; bool isOk = true; for (std::string::size_type i = 0; i != input.size(); ++i) { char c = input[i]; bool found = false; for (std::string::size_type j = 0; j != pattern.size(); ++j) { if (c == pattern[j]) { found = true; break; } } if (!found) { isOk = false; break; } } std::cout << input << ":" << (isOk ? "true" : "false") << std::endl; 这是最直观最简单的办法。但是有两层循环。仔细看,最里面那层循环,只是为了查找一个元素是否在一个集合中,所以完全可以用…

The Http URI 解析

今天我在对照着rfc3986看java.net.URI的实现。URL无处不在,摆在我们面前的一个核心问题就是,如何解析它。URI的全称是Uniform Resource Identifiers。URL的全称是Uniform Resource Locator,它是URI的子集。意思是说,我们是通过资源的primary access mechanism的一种表示方式来标识这个资源,而不是通过名字、或其它属性的方式标识。Http request的第一行中,method后面是Request-URI。如: GET /index.html HTTP/1.1其中"/index.html"就是 Request-URI。Request-URI有4种形式:* 就一个星号。 如 "OPTIONS * HTTP/1.0"absoluteURI 。下面详细说abs_path: 即"/" path_segments [ "?" query ]authority。 给Connect方法用absoluteURI 有三种形式:net_path 模式: scheme "://" authority [ abs_path ] [ "?" query ]abs_path 模式: scheme ":/" path_segments [ "?" query ]opaque 模式: scheme ":" authority uric_no_slash *uric平时用的主要都是第一种。schema不分大小写。schema的第一个字符必须是[a-zA-Z],后面的字符必须是[a-zA-Z0-9]和+ - . 这三个字符。拿到input之后首先找":/?#"这4个字符,如果首先找到的是冒号,那么就说明input是含有scheme的。java通过这样把absoluteURI和abs_path分开。通常来说,absoluteURI用于发给http proxy,而abs_path发给普通的http server。http标准要求所有支持http/1.1的server都得支持absoluteURI形式的请求。也就是说…

2013-04-24

今天试了一下sphinx-doc,据说python的文档主要都是拿它写的。它用的是一种叫reStructuredText的语法,我看很类似于markdown。有简单的工具用于把xhtml转换成reStructuredText格式。我是发现clang的某些项目用这个工具写的文档,所以想试下。后来发现它插表格实在太不方便了,html代码贴进去不能用,非要短横线、竖线自己画一个表格出来。真麻烦。用它的转换工具转出来的table也有问题。貌似是对span="2" 这个的跨多个单元格的表格支持比较难?

2013-04-21

其实今天特别想去元大都公园,海棠花开的正盛的时候,真正的花溪啊!可是想了想,一没数码相机,二没girlfriend,还不如在自家阳台晒太阳呢。

试用 clang-format

xcode的代码格式化工具烂的很。于是我想找一个更好的。其实emacs自带的就有,不过对代码的语义理解较差。 Google的人在llvm项目中贡献了一个新东西: clang-format。这个项目之前在extra-tools中,上个月刚刚被merge到clang的主干了。所以就像平时编译clang时那样把svn trunk中的代码check out出来编译一次,就有这个工具了。这个工具既可以在命令行下运行,也可以作为vim的插件。具体文档请见这里http://clang.llvm.org/docs/ClangFormat.html不过目前尚不完美。它把我本来能编译过的代码格式化成不能编译的了…… 对宏的理解还是有问题。我准备去作者提BUG去。

2013-4-18

今天终于把一个很烦心的项目交出去了.这周末准备写一个简单的httpd server,服务静态文件。谁知道如果我想给它加上以CGI方式运行PHP的功能,该如何加呢?直接fork然后执行php进程?参数怎么传?我需要设置哪些环境变量?另外,如何建立一个简单的全文索引?tumblr的搜索功能真是差劲,只能按照tags进行搜索,没有全文搜索。Lucene ? 我的VPS只有1G内存。

为什么你写不好一个快速排序? 谈程序员的职业发展

快速排序的算法我很熟悉,就一句话:"随机选一个元素,用它把输入集分成两半,对这两半继续递归,然后将递归得到(已排好序)的结果合并"。但几个月前看算法书的时候自己尝试写了一下快速排序,发现远远是另外一回事。虽然我对这个算法很清楚,但是用C++实现的时候充满了疑惑,写出来的代码BUG很多,调了很久才调对。相反,如果拿这个做面试题去面应届生,我相信对北大清华的学生通过率应该很高,至少过半。那么我比他们多了6-7年的工作经验,这些经验又是什么呢?工作经验是人生最容易积攒的财富,只增不减。钱和不动资产,差不多也是如此。所以要想向年轻人炫耀成功项目,牛B的经历,是很容易的事情。在一个很好的平台上,与聪明的人共事,顺水推舟,再加上运气不是太差的话,工作3-5年后,必然会有一个值得吹嘘的项目。但是呢,对一个程序员来说,最核心的价值是什么?是快速的把想法,变成无bug的正确代码的能力。像前面提到的快速排序,如果需求已经很明确,怎么实现已经很清楚,语言你自己选,工具你随便挑。20分钟内代码写不出来,写不对,那就自己的问题,水平差。我之前走了一条弯路,听信软件工程的人说,不要重复造轮子。于是就忽视了这些基础训练。"不要重复造轮子"这句话在公司里是对的,但是在下班后,或是在学校,在自己写代码练手的时候,就绝对是错的。重写那些经典的算法,是绝佳的思维练习。写二分查找的时候,需要根据区间的长度是奇数还是偶数,判断结果是大于还是小于,分成2x2=4种情况考虑,然后再想怎么缩减重复代码。写快速排序的时候,除了实现基本功能外,若是能考虑下比较时发生的相等的情况如何处理,又能把执行效率提升不少。看你想要什么。若是想挣更多的钱,谋求更高的职位(无论技术岗还是管理岗),那么这些都和上述无关。在我现在的公司,每个程序员唯一的出路就是当架构师。这和你能不能写好快速排序没有关系,能看懂牛人写的代码,偶尔做做bug fix或者加个小模块就wonderful了!这就是我牢骚的关键点,随着地位、荣誉、薪水的提升,却逐渐忘却了作为一个程序员,最最基本、最最重要的技能是什么。医生可不像我们这样。即便那医生已经50-60岁了,即便已经是科主任了,依然要做手术主刀。一个手术一不留神做败了,半生积攒的声誉尽毁。于是我最近常在反复问自己,通过6年全职工作,我的编码能力有了多少提升?除了更…

云服务? 细数一下我现在用到的

最近我做了一系列的大迁移,因为我厌透了做运维的工作。挨个列吧:Blog我最早的blog是在blogcn上,然后live space,然后自建的wordpress。但是wordpress用了4-5年之后我发现一个大问题,它是一个信息孤岛。首先,baidu把我封了,拒不索引我。然后google每天大概也就给我带来几十个UV,留言的更少。大部分常客都是通过google reader访问,算上僵尸用户订阅数大概在200-300左右,只看,不访问网站也不留言。所以总的来说,这个blog就是一个单向的信息孤岛。于是这周我把我的blog迁移到了tumblr,一个更近代化的社交平台。我今天迁移刚刚完毕。如果facebook能支持绑定自己的域名的话,我会更偏好于facebook。amazon s3amazon s3就是一个静态文件池。从理论上来说,启用s3之后能大幅度提高我的个人网站的访问速度。因为它在新加坡和日本有数据中心,从北京访问的延迟大约是70-130 ms 左右。实际上很难说,我国的网络情况太复杂,ping值忽高忽低。网盘我最早用的第一个网盘是wuala,因为它支持本地加密后再上传,数据安全性很可靠。之后我又尝试了microsoft的skydrive,因为它提供25G的空间,很诱人,而且和email、msn服务结合的很好。但是这些网盘都有三个致命的问题:(1) 上传慢。首先,我在家的ADSL,上传的上限速度只有70KB/s,传递25G的数据需要100多个小时。而且这些网盘都不支持P2P同步,必须经服务器中转。(2) 严重拖慢操作系统启动。网盘在启动的时候,必须对比本地文件和远程服务器的文件是否一致。服务器还好控制,本地呢?如果我现在关闭网盘软件,然后修改了某个需要同步的文件,再打开网盘软件,它如何得知这个文件被更改过了呢?唯一的办法就是把所有文件全部扫描一遍,和远程作对比。如果你是有25G的C++代码需要扫描,呵呵,无论程序写多高明,硬盘也会给累趴下。然后机器卡的不听使唤。MAC下的Skydrive更惨,可能是微软的程序员不知道怎么监听苹果的HFS的更改,它一直处于sleep/scan/sleep/scan这样的循环中,CPU占有率像一条漂亮的正弦曲线。(3) 冲突难解决。wuala和skydrive在遇到冲突的时候,总是悄悄的rename一下了事。于是我就默默的继续编辑…

从skydrive往amazon s3迁移

最近我发现了一个很奇特的工具,GoodSync。它能把本地文件和服务器上的文件做同步,差不多就是一个网盘。但是它的奇特在于,它支持各种各样的网盘协议,ftp/sftp/webdav/amazon s3/skydrive/google drive/amazon drive等等,可惜它不解中国国情,不支持百度网盘之类的。首先看你想拿网盘做什么。如果是像115那样,分享盗版内容,那么下载速度最重要,其次是上传。如果只是想自己用,那么上传速度最重要。而我只是想自己用。如果是ADSL,那么无论是skydrive还是百度网盘,都是一样慢。因为上传速度只有1Mb/s或者512Kb/s,运营商限速了。无论访问的是太平洋彼岸微软的skydrive服务器,还是北京的百度的服务器,都是一样慢。如果去除这个限制,而又不想把数据放在国内的话,那么选择就很多了。MS和amazon在新加坡、日本都有可对外出租的云数据中心。我目前用的是新加坡的,ping值在70-80ms左右,上传在500-1000KB/s左右。挺爽的。我在家用北京联通10Mb光纤测试,从amazon美国加州的服务器下载大文件,能把我的光纤带宽基本跑满。但是在公司测试的时候不行,只有200KB/s左右。目前我正在把数据从skydrive往s3搬。为此我每年将多300RMB左右的开销。就当少约姑娘吃了一次饭吧。上周我们两个人去公司附近的小吊梨汤吃晚饭,两个人吃了250还没吃饱。真是物价飞涨啊…… 相比而下,玩魔兽世界、买VPS、amazon云服务什么的简直是太省钱的生活方式了。

Nepal游记(三)

图片
早上起来看日出Annapurna 1号峰是在西边。所以早上太阳从东边升起,照在它上面时,就有了日照金顶的壮观。它的海拔应该是8091米。
往东边看的时候,看到一个意外的景象。那片云,就像一只凤凰。可惜,不到2分钟,就消失了。
看完日出后,大家就纷纷下撤。我因为高原反应,也不想久待。头晕的厉害。从ABC到MBC的路途中看见一个冰窟窿,足有30-40cm深,下面是潺潺流水。我真的很好奇啊!我觉得MBC比ABC漂亮多了,就在MBC多呆了一会儿。MBC的旁边有一个荒草坡,这是我爬上去后拍的。
那个荒草坡其实很危险的。因为很高,有点陡,而地上都是荒草覆盖,很滑。见下图。如果踩不稳滑下去,就是在石头上打滚了。下来之后遇见一个同行。程序员看见这身衣服应该懂得。他来自澳大利亚。第一天下撤到Bamboo。第二天到Jhino泡温泉。是在一个峡谷里,中间有条河,很冰。但是山里有温泉,用管道引过来,在河边修了2个池子。一边泡温泉,一边看着这样的美景。
突然有人惊呼,Eagle! 一看,头顶有一只老鹰正在来回盘旋,俯视我们。这是我晚饭,当地人吃的最多的东西。尼泊尔套餐。第二天早上起来腿疼,因为第六天了,每天运动量都很大。一个英国佬给我推荐了这个:抹完之后腿上火辣辣的,顿时感到舒服一些,不疼了,继续走。其实山上也有可乐和雪碧卖的。我多年不喝碳酸饮料了,但是太热,来一瓶吧:下山的路上遇见一个澳洲小伙,做软件测试的。背着一个旅行箱(带轮子但是又可双肩背的那种),一双普通Nike鞋就来了。也没有登山杖什么的,还问我,这东西真的有用吗?他说他下一站是中国,他要去虎跳峡,平遥,丽江,阳朔等等。可见,装备真的不重要,最重要的是你想。我Annapurna之行的最后一天恰好是当地的Holi节。每个人都涂的花花绿绿的。你看这些老外们多享受:大约天黑的时候,到达山脚(Kandi)。找了一个Local Bus回Pokhara,然后就黑灯瞎火的开始找Hotel。最后在一个短巷子的尽头看见一个小别墅,敲门进去,真的是Hotel,很干净。地面上铺着很精致地毯。一个独立的房间,3张床,带一个很大的卫生间,问我要10美元一天,被我砍到500尼币,哈哈。钱不是重要,重要的是,这是我住过的最豪华的房子。 一早起来,店主看见我起床了,赶紧端来免费的早茶,
邀请我一起在花园里坐着享受阳光。还有两天就要走了,剩了这么多尼币,怎么花出去? 在信…