jQuery实例内存空间占用

2010-2-8 评论(2) 分类:技术文章 Tags:

刚接触jquery时很好奇,一个jQuery对象,那么多方法可以用,要是每个对象都保存着这些方法,那得占用多大的内存空间啊。很显然,那些方法都是共用的,只保存一份。今天闲着,研究了下。

要知道哪些方法是每个实例各有一份,哪些方法是共享的,还是先来研究下js的基础:js内部是怎样调用一个实例的属性/方法的。看这段代码:

    var Test = function () {
        this.a = "a";
        this.b = "b";
        this.c = function(){
            return "c";
        }
    }
    Test.prototype = {
        b: "b_prototype",
        d: function(){ return "d"; },
        e: "e"
    }

    var t1 = new Test();
    var t2 = new Test();

var t1 = new Test(),这一句,在 Firefox 下,不考虑参数传递,可以用下面的代码来表示 new 的过程:

var o = {__proto__: Test.prototype};
Test.apply(o);
t1 = o;
//摘自http://lifesinger.org/blog/2009/06/yui3-oop/

经过Test.apply(o);这一句,o = {__proto__: Test.prototype, a: “a”, b: “b”, c: function(){ return “c” } }

调用t1(即o)实例的方法/属性时,会先在o查找是否存在,如果存在,即返回,不存在,则沿着原型链__proto__往上查找,实例对象t1的__proto__指向原型Test.prototype,而Test.prototype.__proto__指向父类的原型,一层层往上搜索,这里Test继承原始天尊Object,所以Test.prototype.__proto__ === Object.prototype

alert(t1.a) //a 在对象中找到a = “a”
alert(t1.b) //b 在对象中找到b = “b”,不再继续查找,忽略对象原型里的b = “b_prototype”
alert(t1.e) //e 在对象中找不到d,沿原型链找到Test.prototype有属性e = “e”

从new语句的分解可以看到,在构造函数里用this.xx = xx生成的方法/属性是每个实例对象都会复制一份的,而prototype里的方法/属性则所有对象共享一份。

alert(t1.c === t2.c) //false t1 t2两个对象的方法c是不同的拷贝,分别保存在t1 t2里
alert(t1.d === t2.d) //true 两个方法d都指向Test.prototype.d

需要注意的是,如果你给t1.d赋了新的值或函数,并不等于修改了Test.prototype.d,这点曾经迷惑了我:

t1.d = “new d”;
alert(t1d === t2.d) //false t2仍然指向Test.prototype.d,而t1在自己对象里新增了属性d,调用t1.d时不会再沿原型链向上查找

回过头看看jQuery,很明显,所有jQuery实例用到的方法都保存在prototype里,只保存一份,jQuery实例对象本身只包含了length selector context三个属性,以及搜索到的DOM。例:

    <div id="tid1" class="tclass"></div>
    <div id="tid2" class="tclass"></div>
    //在jquery源码里jQuery.fn ==  jQuery.fn.init.prototype == jQuery.prototype
    $(".tclass") == {__proto__:jQuery.fn.init.prototype,
                      selector: ".tclass",
                      context: document,
                      length: 2,
                      0:/*指向DOM元素<div id="tid1" class="tclass"></div>*/,
                      1:/*指向DOM元素<div id="tid2" class="tclass"></div>*/
                     }

FLEX中使用AS动态创建DataGrid

2010-2-6 评论(2) 分类:技术文章 Tags:

初学FLEX时,需要在AS里动态生成DataGrid,结果搞了很久才搞明白怎么把用MXML写出来的DataGrid改成用AS写出来,其中最主要的就是自定义itemEditor、itemRender怎么写,写篇东西整理总结下。

先看看下面这段代码:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
	<mx:Script>
		<![CDATA[
			import mx.collections.ArrayCollection;
			import mx.controls.DataGrid;
			import mx.events.ListEvent;
			[Bindable]
			private var dgDataArr:Array = [{name: "Jon", job: "officer"},
									  {name: "James", job: "seller"},
									  {name: "Jodon", job: "manager"}];

			private function itemClickHandler(e:ListEvent):void
			{
				trace(e.target);
			}

		]]>
	</mx:Script>
	<mx:Component id="comboboxEditor">
		<mx:ComboBox dataProvider="{dt}" editable="true">
			<mx:Script>
				<![CDATA[
					private var dt:Array = ["officer", "seller", "manager"];
				]]>
			</mx:Script>
		</mx:ComboBox>
    </mx:Component>
	<mx:DataGrid width="100%" x="10" y="20" fontSize="14" dataProvider="{dgDataArr}" editable="true" itemClick="itemClickHandler(event)">
		<mx:columns>
			<mx:DataGridColumn dataField="name" editable="false" />
			<mx:DataGridColumn dataField="job" itemEditor="{comboboxEditor}">
			</mx:DataGridColumn>
		</mx:columns>
	</mx:DataGrid>
</mx:Application>

代码实现的是创建一个DataGrid,其中job栏可以编辑,并且编辑器是自定义的一个ComboBox。效果如下:

现在看怎么用AS代替MXML创建同样的DataGrid。
(更多…)

FLASH绘图板

2010-1-29 评论(6) 分类:作品 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 评论(25) 分类:作品 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/

搬空间

2010-1-23 评论(13) 分类:生活

博客已经从名网迁移到mt主机~之前放在名网实在是折腾人,我是被逼走的~在此期间我提交了16个售后问题,每个售后问题都有来来回回很多次留言,解决时间有快有慢。网站估计只有80%时间是正常的,总是出现这样那样的问题导致无法访问或不正常。

来看看都是哪些问题:

1.后台phpmyadmin无法编辑或删除数据,出现:“(关键词:from,delete)您浏览的页面或提交的数据包含敏感关键词信息,该关键词已经被过滤。”问客服,客服说你不要用这个关键字,这是敏感词。晕。忘记最后怎么解决的了。

2.“拒绝访问, 页面包含非法关键字: XX”。只要页面出现某个敏感关键词,整个页面就不能访问,只出现这么一句话。那我删掉这关键字还不行吗?对不起,还真不行,因为后台编辑也会出现这个关键词,一样打不开,直接去数据库修改数据就出现上面的第一个问题,无法修改。最后是通过跟客服打电话才解决。页面关键词实在太多,客服发了份列表给我,貌似丢了~

3.某段时间,静态页面可以打开,博客php程序打不开,提交售后问题,说是其他用户占用了超高的CPU。这个问题处理了很久,两三天,处理完后过了几天还是出现这样的问题,如此反复3次。最后他们让我转到linux空间去了,迁移空间还要我自己down下所有数据再手动上传上去,数据库也是,又折腾了好一会。

4.由于自己疏忽,放上了一两个MP3文件,被百度抓取到了,流量猛增,一下子就用完了,在空间流量快用完时他们不会通知你,等你的网站因超流量了打不开了,要你自己上去他们网站看,去提交售后问题,他们才会告诉你,流量超了。

5.广州机房审查,搞了两个多星期,在此期间网站无法访问。

6.机房审查过后,连接不上数据库,伪静态也失效了,得自己去探索问题所在,自己去折腾解决。

7.1月18日网站又打不开了,出现“Bad Request (Invalid Hostname)”,什么提示都没有,又一次挂掉了。提交售后问题才回答,他们做了CDN加速,要我的域名重新绑定一个新的IP地址。厉害,你不通知客户,直接先把IP地址给换了,什么提示都没有,等到用户发现自己的网站打不开,提交售后问题后才回答。这就是名网的服务。

8.最恶心的一条来了,前几天打开网站,莫名其妙的出现卖MSN监视软件的网站来,更恶心的是,它不是跳转到另外一个域名另外一个网站,它是直接绑定了,webbang.net/download.html就是这个监视软件的下载页面,靠,搞到有人以为是我在卖这些东西。到后台一看,说我网站有违法内容:twitter。确实放了一个twitese在上面,但未公开。好,那我删了,删完提交售后问题,提交了一大堆,结果得到的回复是“用户不好意思!你的问题已经反映给我们领导”之类的,没帮我开通。晕死,再提交一次,说你先帮我开通空间再说啊。得到的回复是:“twitter 请关闭相关服务”。。我抓狂了,不把用户提交的售后问题当回事,之前我已经明确说我已经删除twitter相关的所有东西了。无奈再提交一次,终于开通。。实际上我要他开通的唯一目的就是备份数据库。网站关闭的时候你连进入自己数据库的权限都没有。我再啰嗦吐下苦水,你发现违法内容,一不通知我去删除,二停止了我的空间,让我连备份的机会都没有,三停止后还跳转到买软件的网站,四客户服务拖延,这是什么行为?简直是强盗+欺诈行为。

千万别买名网,或者别买国内空间,因为上面的问题很多都是国内政策导致的,只是名网处理得很差。

不过名网还有一点可以称赞的就是,虽然普通客服态度不怎么样,但技术客服态度很好。

杂想片段

2010-1-16 评论(10) 分类:随记 Tags:

1

中国3.8亿网民,有多少人会想去翻墙?根据昨天看到的统计,twitter上的中文用户半年内有发过RT的不过3万多,翻墙活跃的人一般都会上twitter,这样估计一下,就算翻墙的人有 100万,也只占中国网民的0.3%,所以在twitter上偶尔看到“翻墙已经成为中国网民的一项基本技能”“全民翻墙”这些说法觉得很不靠谱。

2

实际上翻墙很容易,但对一般网民来说,翻墙干嘛?翻墙可以上 youtube facebook blogspot twitter 原版,和其他一系 列被封的网站,但对大部分人来说,这些都不是上网必需品,何必折腾着特地翻出去上这些网站?很多人翻墙后说,墙外也就那样,没什么好看的,目前还没有多大 的理由能吸引普通网民翻墙。你可以说twitter上很自由,不像新浪微博审核那么严格,但一般人只想记录生活,跟身边的人交流,新浪微博已经足够了,没 事讨论那么多敏感话题干嘛。不能否认一般人不爱折腾这个事实,我就是很少翻墙的,用puff也嫌麻烦,除非发现一篇很想看的blogspot,或者看看 twitterAPI文档,才会去翻。

3

百度在某一个圈子里名声是挺臭的,实际上它被曝的罪状和黑幕也不少,1 2 ,相对google的不作恶,百度显得为了利益十恶不赦。但看到有人说鄙视用百度搜索的人,感觉真的没必要,实际上网民管你恶不恶,只要不恶到我身上来就 行了,哪家好用就用哪家,其实很多时候搜索正常的东西,百度会比google好用,特别是中文百科类和提问类的,百度百科和知道的结果往往就是搜索者想要 的,另外百度也足够稳定,有时我会打不开google,可能是自身网络的原因,但百度几乎没碰到打不开的情况。当然也有很多时候google比百度好用, 搜索冷门的东西,新奇的东西,英文资料,google得到的结果都会比百度多而且好。所以我都是看情况几乎平均地使用两个搜索引擎的。对于搜索引擎这种工 具,哪个好用就用哪个,再正常不过了。

4

我比较恶心两类人:超装逼的人和愤青。一般人偶尔有意无意也会装一下,当然我也会,觉得这没什么问题,恶心的就是那些无时无刻都在装逼的,就是要让 你觉得他比普通人高一筹,就是要体现自我优越感。其实很多专家可以直接称之为装逼家了。对于那些愤青,有人说中国相对朝鲜伊朗还是好的他就激动地“教导” 你,说用百度好他就跳起来开骂,说不抵制家乐福就骂你卖国,不管正派反派,都足够让人恶心的。

5

记得小时候第一次写作文么,应该大部分都是,扶老奶奶过马路,捡到一分钱交给警察吧?我们从小就被培养写这些有“内涵”的文章,而不是记录真实的文 字。小时候被教导要诚实,不能撒谎,却不仅老师一直在撒谎,还要教唆人写撒谎的作文。但这也不能怪他们,因为我们国家的主流就是这样,看看新闻联播,新华 网人民网……如果没有这样的教育,怎么会接受高也的“心神不宁”,怎么相信 这个 这个 这个 呢。感觉还是当个非主流的人好~不过可能一不小心就会被变成 不明真相的群众 别有用心的人~

6

中国互联网环境实在太差,可能短期内改变不了,但等再过些年,整体素质提高了,现在的年轻一代成爸妈级人物了,情况总会大不一样。

7

虽然一直在关注这几天在twitter上炒爆了的谷歌退出中国事件,但不知道该说什么,只可惜了中国失去一家这么难得的好公司。

2009

2009-12-31 评论(5) 分类:生活 Tags:

不知道该怎么总结2009年好,因为年度的边界现在在我印象里似乎不太明显,我记不清哪些事情哪些改变是在这一年内发生的,哪些是在更早之前发生的。感觉这一年我变化还是挺大的,但说不出来,写一些碎片段吧。

几件事值得记录,年初的兼职,让我开始尝试到经济独立(虽然学费还没独立),年中的腾讯实习生招聘,让我提升了信心,年末的推特中文圈让我认识挺多人。

今年才知道GFW这个东西,似乎GFW是今年才严重发作的吧,我也忘记是什么时候开始知道这个国家的一些现状。不多说。

今年做的东西不多也不少,几乎都放上博客了,另外终于做了个比较多人用的东西,成就感挺强的~~我还是很喜欢做自己的东西,但是脑袋里点子太少了,闲的时候经常纠结于要做个什么东西好。

今年博客写得少了,唠叨得少了,一般琐碎的都写上twitter了,懒得写博客,很多人都这样吧。比以前多了一些技术文章,希望下一年能写多些技术文章。另外还尝试写了一两篇媒体类的文章,呵,效果不咋地。

今年看的书虽然就那么十来本,但已经差不多是我以前看过的书的总和了。没事我觉得还是看看书好,开阔视野。就算是忽悠人的书,看多了才会知道这书是忽悠人的。看看《货币战争》,虽然扯淡了点,但可以引起人对金融和经济的兴趣。看看《走出软件作坊》,虽然现实上我不喜欢作者这样超级正规正派实用主义的人,但这本书我觉得对于无经验的学生很值得一看,看完大概了解,原来软件开发,项目管理大概是这样的。我就看了那么十来本书,但觉得视野比去年这个时候广一点了,希望接下来一年能看更多书。

今年似乎想多了一些乱七八糟的事,想以后的工作和生活,想“活着”,首先要活着,身体健康,其次是过日子,目标是日子过得有趣,快要工作了,锻炼和寻找合适的心态,才能做到快乐地过日子,心态这方面,我实在太差了。

最近意识到,自己有个挺严重的缺点,就是十分毛躁,沉不下心来。一旦有一些无法预测的事,就会很烦,压着感觉很不舒服,还整天做别的事也想着它。我想要是这小小压力都承受不了,以后工作怎么办。寻求克服的方法中,希望下一年能做到。另外急躁是我从小到大的性格,一时半会估计改不了,尽量冷静。

下半年似乎又有点伤病缠身的现象,先是脚倒霉地缝几针静养几个星期,接着国庆后感冒咳嗽快一个月,搞到慢性咽炎都有了,经常痒。另外年末老爸来广州看病,着实让人担心死了,接下来会来广州治疗,希望尽快康复。。

身体是根本,趁没生病,养好身体吧。

兼职结束

2009-12-20 评论(1) 分类:生活 Tags:

上个星期12月13日正式结束了我的一份兼职工作,3月6日-12月13日,历时九个月。

在大二寒假快结束的时候,我突然想在网上找找看有没有项目有没有兼职可以做,结果就找到了这份兼职,最初是给我一个星期的时间去学习prado框架和做一个应用—抓取5tutor.com上的数据保存到数据库,要求程序要用prado这个框架做。当时学起来难度有点大,prado这个框架挺冷门的,资料很少,官网文档都不怎么齐全,最后我还是做到了,估计也超出他的预期了,兼职就正式开始了,当晚通了个电话,聊了点相关事宜,那时还挺激动的,毕竟是第一份拿工资的工作。对方是香港人,他的普通话跟我的粤语一个水平,结果挺搞,不知道用粤语好还是普通话好。

这个开始的入门程序做了二三十个小时,但他说以后会要求我用6-7小时甚至更少的时间要我完成这样的程序,事实上,后来,根本不是这回事。刚开始的时候要求很高,要我在一个周末两天内做出一个挺难的组件,当时实在是做不到,搞到我想要是这么辛苦的话,不做算了,但到后来似乎工作量越来越少,他要求也变低了很多,万事开头难啊,在开头几个星期里很辛苦,熬过去后,后面很轻松,总的来说,这份兼职做得挺轻松的。

刚开始那一个月要求高一点,沟通上也不怎么顺畅,一次舍友生日,我跟他说,今晚舍友生日,那些工作我明天再做吧,当时他回我什么我忘了,反正看了很不爽。后来似乎态度好了,沟通也顺畅了,因为他本身也是程序员,还挺厉害的,说到一些程序问题不会出现鸡同鸭讲的情况。另外他不仅仅是要我完成他的程序,还有意让我学多点东西,碰到我有疑问的会讲跟我讲一大堆,像个导师栽培学生~还会让我尝试新的东西。有时候我偷懒也不会怎么责怪,到现在只有跟我提过一次说最近我做得太慢了,thx、sorry这样的词也对我也说了不少次。觉得这样的老板是挺难得的。在此感谢他~

忘了说,他是做香港家教中介网站的,叫“香港导师街”,我做的都是后台管理的,所以在网站上都看不到~现在的主页外观本来也算是我做的,但他只单单把导航栏部分抽出来放上去了。

起初他对我说停止合作的时候,我还觉得是不是因为我偷懒了所以被炒了,回复说绝对不是,他已经付出很多时间做training,炒掉我对他也是挺大的损失,纯粹是业务发展上的原因。“如果可以的話, 我必與你合作.”相信他说的是真的,因为确实对我的学习投入了不少。可能他网站完善了,不再需要雇人了吧。

有这份兼职,有稳定的生活费,就能安心学习,安心做我自己喜欢做的东西了,其他项目做不做都行。现在没了这份兼职,可能得花多点时间在做网站做页面赚钱上了,sigh~

KISSY Editor 源码学习笔记

2009-12-9 评论(0) 分类:技术文章 Tags:

KISSY Editor是淘宝的开源编辑器,基于YUI2.x开发,但感觉YUI在里面起到的就一个工具的作用,我没学过YUI2.x,对阅读源代码似乎也没多大影响。不过貌似YUI2.x本来就是一个工具库的角色。

觉得边看代码边写下来效果会好得多,以后尽量这样做~对这个源码看得并不仔细,只是试图把主要部分框出来,第一次这样做,写出来挺乱,确实是一个“笔记”来着,零零散散。以下记录和分析可能有挺多错误,望发现者指正。

基础

KISSY Editor由多个模块组成,除核心模块外,其他各个模块相互独立(配置模块除外,如smilies~config~wangwang)。各个插件也相互独立,方便日后扩展。
模块上用到的HTML模板都在开头定义,用全大写字母命名,模板上的参数用大括号括起,使用时用replace替换参数。所有的编辑器外观样式都通过className在css里定义。

创建一个编辑器可用KISSY.Editor(textarea, config)也可用new KISSY.Editor(textarea, config),第一种当成函数调用,会返回new KISSY.Editor(textarea, config)

基础函数:

  • 添加模块:add: function(name, fn, details),把所有模块都保存在属性mods里。
  • 添加插件:addPlugin: function(name, p), 把所有插件都保存在属性plugins里,不允许同名插件覆盖。
  • 加载所有模块:_loadModules 执行所有模块的fn,并把执行过的模块加入属性_attached里

核心模块

core~config: 配置模块
lang~*: 语言模块,保存在E.lang[*],自由扩展多种语言
core~plugin: 定义插件种类
core~dom: 封装一些与编辑器dom相关的方法到E.Dom
core~color: 封装颜色值转换相关方法和正则表达式E.Color
core~command: 不明
core~range: 封装Range方法(获取选中对象、选中文本等)到E.Range

core~instance: 实例化编辑器

  • render编辑框,在此模块开头定义编辑框模板,在传入的textArea前面插入编辑框,隐藏textArea
  • 创建工具栏和菜单栏,并调用各自的init()初始化: this.toolbar = new E.Toolbar(this); this.statusbar = new E.Statusbar(this);
  • 初始化所有插件(工具栏和状态栏的插件在各自的对象里初始化),给每个插件的属性editor传入当前编辑器实例 p.editor = this;
  • 连接到编辑框的三个属性:container contentWin contentDoc

core~toolbar: 工具栏模块

  • init(): 按照config.toolbar的参数用_addItem加载插件
  • _addItem(): 初始化插件,把插件加入工具栏
  • _bindItemUI: 给插件绑定事件
  • 三个updateState相关方法让鼠标点击编辑框时插件根据情况改变状态

core~statusbar: 状态栏模块 与工具栏类似

core~menu: 下拉菜单模块

工具栏有些插件点击后有下拉菜单供选择,例如字体、颜色等,在此模块定义通用方法,需要用到的插件可以调用。

插件模块

smilies~config~default、smilies~config~wangwang: 表情插件的配置文件 每一个为一套表情图片。

plugin~*: 插件模块

  • 每个模块使用E.addPlugin添加相应的插件
  • 每个插件里:
    • 如果定义了init(),则在初始化插件时会调用。
    • 每个插件都有属性type,指定它是哪个类型的插件
    • 放在toolbar上的插件,点击时执行插件的exec() 方法
    • 插件与外部的连接:editor: 编辑器实例,即Editor.Instance

暂时到这里~

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

2009-12-8 评论(14) 分类:作品 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限制直接跳过了。
偶尔一些外国人的推里出现了中文,也会被抓取进数据库。程序写得很乱,没去整理,挺多地方有摇摇欲坠的感觉。不过上线运行了挺长时间,应该还算靠谱吧~