新浪微博版twitese

2010年8月14日 22:50 查看评论(6) 分类:作品 Tags:

sina_twitese

架设网址:http://webbang.net/sinatwitese

项目主页:http://code.google.com/p/sinatwitese/

几个月前新浪微博找我做个实现微博所有功能的开源PHP客户端,换句话说就是把twitese改成用于新浪微博,但这样似乎没什么用,新浪微博又不用翻墙上,何必用到第三方网页客户端呢,想想可能是因为要有个微博应用的代码示例。

结果我花了点时间做出来,比较麻烦的是新浪微博的评论,下了挺多功夫的,其他都差不多,当时做到基本可以用了:

后来新浪的人有尝试修改一下外观,然后又很长一段时间毫无动静,我问了后才被告知他们不用这个了,打算自己写一个了,可能发现太难修改界面了,代码里还残留有很多twitter的东西,还不如自己写个效率高。于是我这个东西就无声无息地被埋葬了,现在掘出来晒晒太阳。

iphone webapp:模拟tweetie

2010年7月3日 0:07 查看评论(1) 分类:作品 Tags:

img_0026

地址:http://webbang.net/lab/tweetie (桌面浏览器只支持safari/chrome)

IPhone Safari不支持position:fixed,这点很麻烦,一般读取内容的app都是头部和尾部固定,中间内容滚动这样的形式,而在web上没有了postion:fixed这个功能就没法这样做了。有人针对这个问题做了hack,iScroll做得很好,效果很平滑,甚至连旁边的滚动黑条都模拟了,还支持android和桌面浏览器,真是好东西。想拿它做个东西试试。

想实现tweetie里拖动刷新推的效果,于是对iScroll进行了小小修改,options里增加了edge参数,即设置哪里是边界。再用自家的iquery开始试着实现。

实现过程发现IPhone Safari性能还是挺差,一不小心就会变得很卡,例如:
1.头部放个会动的loading图片就会让整个滚动变得很卡,不得不去掉换成不动的loading图。
2.头部箭头翻转如果设置了动画转动,就会卡大约半秒才开始转动,不得不去掉这个效果。

结果现在的效果并不好,拖动刷新的过程没有原版tweetie那么流畅,不知还有没有优化的空间。

做这样内容式的webapp相对于原生APP来说,除了性能差点,还有一个缺点,就是webapp无法直接获取远程数据(跨域问题),除非用jsonp,像获取twitter数据这些,得在本地搭个类似代理才行,多了个服务器流量。

没有android可以测试这个应用,不过应该是支持android的~要是tweetie没被twitter收购,这东西可能还有做下去的价值,现在似乎就没啥价值了,就不继续做下去了~只是演示下效果。

另,在IPhone/ITouch上webapp真是二等公民,实在没法跟原生APP相比,不知道在IPad上情况怎样,有机会真想试试~

jQuery for Iphone: iQuery

2010年6月16日 0:39 查看评论(1) 分类:作品 Tags:

img_0015 img_0017

仿照jquery的API写了专用于iphone的jquery,索性叫iquery。虽然API很多一样,但里面的实现大多不一样,sizzle引擎改成了现代浏览器自带的queryselector,其他API很多实现上是简化了,很多并不常用的方法和功能没加上,增加了iphone特有的touch等事件,详细看文档。因为内部实现是自己写的,又没有经过很多测试,所以还不能像jquery那样随心所欲地用不怕出错,还拿不出手,只能自己用,打算边用边测试,先放上源码和文档。

文档同时也算是iquery的使用演示。建议在iphone/itouch下查看,同时还可以挺好地支持电脑上的chrome和safari,其他浏览器不行~

P.S 目前文档还有很多方法没有加上详细说明

文档:http://tiny.cc/iquery

源码:http://code.google.com/p/bangswork/source/browse/trunk/iquery/iquery.js

目前压缩前17.8K,压缩后9.4K

IPhone Webapp:手尺

2010年6月7日 20:08 查看评论(2) 分类:作品 Tags:

handruler_cover handruler_ctn

简介

测量手指比划距离的工具,两手指放在屏幕上,即会显示出两手指之间的长度,单位为厘米。

需要使用iphone/itouch打开并添加至主屏幕,才能开始使用,因为只有添加到主屏幕才能全屏运行。

应用地址:http://tinyurl.com/handruler

开发

一直很想开发iphone应用,还没试过开发用手指交互的应用,想想比开发一般的应用要爽。可惜想开发iphone应用得花很多本钱,首先买个mac,再买个$99/年的证书,我买个itouch都很费劲了,当然折腾不起。于是,转向webapp。

似乎开发iphone webapp的比较少,网上资料少,我想找iphone浏览器里多出了哪些事件,怎么全屏怎么离线缓存等都找了半天,后来在http://dedy.tv/看里面应用的源码直接偷过来了,但还是费了些周折。浏览器多出的事件也在这里找到了,真费劲。

于是先做了个小小的应用练练手,开发的第一个用手指交互的应用,虽然可能用处不大,但感觉爽,哈哈。

有空再写写开发iphone webapp跟普通网页应用的不同点。

陆战军旗

2010年4月7日 13:29 查看评论(6) 分类:作品 Tags:

army

AI版(AI很笨):http://bangswork.googlecode.com/svn/trunk/army/Army-AI/index.html

前言

小时候玩的棋类游戏中,军旗算是玩得比较多的,接下来就是跳棋了。不知有多少年没碰过军旗,上次偶然在姐家下了一盘,挺怀念的,网上查了一下,四国军棋是挺多,但我们的玩法是不断翻开盖住的棋子的,据说这叫翻翻棋,边锋游戏有,下载后发现不咋地,应该是十几年前做的了,我想自己做一个网页版的。奇怪怎么这么久还没有大型的网页版的棋牌游戏,总比QQ游戏方便很多吧。

前期

前期得先把棋盘画好,定好棋子在上面的走动规则。话说这棋盘画得我自己挺满意的,呵,高仿真啊,我是把棋盘拍照下来照着画的,不过缺点是高度太大了,对于小电脑一个屏幕可能还看不到整个棋盘。棋子就不咋地,很一般,不过想换肤很容易。

程序的实现方面,这次我还是用了jquery,本来想用YUI练习下的,但发现YUI本来就不适合用来做这样的游戏,只适合用于分模块构建中大型网站,另外它没有在dom里保存data的功能,所以还是用回jquery。
(全文…)

python版twitese排行榜(开源)

2010年2月26日 17:53 查看评论(8) 分类:作品 Tags:

闲着没事,学下python,浏览完《dive into python》,想半天没想出来要做个什么东西实践好。此时twitese的排行榜功能已经停滞很久了,之前java版的代码也比较乱,索性用python重写这个功能好了。当然,这个程序还是架设在GAE上的。

这次做的基本上跟原版一样,只是抓数据时不用page这个参数了,用cursor这个参数分页,发现这个参数用来抓取数据实在是比page方便多了。另外通过一些小伎俩解决了原本只能获取前1000个用户的问题,现在可以直接通过分页看到所有抓取到的用户了。具体抓取方法见这里,最后做了独立页面:http://twiteseapi.appspot.com/

写旧程序,虽然是用不同语言写,但激情实在高不了~这次这个python应用感觉写得没什么python的风格,可能是因为程序太简单吧。python给我的初感觉就是很精简,跟java正好相反,只是奇怪为什么每个类方法的self参数为什么不自动传进去,还要手动写,这跟它的精简实在不符。

这个程序,也是开源的,并且做到很容易架设,只需要上传后执行一下init就行了。地址:http://twiteseapi.googlecode.com/

FLASH绘图板

2010年1月29日 0:30 查看评论(3) 分类:作品 Tags:

发个绘图板,算是这学期图形学的作业,另外给一个项目用,绘制树形图标后通过php输出图片。

这是用flash builder 4做的,主要是想尝尝鲜,好像我都比较喜欢尝鲜的,做AIR账本的时候AIR刚刚出现没什么资料,这次也是,FB4 beta版刚出不久,没什么资料,里面关于皮肤的东西官方帮助又说得不明不白,有点蒙着做这个东西。觉得做个画板挺有趣的,可以练练面向对象编程,因为里面要用到继承的东西不少。

其中花功夫比较大的就是那个文本生成和选择工具上,当时找了半天才摸索到去除textinput边框和背景的方法。选择工具则是牵涉到整个画板了,都得在开始做之前就想好,目前的功能是鼠标移到元素上会选中那个元素,加红色边框,用选择工具画个矩形可以圈选多个元素,对多个元素一起进行编辑,拖动其中一个其他也会跟着动,记得当时这个比较折腾人~FLASH不支持多对象拖动,需要自己通过mousemove事件写,但如果是在某个容器上绑定 mousemove,鼠标移动过快的话就不会响应,得把事件绑定到外层的整个大容器里才行,反正一番折腾,结果现在貌似还正常~有没有潜在bug就不知道了~~开发过程中其他的事都不记得了,本来想做好工具栏皮肤的,但后来没精力没动力去做了,就先不做了~仅是习作~

效果:http://bangswork.googlecode.com/svn/trunk/drawing/bin-debug/flowchart.html
源码:http://code.google.com/p/bangswork/source/browse/trunk/#trunk/drawing

twiteseV1.3

2010年1月27日 13:54 查看评论(24) 分类:作品 Tags:

考完试后,开始大改twitese,修复了很多大小bug,新增了一些功能,具体如下:

新增
新增官方RT,RT显示格式有两种,可以在“设置”里选择。
新增自定义API,发现默认API无法使用时可以自己设定API,在“设置”里自定义
新增停止自动刷新按钮
新增状态数值刷新按钮,更新好友数、关注者、推数三项数值
好友列表新增 关注/取消关注 按钮
侧边栏新增推群、热门消息
提示条新样式,固定在页面顶部,不会出现看不到的情况

细节
@自己的推高亮显示
ajax刷新时会更新旧推的时间
图片显示代码优化,每次刷新新推只检测新推里是否有图片。
搜索优化 纯中文字符间加空格
发推时显示的新推格式修整,链接,图片等都会显示
丰富出错提示,例如连接不上twitter、向没有关注你的人发私信都会有相应的提示

修复
修复中文标签乱码的bug
修复发送消息时过滤+ &等符号的bug
修复进入空页出错的bug
修复空间不支持加密函数时出现的错误

目前官方RT有一个问题,就是无法在timeline里显示自己是否RT过这条推,也就是说,你RT完一条推后,如果想undo,必须进入侧边栏的“RT消息”里删除那条推。自己RT过的消息在timeline里也无法高亮显示。这是官方API的缺陷,在开发者论坛上已经有人抱怨过,不知以后会不会加一个“rt_by_me”这样的参数。

之前最棘手的就是在某些空间不能加关注加收藏等问题,这些都是curl那块出的问题,貌似不同版本的PHP对这个curl语句支持不一样?没有空间可以测试不知道怎么修复。这次又小改了下这部分代码,但不确定之前那些问题是否解决了~

修整的过程感觉挺爽的,把bug一个个改掉,新功能一个个加上,挺顺利的,也重整了部分代码,把timeline的代码统一放在twitese.php的一个函数里,所有页面通过传参数调用,统一管理,可惜搜索页面和刷新推的特殊参数太多没法放进去。发现做啥东西都是刚开始时激情十足,连续做得久做得多了就没多大激情了,得换换口味休息休息才行。于是,我之前计划想加入的“高级搜索”功能,就留到下个版本再实现吧~

项目主页:http://code.google.com/p/twitese/

抓取twitter中文用户数据GAE程序开源

2009年12月8日 23:32 查看评论(12) 分类:作品 Tags:

起源

我对抓取和处理数据挺感兴趣的,以前试过用PHP抓取饭否用户的数据,得出饭否用户统计(放在秘饭里),当时特别需要能有定时执行一个程序持续抓取数据的功能,但找不到方法,暑假发现GAE有cron功能时挺兴奋,就琢磨着要做个什么东西,抓取一些什么数据玩玩。可惜饭否挂了,否则我做的肯定是饭否的应用,饭否没了,就捣鼓twitter了。

想着想着,就想出抓取twitter上说中文的用户,形成一个排行榜,一个圈子,就是推特中文圈了,因为可以不断抓取数据,每个人最新的一条推都保存在数据库里,更新时间也保存,然后读取数据库,根据更新时间排序取出数据,就能形成的“随便看看”功能了。我最初想做的,就是这两个东西。实实在在的一个“中文圈”,后来闲着也是闲着,干脆把使用twitter需要的功能都加上了。没想到后来受欢迎的是这些普通功能,最初的那两个功能反响反倒不怎么样。另外,在中文圈发消息的时候,会自动更新存在GAE数据库里对应的用户数据,所以会马上显示在随便看看里。用的人多了,随便看看的更新就比单纯后台抓取数据快多了。

后来GAE版被封,改写PHP版,不愿放弃排行榜和随便看看,于是修改了程序,还是那样抓取数据,再提供个页面输出json数据,让php程序调用。

本来打算开源PHP版twitese后下一步就是要开源这个抓取数据提供API的GAE程序的,但一因为懒,二因为大家似乎没这个需求,就搁置了,今天偶尔想起来,就放上吧。

程序

项目主页:http://code.google.com/p/twiteseapi/

原理

读取FecthHelper数据库获得用户id和页码(第一次用下面写的initFetch页面写入初始数据),抓取他的好友列表,循环每一个用户,判断他的姓名、desecration、最新的推里有没有中文,有的话保存进TwitterUser数据库,没有的话跳过。一个页面的好友列表处理完后,判断此页是否为末页(根据好友个数是否小于一个数),不是末页则把下一页的页码写入FecthHelper数据库,等待下次执行。是末页则读取数据库TwitterUser里另一个用户的数据,存入FetchHelper,等待下次执行。

使用

在eclipse新建一个GAE项目,再把文件覆盖进去。改一下appengine-web.xml里的名字,剩下的就是提交上传了。

页面

4个功能页面:

initFetch页面,源文件InitFetchData.java
上传程序后首先运行这个页面,初始化生成FetchData数据库,写入当前要抓取的用户和页码。

fetch页面,源文件FetchData.java
核心页面,读取FetchData数据库取出用户名和页码,抓取它的好友列表,保存进数据库TwitterUser,按照不同条件判断继续下一页抓取还是改变抓取的用户。

reset页面,源文件ResetData.java
读取过的twitter用户在数据库里会标志readed=true,fetch抓取时间过长可能会导致所有用户readed都为true,这个页面每次修改100个用户的readed为false。

delete页面,源文件DeleteData。java
删除数据库TwitterUser里的数据,每次删除300条。

其中fetch reset delete都应该通过cron不断执行。

2个输出页面:

rank.json页面,源文件RankJson.java

输出排行榜数据,格式:

[{
    "profile_img_url": "http://……",
    "screen_name": "bang590",
    "name": "bang",
    "description": "",
    "followers_count": 1455053,
    "friends_count": 72,
    "statuses_count": 586
  },
  ……
]

接受参数:页码page 条数count 均为optional

browse.json,源文件BrowseJson.java
输出随便看看数据,格式:

[{
    "profile_img_url": "http://……",
    "screen_name": "bang590",
    "name": "bang",
    "text": "推内容",
    "created_at": "Tue Dec 08 15:15:50 UTC 2009",
    "id": 6465851422,
    "source": "web"
  },
  ……
]

接受参数:页码page 条数count 均为optional

目前存在的问题是,没判断API Rate limit,抓取时超过了API限制直接跳过了。
偶尔一些外国人的推里出现了中文,也会被抓取进数据库。程序写得很乱,没去整理,挺多地方有摇摇欲坠的感觉。不过上线运行了挺长时间,应该还算靠谱吧~

twitese1.1 新增list功能

2009年11月27日 20:42 查看评论(10) 分类:作品 Tags:

更新

个人挺喜欢twitter的list功能,在follow的人多的时候尤为有用,这两天抽出时间给twitese加上了list功能,顺便改正一些小bug。

修改的bug:

php空间开启magic_quotes情况下单引号双引号前多了”的问题
消息自动刷新时执行时间超时出现的错误
修正国内空间无法搜索的问题
……还有其他一些小错误

更新:

list的查看,新增list、list成员等功能 P.S list消息界面会自动刷新
新增API limit显示
去除config.php里的SEARCH_API设置,改成在程序里自动判断
FAQ页面

待增加的功能:

图片上传、黑名单、短网址、cookie加密(原先的有错误,暂时不用了)、ajax自定义(自动刷新时间间隔,提示条隐藏等)

项目主页:http://code.google.com/p/twitese/

预览:http://twitese.webbang.net/

命名

在twitter上咨询了list翻译成中文要叫啥好,推友的答案是“列表 推列 李斯特 群组 自分类 圈子”,个人倾向于推列和群组,那么就组合一下,叫推群好了,觉得这名字还算合适吧。

API Limit

做twitese,受twitter API rate limit的限制太大了,也就是一小时限制请求150次API,超过了就要等下个小时重置才能继续。一般可以申请twitter白名单,能将每小时限制次数提高到20000次,这样几乎就没什么限制了,但做twitese是开源由大家自由架设的,总不可能要求每个架设的人都申请白名单。于是都得小心翼翼地使用API,能省既省,于是不能每次刷新页面的时候都更新用户数据,省略了每次进入用户页面就要判断是否已经加入黑名单的功能,等等。做list的时候发现要用的请求数太多了,于是,现在的list添加成员方法只有那么很不方便的一种,以后再想办法改进吧。

list API

做的过程着实被list的API恶心了不止一次。总结一下:

1.先看看list的所有API

List Methods
POST lists (create)
POST lists id (update)
GET lists (index)
GET list id (show)
DELETE list id (destroy)
GET list statuses
GET list memberships
GET list subscriptions

List Members Methods
GET list members
POST list members
DELETE list members
GET list members id

List Subscribers Methods
GET list subscribers
POST list subscribers
DELETE list subscribers
GET list subscribers id

你单看名字能知道这个API是干嘛的吗?能的话算你牛,这是第一个恶心的地方。以前的API功能是什么都是一目了然的。
例如GET list subscribers id是检查用户是是否已经follow某个list ,而GET list subscribers是返回用户follow的所有list,两者名字上的差别就是差一个单词”id”,牛。

2.每一个list API地址都是http://api.twitter.com/1/开头的,旧的API都是以http://twitter.com开头的,接下来说的你可能会看晕:
list大部分API可以用http://twitter.com代替http://api.twitter.com/,结果一样,但有些就不行:

http://api.twitter.com/1/bang590/lists.xml 可行
http://twitter.com/1/bang590/lists.xml 可行

http://api.twitter.com/1/bang590/lists/subscriptions.xml 可行
http://twitter.com/1/bang590/lists/subscriptions.xml 不可行

犯晕了没?后来无意中发觉,把所有http://api.twitter.com/1/改成http://twitter.com/就都可行了,这才让我可以继续做下去:
http://twitter.com/bang590/lists/subscriptions.xml 可行
官方API文档完全没有提到这回事,这在考验程序员的悟性么?

3.有些API完全不可用,例如GET list subscribers id,怎么搞都是出现404找不到页面,于是现在还没有判断用户是否已经关注某个list的功能。

4.最恶心的一点,为list添加和删除成员,竟然不接受“bang590”这样的用户名,而只支持一长串数字的用户ID。一直以来screen_name一直都被当做id用,在这里竟然不被支持,这下脑残了,我必须通过screen_name请求users/show,返回这个用户对应的id,再传给list添加成员的API,才能成功添加成员。list添加成员是不限制API的,但users/show要,也就是说,每添加和删除一个成员,就要用到一次API请求……巨脑残,难道是我没找到更好的办法?

总结四个字:乱七八糟

list功能没经过很多测试,所以应该还有大大小小挺多错误的,大家指正吧。