Archive for 一月, 2010

淘宝VS易趣 是非成败转头空

by baiheinet on 一月 30th, 2010

  下午和张磊聊起了C2C那些事儿,在中文互联网,最经典的商战就是淘宝击败易趣,双方在斗争中,其实都脑残过,只不过,易趣的脑残很彻底,结果是失去了市场;淘宝的脑残还可以接受,结果是丢了本来可能很可观的收入;

  淘宝击败的易趣的秘密,包装最多的,是说淘宝绕开易趣的广告封人满为患,后来的人无处容身,像我,就需要租间房子。这栋楼老太太有两层房,之前楼下住着她的儿子儿媳,不过,他们去锁(易趣和几大门户签订了排淘宝的协议),通过在中小网站投放联盟广告制胜;但我一直认为这个不是最重要的,甚至连前3都排不上(我把他排第4),因为这不能说是淘宝的核心优势,实际上,从总量上来说,易趣在联盟市场的投入,并不比淘宝少多少;追溯一下的话,我大约在大二大三的时候,每个月都能从易趣拿不少钱,那时候还没淘宝呢;

  如果让我来选择淘宝击败易趣的最大的三个因素的话,我会选择3个:1、免费;2、支付宝;3、公关

  1、免费

  易趣当时收3种费用,上架费、成交佣金和推荐费(交费有橱窗显示、位置靠前,推荐费可选);其实我一直认为,收费没问题,问题是怎么收费,我并不认为易趣的失败是因为收费,真正的原因是易趣不知道怎么收费;在易趣意识到淘宝的强大压力的时候,他免费了,但免掉的,如果我没记错,是成交佣金,而上架费照收;此事真是脑残得让我唏嘘不已啊。其实对于卖家来说,我成交了赚了钱分点给你没什么问题,我这个商品上架了,还不知道能不能赚钱,就先把钱分给你,那我就不愿意了,同甘就要共苦,凭啥我赚了你赚,我赔了你还赚呢?

  后来,我看了《完美商店》这本介绍美国ebay的书,上面写ebay之所以一定要交上架费,是为了保证信息的有效性,也就是杜绝SPAM;这个可能符合美国文化,但绝不符合中国文化;易趣里面真的没有明白人吗?我觉得不一定,但可能这样的文化理念的问题,美国人确实无法理解吧?那就活该你们死了!

  证明我的观点的是,其实现在淘宝就已经在收推荐费(直通车)和成交佣金(淘宝客),也没看到有卖家抵触;当然,他们把“招财进宝”这个本来很好的东西搞砸了也是脑残,另当别论。

  2、支付宝

  在竞争战略上,杀手级的应用可以是竞争对手无法跟随的,例如上面的免费;也可以战略上很重要,但是竞争对手可以跟随,甚至本来就有,但是被忽视的,例如支付宝;

  广告上有一个理论是USP,独特的销售主张,就是说用你的核心点占领消费者的心智,比如说牙膏,有的主打美白,有的主打防蛀,其实美白的不一定美白,防蛀的不一定防蛀,但是你说了别人没说,消费者就认你;

  而,易趣脑残就脑残在这里,其实易趣的“支付宝”,准确的名字叫“安付通”(安付通也有交易担保功能),比支付宝至少要早一年,但是他一般是被易趣放在一个旮旯的角落里,如果不是资深的骨灰的买家,根本就找不到;而在当时的中国C2C环境下,交易安全是最重要的,

  结果就是,因为淘宝把支付宝作为一个战略产品推出,迅速占领网民心智,导致网民只知支付宝不知安付通,甚至误以为支付宝是首创,都是后话了。

  消费者网购看中的因素很多,但如果要排序,最重要的前2个,肯定是“安全”和“低价”,淘宝中国支付宝保障了交易的安全,从而取得极大成功,而易趣本来可以做到这一点,却白白放弃,我忍不住又要唏嘘了;

  3、公关

  我一直认为淘宝的公关是中国互联网公司里面最强大的,我甚至觉得,一定程度上,易趣是被淘宝的公关骂死的;

  上面一段说到占领心智,这个环节,就是淘宝的公关团队实现的,所谓“三人成虎”,你本来还觉得易趣挺好,耐不住报纸杂志老告诉你淘宝更好,说着说着难道你有勇气老不相信吗?

  比较起来,我能理解,易趣觉得自己是国际大公司,有摆范儿,要有气度,打不还口骂不还手,酒香不怕巷子深;就你那绅士劲儿,活该被骂死。

  以上几点是易趣死掉的根本原因,而我确实觉得他可以不死的;从易趣帮后来的发展看(我还专门总结了一下易趣的总监经理们后来的发展,这些人亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经飘起了雨。盆子在阳台的右角,雨水先落大都混得不错,当然了,有些话不适合说,就心领神会吧),易趣还是有很不错的精英队伍的,但再牛的人,耐不住一直走在错误的方向上。

  淘宝所犯的最脑残的错误,前文也说了,就是“招财进宝”事件,招财进宝本身其实很好,奈何没运做好,这个我06年就分析过了,不再多说;但是,仍然要说一声,我特别佩服当时负责运作这个事情的兄台,你的脑残,让淘宝少赚了多少亿啊?虽然后来,招财进宝以“直通车”的形式又出来了,但是偷偷摸摸的,估计也没能得到几个子儿的收入(对于阿里来说)。

  所有这些,其实也都是几年前的事情,但以互联网的速度,却都是老的不能再老的黄历了;这里所说的,也都是几年前的思考,现在说来确实是炒隔年饭了,只是因为又和人说起来,而且现在的身份很多话可以说了,所以就说说,做一个纪录。

  战略决定成败,战术决定速度。

IT人跨界:开咖啡店没想过赚钱

by baiheinet on 一月 30th, 2010

白鸦在无意中做了个贡献——作为资深IT设计师和国内UED(用户体验设计)先行者,他“跨界”开了一家让 IT 青年互相取暖的咖啡店Beta Cafe。

如今,IT人开咖啡店实在很潮流,一个个前赴后继愣是往里冲。IT头脑的创业是怎么想的?他们看好了咖啡馆赚钱?还是为了好玩装酷扮高雅?他们用IT思维经营的咖啡馆生意如何?好好瞧瞧去。

IT界潜流行:开咖啡店去

目前比较有名的IT人咖啡店,北京有“奇遇花园”,是资深互联网人士詹膑开的。10年前,当詹膑还是个学生的时候,就迷上了在学校附近的咖啡馆里看书。点一杯只要8元钱且可以续杯的美式咖啡,在咖啡的香气中享受读书乐趣。现在他也常常呆在吧台,因为他的“奇遇花园”成了很多互联网人士的精神客厅。

在杭州,詹膑的朋友项建标开过卖咖啡和酒的“玛雅”,就在曙光路上。南山路上还有家“淘咖啡”,这是淘宝网第一家授权经营的咖啡店。但是,做生意和网上冲浪毕竟是两码事,这两家店后来因为各种原因都关门歇业了。

一个IT人倒下了,无数个IT人站起来。白鸦就凭着自己的美好愿望,开了BETA CAFE。跟白鸦先后开张的还有游戏人陈博开的UU咖啡。听说,微软也准备搞个咖啡空间,推销自己的Win 7系统。

咖啡店是大家“攒”的

IT人开咖啡店实在很特别。就拿贝塔咖啡来说,大厅里的红沙发、台灯、插座、彩电、植物、纸巾甚至咖啡机,都是全国各地的网友免费送上门的。有这等好事?

2008年11月白鸦从北京携家小到杭州,家里客厅顿时成了IT青年聚会的场所。吃了喝了之后,朋友就抱怨他们家客厅太小,希望有个更大的场所,于是大家商量开个咖啡店。

咖啡店的构想、寻址花了20多天,装修花了1个多月,5月中旬就卖出了第一杯咖啡,6月份正式开张。

BETA CAFE总投资100万元,却足足有20个股东。倒不是白鸦缺钱,而是IT人太热情了。他在网上发了招股的告示后,很多人都有兴趣参股一家IT人自己的咖啡店,直接把钱打到他私人账户上。

“有的人还发个邮件给我说打钱了,有的隔了很久也不知道是谁打的钱。20个股东里,有几个以前根本不认识。”

白鸦说,IT人可贵的一点,就是开放和信任。基于同样的原理,他在网上呼吁大家“认购”咖啡馆摆设时,又有很多人免费送东西过来。

有人一搬就是20箱酒,说“先喝着吧”;有人送来了沙发;有人送来张价值30万元的桌子;有人送来一套咖啡机;还有送SONY液晶电视的。还有人问“插销有了么”,不久送了一堆插销过来。

经“内测”、“公测”阶段后,咖啡馆正式“上线”那天,白鸦害怕看到一堆花篮。他呼吁:“花篮太不环保,你们想送就‘认购’些盆栽植物吧”。于是现在咖啡店能看到的植物,基本上是当时大家拿过来的。

牛人出没请注意

BETA是互联网人相聚的地方,常常有电子商务讨论、5G聚会、Twitter聚会、设计日等活动,大家还能在网上对他们下周播放的电影进行投票。

今年5月份,BETA在网上发帖希望卖出自己的第一杯咖啡。结果,又拍网CEO刘平阳早早赶到,花90大洋喝掉了第一杯咖啡——平时咖啡才卖30元一杯。

6月开张那天,全国各地捧场的来了300多人,不乏互联网牛人。有一位叫“小马”的,为了喝杯咖啡,他率先使用高科技工具支付宝作为支付手段结账。

“平时,附近很多互联网公司的人都会过来喝咖啡、吃简餐,我们都不习惯叫这个总那个总的,总裁太多了,反正都叫名字。”白鸦说。

经过认证才能获“美女”卡

既然名气和东西都是大家给的,总要体现主人的好客精神。在众网友的献计献策下,贝塔咖啡推出了三档打折卡:铁卡、美女卡,和VIP卡。

美女卡和VIP卡都打八五折,不过得到美女卡并不容易,原定是要众股东一致通过才行。因为股东都在全国各地,所以有时候白鸦也放放水,见长得差不多就给了。有意思的是,卡上注明有效期是103年。

美女卡优惠不及铁卡——真的是白晃晃的金属做的,收账的见此卡就给7折折扣,因此只有铁哥们才能得到。但是,铁卡的折扣是不定的,生意好时咖啡店会送吃送喝打折扣,生意不好时却可能收更贵的钱——是铁哥们总得两肋插刀。

此外,互联网人士只要出示名片,就可以打九折。白鸦理想中,咖啡店80%的客户应该是互联网及相关人士。至于怎么判断,他说看看、嗅嗅就能知道哪些是同行了。

IT咖啡馆没想要赚钱

再介绍一家杭州游戏人开的咖啡店UU咖啡,投资人陈博毕业于浙江大学,几年来做游戏攒了不少钱,于是想给浙大籍及周边院校的创业者建立一个“创业者之家”。

对钱的态度,陈博和白鸦挺接近——靠咖啡店也赚不了多少,别亏就行。

贝塔咖啡馆每个月的成本大概5万多元,白鸦告诉记者:第二个月赚了1000多元,第三个月不到1000元。按这个速度,赚回100万元得是个“马拉松”。

“招股说明里我就写清楚了,不可能赚钱。”

陈博的UU咖啡,前期投资不算,每个月收入比支出略少一点点。他说:我希望的是不要亏,老亏大家就没劲了。

不过他们都觉得拥有一家咖啡店很有意思。“我的咖啡店,每周三晚上都有创业聚会,我们请了很多企业家、牛人过来互动,每次都爆满的。”

看到更多更年轻的面庞在为自己的创业理想而倾听、讨论、碰撞,陈博觉得很值很充实。

好的咖啡馆,让那些不安的灵魂得到片刻温暖。比如J罗琳写《哈里波特》的“Nicolson”咖啡馆,《爱在日落黄昏时》里Julie Delpy和Ethan Hawke碰面的Le pure cafe,19世纪金牌单身汉勃拉姆斯常常光顾的广场小咖啡店等等。IT咖啡馆,则是让IT人取暖的地方。

Published by  Published by xFruits

Original source : http://blog.mywowo.com/default.asp?id=710...

世界上最小的 MP3 Web 播放器

by baiheinet on 一月 30th, 2010

感谢COMSHARP CMS的投递

在 Web 页面上播放播放 MP3 音频并不难,我们曾在 5 个免费的 Web 视频及音频播放器一文中,介绍过两个 MP3 Web 播放器,它们的功能都很强大,会在页面上显示播放界面,控制 MP3 音频的播放,我们今天介绍这个 MP3 Web 播放器 1 Bit Audio Player,其播放界面只有一个箭头那么大。它可以嵌入你的 Web 页面,在每个 MP3 链接的后面生成一个播放箭头,点击后现场播放。

Published by  Published by xFruits

Original source : http://www.cnbeta.com/articles/103257.htm...

坦克車駛入Google首頁

by baiheinet on 一月 28th, 2010

這兩天讀Google vs China那一期Newsweek時,看到這張設計圖片,以坦克車來製作出一個Google首頁,很有意思吧。

有幾點是值得留意的,除了坦克車,還有坦克車前的那位人兄,是大家都不會忘記的。他飾演「l」。而介面中不是「I’m feeling lucky」,而是「I’m feeling watched」。最後還有那個關鍵字….

相關文章:
有關「Google vs 中國」的漫畫

Jan’s Tech Blog, where technologies are explored and annotated.
Join Jan’s Tech Blog Faacebook Page, or follow the Twitter to get updates.

世界奇观:用瓶子建的房子

by baiheinet on 一月 24th, 2010

世界奇观:用瓶子建的房子 | Jandan.net

世界奇观:用瓶子建的房子 | Jandan.net

世界奇观:用瓶子建的房子 | Jandan.net

世界奇观:用瓶子建的房子 | Jandan.net

世界奇观:用瓶子建的房子 | Jandan.net

世界奇观:用瓶子建的房子 | Jandan.net

世界奇观:用瓶子建的房子 | Jandan.net

世界奇观:用瓶子建的房子 | Jandan.net

世界奇观:用瓶子建的房子 | Jandan.net

世界奇观:用瓶子建的房子 | Jandan.net

世界奇观:用瓶子建的房子 | Jandan.net

世界奇观:用瓶子建的房子 | Jandan.net

Published by  Published by xFruits

Original source : http://www.waqiqu.com/show.php?tid=1588...

朝鲜,一个牛仔裤的故事

by baiheinet on 一月 21st, 2010

年12月,一种NoKo牌牛仔裤在瑞典上市,售价高达1500瑞典克朗(约合217美元)。

(图一 NoKo牛仔裤)

与众不同的是,这种牛仔裤是朝鲜生产的。

(图二 模特展示这种牛仔裤)

这条消息引起了轰动。

你能想像吗,一个与“资产阶个倒置的W,首尾两点之间距离没那么均匀分配,中间的社区相对密集,是嘈杂的闹市。如果有时间,哪怕你走马观花也能淘级腐朽文化”势不两立的国家,居然生产西方文化象征的牛仔裤!

人们充满了好奇,想知道这些牛仔裤是从哪里来的?为什么选择在瑞典上市呢?它的背后又有怎样的故事?

(图三 NoKo牛仔裤宣传册页)

上周的德国《明镜》周刊独家爆料,揭开了谜底。真是让人亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经飘起了雨。盆子在阳台的右角,雨水先落大开眼界,这条牛仔裤背后故事的曲折复杂,就像超现实主义小说一样,充满了反讽,比好莱坞电影还要精彩。

(图四 NoKo牛仔裤的三位创始人,从左到右分别为23岁的Jakob Ohlsson,24岁的Tor Rauden Kallstigen,25岁的Jacob Astrom。)

事情的起源,要追溯到2007年7月。当时,斯德哥尔摩一家广告公司的三个青年雇员,下班后聚在一起喝酒。他们都是大学刚毕业不久,想寻找一些好玩的事情。

(图五 NoKo牛仔裤创始人)

出于好奇,他们打开了朝鲜民我她家就有待租的房子,却又警觉的问我租这处干什么。还能干什么,我是当地民间工艺品厂的业务员,我的职业是积极地在主主义人民共和国的官方网页korea-dpr.com。在Business部分,他们看到网页上写着,朝鲜出口各种商品,包括化妆品、卡车、大理石、矿泉水、灭火器,还有--牛仔裤!

一时兴起,他们就按照网页上的联系方式,发出了一封电子邮件,声称自己是一家瑞典进出口公司的经理,对朝鲜产品有兴趣,希望与该国合作等等。

(图六 他们发往朝鲜的第一封Email。)

这原本只是一场恶作剧,第二天酒醒之后,三个年轻人就把这事忘了。但是没有想到,他们很快收到了回信,一个自称Sapmak的朝鲜人,用非常友好的语气感谢他们对朝鲜产品的兴趣,并且希望他们与朝鲜驻瑞典大使馆联系。

这些年轻人就真的给朝鲜驻瑞典大使馆打了一个电话。对方在电话里保证,将尽力满足他们的一切要求,并且邀请他们到使馆面谈。这三个瑞典青年心想,到使馆看看也很好玩,就欣然允诺。因为担心自己看上去太年轻,不像进出口公司的经理,他们就请出了其中一人的家长扮演经理。那位家长的正式职业是牙医,他穿上西装,打好领带,带着三个"雇员",就去拜访朝鲜驻瑞典大使。在拜访中,他们还随身携带了两条牛仔裤(其中一条还是穿过的),作为交给朝鲜方面的样品。一切看上去非常可信。

(图七 Noko牛仔裤的整个制作团队,这张照片是后来在平壤的照相馆拍的。)

2008年初,朝鲜向他们发出了正式邀请,希望他们到平壤的服装厂考察签约。三个年轻人提出,想参观朝鲜的计算机中心,以及与普通的朝鲜青年见面,并观看大型团体操表演"阿里郎"。但是,朝鲜方面开出了一份不一样的访问日程,包括参观存放金日成遗体的锦锈山纪念宫、万寿台金日成塑像、存放各国领。光线低沉,半天了都没人在楼道出现。三到五层以及第八层楼道口安有小牛奶箱,绿色房子造型,透过自身的孔被大铁钉铆导人赠送给朝鲜礼品的国际友谊展览馆等等。

(图八 平壤的全景,照片中央就是全世界最大的烂尾楼——柳京饭店。)

2008年7月27日,这三个瑞典青年从北京乘坐火车,抵达了平壤。车站上有专人迎接,并且还有一个专门派来为他们开车的司机。他们被带到了著名的高丽饭店(Koryo Hotel),宾主一起在酒吧里唱卡拉OK联欢。朝鲜陪同总是在唱慷慨激昂的军歌,而他们则是唱甲壳虫乐队的老歌,两种歌曲轮流响起,最后以双方一起合唱"平壤之夜"而结束。为了纪念这个夜晚,后来上市的牛仔裤的两个型号,就被分别定名为Kara型和Oke型。

(图九 高丽饭店是朝鲜最高级的宾馆,号称五星级,但是按照世界通行标准,只相当于三星级。)

接下来的10天,他们参观了一些朝鲜的服装厂,但是合作的事情迟迟没有进展。在这个过程中,他们还去参观了平壤动物园,那里的动物不多,就连鳄鱼看上去都很孤独。

(图十 夕阳中的平壤街头。)

在离开前的最后一天,他们终于见到了负责采矿和纺织部门的一位高级官棵绿色棕树之间是灰色偏暗的楼道。光线低沉,半天了都没人在楼道出现。三到五层以及第八层楼道口安有小牛奶箱,绿色房员,双方握手、合影、干杯之后,协议就算达成了。最后的决定是生产黑色牛仔裤,因为蓝色牛仔裤是美国文化的象征,朝鲜不愿意生产。

(图十一 平壤合影)

又过了一年,牛仔裤终于生产出来了。其中又经过了许多曲折,比如朝鲜的女制衣工人,不熟悉牛仔裤的生产工艺,不得不专门培训缝纫技法,再比如,朝鲜缺乏制作牛仔裤所需的金属纽扣,不得不进口,但是货物在经过巴基斯坦的时候遗失了,费了九牛二虎之力才找回来。这些都不必细说了,总之,"朝鲜制造"的牛仔裤终于问世了。

(图十二 生产牛仔裤的朝鲜工厂。)

(图十三 生产所需的牛仔布来自中国。)

2009年11月11日,第一批1100条牛仔裤运抵斯德哥尔摩。一家百货公司被他们说服,同意从12月4日开始销售。但是瑞典媒体议论纷纷,讨论是否应该与朝鲜发展经贸关系,尤其是考虑到朝鲜半年前刚刚进行过核武器试验。牛仔裤只上架了半天,百货公司就不堪压力,决定退回这批货物,理由是不愿意卷入政治。

(图十四 在平壤服装厂楼外。)

在争议面前,三个瑞典青年发表了一份措辞谨慎的声明,表示没有想到会事情变得这么复杂,他们的最初动机只是好玩而已。

(图十五 在仓库中)

现在,这些牛仔裤不再在商店中销售了,而是索性作为展品,在新成立的NoKo牛仔裤博物馆展览,彻底从一种商品变成了行为艺术。

这个博物馆的网址是nokojeans.com,地址在斯德哥尔摩Vartoftagatan 47号,靠近Medborgarplatsen地铁车站。经过的朋友可以去看看。

(图十六 Noko牛仔裤博物馆)

至此,整个事件看上去就像一出一本正经恶哗啦地摇晃着玻璃水壶。附近的花鸟市场有塑料的喷该是个倒置的W,首尾两点之间距离没那么均匀分配,中间的社区相对密集,是嘈杂的闹市。如果有时间,哪怕你走马观花也水壶,可惜它是塑料的。当然,玻璃的水壶易碎。我宽容卖塑料喷该是个倒置的W,首尾两点之间距离没那么均匀分配,中间的社区相对密集,是嘈杂的闹市。如果有时间,哪怕你走马观花也水壶小搞的荒诞派戏剧,混杂着黑客文化、嬉皮士精神、摇滚、商业操作、共壶便向阳台走去,哗啦哗啦地摇晃着玻璃水壶。附近的花鸟市场有塑料的喷该是个倒置的W,首尾两点之间距离没那么均匀分配,中间的社区相对密集,是嘈杂的闹市。如果有时间,哪怕你走马观花也水壶,可惜它是塑料的。当然,玻璃的水壶易碎。产主义意识形态等各种元素。在这条牛仔裤上面,你可以演绎出无数的象征意义,没准那一天它真的就会流行起来。

另一方面,联想到海盗湾宜家家具也都是瑞典人做出来的,不由让人感叹,这个国家的人的创造力怎么会这么丰富,玩得怎么会这么精彩,真是佩服啊!

(完)

新浪围脖爆源码 (附文件)

by baiheinet on 一月 17th, 2010

刚才登陆新浪围脖,突然爆出PHP源代码,以下贴出:

/**
* 微博客模型层
*
* @copyright (c) 2009, 新浪网MiniBlog All rights reserved.
* @author 王兆源 朱建鑫
* @version 1.0 - 2009-07-16
* @package Model
*/

include_once SERVER_ROOT.'model/mBase.php';
include_once SERVER_ROOT.'config/mblogConfig.php';

class mMblog extends mbase {

/**
* 将数据层取得的数据decode,供上层使用
*
* @param array $data
* @return array
*/
public function mapping($mblogList, $source='mblog', $parse=true, $isNoAddLink=false, $isParseVideo=true) {

$o_base62 = ClsFactory::Create('tools::encode::base62Parse');
$o_short = ClsFactory::Create('model::mShortUrl');
$result = array();
$func = 'renderTag';
$objAnalyzeAt = ClsFactory::Create("tools::analyze::TAnalyzeAt");
if(in_array($source,array('widget','widget_blog')))
$isTarget = true;
else
$isTarget = false;
foreach($mblogList as $v) {
if($v===false) continue;
if($source == 'myat') {
if($v["isDel"]) {
$result[$v['mid']] = $v;
continue;
}
}
$data = @unserialize($v['content']);

if($isParseVideo && $data['video'] && $data['video'][0] && !is_array($data['video'][0])){
//先做一个兼容,导完数据就不做了
$shorts = $o_short->shorts2long($data['video']);
unset($data['video']);
if(!empty($shorts)){
foreach($shorts as $sk=>$sv){
if(empty($sv['ext']['url'])){
continue;
}
$data['video'][] = array(
'url' => $sv['ext']['url'],
'title' => $sv['ext']['title'],
'pic' => $sv['ext']['pic'],
'type' => $sv['from'],
'vname' => $sk,
'ourl' => $sv['url']
);
}
}
}

$data['tag'] = $v['tag']=='' ? array() : explode(' ', $v['tag']);
$data['reason'] = $this->renderTag($data['reason'],$isTarget);
$data['pic'] = is_array($data['pic']) ? $data['pic'] : array();
if($source!='wap' && $parse && $v['appid']!=MBLOG_APP_RSS) {
$data['text'] = $this->$func($data['text'],$isTarget);
}
if($source !='wap' && !$isNoAddLink) {
//进行@功能替换
if(($v['filter']& 8) == 8) {
$objAnalyzeAt->atTOlink($data['text'],$data["atUsers"],$isTarget);
if($v['appid'] == 2) {
$objAnalyzeAt->atTOlink($data['reason'],$data["atUsers"],$isTarget);
}
}
}

$result[$v['mid']] = array(
'mid' => $v['mid'],
'mid62' => $o_base62->encode($v['mid']),
'uid' => $v['uid'],
'data' => $data,
'content' => $data['text'],
'tag' => $v['tag'],
'appid' => $v['appid'],
'ip' => $v['ip'],
'ctime' => $v['ctime'],
'status' => $v['status'],
'filter' => $v['filter'],
'isdel' => $v['isDel'],
);

if($parse) $fbmlAr[$v['mid']] = $data;
//if($parse && $source!='wap' ;) $fbmlAr[$v['mid']] = $data;
//echo "-------\r\n";
}
if(empty($result)) return false;
// if($parse) {
if($parse && $source!='wap' ;) {
// $func = $source=='wap' ? 'parseFbmlWap' : 'parseFbmlmblog';
// $fbmlAr = $this->$func($fbmlAr);
$fbmlAr = $this->parseFbmlmblog($fbmlAr);
foreach($result as $k => &$v) {
$v['data'] = $fbmlAr[$k];
}
}
elseif($source =='wap')
{
//$fbmlAr = $this->parseFbmlWap($fbmlAr);
foreach($result as $k => &$v) {
$v['data'] = $fbmlAr[$k];
}
}
return $result;
}

/**
* 普通微博客fbml解析
*
* @param array $fbmlAr
* @return array
*/
public function parseFbmlmblog($fbmlAr) {
$contents = array();
if(!empty($fbmlAr)){
foreach($fbmlAr as $k => $v) {
$contents[$k] = $v['text'];
}
}
$o_fbml = ClsFactory::Create("tools::fbml::fbmlParse");
$contents = $o_fbml->fbml_parse_array($contents);
if(!empty($fbmlAr)){
foreach($fbmlAr as $k => &$v) {
$v['text'] = $contents[$k];
}
}
return $fbmlAr;
}

/**
* wap的fbml解析
*
* @param array $fbmlAr
* @return array
*/
public function parseFbmlWap($fbmlAr) {
$o_sturl = ClsFactory::Create('model::mShortUrl');
foreach($fbmlAr as &$v) {
$text = &$v['text'];
$link = &$v['link'];
if (!is_array($link))
{
$link = array();
}
preg_match_all("/\<\s*sina\s*\:\s*([a-zA-Z1-9]+)\s+([^\>]*)\/?\>/i", $text, $out1);
if(empty($out1[0])) continue;
foreach($out1[0] as $k1 => $v1) {
if($out1[1][$k1]!='link') continue;
preg_match_all("/([a-zA-Z0-9_]+)\s*\=\s*[\'\"]?([^\'\"\s]+)[\'\"]?/", $v1, $out2);
if(empty($out2[0])) continue;
$out2[1] = array_unique($out2[1]);
foreach($out2[1] as $k2 => $v2) {
if($v2!='src') continue;
$url = strpos($out2[2][$k2], 'http://')!==false ? $out2[2][$k2] : SHORTURL_DOMAIN.$out2[2][$k2];

$link[] = $url;
$text = str_replace($v1, $url, $text);
break;
}
}
}
return $fbmlAr;
}

/**
* 获取指定ID号的微博内容
*
* @param array $mids 微博ID号数组
* @return array 微博客内容数组
*/
public function getMblogByMids($mids, $source='mblog', $parse=true, $isNoAddLink=false, $cuid="", $isParseVideo=true) {
$objMblog = ClsFactory::Create('data::dMblog');
$mblogData = $objMblog->getMblogByMids($mids);
if($mblogData===false) return false;
if($cuid) {
$mblogData = $this->filterStatus($mblogData, $cuid);
}
$mblogData = $this->mapping($mblogData, $source, $parse, $isNoAddLink, $isParseVideo);
if($mblogData===false) return false;
return $mblogData;
}

/**
* 获取指定ID号的微博内容(专针对获取单条微博,解决区分不出是不存在该条微博,还是服务异常的问题)
*
* @param array $mids 微博ID号数组
* @return array 微博客内容数组
*/
public function getMblogByMidsWap($mids, $source='mblog', $parse=true, $isNoAddLink=false, $cuid="") {
$objMblog = ClsFactory::Create('data::dMblog');
$mblogData = $objMblog->getMblogByMids($mids);
if($mblogData===false) return false;
if (empty($mblogData))
{
return array("code" => "M02001&quot ;) ;
}
if($cuid) {
$mblogData = $this->filterStatus($mblogData, $cuid);
}
$mblogData = $this->mapping($mblogData, $source, $parse, $isNoAddLink);
if($mblogData===false) return false;
return $mblogData;
}

/**
* 获取某人的关注feed列表,支持page分页
*
* @param integer $ouid 用户uid
* @param integer $page 页码
* @param integer $pagesize 可选,每页显示数
* @param integer $filter 筛选器
* @param string $source 获取来源
* @return array
*/
public function getAttMblogInPageByFilter($cuid, $ouid, $page, $pagesize=MBLOG_PAGE_SIZE, $filter=MBLOG_FILTER_DEFAULT, $source='mblog') {

$filterArr = array(1=>array(1,3,5,7),
2=>array(2,3,6,7),
MBLOG_TYPE_ORI=>array(0,1,2,3), //原创
4=>array(4,5,6,7));
$filters = $filterArr[$filter];

$o_mblog = ClsFactory::Create('data::dMblog');
// 从缓存取数据
if($page==1) $result = $o_mblog->getFilterFeedByMc($ouid, $pagesize, $filter . "_page&quot ;) ;
if(is_array($result)) {
$result['record'] = $this->filterStatus($result['record'], $cuid);
$result['record'] = $this->mapping($result['record'], $source, true);
return $result;
}
// 取不到的处理流程
$mids = $this->getAttMids($ouid);
if($mids===false) return false;

$mblogList = $o_mblog->getMblogByMids($mids);

$newMids = array();
foreach($mblogList as $v) {
if($cuid!=$ouid && $v['status']==STATUS_SELF) continue;
if(!in_array($v['filter'],$filters)) continue;
$record[$v['mid']] = $v;
$newMids[] = $v['mid'];
}//剩下的是有效的msg
$total = count($newMids);
$newMids = array_slice($newMids, ($page-1)*$pagesize, $pagesize);
$record = array_slice($record, ($page-1)*$pagesize, $pagesize);
if(empty($mids)) return array('total'=>0, 'record'=>array());

$result = array('total'=>$total, 'record'=>$record);
if($page==1) $o_mblog->getFilterFeedByMc($ouid, $pagesize, $filter . "_page&quot ;) ;
$result['record'] = $this->filterStatus($result['record'], $cuid);
$result['record'] = $this->mapping($result['record'], $source, true);
return $result;
}

/**
* 获取某人的关注feed列表,支持page分页
*
* @param integer $ouid 用户uid
* @param integer $page 页码
* @param integer $pagesize 可选,每页显示数
* @param integer $filter 筛选器
* @param string $source 获取来源
* @return array
*/
public function getAttMblogInPage($cuid, $ouid, $page, $pagesize=MBLOG_PAGE_SIZE, $filter=MBLOG_FILTER_DEFAULT, $source='mblog') {
//是否要过滤
if($filter != MBLOG_FILTER_DEFAULT) {
return $this->getAttMblogInPageByFilter($cuid, $ouid, $page, $pagesize, $filter, $source);
}
$o_mblog = ClsFactory::Create('data::dMblog');
// 从缓存取数据
if($page==1) $result = $o_mblog->getFeedByMc($ouid, $pagesize);
if(is_array($result)) {
$result['record'] = $this->filterStatus($result['record'], $cuid);
$result['record'] = $this->mapping($result['record'], $source, true);
return $result;
}
// 取不到的处理流程
$midInfo = $this->getAttMids($ouid, $page, $pagesize);
if($midInfo===false) {
TInfoLog::addLogs("getAttmblog-mMblog-getAttMids-{$cuid}, {$ouid}", "waperr");
return false;
}
if(empty($midInfo['mids'])) return array('total'=>0, 'record'=>array());
$mids = $midInfo['mids'];
$dTotal = $midInfo['dCount'];
$mblogList = $o_mblog->getMblogByMids($mids);
if($mblogList===false) {
TInfoLog::addLogs("getAttmblog-mMblog-getMblogByMids-{$cuid}, {$ouid}", "waperr");
return false;
}
$record = array();
foreach($mblogList as $v) $record[$v['mid']] = $v;
$record = $this->filterStatus($record, $cuid);
$result = array('dTotal'=>$dTotal, 'total'=>count($record), 'record'=>$record);
if($page==1) $o_mblog->setFeedByMc($ouid, $result, $pagesize);
$result['record'] = $this->mapping($result['record'], $source, true);
if($result===false) {
TInfoLog::addLogs("getAttmblog-mMblog-mapping-{$cuid}, {$ouid}", "waperr");
return false;
}
return $result;
}

/**
* 获取某人的关注feed列表,支持endmid分页
*
* @param integer $ouid 用户uid
* @param string $endmid 可选,以这个id的下一个id开始获取,为空为从头获取
* @param integer $pagesize 可选,每页显示数
* @param integer $filter 筛选器
* @param string $source 获取来源
* @return array
*/
public function getAttMblogInEndid($cuid, $ouid, $endmid='', $pagesize=MBLOG_PAGE_SIZE, $filter=MBLOG_FILTER_DEFAULT, $source='mblog') {
//ligang1为筛选功能添加Private函数
if($filter != MBLOG_FILTER_DEFAULT)
return $this->getAttMblogInEndid2($cuid, $ouid, $endmid, $pagesize, $filter, $source);

$maxPage = 10;
$o_mblog = ClsFactory::Create('data::dMblog');
// 从缓存取数据
if($endmid=='') {
$result = $o_mblog->getFeedByMc($ouid, $pagesize);
if(is_array($result)) {
$result['record'] = $this->filterStatus($result['record'], $cuid);
$result['record'] = $this->mapping($result['record'], $source, true);
$result['isend'] = 0;
return $result;
}
}
// 取不到的处理流程
$mids = $this->getAttMids($ouid);
if($mids===false) return false;
if(empty($mids)) return array();
$total = count($mids);
if(empty($endmid)) {
$key_start = 0;
$is_end = 0;
$key_end = $pagesize - 1;
} else {
$keys = array_flip($mids);
$key_start = $keys[$endmid] + 1;
$is_end = count($keys)>($key_start+$pagesize) ? 0 : 1;
if($key_start>($maxPage-2)*$pagesize+1) $is_end = 1;
$key_end = $key_start+$pagesize>count($keys) ? count($keys)-1 : $key_start+$pagesize-1;
}
$newmids = array();
for($i=$key_start;$i<=$key_end;$i++) {
if($mids[$i]>0)
{
$newmids[] = $mids[$i];
}
}
$result = $o_mblog->getMblogByMids($newmids);
if($result===false) return false;
$record = array();
foreach($result as $v) {
$record[$v['mid']] = $v;
}
$result = array('total'=>$total, 'record'=>$record);
$result['record'] = $this->filterStatus($result['record'], $cuid);
if($endmid=='' ;) $o_mblog->setFeedByMc($ouid, $result, $pagesize);
$result['record'] = $this->mapping($result['record'], $source, true);
$result['isend'] = $is_end;
return $result;
}

/**
* 获取某人的关注feed列表,支持endmid分页,filter不为MBLOG_FILTER_DEFAULT时的调用。
*
* @param integer $ouid 用户uid
* @param string $endmid 可选,以这个id的下一个id开始获取,为空为从头获取
* @param integer $pagesize 可选,每页显示数
* @param integer $filter 筛选器
* @param string $source 获取来源
* @return array
*/
private function getAttMblogInEndid2($cuid, $ouid, $endmid='', $pagesize=MBLOG_PAGE_SIZE, $filter, $source='mblog') {
$filterArr = array(1=>array(1,3,5,7),
2=>array(2,3,6,7),
MBLOG_TYPE_ORI=>array(0,1,2,3), //原创
4=>array(4,5,6,7));
$filters = $filterArr[$filter];
$maxPage = 10;
$o_mblog = ClsFactory::Create('data::dMblog');

// 从缓存取数据
if($endmid=='') {
//由于有了不同的filter,因此MC的key值需要更进一步的区分。
$result = $o_mblog->getFilterFeedByMc($ouid, $pagesize, $filter);
if(is_array($result)) {
$result['record'] = $this->filterStatus($result['record'], $cuid);
$result['record'] = $this->mapping($result['record'], $source, true);
$result['isend'] = 0;
return $result;
}
}

// 取不到的处理流程

//得到500条
$mids = $this->getAttMids($ouid);
if($mids===false) return false;
if(empty($mids)) return array();

//去掉无效的mid
$newmids = array();
foreach($mids as $mid) {
if($mid>0)
{
$newmids[] = $mid;
}
}

//得到内容
$result = $o_mblog->getMblogByMids($newmids);
if($result===false) return false;

//逐项过滤掉私有的和需要过滤器过滤的数据
$record = array();
$newmids2 = array();
foreach($result as $v) {
if($cuid!=$ouid && $v['status']==STATUS_SELF) continue;
if(!in_array($v['filter'],$filters)) continue;
//if($v['mid']<$key_start||$v['mid']>$key_end) continue;
$record[$v['mid']] = $v;
$newmids2[] = $v['mid'];
}//剩下的是有效的msg

$total = count($newmids2);
//从有效的msg中选择在此页中显示的条目集合
if(empty($endmid)) {
$key_start = 0;
$is_end = 0;
$key_len = $pagesize;
} else {
$keys = array_flip($newmids2);
$key_start = $keys[$endmid] + 1;
$is_end = count($keys)>($key_start+$pagesize) ? 0 : 1;
if($key_start>($maxPage-2)*$pagesize+1) $is_end = 1;
//if($key_start>($maxPage-2)*$pagesize+1) $is_end = 1;
$key_len = $key_start+$pagesize>count($keys) ? count($keys)-$key_start+1 : $pagesize;
}

$record = array_slice($record,$key_start,$key_len);

$result = array('total'=>$total, 'record'=>$record);
//同上面的getFeedByMc的调用说明
if($endmid=='' ;) $o_mblog->setFilterFeedByMc($ouid, $result, $pagesize, $filter);
$result['record'] = $this->filterStatus($result['record'], $cuid);
$result['record'] = $this->mapping($result['record'], $source, true);
$result['isend'] = $is_end;
return $result;
}

/**
* 添加一条微博客
*
* @param integer $uid 作者uid
* @param ? $content 内容
* @param ? $pic 图片id号
* @param ? $appid 应用号
* @param ? $tag tag标签
* @param ? $ispic 是否含图片
* @param ? $isrt 是否含转发
* @param ? $islink 是否含连接
* @param string $ip 发表者ip地址
* @param string $ctime 发表时间(DateTime格式)
* @param ? $status 微博状态
* @return true
*/
public function add($uid, $content, $pic, $appid, $ip, $ctime, $status=0, $searchMcq=true, $sourceText='', $sourceLink='') {
//检查sass
$startTime1 = getmicrotime();
$mSassobj = ClsFactory::Create('model::mSass');
$issasskill = $mSassobj->checkPostBlog($uid);
$startTime2 = getmicrotime();
if($issasskill) {
$errorcode = $mSassobj->getErrmsg();
if($errorcode == SASS_COMMON_PUBLISH_REJECT_PRIMARY) {
return array("code" => "M02014&quot ;) ;
} elseif($errorcode == SASS_COMMON_PUBLISH_REJECT_ADVANCED) {
return array("code" => "M02015&quot ;) ;
}
return array("code" => "M00008&quot ;) ;
}
$ispic = 0;
$islink = 0;
//ligang1 add
$isat = 0;
if (!empty($pic))
{
$ispic = 1;
if (!is_array($pic))
{
$pic = array($pic);
}
}

if (mb_strwidth($content, "UTF-8&quot ;) > MBLOG_CONTENT_MAX_SIZE)
{
$content = mb_strimwidth($content, 0, MBLOG_CONTENT_MAX_SIZE, "", "UTF-8");
}

$rcontent = $content; //--含有源链接的微博内容,以便检查黑网址
//入库前就做html转义
$content = htmlspecialchars($content);

//--判断内容中是否含有链接,如果有链接则替换成短url
$strinShortUrl = array();
$objAnalyzeLink = ClsFactory::Create("tools::analyze::TAnalyzeLink");
$bRet = $objAnalyzeLink->getData(array('content'=>$content,'from'=>MBLOG_ACTION_MBLOG),$strinShortUrl,$videoArr);
if ($bRet !== FALSE)
{
$islink = 1;
$content = $bRet;
}
$startTime3 = getmicrotime();
$adminObj = ClsFactory::Create("model::mAdminCheck");
$personObj = ClsFactory::Create("model::mPerson");
$userInfo = $personObj->getUserInfo($uid, true);
$startTime4 = getmicrotime();
$arr = $adminObj->checkPubMblog($userInfo, array('appid'=>$appid,'content'=>$rcontent,'ip'=>$ip,'ispic'=>$ispic,'islink'=>$islink));
$startTime5 = getmicrotime();
if($arr['kwdlevel'] == KEYWORD_FORBID) {
return array("code" => "M02005&quot ;) ;
}elseif($arr['status'] == STATUS_KILL){
return array("code" => "M02005&quot ;) ;
}
elseif ($arr['usergrouplevel'] == STATUS_KILL)
{
return array("code" => "M02009&quot ;) ;
}

//--获取tag内容
$isTag = false;
$objAnalyzeTag = ClsFactory::Create("tools::analyze::TAnalyzeTag");
$bRet = $objAnalyzeTag->getData($content);
if ($bRet !== FALSE)
{
$tag = $bRet;
$isTag = true;
}
$startTime6 = getmicrotime();
//ligang1 add 判断msg中是否有@人名存在。
$objAtUser = ClsFactory::Create("model::mAtUser");
$atUsers = $objAtUser->getAtUsername($content);
$startTime7 = getmicrotime();
if(count($atUsers)>0){
$isat = 1;
}
$mblogContent = array();
if(!empty($videoArr)){
$mblogContent['video'] = $videoArr;
$isvideo = true;
} else {
$isvideo = false;
}

//ligang1 add end
$filterAr = array(
MBLOG_FILTER_PIC => $ispic,
MBLOG_FILTER_LINK => $islink,
//ligang1 add
MBLOG_FILTER_AT => $isat,
//ligang1 add end
MBLOG_FILTER_VIDEO => $isvideo,
);

$mblogContent['text'] = $content;
$mblogContent['pic'] = $pic;
//ligang1 add
$mblogContent['atUsers'] = $atUsers;
//ligang1 add end
$mblogContent['uid'] = $uid;
if($appid==MBLOG_APP_SHARE) {
$mblogContent['sourceText'] = $sourceText;
$mblogContent['sourceLink'] = $sourceLink;
}
$mblogContentString = serialize($mblogContent);
$bRet = $this->insertMblog($uid, $mblogContentString, $appid, $tag, $filterAr, $ip, $ctime, $arr, $searchMcq);
$startTime8 = getmicrotime();
//统计数据需要
foreach($bRet as $mid => $mInfo) {
$ssm = ClsFactory::Create('tools::log::SSM_Miniblog');
$ssm->ext_log = array();
if(is_array($strinShortUrl) && count($strinShortUrl) > 0) {
$ssm->ext_log['shortUrl'] = implode(";", $strinShortUrl);
}
if($mInfo['appid'] === MBLOG_APP_SHARE) {
$ssm->ext_log['isShare'] = "1";
$ssm->ext_log['url'] = $sourceLink;
}
if($filterAr[MBLOG_FILTER_LINK]) {
$ssm->ext_log['islink'] = "1";
}
if($filterAr[MBLOG_FILTER_PIC]) {
$ssm->ext_log['isPic'] = "1";
}
if($filterAr[MBLOG_FILTER_VIDEO]) {
$ssm->ext_log["isVideo"] = "1";
}
if($mInfo['appid'] === MBLOG_APP_TRANSMIT) {
$ssm->ext_log['isTransmit'] = "1";
}
if($mInfo['appid'] === MBLOG_APP_SHARE) {
$ssm->ext_log['isShare'] = "1";
}
if($isTag === true) {
$ssm->ext_log['isTopic'] = "1";
}
$mblogsize = mb_strwidth($content, "UTF-8");
$ssm->ext_log["size"] = $mblogsize;
if($mInfo['appid'] === MBLOG_APP_TRANSMIT) {
$ssm->ext_log['rtmid'] = $mInfo['data']["rtmid"];
$ssm->ext_log['rootuid'] = $mInfo['data']["rootuid"];
$ssm->ext_log['rootmid'] = $mInfo['data']["rootmid"];
}
//$ssm->isDebug = true;
$ssm->property['datetime'] = date('Y-m-d' ;) ;
$ssm->property['clientip'] = $ip;
$ssm->property['operator'] = $uid;
$ssm->property['source'] = $mInfo['appid'];
if($bRet === false) {
$ssm->property['status'] = SSM_LOG_STATUS_FAIL;
} else {
$ssm->property['status'] = SSM_LOG_STATUS_SUCC;
}
$ssm->property['object'] = $mid;
if($mInfo['appid'] === MBLOG_APP_TRANSMIT) {
$ssm->property['otheruid'] = $mInfo['data']["rootuid"];
}
//$ext = implode(",",$ssm->ext_log);
//$ssm->property['extfields'] = $ext;
$ssm->log(SSM_LOG_ACTION_MBLOGPUB, SSM_LOG_ACTION_MBLOGPUB);
}
if($arr['status'] == STATUS_FIRST_CHECK){
return array("code" => "M02005&quot ;) ;
}
if($arr['usergrouplevel'] == STATUS_FIRST_CHECK){
return array("code" => "M02005&quot ;) ;
}
$startTime9 = getmicrotime();
$t = number_format($startTime9-$startTime1,10);
$t1 = number_format($startTime2-$startTime1,10);
$t2 = number_format($startTime3-$startTime2,10);
$t3 = number_format($startTime4-$startTime3,10);
$t4 = number_format($startTime5-$startTime4,10);
$t5 = number_format($startTime6-$startTime5,10);
$t6 = number_format($startTime7-$startTime6,10);
$t7 = number_format($startTime8-$startTime7,10);
$t8 = number_format($startTime9-$startTime8,10);
if($t>1) {
$mstr= $t.'|'.$t1.'|'.$t2.'|'.$t3.'|'.$t4.'|'.$t5.'|'.$t6.'|'.$t7.'|'.$t8."\n";
error_log($mstr,3,'/data1/www/privdata/t.sina.com.cn/logs/INFO/'.date('Y-m-d').'modeladdmblog.log');
}

return $bRet;
}

public function insertMblog($uid, $content, $appid, $tag, $filterAr, $ip, $ctime, $statusArr=array(), $searchMcq=true) {

//--合并计算过滤条件(含图片\链接)
// $arrFilter = array(MBLOG_FILTER_PIC=>$ispic,MBLOG_FILTER_LINK=>$islink);
$oSearch = ClsFactory::Create('model::mSearch');
$filterString = $oSearch->encodeFilter($filterAr);

$obj = ClsFactory::Create("model::mAdminCheck");
$arrData = unserialize($content);
$mblogText = $arrData['text'];

$duserobj = ClsFactory::Create('model::mPerson');
$userinfo=$duserobj->getUserInfo($uid, true);
if($statusArr === array()){
if( is_array($arrData) && isset($arrData['reason']))
$ckText = $arrData['reason'];
else
$ckText = $arrData['text'];
$checkarr = $obj->checkPubMblog($userinfo, array('content'=>$ckText,'appid'=>$appid,'ip'=>$ip));
}else{
$checkarr = $statusArr;
}

$usertype = $obj->getUserType($uid);
if($checkarr['status']==STATUS_KILL)
{
return false;
}

//--插入微博客数据库
$startTime = getmicrotime();
$objMblog = ClsFactory::Create('data::dMblog');
$mid = $objMblog->add($uid, $content, $appid, $tag, $filterString, $ip, $ctime, $statusArr['status']);
$act_status = $mid===false ? 0 : 1;
$message = array(SOURCE_WWW, $act_status);
record_logMon(SERVICE_ADD_MBLOG_DATA, $startTime, $message);

if($mid===false) return false;

// 更新Feed和Myfeed缓存
$mblogch = array(
'mid' => $mid,
'uid' => $uid,
'content' => $content,
'appid' => $appid,
'tag' => $tag,
'ip' => $ip,
'ctime' => $ctime,
'status' => $checkarr['status'],
'filter' => $filterString,
);
$objMblog->setNewMyfeedByMc($uid, $mblogch, 10); // wap用
$objMblog->setNewMyfeedByMc($uid, $mblogch, MBLOG_PAGE_SIZE);
$objMblog->setNewFeedByMc($uid, $mblogch, MBLOG_PAGE_SIZE);
//ligang1 add
$objMblog->setNewFilterFeedByMc($uid, $mblogch, MBLOG_PAGE_SIZE, $mblogch['filter']);

$oMscore = ClsFactory::Create('model::mScore');
$userRank = $oMscore->getRankList(array($uid));

//--插入myfeed库
$objDfeed = ClsFactory::Create('data::dFeed');
$objDfeed -> addtoMyFeed($uid, $mid);

// 获取IP信息
$o_ip = ClsFactory::Create('data::dIp');
$ips = $o_ip->getFormatInfoByIp($ip, true);
$zone = "{$ips['province']}:{$ips['city']}";

//--写入feed表
$feeddata = array();
$feeddata['uid'] = $uid;
$feeddata['content'] = $mblogText;
// $feeddata['data'] = $content;
$feeddata['tag'] = $tag;
$feeddata['ctime'] = $ctime;
$feeddata['ip'] = $ip;
$feeddata['zone'] = $zone;
$feeddata['appid'] = $appid;
$feeddata['usertype'] = $usertype;
$feeddata['mid'] = $mid;
$feeddata['islink'] = $filterAr[MBLOG_FILTER_LINK];
$feeddata['ispic'] = $filterAr[MBLOG_FILTER_PIC];
$feeddata['isat'] = $filterAr[MBLOG_FILTER_AT];
$feeddata['isrt'] = 0;
$feeddata['filter'] = $filterString;
$feeddata['status'] = $checkarr['status'];
$feeddata['kwdlevel'] = $checkarr['kwdlevel'];
$feeddata['zonelevel'] = $checkarr['zonelevel'];
$feeddata['userlevel'] = $checkarr['userlevel'];
$feeddata['rank'] = $userRank[$uid];
$feeddata['is_push_search'] = $checkarr['is_push_search'];
$feeddata['searchMcq'] = $searchMcq;
$feeddata['user_type'] = $checkarr['usertype'];

// 如果是搜索页过来的,直接推搜索而不走搜索队列
if($feeddata['is_push_search'] && !$searchMcq
&& $feeddata['rank']>=MBLOG_UPLOADPIC_USER_LEVEL
&& !in_array($feeddata['usertype'], array(BLACK_USER, DANGER_USER))) {
$searchData = array(
'mid' => $feeddata['mid'],
'uid' => $feeddata['uid'],
'data' => $content,
'content' => $feeddata['content'],
'tag' => $feeddata['tag'],
'ctime' => $feeddata['ctime'],
'ip' => $feeddata['ip'],
'zone' => $feeddata['zone'],
'appid' => $feeddata['appid'],
'filter' => $feeddata['filter'],
'usertype' => $feeddata['usertype'],
);
$oSearch->postData('add', $searchData);
}

//--增加积分,写队列
if(!isset($arrData['reason']) || $statusArr['status']==STATUS_FIRST_CHECK)
{
$mScoreObj = ClsFactory::Create("model::mScore");
$mblogRet = $mScoreObj ->collectBehavior(SCORE_SEND_MBLOG,$uid);

$dfeedobj = ClsFactory::Create("data::dFeed");
$dfeedobj->addtoMcq($uid,$feeddata['mid'],$feeddata,"add&quot ;) ;
//ligang1 add for imbot.
if(in_array($feeddata['status'], array(STATUS_FIRST_CHECK,STATUS_UNCHECK,STATUS_CHECKED,STATUS_NOSEARCH))) {
$dimbotobj = ClsFactory::Create("data::dImBot");
$dimbotobj->addtoMcq(array('type'=>'0','info'=>array('uid'=>$uid,'mid'=>$feeddata['mid'])));
}
//ligang1 add end
}
//--增加计数器
if(in_array($checkarr['status'], array(STATUS_UNCHECK,STATUS_CHECKED,STATUS_NOSEARCH))) {
$o_counter = ClsFactory::Create('model::mCounter');
$o_counter->increment(COUNT_SAVE_MBLOG_MYFEED, $uid);
}
//--格式化数据返回,由JS回写到页面
$feeddata['content'] = $content;
$returnData = $this->mapping(array($feeddata['mid']=>$feeddata));
return $returnData;
}

/**
* 当用户关注某个人后,需要给被关注人发feed
*
* @param integer $starid(被关注id)
* @param integer $fansid(关注人id)
* @return false
*/
public function followSameOneFeed($starid,$fansid){
$dfeedobj = ClsFactory::Create("data::dFeed");
$re = $dfeedobj->followSameOneFeed($starid,$fansid);
return $re;
}

/**
* 删除微博客
*
* @param integer $mid
* @param integer $ownerUid
* @return unknown
*/
public function delete($mid, $ownerUid,$ip='',$isWap=false) {
$objMblog = ClsFactory::Create('data::dMblog');

$mblogInfo = $this->getMblogByMids(array($mid));

//删除缓存中的信息
$objMblog->delMyfeedByMc($ownerUid, 10); // wap用
$objMblog->delMyfeedByMc($ownerUid, MBLOG_PAGE_SIZE);
$objMblog->delFeedByMc($ownerUid, MBLOG_PAGE_SIZE);
//ligang1 add
$objMblog->delFilterFeedByMc($ownerUid, MBLOG_PAGE_SIZE);
// 删除图片
/*
$info = $this->getMblogByMids(array($mid));
if($info===false) return false;
$pids = $info[$mid]['data']['pic'];
if(!empty($pids)) {
$o_image = ClsFactory::Create('model::mImage');
$o_image->delImage($pids);
}*/

// 删除微博客主题
$bRet = $objMblog->delete($mid, $ownerUid);

//统计数据需要
$ssm = ClsFactory::Create('tools::log::SSM_Miniblog');
//$ssm->isDebug = true;
$ssm->property['datetime'] = date('Y-m-d' ;) ;
$ssm->property['operator'] = $ownerUid;
$ssm->property['clientip'] = $ip;
if($isWap) {
$ssm->property['source'] = MBLOG_APP_WAP;
} else {
$ssm->property['source'] = MBLOG_APP_MBLOG;
}
if($bRet === false) {
$ssm->property['status'] = SSM_LOG_STATUS_FAIL;
} else {
$ssm->property['status'] = SSM_LOG_STATUS_SUCC;
}
$ssm->property['action'] = 1;
$ssm->property['object'] = $mid;
$ssm->log(SSM_LOG_ACTION_MBLOGDEL, SSM_LOG_ACTION_MBLOGDEL);

if($bRet===false) return false;

//--实时删除myfeed
$dfeedobj = ClsFactory::Create("data::dFeed");
$dfeedobj->delMyFeed($ownerUid, $mid);

//--队列删除
$dfeedobj->addtoMcq($ownerUid,$mid,array(),"del&quot ;) ;

//--删除积分
$mScoreObj = ClsFactory::Create("model::mScore");
$mScoreObj->collectBehavior(SCORE_SELF_DEL_MBLOG, $ownerUid);

//--减少计数器
$o_counter = ClsFactory::Create('model::mCounter');
$o_counter->decrement(COUNT_SAVE_MBLOG_MYFEED, $ownerUid);

// 如果是转发,转发计数器减1
if($mblogInfo[$mid]['appid']==MBLOG_APP_TRANSMIT) {
$rootMid = $mblogInfo[$mid]['data']['rootmid'];
$fromMid = $mblogInfo[$mid]['data']['rtmid'];
$o_counter->decrement(COUNT_SAVE_MBLOG_RT, $rootMid);
if($fromMid!=$rootMid) {
$o_counter->decrement(COUNT_SAVE_MBLOG_RT, $fromMid);
}
}

# LOG MID TO MCQ @ 9013
$this->logMBlogDeletion($mid);
return $bRet;
}

/**
* 渲染tag显示
*
* @param string $content
* @return string
*/
public function renderTag($content, $istarget=false) {
$istarget = $istarget ? 1 : 0;
$content = str_replace("#", "#", $content);
$content = str_replace ( ''', '\'', $content );
$content = str_replace ( ''', '\'', $content );
$str = preg_replace("/#([^#]+)#/ise", "stripTag('\\1','\\0', {$istarget})", $content);
return $str;
}

public function delTag($content) {
$content = str_replace("#", "#", $content);
return preg_replace("/#([^#]+)#/is", '', $content);
}

/**
* 获取用户的微博客计数器
*
* @param integer $OwnerUid
* @return integer
*/
public function getPersonMblogCount($OwnerUid) {
$o_counter = ClsFactory::Create('model::mCounter');
$result = $o_counter->query(COUNT_SAVE_MBLOG_MYFEED, array($OwnerUid));
return $result[$OwnerUid];
}

/**
* 获取微博客转发计数器
*
* @param array $mids
* @return int
*/
public function getMblogsRtCount($mids) {
$o_counter = ClsFactory::Create('model::mCounter');
$mCountRet = $o_counter->query(COUNT_SAVE_MBLOG_RT, $mids);
return $mCountRet;
}

/**
* 获取某人的微博客列表,如果两个UID相同则会直接调用,否则会去掉不可见数据
*
* @param integer $VisitUid 访问者的uid
* @param integer $OwnerUid 资源所有者的uid
* @return unknown
*/
public function getPersonMblogList($cuid, $ouid, $filter, $page, $pageSize=MBLOG_PAGE_SIZE, $source='mblog') {
$cuid += 0;
$ouid += 0;
$filter += 0;
$page += 0;
$pageSize += 0;
if($ouid<=0 or $page<=0 or $pageSize<=0) return false;
// 从缓存取数据
$o_mblog = ClsFactory::Create('data::dMblog');
if($page==1) $mblogList = $o_mblog->getMyfeedByMc($ouid, $pageSize);
// 取不到的处理流程
if($mblogList===false or empty($mblogList) or is_null($mblogList)) {
$o_feed = ClsFactory::Create('data::dFeed');
$feedlist = $o_feed->getMyFeedList($ouid, $page, $pageSize);
if($feedlist===false) return false;
$mids = array_map(create_function('$a','return $a["mid"];'), $feedlist);
$mids = array_values(array_unique($mids));
$mblogList = $o_mblog->getMblogByMids($mids);
if($mblogList===false) return false;
// 种缓存
$mblogList = $this->filterStatus($mblogList, $cuid);
usort($mblogList, create_function('$a,$b','return strtotime($b["ctime"])-strtotime($a["ctime"]);'));
if($page==1) $o_mblog->setMyfeedByMc($ouid, $mblogList, $pageSize);
}else {
$mblogList = $this->filterStatus($mblogList, $cuid);
}
$mblogList = $this->mapping($mblogList, $source, true);
if($mblogList===false) return false;
return $mblogList;
}

/**
* 按筛选条件获取某人微博列表
*
* @param unknown_type $uid
* @param unknown_type $filteType
* @return unknown
*/
public function getMblogListByFilter($uid, $filteType) {
$objMblog = ClsFactory::Create('data::dMblog');
$bRet = $objMblog->getMblogListByFilter($uid, $filteType);
return $bRet;
}

/**
* 修改某条微博客状态,同时自动对myfeed及计数器进行操作
*
* @param integer $mids
* @param integer $status
* @return unknown
*/
public function modifyMblogStatus($mids, $status) {
if(!is_array($mids) or empty($mids)) return false;
$o_mblog = ClsFactory::Create('data::dMblog');
$mblog = $o_mblog->getMblogByMids($mids);
if($mblog===false) return false;
$bRet = $o_mblog->modifyMblogStatus($mids, $status);
if(!$bRet) return false;

$o_feed = ClsFactory::Create('data::dFeed');

$deletion = array();

foreach($mblog as $mid => $v) {//删除或新增myfeed
$v['status'] = $v['status'] + 0;
if($v['status']==$status) continue;
if(in_array($v['status'], $GLOBALS['SCOPE_STATUS'][SCOPE_STATUS_SELF]) && in_array($status, $GLOBALS['SCOPE_STATUS'][SCOPE_STATUS_NOSHOW])) {
$o_feed->delMyFeed($v['uid'],$mid);
# 记录待删除的mid
$deletion[] = $mid;
}else
if(in_array($v['status'], $GLOBALS['SCOPE_STATUS'][SCOPE_STATUS_NOSHOW]) && in_array($status, $GLOBALS['SCOPE_STATUS'][SCOPE_STATUS_SELF])) {
$o_feed->addtoMyFeed($v['uid'],$mid,$v['ctime']);
}
}

// 新计数器
$o_counter = ClsFactory::Create('model::mCounter');
foreach($mblog as $v) {
$v['status'] = $v['status'] + 0;
if($v['status']==$status) continue;
if(in_array($v['status'], $GLOBALS['SCOPE_STATUS'][SCOPE_STATUS_SELF]) && in_array($status, $GLOBALS['SCOPE_STATUS'][SCOPE_STATUS_NOSHOW])) {
$o_counter->decrement(COUNT_SAVE_MBLOG_MYFEED, $v['uid']);
}else
if(in_array($v['status'], $GLOBALS['SCOPE_STATUS'][SCOPE_STATUS_NOSHOW]) && in_array($status, $GLOBALS['SCOPE_STATUS'][SCOPE_STATUS_SELF])) {
$o_counter->increment(COUNT_SAVE_MBLOG_MYFEED, $v['uid']);
}

//删除缓存中的信息
$o_mblog->delMyfeedByMc($v['uid'], 10); //wap
$o_mblog->delMyfeedByMc($v['uid'], MBLOG_PAGE_SIZE);
$o_mblog->delFeedByMc($v['uid'], MBLOG_PAGE_SIZE);
//ligang1 add
$o_mblog->delFilterFeedByMc($v['uid'], MBLOG_PAGE_SIZE, $v['filter']);

}

# 记录删除的mid到mcq
$this->logMBlogDeletion($deletion);

unset($o_counter,$o_feed,$mblog,$o_mblog);
return true;
}

/**
* 根据mid列表批量查询转发信息
*
* @param array $mids
* @return array
*/
public function getTransmitByMids($mids) {
$o_mblog = ClsFactory::Create('data::dMblog');
$list = $o_mblog->getTransmitByMids($mids);
return $list;
}

/**
* 添加一条转发关系
*
* @param integer $uid 转发者uid
* @param integer $fromMid 来源资源id
* @param string $reason 转发理由
* @param string $ip 转发者ip地址
* @param string $ctime 转发时间(DateTime格式)
* @param integer $status 微博状态
* @param bool $iscommTran 是否评论转发
* @return array
*/
public function transmit($uid, $fromMid, $reason, $appid, $ip, $ctime, $status=0, $searchMcq=true,$isWap=false,$iscommTran=false) {
//检查sass
$mSassobj = ClsFactory::Create('model::mSass');
$issasskill = $mSassobj->checkPostBlog($uid);
if($issasskill) {
$errorcode = $mSassobj->getErrmsg();
if($errorcode == SASS_COMMON_PUBLISH_REJECT_PRIMARY) {
return array("code" => "M02014&quot ;) ;
} elseif($errorcode == SASS_COMMON_PUBLISH_REJECT_ADVANCED) {
return array("code" => "M02015&quot ;) ;
}
return array("code" => "M02003&quot ;) ;
}

//检查sass结束
$adminObj = ClsFactory::Create("model::mAdminCheck");
$personObj = ClsFactory::Create("model::mPerson");
$userInfo = $personObj->getUserInfo($uid, true);
$arr = $adminObj->checkPubMblog($userInfo, array('content'=>$reason,'appid'=>$appid,'ip'=>$ip));

if($arr['kwdlevel'] == KEYWORD_FORBID) {
return array("code" => "M00006&quot ;) ;
}

if($arr['status'] == STATUS_KILL){
return array("code" => "M00005&quot ;) ;
}
elseif ($arr['usergrouplevel'] == STATUS_KILL)
{
return array("code" => "M02009&quot ;) ;
}

$usertype = $adminObj->getUserType($uid);
$checkarr = $arr;

$o_mblog = ClsFactory::Create('data::dMblog');
$o_base62 = ClsFactory::Create('tools::encode::base62Parse');
//取根mblog

$bRet = $this->getMblogByMids(array($fromMid), 'mblog', false, true, '', false);
if(!$bRet) return false;
$mblog = $bRet[$fromMid];
// 获取根微博的mid
if(empty($mblog['data']['rootmid62'])) {
$traninfo = $o_mblog->getTransmitByMids($fromMid);
$rootMid = !empty($traninfo) ? $traninfo[$fromMid]['rootmid'] : $fromMid;
} else {
$rootMid = $o_base62->decode($mblog['data']['rootmid62']);
}
//检查后台是否允许转发
$fromUid = $bRet[$fromMid]['uid'];
$fromUserInfo = $personObj->getUserInfo($fromUid,true);
$ckInfo = $adminObj->checkMblogPower($fromUserInfo,$rootMid);
if($ckInfo['fwd'] == MBLOGSET_RT_FORBID){
return array("code" => "M02011&quot ;) ;
}else
if($ckInfo['fwd'] == MBLOGSET_RT_CLOSE) {
$checkarr['status'] = STATUS_FIRST_CHECK;
$checkarr['is_push_search'] = false;
}
/*--检查用户自己不可以转发自己的微博客
if ($bRet[$fromMid]['uid'] == $uid)
{
return false;
}*/

if (mb_strwidth($reason, "UTF-8&quot ;) > MBLOG_CONTENT_MAX_SIZE)
{
$reason = mb_strimwidth($reason, 0, MBLOG_CONTENT_MAX_SIZE, "", "UTF-8");
}
//入库前就做html转义
$reason = htmlspecialchars($reason);

// 解析连接成短连接
$strinShortUrl = array();
$objAnalyzeLink = ClsFactory::Create("tools::analyze::TAnalyzeLink");
$bRet = $objAnalyzeLink->getData(array('content'=>$reason,'from'=>MBLOG_ACTION_FORWARD),$strinShortUrl,$videoArr);
if($bRet!==false) $reason = $bRet;

// 增加必要字段
$mblog['data']['uid'] = $uid;
$mblog['data']['fromuid'] = $mblog['uid'];
$mblog['data']['rootuid'] = $rootMid==$fromMid ? $mblog['uid'] : $mblog['data']['rootuid'];
$mblog['data']['rootmid'] = $rootMid;
$mblog['data']['rootmid62'] = $o_base62->encode($rootMid);
$mblog['data']['rtmid'] = $fromMid;
$mblog['data']['rtmid62'] = $o_base62->encode($fromMid);
$mblog['data']['reason'] = $reason;
$mblog['isat'] = 0;
$atUsers_Reason = array();
$objAtUser = ClsFactory::Create("model::mAtUser");
$atUsers = $objAtUser->getAtUsername($reason);
if(count($atUsers)>0){
foreach($atUsers as $name) {
$name = strval($name);
$mblog['data']['atUsers'][$name] = $name;
$atUsers_Reason[$name] = $name;
}
$mblog['filter'] |= 8;
$mblog['isat'] = 1;
}

//if($mblog['data']['rootuid'] != $uid) {
$rootUserInfo = $personObj->getUserInfo($mblog['data']['rootuid'], false);
if($rootUserInfo !== false) {
$rootNick = $rootUserInfo['name'];
if (!$iscommTran) {
$mblog['data']['atUsers'][$rootNick] = $rootNick;
$atUsers_Reason[$rootNick] = $rootNick;
}
}
$mblog['isat'] = 1;
//}
// 获取新的filter标识
$o_search = ClsFactory::Create('data::dSearch');
$arfilter = $o_search->decodeFilter($mblog['filter']);
$arfilter[MBLOG_FILTER_RET] = true;
if(!empty($videoArr)){
$mblog['data']['video'] = $videoArr;
$arfilter[MBLOG_FILTER_VIDEO] = true;
}
$mblog['filter'] = $o_search->encodeFilter($arfilter);

//--获取tag内容
$isTag = false;
$objAnalyzeTag = ClsFactory::Create("tools::analyze::TAnalyzeTag");
$tags = $objAnalyzeTag->getData($mblog['data']['reason']);
if ($tags !== FALSE) $isTag = true;
// 写微博客信息
$insertmbloginfo = $this->insertMblog($uid, serialize($mblog['data']),$appid, $mblog['tag'],$arfilter, $ip, $ctime, $checkarr);
if(is_array($insertmbloginfo)){
$midtmp = array_keys($insertmbloginfo);
$mid = $midtmp[0];
}

//统计数据需要
foreach($insertmbloginfo as $mid => $mInfo) {
$ssm = ClsFactory::Create('tools::log::SSM_Miniblog');
$ssm->ext_log = array();
if(is_array($strinShortUrl) && count($strinShortUrl) > 0) {
$ssm->ext_log['shortUrl'] = implode(";", $strinShortUrl);
}
if($mInfo['appid'] === MBLOG_APP_SHARE) {
$ssm->ext_log['isShare'] = "1";
}
if($filterAr[MBLOG_FILTER_LINK]) {
$ssm->ext_log['islink'] = "1";
}
if($filterAr[MBLOG_FILTER_PIC]) {
$ssm->ext_log["isPic"] = "1";
}
if($filterAr[MBLOG_FILTER_VIDEO]) {
$ssm->ext_log["isVideo"] = "1";
}
if($mInfo['appid'] === MBLOG_APP_TRANSMIT) {
$ssm->ext_log["isTransmit"] = "1";
}
if($mInfo['appid'] === MBLOG_APP_SHARE) {
$ssm->ext_log["isShare"] = "1";
}
if($isTag === true) {
$ssm->ext_log["isTopic"] = "1";
}
//得到博文字节数
$mblogsize = mb_strwidth($mblog['data']['reason'], "UTF-8");
$ssm->ext_log["size"] = $mblogsize;

if($mInfo['appid'] === MBLOG_APP_TRANSMIT) {
$ssm->ext_log['rtmid'] = $mInfo['data']["rtmid"];
$ssm->ext_log['rootuid'] = $mInfo['data']["rootuid"];
$ssm->ext_log['rootmid'] = $mInfo['data']["rootmid"];
}
//$ssm->isDebug = true;
$ssm->property['datetime'] = date('Y-m-d' ;) ;
$ssm->property['clientip'] = $ip;
$ssm->property['operator'] = $uid;
if($isWap) {
$ssm->property['source'] = MBLOG_APP_WAP;
} else {
$ssm->property['source'] = MBLOG_APP_MBLOG;
}
if($mid === false) {
$ssm->property['status'] = SSM_LOG_STATUS_FAIL;
} else {
$ssm->property['status'] = SSM_LOG_STATUS_SUCC;
}
$ssm->property['object'] = $mid;
if($mInfo['appid'] === MBLOG_APP_TRANSMIT) {
$ssm->property['otheruid'] = $mInfo['data']["fromuid"];
}
$ext = implode(",", $ssm->ext_log);
$ssm->property['extfields'] = $ext;
$ssm->log(SSM_LOG_ACTION_MBLOGPUB, SSM_LOG_ACTION_MBLOGPUB);
}

if($mid===false) return false;
// 写转发关系
$bRet = $o_mblog->addForward($mid, $mblog['uid'], $uid, $rootMid, $fromMid);
if($bRet===false)
{
if($checkarr['status'] == STATUS_FIRST_CHECK){
return array("code" => "M02005&quot ;) ;
}else
return false;
}
//增加积分
$mScoreObj = ClsFactory::Create("model::mScore");
$mScoreObj ->collectBehavior(SCORE_TRANSTER,$uid,$mblog['uid']);

// 写myfeed
$o_feed = ClsFactory::Create('data::dFeed');
//$o_feed->addtoMyFeed($uid, $mid);

$oMscore = ClsFactory::Create('model::mScore');
$userRank = $oMscore->getRankList(array($uid));
$mblog['data']['atUsers'] = $atUsers_Reason; //只分发reason里面的@用户

// 获取IP信息
$o_ip = ClsFactory::Create('data::dIp');
$ips = $o_ip->getFormatInfoByIp($ip, true);
$zone = "{$ips['province']}:{$ips['city']}";

// 队列分发
$feeddata = array(
'mid' => $mid,
'uid' => $uid,
'content' => $mblog['data']['text'],
// 'data' => serialize($mblog['data']),
'tag' => $mblog['tag'],
'ctime' => $ctime,
'ip' => $ip,
'zone' => $zone,
'appid' => $appid,
'usertype' => $usertype,
'filter' => $mblog['filter'],
'status' => $checkarr['status'],
'kwdlevel' => $checkarr['kwdlevel'],
'zonelevel' => $checkarr['zonelevel'],
'userlevel' => $checkarr['userlevel'],
'parentid' => $fromMid,
'rootid' => $rootMid,
'rank' => $userRank[$uid],
'isrt' => 1,
'is_push_search'=> $checkarr['is_push_search'],
'searchMcq' => $searchMcq,
'isat' =>$mblog['isat'],
'user_type' => $checkarr['usertype'],
);

if(!$searchMcq) {
$oSearch = ClsFactory::Create('model::mSearch');
$searchData = array(
'mid' => $feeddata['mid'],
'uid' => $feeddata['uid'],
'data' => serialize($mblog['data']),
'content' => $reason,
'tag' => $feeddata['tag'],
'ctime' => $feeddata['ctime'],
'ip' => $feeddata['ip'],
'zone' => $feeddata['zone'],
'appid' => $feeddata['appid'],
'filter' => $feeddata['filter'],
'usertype' => $feeddata['usertype'],
);
$bRet = $oSearch->postData('add', $searchData);
}

$o_feed->addtoMcq($uid,$mid,$feeddata,"add&quot ;) ;

//ligang1 add for imbot.
$dimbotobj = ClsFactory::Create("data::dImBot");
$dimbotobj->addtoMcq(array('type'=>'0','info'=>array('uid'=>$uid,'mid'=>$feeddata['mid'])));
//ligang1 add end
$o_counter = ClsFactory::Create('model::mCounter');
$o_counter->increment(COUNT_SAVE_MBLOG_RT, $fromMid);

if($fromMid!=$rootMid) {
$o_counter->increment(COUNT_SAVE_MBLOG_RT, $rootMid);
}
if($checkarr['status'] == STATUS_FIRST_CHECK){
return array("code" => "M02005&quot ;) ;
}
elseif($checkarr['usergrouplevel'] == STATUS_FIRST_CHECK){
return array("code" => "M02005&quot ;) ;
}
return $mid;
}

/**
* 根据资源id删除转发关系
*
* @param integer $mid 资源id
* @return boolean
*/
public function delForwardByMid($mid) {
$o_mblog = ClsFactory::Create('data::dMblog');
$bRet = $o_mblog->delForwardByMid($mid);
return $bRet;
}

/**
* 从缓存获取某人的feed列表,widget专用
*
* @param integer $ouid
* @param integer $pagesize
* @return array
*/
public function getMyFeedMblogFromCache($ouid, $pagesize) {
$o_mblog = ClsFactory::Create('data::dMblog');
$mblog = $o_mblog->getMyFeedMblogFromCache($ouid);
if($mblog===false) {
$mblog = $this->getPersonMblogList(0, $ouid, MBLOG_FILTER_DEFAULT, 1, MBLOG_PAGE_SIZE, 'widget_blog' ;) ;
if($mblog===false) return false;
$bRet = $o_mblog->saveMyFeedMblogToCache($ouid, $mblog);
if($bRet===false) return false;
$mblog = array_slice($mblog, 0, $pagesize);
}
return $mblog;
}

/**
* 从缓存获取某人的关注feed列表,widget专用
*
* @param integer $ouid
* @param integer $pagesize
* @return array
*/
public function getAttFeedMblogFromCache($ouid, $pagesize) {
$o_mblog = ClsFactory::Create('data::dMblog');
$mblog = $o_mblog->getAttFeedMblogFromCache($ouid);
if($mblog===false) {
$mblog = $this->getAttMblogInPage(0, $ouid, 1, 20, MBLOG_FILTER_DEFAULT, 'widget' ;) ;
if($mblog===false) return false;
$bRet = $o_mblog->saveAttFeedMblogToCache($ouid, $mblog);
if($bRet===false) return false;
$mblog['record'] = array_slice($mblog['record'], 0, $pagesize);
}
return $mblog;
}

/**
* 获取某人的最新feed数
*
* @param integer $uid
* @param integer $endmid 暂时不用
* @return array
*/
public function getNewFeedNum($uid,$endmid=0) {
$o_feed = ClsFactory::Create('data::dFeed');
$num = $o_feed->getUnReadFeedCache($uid);

return $num+0;
}

/**
* 清除某人的最新feed数
*
* @param integer $uid
* @return boolean
*/
public function clearUnReadFeedCache($uid) {
$o_feed = ClsFactory::Create('data::dFeed');
$re = $o_feed->clearUnReadFeedCache($uid);

return $re;
}

/**
* 获取某人的关注feed列表
*
* @param integer $ouid
* @param integer $filter
* @param string $source
* @return array
*/
private function getAttMids($uid, $page, $pagesize) {
$o_feed = ClsFactory::Create('data::dFeed');
$list = $o_feed->getFeedList($uid, ($page-1)*$pagesize, $pagesize);
if($list===false) return false;
if(empty($list)) return array('dCount'=>0, 'mids'=>array());
$dCount = count($list);
$mids = array_map(create_function('$a','return $a["mid"];'), $list);
$mids = array_values(array_unique($mids));
$result = array('dCount'=>$dCount, 'mids'=>$mids);
return $result;
}
/**
* 记录所有删除的mid到mcq
*
* @param array $mids
* @return boolean
*/
public function logMBlogDeletion($mids)
{
$dmblog = ClsFactory::Create('data::dMblog');
return $dmblog->logMBlogDeletion($mids);
}

/**
* 修改单篇微博客
*
* @param int $mid
* @param int $ownerUid
* @param string $content
* @param string $pic
* @param bool $modifyrt
* @return true or fasle
*/
public function modifyMblog($mid,$ownerUid,$content,$pic='',$status=0,$modifyrt=false,$atUsers="")
{
$dMblogobj = ClsFactory::Create('data::dMblog');
$ominfo = $dMblogobj->getMblogByMids(array($mid));

$ispic = 0;
$islink = 0;
$isat = 0;
if (!empty($pic))
{
$ispic = 1;
if (!is_array($pic))
{
$pic = array($pic);
}
}
if (mb_strwidth($content, "UTF-8&quot ;) > MBLOG_CONTENT_MAX_SIZE)
{
$content = mb_strimwidth($content, 0, MBLOG_CONTENT_MAX_SIZE, "", "UTF-8");
}
if($status != 1) {
$content = htmlspecialchars($content);
}
$objAnalyzeLink = ClsFactory::Create("tools::analyze::TAnalyzeLink");
$bRet = $objAnalyzeLink->getData(array('content'=>$content,'from'=>MBLOG_ACTION_MBLOG));
if ($bRet !== FALSE)
{
$islink = 1;
$content = $bRet;
}

//--获取tag内容
$objAnalyzeTag = ClsFactory::Create("tools::analyze::TAnalyzeTag");
$bRet = $objAnalyzeTag->getData($content);
if ($bRet !== FALSE)
{
$tag = $bRet;
}

$filterAr = array(
MBLOG_FILTER_PIC => $ispic,
MBLOG_FILTER_LINK => $islink,
MBLOG_FILTER_AT => $isat,
);
$mblogContent = array();
$mblogContent['text'] = $content;
$mblogContent['pic'] = $pic;
$mblogContent['uid'] = $ownerUid;
if(is_array($atUsers) && count($atUsers) > 0) {
$mblogContent['atUsers'] = $atUsers;
$filterAr[MBLOG_FILTER_AT] = 1;
}
$oSearch = ClsFactory::Create('model::mSearch');
$mblogContentString = serialize($mblogContent);
$filterString = $oSearch->encodeFilter($filterAr);

if($ominfo[$mid]['appid']==MBLOG_APP_TRANSMIT)
{
$contentar = unserialize($ominfo[$mid]['content']);
$contentar['reason']= $content;
$mblogContentString = serialize($contentar);
}
$dMblogobj = ClsFactory::Create('data::dMblog');
$dMblogobj->modifyMblog($mid,$mblogContentString,$tag,$filterString);
//删除缓存中的信息
$dMblogobj->delMyfeedByMc($ownerUid, 10); // wap用
$dMblogobj->delMyfeedByMc($ownerUid, MBLOG_PAGE_SIZE);
$dMblogobj->delFeedByMc($ownerUid, MBLOG_PAGE_SIZE);
return true;
}
/**
* 过滤微博列表中不显示的微博
*
* @param array $mblogList
* @param interger $cuid
* @param interger $statusScope
* SCOPE_STATUS_PUBLIC:所有人可见
* SCOPE_STATUS_SELF:自己可见
* SCOPE_STATUS_SEARCH:搜索可见
* default: 全部
*/
public function filterStatus($mblogList, $cuid="", $statusScope=SCOPE_STATUS_SELF) {
if(!is_array($mblogList) || !isset($GLOBALS['SCOPE_STATUS'][$statusScope])) {
return $mblogList;
}
foreach($mblogList as $k => $v) {
if($v===false) continue;
if(!in_array($v['status'], $GLOBALS['SCOPE_STATUS'][$statusScope])) {
unset($mblogList[$k]);
continue;
}
if($v['status'] == STATUS_SELF && $cuid != $v['uid']) {
unset($mblogList[$k]);
}
}
return $mblogList;
}

// 后台专用清除缓存
public function delMc_Admin($ownerUid) {
$objMblog = ClsFactory::Create('data::dMblog');
$objMblog->delMyfeedByMc($ownerUid, 10); // wap用
$objMblog->delMyfeedByMc($ownerUid, MBLOG_PAGE_SIZE);
$objMblog->delFeedByMc($ownerUid, MBLOG_PAGE_SIZE);
$objMblog->delFilterFeedByMc($ownerUid, MBLOG_PAGE_SIZE);
}
/**
* 获取最后一条微博
*
* @param array $uids uid数组
* @return array|false array( uid1=>array(uid=>,ctime=>,mid=&gt ;) ,
* uid2=>array(uid=>,ctime=>,mid=&gt ;) ,
* ......
* )
*/
public function getLastMblog($uids){
if(!is_array($uids)) return false;
foreach($uids as $k => &$uid) {
if(!is_numeric($uid)) {
unset($uids[$k]);
continue;
}
$uid += 0;
if($uid<=0) unset($uids[$k]);
}
if(empty($uids)) return false;
$dMblogobj = ClsFactory::Create('data::dMblog');
$infos = $dMblogobj->getLastMblog($uids);
if($infos===false) return false;
return $infos;
}
public function getLastMblogContents($uids){
$o_time = ClsFactory::Create('tools::formatter::TimeFormatter');
$infos = $this->getLastMblog($uids);
if($infos === false) return false;
foreach ($infos as $v){
$mids[] = $v['mid'];
}
$tmpMblogs = $this->getMblogByMids($mids);
if($tmpMblogs === false) return false;
foreach ($tmpMblogs as $v){
$content = ($v['appid'] == MBLOG_APP_TRANSMIT) ? $v['data']['reason'] : $v['data']['text'];
$content .= "(".$o_time->timeFormat($v['ctime']).&quot ;) ";
$content = "".strip_tags($content)."";
$mblogs[$v['uid']] = $content;
}
return $mblogs;
}

}

function stripTag($str, $linkWord, $istarget=false) {
if ($str == MBLOG_PUBLISH_DEFUALT_TAG)
{
return "";
}
if(preg_match("!http\:\/\/[a-zA-Z0-9\$\-\_\.\+\!\*\'\,\{\}\\\^\~\[\]\`\<\>\%\<\>\/\?\:\@\&\=]+!is", $str)) {
return $str;
}
$target = $istarget ? ' target="_blank"' : '';
$url = sprintf(SEARCH_MBLOG_URL, urlencode(urlencode(htmlspecialchars_decode($str))));
$str = ''.$linkWord.'';
return $str;
}
?>

Published by  Published by xFruits

Original source : http://www.she.vc/blog/268...

内容重复机制可视化:大量有用的信息图表

by baiheinet on 一月 15th, 2010

众所周知,内容重复是搜索引擎优化中的一大忌,通常情况下转载的文章是很难获得高权重,所以站长们往往使用伪原创,下面是部分关于内容复制的信息图表,相信对各位会有所帮助。

#1 从博客上复制内容:

blog duplicate content 1 内容重复机制可视化:大量有用的信息图表

上图是主要针对博客这种网站媒体类型的,我们使用wordpress的时候经常将文章毫无保留地展示在首页,而不是使用输出摘要(就好像SEMWATCH那样:)),根据Randfish观察,其实这样子是会搜索引擎误认为内容重复。

#2 URL参数引起的内容重复

swedish fish 内容重复机制可视化:大量有用的信息图表

究竟URL参数像Session IDs,Tracking IDs是怎样引起内容重复的呢?Googlewebmastercentral (需要翻落在我阳台盆栽的榕树叶上,叶子颤动,枝丫摇晃,但还是支撑不住这重量。风从东面吹来,雨水砸在窗口上的铁罩,紧凑又墙) 透露,同一个产品页面,如果搜索引擎爬虫抓取可以通过多种链接途径抓取同一个产品页面,那样会有以下几种消极的影响:

1.多种URLs会稀释链接的广泛性。比如上图的产品页面,如果有50个导入链接,那有可能分别形成了3种导入URL途径,而不是唯一的某一个URL,这样就等于将导入链接传递的权重分散到3个不同的链接上。

2.搜索结果或许会呈现不友好的URL(比如一大串长长 的session ID,tracking ID)。从而在SERP中,降低了用户对该页面的清晰了解程度(英文url比如semwatch.org/sem,不仅仅具备搜索引擎友好性,更重要的是用户体验友好性),不利于品牌的塑造。

#3 搜索引擎对待内容重复的态度

se duplicate content 内容重复机制可视化:大量有用的信息图表

Search Engine Land给出上图可知,一般来说搜索引擎通过4个步骤来识别内容是原创还是复制:

1.发现。当搜索引擎爬虫发现新的内容,他会立刻与之前收录的内容进行比较确保内容的原创性。

2.丢弃。首先,搜索引擎会放弃收录那些来自链接工厂,MFA站点(Made For Adense)和被列入黑名单的IP的页面

3.解剖。下一步就是分析每个页面的 入站链接,判断链接的质量和源头。

4.决定。最后就是回顾之前收录的页面和相关链接,决定哪一个页面才是绝对原创。

#4 关键词拆解

keyword cannibalization 内容重复机制可视化:大量有用的信息图表

搜索引擎会蜘蛛通过你的某一个特定页面爬行4个或者40个网站上不同的页面,而这种行为一般是通过该页面的相关内容链接进行爬行抓取(比如上图的“滑雪板),很多朋友希望通过将众多页面相互关联起来即使相互之前没有关联性,一个站点的许多页面过度使用同一个关键词,从而为了提高排名。但是事实上,这种行为对于排名是帮助不大的。

#5 怎样处理好内容重复的情况

duplicate interlinking 内容重复机制可视化:大量有用的信息图表

这里不同在于不是仅仅通过“滑雪板”这个词而是通过各种各样,有价值而且唯一的关键词(比如折扣滑雪板,小孩滑雪板等)链接到原来的内容上。这样搜索引擎就可以很容易确定该页面与其他页面的相关性极强,这不仅仅基于搜索引擎友好性,更是考虑到用户体验与网站未来的信息架构。

Canonical标签

canonical solution 内容重复机制可视化:大量有用的信息图表

Source: Dynamical.biz

canonical url for categorie 内容重复机制可视化:大量有用的信息图表
Source: SEOmoz.org

其实上面两幅图都涉及到一个问题,那就是网址规范化,针对这个问题,Zac前辈很早前就给我们分析过—网址规范化问题最新解决方法,大家可以前往学习。

301重定向

301 redirect 内容重复机制可视化:大量有用的信息图表

301重定向也是解决内容重复的重要方法,对于永久的重定向,搜索引擎更偏爱于301重定向。随着301重定向实施,旧网站的权重就会自动传递到新的网站上。

当各位了解了搜索引擎对于内容重复判断机制以后,相信对各位的优化工作会有所帮助。我们经常说“细节制胜”,所以无论是网络营销还是单纯的SEM都必须遵循这样的一个原则和细节,方能制胜。

图表收集:Ann Smarty,原文链接

本文首发 SEM Watch ,转载请注明出处。欢迎大家留言或者来信(talk[at]SEMWatch.org)

相关文章

留学考试作文语法自检列表

by baiheinet on 一月 15th, 2010
  1. 单词拼写错误:作者未按照单词的正确拼写方式书写单词,但不包括由于英式英语和美式英语差异所带来的单词拼写差异。
  2. 名词单复数形式错误:作者错误地使用了名词的数,包括:使用了不可数名词的”复数”形式,使用了集合名词的”复数”形式,在应该使用复数的地方使用了单数名词等。
  3. 单数可数名词未受限定:句子中出现的单数可数名词之前没有使用限定词,包括冠词、不定代词、指示代词、名词或代词所有格、数词与某些形容词性的物主代词。
  4. 词性错误:作者在选择词汇的过程中忽略了英文词性的特性,仅按照含义来使用词汇,从而发生了词性使用错误的现象。
  5. 修饰关系错误:作者违反了词汇修饰的规则,采用了不恰当的修饰关系。包括用形容词修饰动词、形容词修饰形容词,副词修饰名词等。
  6. 搭配错误:句子中出现了不合适的词汇修饰、限制、说明现象,或者错误地使用了固有的词汇搭配形式。
  7. 词序错误:作者未使用正确的、符合习惯的表述语序来对内容进行陈述。其中包括修饰词顺序错误,该倒装时没有倒装等。
  8. 非谓语动词使用错误:作者错误的使用了现在分词、过去分词、或动词的不定式。其中包括:
    • 现在分词和过去分词误用:作者没有保证逻辑主语与分词的一致性,即当逻辑主语发出动作时使用了过去分词,而在承受动作或状态时使用了现在分词。
    • 不定式与动名词误用:动名词表达的是”状态,性质,心境,抽象,经常性,已发生的”;不定式表达的是”目的,结果,原因,具体,一次性,将发生的”,作者错误的使用了不定式或动名词。
  9. 介词误用:作者错误的使用了介词。
  10. 连词误用:作者错误的使用了连词。
  11. 关系代词误用:作者在定语从句中错误的使用了关系代词。
  12. 冠词误用:作者没有分清楚定冠词和不定冠词的区别,或对两个不定冠词的用法不清楚而错误的使用了冠词。
  13. 代词误用或指代不明:作者使用的代词的数或者性与名词不匹配,或者读者无法直接判断作者使用的代词所指代的对象。
  14. 句子不完整:句子中某成分,尤其是构成句子的主干成分残缺。
  15. 主谓不一致:句子的主语和谓语在”数”上不满足一致关系。
  16. 违反主句专一原则:当一个句子由多个分句组成非简单句时,作者没有确保有且仅有一个主句,即所有从句必须有连词、关系代词或者分号等引导或隔离,但必须保证有唯一的主句。犯此类错误的句子叫做”流水句(run-on sentences)”或”逗号拼凑句(comma splice)”。
  17. 比较句错误:包括作者在比较句中的比较主体不一致,即在一个比较句中,作者所引入的两个比较对象不具备同样的本质和属性,即”不可比”,或比较级使用错误等。
  18. 并列主体不一致:在并列成分中,作者没有做到并列双方在结构、功能、性质方面完全对等。
  19. 时态错误:句子谓语动词所使用的时态与句子所在的上下文环境不一致。
  20. 语态错误:句子谓语动词所使用的语态(主动/被动)与主语不一致。
  21. 语气错误:句子没有根据上下文采用正确的实语气或虚拟语气。
  22. 不符合英语习惯用法:句子或词等满足语法规则,但是不符合英美国家的母语使用者的表述习惯。

以上列表由杜昶旭老师根据我之前的一个“语法自检列表”补充并重新整理,目前用作Langlib.com上的作文批改根据。

Windows 7 and Windows Server 2008 R2免费电子书

by baiheinet on 一月 15th, 2010

2009年微软发布了全新的Windows客户端和Windows服务器。微软需要确保终端用户,IT专业人员和开发人员可以获取信息,帮助他们建立新的平台,Windows 7和Windows Server 2008 R2。微软下载中心现免费提供这两个新系统的电子书。免费提供这两个电子书籍旨在吸纳更多的专业人士采用Windows 7和Windows Server 2008 R2。

IT专业人员可以从software giant免费获得 “Introducing Windows Server 2008 R2” and “Deploying Windows 7 Essential Guidance from the Windows 7 Resource Kit and TechNet Magazine”两本电子书。这将有助于公司快速部署Windows Vista and Windows Server 2008 R2。

“电子图书Deploying Windows 7 Essential Guidance由Windows 7 Resource Kit和TechNet杂志联合从业界专家Mitch Tulloch, Tony Northrup, Jerry Honeycutt, Ed Wilson所写的文章中精选,也包括了windows团队从TechNet杂志精选的部分文章。专题包括包括:平台开发,规划部署,软件兼容性测试,数据库移植8种常见问题。”——Windows 7 Resource Kit和TechNet杂志联合撰写的Deploying Windows 7 Essential Guidance概述。

 “Introducing Windows Server 2008 R2”是设计的目的是为了简化大型组织安装和管理最新的服务器系统运行基础系统服务构。 “在9各章节中覆盖Windows Server 2008 R2的方方面面,在仅有的200页显然只是天方夜谭。我们做的不是面面俱到,而不是主要介绍Windows Server 2008新的和重要的内容“——节选自该书。

via softpedia.com  fworld编译



[够趣堂] | Follow me on 新浪微博 | 够趣堂logo征集,送独立ip主机

相关日志

Published by  Published by xFruits

Original source : http://an-liu.cn/windows7/post/3472.html...

Pages: 1 2 Next