follow me on Twitter

    Monday, December 14, 2009

    HIT Online Judge System Assistant

    记得大学时偶尔去Sun老师一直推荐的HOJ上玩一玩,虽然我并不擅长算法,但是感觉ACM实在是件有趣的玩意。由于当时属于土鳖水平(其实现在也是),所以一直希望下面两个问题能够被解决:



    1. 我还没有做过的题目中,最容易的是哪道?(这样最容易提高成绩)
    2. 有没有和我刚刚过的那道题基本类似的题目?(这样也许类似的题也能马上做出来)

    自从有了Google App Engine帐号后,我就发现,可以自己写一些程序去实现这些HOJ原本没有的功能,于是发散思维,发现还有很多可以给使用HOJ的人很大方便的小功能:



    • 最近一段时间某人的Accept题目跟踪(了解自己的工作情况)
    • 最近一段时间Accept题目最多人的排行(调动大家的积极性)
    • 题目网络收藏夹(在机房看了一道有思路的题目后,经常在回寝室后就找不到了)
    • 题目推荐和反对(让好题目能被大家”顶”起来)

    再说下去就不着边际了,还是一步步把程序写起来吧。最近首先完成了HOJ上题目信息的自动收集功能,所有的数据每隔一小时自动更新。最简单的展示就是按照Accept的人数排序题目了,基本上按照AC人数排序的数据就是下图形状的(排除了1001和1002题,这个图片也是自动更新的,不过一年半载内应该没有变化吧),还真是一个长长的尾巴啊.



    http://hit-acm.appspot.com/ 就暂时叫HOJ助手吧,先把我前面提出的两个问题解决了,这样就是个真正的助手了。

    Saturday, December 12, 2009

    《jQuery in Action》 in action - Chapter 8

    Talk to the server with Ajax

    有关Ajax的介绍就不再唠叨了,用jQuery的Ajax功能可以:1.适应不同的浏览器 2.获得很多有用的工具方法

    场景1:在服务器端获得html片段注入当前DOM - 使用load(url,parameters,callback) 。一个我之前不了解的小技巧是url参数中可以添加jQuery的选择器,可以选择性的注入服务器返回的片段的一部分,例:

    $('.injectMe').load('/someResource #div');

    默认load使用GET请求,如果带上参数,就会使用POST了,这主要是方便处理参数中的编码问题。提到POST,随便带出作用于wrapped set的两个工具方法serialize()serializeArray(),他们能够将范围内有效的form元素整理出来(需要form control有name属性,可以智能的处理处理radio等元素和disabled等状况),序列化成url参数的形式和数组的形式,非常方便。

    场景2:从服务器端获取数据然后进行处理 – $.get(url,parameters,callback,type)可以用来处理各种类型的数据,不过目前最让人喜欢还是$.getJSON(url,parameters,callback)的方式。在服务器端生成JSON格式,各种编程语言应该都有方便的库可以直接用,如果服务器端支持JSONP,在url参数里加入“callback=?”就可以非常简洁的完成一个异步调用和回调的编写(谁用谁知道啊^^)。让然要向服务器端提交数据也可以用$.post(url,parameters,callback,type) 有关type参数在下面介绍.

    场景3:自定义更特殊的http请求 – $.ajax(options).实际上$.get和load等函数都是$.ajax的包装,最终jQuery都是调用的$.ajax。options里面参数很多,重点介绍:

    • dataType - String类型 - 就是前面说的$.get中对应的type,当传入不同的值时,jQuery会对返回的结果做一些预处理,在请求成功的callback的第一参数中会返回不同的值:
      xml 请求的返回内容将会被解析为XML Dom并传递给callback
      html 返回内容中的html文本不做处理,但是script标签中的内容会被执行
      json/jsonp 返回结果会被认为是json字符串并被evaluated
      script 返回的内容被认为是javascript并执行,script本身会作为字符串传递给callback
      text 返回的内容被认为是普通文本,直接传递给callback
    • beforeSend - Function - 在http请求发送前,会将XHR对象传入,用来做一些自定义头等动作
    • global - Boolean - 一个开关,默认为开放状态,也就是在jQuery控制的每一个Ajax请求中的各个事件点上,jQuery都会激发定义在本页面内的全局方法 - ajaxStart(callback)/ajaxSend(callback)/ajaxSuccess(callback)/ajaxError(callback)/ajaxComplete(callback)/ajaxStop(callback) 例:$('#errorConsole').ajaxError(reportError)会在任何一个ajax请求出错时调用reportError函数(这里实际上作为wrapped set的方法不是很直观,但是很方便)

    场景4: 为这个页面设置全局某人ajax options - $.ajaxSetup(properties).参数和$.ajax相同,因为所有的ajax方法都是$.ajax的包装,所以这里设置的默认值可以控制所有的ajax方法,唯一注意的是这里设置的是默认值,各方法可以自行覆盖。

    链接: jQuery in Action》 in action系列

    Tuesday, December 01, 2009

    iPhone 3G上传自定义铃声

    [update 2009.12]在新的3.1.2的固件上发现到第三步就可以了,真是不错

    来买的iPhone 3G还没换过铃声,原因是似乎iPhone不"越狱"的话Apple官方只提供收费的铃声从iTunes Store下载,这个我可承受不起。由于俺的小黑是港行,还是不太情愿去越狱的,难道就没有不“违规”的方法,通过正常途径上传自定义铃声吗?。Apple官方提供mac下的免费软件可以自制铃声并上传,但是我只有pc。网上的一些方法在iTunes 8 + iPhone 3G(2.2固件)下已经不能用了,经过了一个下午的探索终于找到了办法,只需要iTunes就能完成iPhone自定义铃声的使用了!

    环境 iTunes (8.0.2.20/9.0)/iPhone 3G(8G版,固件2.2/3.1.2,港行)

    具体方法如下:

    第一步: 自然是准备好自己制作的铃声,似乎长度要小于40秒,然后导入到iTunes中

    第二步: 如果不是苹果的ACC格式的,可以右键歌曲,选择"Create ACC Version",之后你的Library中就会多一首同名的m4a格式的音乐了。

    第三步: 找到你刚才转换的音乐,把文件名后缀由m4a改成m4r,之后再导入到iTunes中就发现它会出现在"Ringtones"的目录里了(这里不得不鄙视Apple的这种愚弄大家的行为)。网上的很多教程都是说到这里在设定iPhone的同步选项就能将自定义铃声同步到iPhone上去了,可是我这里并不好用,可能是固件版本或是iTunes升级的问题吧。
    [update 2009.11]之后用iTunes和iPhone进行同步时,选择同步ringtone即可

    在第三步后我卡住了很久后来研究了www.ringtonefeeder.com的教程视频才发现了可行的方法。

    第四步: 新建一个"smart playlist",条件是"Kind""is""ringtone",如果你的iTunes是中文语言的,可能要写"类型""是""铃声"。在iPhone的同步界面中的音乐部分,选择同步这个smart playlist。注意这时这个smart playlist是空的,似乎自定义导入的m4r文件不会被iTunes识别,如果不是,恭喜你,你不用做第五步了。

    第五步: 所以我们还需要第五步,这步操作可不容易,就是自己造一个podcast,因为iTunes从podcast处下载来的m4r文件是可以出现在第四步创建的smart playlist当中的,然后也就能被同步到iPhone当中了。造一个podcast对于普通用户可能比较难,我还没想到特别容易的方法,一般podcast hosting类的网站都限制文件类型,一般不包括m4r。其实可以自己弄一个web server从网站找一个podcast的rss文件,自己改成静态的,将xml文件和铃声文件传到web server的路径上就可以了(不详细解释了,我希望改天能找到一个好办法)。之后订阅这个podcast,iTunes自动下载铃声,铃声会进入smart playlist然后就能被同步进iPhone了。

    第六步: 在iPhone的Settings界面->Sounds->Ringtone里就能看到并设置自定义的铃声了。

    总结:这个方法是利用iTunes的小疏忽:屏蔽了Music Library中的非iTunes Store中的铃声上传到iPhone,但是忘了处理smart playlist里从podcast过来的自定义铃声...虽然这个方法目前在第五步可操作性极差,我也搞不清楚究竟需不需要做第四步,但是还算不用越狱,也不用购买收费的铃声制作app,也不需要一台mac,能忍就忍了...另外估计Apple会在下个iTunes或是Fireware中补好这个"小疏忽"的...