Published at: 10:08 pm - Tuesday August 17 2010
虽然现在不做前段了,但是发现好的工具还是很兴奋。今天在twitter上看到Grails in Action的作者 @pledbrook 转了一个geb 0.4的消息,顺带看了一下这个工具 http://geb.codehaus.org geb项目旨在创造一套groovy dsl帮助人们进行webapp的functional test。它是对selenium的封装,举例: @Grapes([ @Grab(’org.seleniumhq.selenium:selenium-firefox-driver:latest.release’), @Grab(’org.codehaus.geb:geb-core:latest.release’) ]) import geb.* println "Dependencies downloaded, ready for testing" Browser.drive(’http://sunng.info:8000/Pacajus’){ assert title== ‘Pacajus’ assert $("p", 3).text() == ‘Population: 41558′ } println "Tested, bye" 打开页面,执行断言。如果断言失败,driver方法会报null: Caught: geb.error.DriveException: null 只要在命令行用groovy执行即可,grapes会搞定依赖关系。 很方便吧,文档上说还可以跟grails / junit等等集成,快去看看吧 http://geb.codehaus.org/manual/latest/index.html The post [...]
Published at: 08:04 pm - Tuesday April 20 2010
XAuth.org 提供一个新的轻量级认证机制,他的机制可以参考: http://xauth.org/spec/ OpenAddresses.org是上个月O’Reilly Where 2.0上发布的开放的Geocoding服务,类似OpenStreetMaps http://openaddresses.org/
Published at: 09:03 am - Saturday March 20 2010
汇报一下近况,最近仍然是6*12小时的工作,这是第二个礼拜了。我们的进度还算是顺利,不过架不住产品那里经常会有另他们自己拍案的新点子,这可苦了开发。可怜我们开发在产品面前基本没有什么话语权,连老大都只能说我们尽量支持。因为我负责的部分跟业务关系不是特别紧密,之前也算是有先见之明,坚决解耦,所以策划的变化对我影响不大,只是听见两旁的同事不断地重复“我悲剧了”。 10.04来了,迫不及待了又。结果升级的过程中遇到了无数依赖问题和冲突,apt几乎都无能为力,前天搞到1点多才睡,早晨7点起床又继续折腾。到了昨天中午终于可以进入桌面了,累得够呛,晚上又发烧了。 早晨起床忽然想起winter,现在的4square这么火,昨天又看到了比较mood的微博产品。哎,我们做的时候可是07年啊,也许是太超前了吧。 加班路上哼张楚的《将将将》,我真想再见张楚一回。 看见@dearaprilfool同学抄的《致橡树》,很有共鸣,女生们应该读一下。小时候读不算,这个年纪读才好。 新的一天开始了。
Published at: 09:03 am - Wednesday March 10 2010
Mosaic: http://en.wikipedia.org/wiki/Mosaic_browser 这么一看,什么标准通通扯淡,还是图片管用,什么浏览器都可以显示。
Published at: 03:02 pm - Thursday February 11 2010
Glad to announce my works this morning: A simple heatmap API based on HTML5 canvas. The programming interface is rather simple now. To create such a heatmap, you just new a heatmap object by: <canvas width=”300″ height=”215″ id=”canv”></canvas> heatmap = new HeatMap(“canv”); Then read your dataset and push data into the heatmap: heatmap.push(x, y, value); [...]
Published at: 10:01 am - Thursday January 28 2010
今早短路,在godaddy上注册了我的新域名sunng.info。更换域名主要出于几方面的考虑: 新域名1年的注册费用相当于原先的一半; 众所周知的原因,域名放在国内存在一定的风险; 原先域名过长不方便记忆和交流; .com后缀和我一穷二白地状况不符 classicning.com曾被加入stopbadware.org,至今没有从twitter的malcious数据库里移除 原先的classicning.com会在今年6月到期,如果没有意外情况我不准备续费了,届时这个使用了四年的域名就要废弃了(当时客服大嫂还在电话里娇嗔地问我为啥不续十年呢,你说为啥呢)。 麻烦大家利用这半年的时间逐步改变习惯,逐步用sunng.info了。
Published at: 11:01 pm - Monday January 04 2010
最近琢磨OAuth认证方式。OAuth的优点主要在于 用户不需要直接提供用户名密码给第三方应用,就可以让第三方应用访问受限资源; 资源提供方对第三方应用有更细粒度的控制。 在整个OAuth协议里,生成signature的base string是最容易出错的部分。它由HTTP方法名、URL编码的请求路径和请求的参数表组成。 请求的参数表是除去oauth_signature以外的所有参数,按参数名排序,并进行url转义 def to_signature_key(method, url, data): keys = list(data.keys()) keys.sort() encoded = urllib.quote(“&”.join([key+"="+data[key] for key in keys])) return “&”.join([method, urllib.quote(url, safe="~"), encoded]) 有了这个通用的生成signature base string的方法,以后就可以根据OAuth协议规范按步骤进行。 首先获取Request Token。这一步通常使用资源提供方注册的API Key和API Key Secret def request_token_params(consumer_key, consumer_secret, path, method=’GET’): data={} data['oauth_consumer_key']=consumer_key data['oauth_signature_method']=’HMAC-SHA1′ data['oauth_timestamp']=str(int(time.time())) data['oauth_nonce']=”.join([str(random.randint(0,9)) for i in range(10)]) print data msg = to_signature_key(method, path, data) [...]
Published at: 11:12 pm - Monday December 21 2009
I will show you the usage of Yan captcha service. In this tutorial, it’s based on a simple ruby web application of the Sinatra web framework. Before we start to use the service, it is necesary to get Yan running. Download the code from the project page, then build and run it with maven: mvn [...]
Published at: 06:11 pm - Thursday November 26 2009
前些天看到一个Nginx的Module,用来是实现Comet,今天简单试了一下功能。作者名叫Leo Ponomarev,项目地址:http://pushmodule.slact.net/ 安装 Module需要在编译时加入nginx,同时下载nginx和nginx-push-module,在nginx configure时增加一个参数: ./configure –add-module=path/to/nginx_http_push_module 使用 编写一个非常基本的nginx配置文件: events{ worker_connections 1024; } http{ server { listen 80; server_name localhost; location /publish { set $push_channel_id $arg_id; push_publisher; push_store_messages on; push_message_timeout 2h; push_max_message_buffer_length 10; push_min_message_recipients 0; } location /subscribe{ push_subscriber; push_subscriber_concurrency broadcast; set $push_channel_id $arg_id; default_type text/plain; } } } 一个简单的Server定义了两个路径分别用于publish和subscribe。所有相关的配置项可以在项目主页找到解释,不作赘述。 启动nginx nginx -c /home/sun/nginxpush/nginx-push.conf 打开一个终端访问subscribe [...]
Published at: 09:10 pm - Thursday October 22 2009
项目的下一阶段,需要做一些数据展现方面的工作,处于对Adobe产品的抵触情绪,我个人还是倾向于用JavaScript来完成。今天找了几个画Chart的库,比较一下功能和编程接口的使用,为接下来的开发做一些准备。 dojox.charting (BSD License) 没什么悬念,第一个想到的就是曾经用过的dojo。之前实习时候用dojo画chart也算是积累了一些心得。dojox.charting的最主要优点是编程接口完善、全面,可以配置的项目很多,接口易于编程,易于动态地生成、操作Chart。而另一方面最主要的问题就是文档比较匮乏,不了解的人可能问了,doc.dojotoolkit.org好强大,怎么会文档匮乏呢。其实是dojo和mootools类似,都很喜欢用option object来传递可选参数,但是这些option object在文档中没有任何涉及,很多关键的属性都在其中但是却没有办法查到,算是美中一大不足。 <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <html xmlns=”http://www.w3.org/1999/xhtml”> <head> <script src=”dojo-release-1.3.2/dojo/dojo.js” djConfig=”isDebug: true”></script> <title>Dojo</title> <script type=”text/javascript”> dojo.require(“dojox.charting.Chart2D”); </script> </head> <body> <h1>Dojox.charting</h1> <div id=”charting” style=”width:400px; height:250px;”> </div> <script type=”text/javascript”> (function charting(){ dojo.empty(“charting”); var data = [2,4,5,7,7,4,4,7]; var chart = new dojox.charting.Chart2D(“charting”); chart.addPlot(“default”, {type: “Lines”, markers: true, shadows: [...]