特别声明:
此次并非针对其他参与2013中国十大优秀开源项目的同行,体系有漏洞要谴责的是制定规则并从中获益但不作为的权贵,草根们制定不了规则但可发现和利用漏洞,这是程序员应有反叛精神没错。但被作为道具不可接受。我代表FineUI请求CSDN公开数据,如果您觉得CSDN有必要撕下遮羞布,请共同呼吁。
============
有人说我太较真了,有人说我应该匿名举报,还有人说有本事你也刷票呀,不过今天我还是要把我知道的说出来,我不会说哪些软件在恶意刷票,我也没有资格说哪些软件在恶意刷票,我只是从程序员的角度对我获取的数据进行实事求是的分析,最终的解释权还是CSDN(因为他们有完整的数据),CSDN也必须正面这次的监管失误,而不能采取躲躲闪闪、含糊其辞、姑息养奸的态度!
相信很多人都看过《云图》,虽然整个电影很长并且晦涩难懂,但是中心思想却异常明显:知其不可而为之。一件事情只有你去做了,去努力了,才有进步的可能。同样,中国的开源社区需要一个干净的氛围,才能进步发展,如果任由恶意刷票的行为春风得意,损害的是整个开源社区的信誉。今天我的这篇文章可能根本啥都改变不了,但至少我努力过。
我叫FineUI
我是FineUI的作者,FineUI控件库经过5年的发展,目前已经发布100多个版本,有完善的文档、教程、示例,有活跃的社区(目前QQ会员4000多人),有180多位网友参与代码贡献,有500多名捐赠会员(占论坛总用户的10%以上)。而这次参加CSDN举办的《2013年度中国优秀开源项目评选》,也是我第一次的评选活动,因此非常重视。
因此,我发动同事好友给我投票,我在FineUI官方论坛发帖,在FineUI QQ群号召大家给我投票,我还分别于上星期一、星期五、星期天在博客园发表了三篇文章,由于推荐或者评论数比较高连续三天置顶,即使现在仍然留在“10天内推荐排行”里面,在每一篇文章的开头,我都号召大家给当前排名前10唯一的.Net开源项目FineUI投票。我的努力没有白费,我的FineUI项目一直没有出过前10名,即使可能有人在恶意刷票,我最终的排名还在第5名。
有人说我是为了名次,这是完全没有道理的,我的FineUI始终都在前20名,而我也清晰的知道最终前10名是由CSDN专家评的,并且送审时前20名应该是不区分名次的,因此我在投票中排第3还是第20对最终结果没有任何影响,甚至有可能经过这件事,FineUI就更没资格了。
有人说FineUI是不是也恶意刷票,我可以明确的告诉大家:没有。FineUI从头到尾没有恶意刷票,我的票数都是同事好友和社区拉票来的,也欢迎CSDN查证。但是肯定存在一个网友给我多次投票的情况,这是谁都不能避免的。
那你FineUI为了什么?
为的就是程序员遇到不公平待遇时揭竿而起的勇气,《好汉歌》大家都会唱“路见不平一声吼”,那么到关键时刻也不能做缩头乌龟。
社区拉票与恶意刷票
请在阅读本文是一定要分清社区拉票和恶意刷票的区别:
- 社区拉票:是通过同事朋友,或者社区关系,号召大家为自己投票,最终投票的是人!当然别人有不投票的权利,你的作用只能是单向的。
- 恶意刷票:是指个人或者刷票公司通过机器注册,或者通过网络水军投票,最终投票的是机器或者网络水军!而机器和网络水军没有不投票的权利,因为你付出了金钱,因此这个作用是强制的。
注:鉴于有人对“*党”这个词很反感,就改成了“网络水军”。
发现问题
投票是从6-13开始,6-23号结束。开始我根本没想到会出现恶意刷票的情况,直到6-21号星期五下班时,FineUI仍然排在第三名,超过第四名100多票。当我回家打开电视,兴高采烈的看完湖南台的《天天向上》,居然发现有一个项目超过了我100多票!!!尼玛,有多少人星期五下班后还在坚持不懈的上网,还在坚持不懈的投票,有没有???有的话请在评论中回复,我想大部分人都像我一样在家看电视、出去吃饭、或者看电影啥的。
我的第一反应就是:刷票、恶意刷票!
总体分析
如果我把星期五晚上的数据采集下来,刷票曲线绝对完美,可惜当时没有意识到要这么做,只知道那个项目很稳定的以每半分钟一票的速度增长。
下面,我们来看下排名靠前的几个项目从星期五到最后时刻的票数变化:
项目 | 6-21星期五下午5:30 | 6-22星期六下午5:30 | 最终结果 |
CnPack | 1528 | 1678(150) | 2100(572) |
* | 1523 | 1644(150) | 1948(425) |
FineUI | 1034 | 1256(222) | 1330(296) |
APDPlat | 962 | 1370(408) | 2094(1132) |
UbuntuKylin | 780 | 1292(512) | 2134(1354) |
ThinkPHP | 806 | 874(68) | 971(165) |
zTree | 739 | 793(54) | 860(121) |
JEECG | 623 | 705(82) | 887(264) |
禅道 | 615 | 702(87) | 777(162) |
DWZ | 576 | 727(151) | 930(354) |
注:
- 括号内为增加的票数。
- 6-21号的数据来自CSDN网站。
请大家一定不要误解,并不是票数增加多的就是刷票,不是这样的,我也不希望看这篇文章的网友下这样的结论。我们看到的只是一个表面现象,我们也只能根据这个表面现象来进行分析,最终的解释权还在CSDN。
这是星期六和星期天
请注意,这里的增加量是星期六和星期天两天的数据,从投票时间上说只占据了投票总时间的 2 / 11 = 18%。
按照正常的理解:1. 最后两天票数增加肯定很多,最后关头嘛; 2. 星期六、星期天上网人数很少,投票数当然就少了。
我没法对第一个理解进行证实,我只能对第二个理解进行稍微的说明,为此我特意在星期天在博客园发表了一篇文章,并在文章开头号召大家为目前排名前10的唯一.Net开源软件FineUI投票,由于评论数较多,在博客园置顶了一天。尽管如此,FineUI在星期天仅仅增加了 74 票,和哪些动辄增加 1000 多票的项目也太不协调了!
无罪假设
我们不能说票数增加的多就是恶意刷票,这绝无道理! 有罪假设是要不得的!
那么,我们就基于欧美流行的无罪假设,假设没有任何人恶意刷票,大家的结果都是真实可信的,来看下每天的票数增长?
项目 | 总票数 | 平均每两天增长数 | 星期六星期天增长数 | 星期六星期天增长率(平均18%) |
CnPack | 2100 | 381 | 572 | 27% |
* | 1948 | 354 | 425 | 22% |
FineUI | 1330 | 242 | 296 | 22% |
APDPlat | 2094 | 381 | 1132 | 54% |
UbuntuKylin | 2134 | 388 | 1354 | 63% |
ThinkPHP | 971 | 177 | 165 | 17% |
zTree | 860 | 156 | 121 | 14% |
JEECG | 887 | 161 | 264 | 29% |
禅道 | 777 | 141 | 162 | 20% |
DWZ | 930 | 169 | 354 | 38% |
如果大家的票数都是真实可信的,那么平均每两天的增长率应该是 18%,最后两天是星期六星期天上网人数少,但考虑是最后两个投票日,所以投票人数会增加也是正常的,不过总不至于会超过 50% 吧,*?
当然,上面分析的都是表面数据,我不能说哪个项目恶意刷票,我也没资格说哪个项目恶意刷票了,具体的分析结果还是要看CSDN。
与CSDN沟通无果
本来,我希望通过向CSDN反映这个情况,CSDN自己解决这个问题就得了,甚至在昨天我还天真的以为CSDN是真的在严查这件事,但是我错了!
2013-6-22 17:47
我通过邮件向CSDN的联系人反映有人恶意刷票的情况,没有回应。
2013-6-23 10::46
我通过邮件向webmaster@csdn.net反映有人恶意刷票的情况,没有回应。
2013-6-24 08:34
我通过CSDN产品客服微博反映有人恶意刷票情况,中午12:22,CSDN老大蒋涛回了三个字“正在查”,我还很友好的把我的24小时统计数据全部发给了CSDN老大蒋涛。
2013-6-24 18:30
CSDN从北京打来电话说是正在查,的确存在同一IP多次投票的情况,但无法确认是社区投票和恶意刷票,但会按照同一IP算一票的结果重新排序。
我请求他们将同一IP算一票的结果,以及去除所有新注册用户投票数据发给邮箱看下,他们欣然答应。
然后,我就满心欢喜地等待,我想CSDN老大都发话了,肯定会解决的(最终证明我还是太幼稚)。
2013-6-25 10:30
等不及的我给CSDN打了个电话,CSDN说无法区分是社区拉票和恶意投票,也不会公布同一IP算一票的排序结果。在我号称要将24小时监控数据公布于众的情况,他们说要请示下老大。
2013-6-25 11:08
我收到CSDN的一条微信,说是正在内部评审,不会公布任何数据!
我彻底愤怒了!我感觉被忽悠了,也感觉到了CSDN根本没有解决问题的诚意,请看相关微博(当时有点激动,说话可能有点不文雅,请各位网友见谅):
程序员的思路
在星期五下午发现可能有人恶意刷票之后,我就一直在想,怎么样才证明一个项目在恶意刷票哪?
如果做一条票数随时间增长的曲线应该是什么样子的呢?
理想的恶意刷票曲线
我们来简单分析下比较笨的恶意刷票行为:
1. 必须有一个明确的起点,这个点前面票数没有增加,这个点后面票数开始增加。
2. 起点后增长曲线如果是直线,则简直一定就是恶意刷票了,因为直线表明有稳定的投票来源,并且票数的增长只和时间有关系,而和任何外部事件(比如通过博客拉票、论坛拉票)没有任何关系,和不同时间点的上网人数多少也没任何关系。
3. 必须有一个明确的结束点,而且这个结束点和大家的作息时间不一致,则简直一定就是恶意刷票了。因为到晚上,上网人数是逐渐减少了,所以票数的增长也应该是逐渐放缓的,而不可能说在某个时间点之后票数增加戛然而止。特别是晚上12点后人数更少,如果晚上12点后,票数的增长幅度还和之前的一样,那简直一定就是恶意刷票了。
综合上面的分析,我画出了一个比较笨的恶意刷票曲线,当然也是最理想的恶意刷票曲线(手绘图,画的不好请见谅):
聪明的恶意刷票曲线
聪明的恶意刷票曲线会模拟实际的投票曲线,会出现多个波段,每个波段都近似为直线,一般会刷刷停停,比如某个项目的投票超过我了,就赶紧刷一段,超过假定的目标后就停一停。
但是模仿再像,也不是真正的社区拉票曲线,这个就需要结合真实数据具体分析了。
写程序员的程序
经过上面的思考之后,我发现只要能写一个小程序,抓取CSDN投票网站 24 小时的投票数据就行了,这就难不倒程序员了,20分钟搞定:
1:
2: static void Main(string[] args)
3: {
4: timer(null, null);
5:
6: System.Timers.Timer aTimer = new System.Timers.Timer();
7: aTimer.Elapsed += new ElapsedEventHandler(timer);
8: aTimer.Interval = 30 * 1000;
9: aTimer.AutoReset = true;
10: aTimer.Start();
11:
12: Console.Read();
13: }
14:
15: private static void timer(object source, System.Timers.ElapsedEventArgs e)
16: {
17: string pageHtml = GetWebPageContent();
18:
19: HtmlDocument doc = new HtmlDocument();
20: doc.OptionFixNestedTags = true;
21: doc.LoadHtml(pageHtml);
22:
23: HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//a[@class='photo']");
24:
25: string datetime = DateTime.Now.ToString("yyy-MM-dd HH:mm:ss");
26:
27: for (int i = 0; i < 40; i++)
28: {
29: HtmlNode node = nodes[i];
30:
31: string title = node.Attributes["title"].Value;
32:
33: string nodeText = node.InnerText.Trim();
34: nodeText = nodeText.Substring(2, nodeText.Length - 3);
35:
36: int piaoshu = Convert.ToInt32(nodeText);
37:
38: Console.WriteLine(piaoshu + "\t" + title);
39:
40: WriteToFile(title, piaoshu, datetime);
41:
42: }
43:
44: Console.WriteLine(datetime + " waiting...");
45: }
46:
47: private static void WriteToFile(string title, int piaoshu, string datetime)
48: {
49: string filePath = Path.Combine(Environment.CurrentDirectory, @"result\" + title + ".txt");
50:
51: using (StreamWriter sw = new StreamWriter(filePath, true, Encoding.UTF8))
52: {
53: sw.WriteLine(datetime + "\t" + piaoshu);
54: }
55: }
56:
57: private static string GetWebPageContent()
58: {
59: WebClient MyWebClient = new WebClient();
60:
61: MyWebClient.Credentials = CredentialCache.DefaultCredentials;
62:
63: Byte[] pageData = MyWebClient.DownloadData("https://code.csdn.net/2013OSSurvey/gitop/codevote/vote_num");
64:
65: string pageHtml = Encoding.UTF8.GetString(pageData);
66:
67: return pageHtml;
68: }
接下来就是等待了,等待是否能够出现我假设的理想恶意刷票曲线?
分析数据
第二天早上八点,我拿到了完整的数据。这个数据我会完全公开,大家可以下载后自己分析,因为我对数据统计不熟悉,所以只能看一些简单的曲线了。有大学专业是数学的,这里的原始数据你千万不要放过,好好运用统计学分析下,说不定有新的发现。
这里我只会把我做的统计曲线原封不动的放在这里,我不能说哪个项目恶意刷票,我也没资格说哪个项目恶意刷票了,具体的分析结果还是要看CSDN。
我不会对上面的结果做任何评价,是非曲直任由网友和CSDN来评说!
到底有没有人在恶意刷票?我不知道,大家也不知道,只有CSDN才能告诉我们真相!
有没有人在恶意刷票?CSDN请告诉我!
本文非常客观地描述了作为一个程序员所能做的事情,但是我不能说哪个项目恶意刷票,我也没资格说哪个项目恶意刷票了,具体的解释权还是要看CSDN。
而CSDN目前的态度却是息事宁人、躲躲闪闪,不敢承认自己的监管失职!不敢将“同一IP算一票”的统计结果发布!更没有诚信在CSDN首页就自己的监管失职向广大网友致歉!
这是一个号称“全球最大中文IT社区”该有的态度吗?
我所能做的就只有这些了,貌似我啥都做不了,我甚至连是否有项目在恶意刷票都不能确认,那还只有求助于CSDN了。
CSDN请告诉我:有没有人在开源项目评选中刷票?
我真的建议CSDN能够做到如下两点:
1. 公布“同一IP算一票”的统计结果(也就是得票数),如果你有更好的统计规则也行;
2. 在CSDN首页就自己的监管失职向广大网友致歉。
注:“同一IP算一票”最初是CSDN告诉我的统计方法,我当然知道一般公司的出口IP只有一个,不过我想这个方法的结论应该还算公道,不过你有更好的统计规则也行。
和100多位开源作者交朋友
这次CSDN举行的《2013年度中国优秀开源项目评选》,网罗了大量优秀的作品,很多作品的作者也是我认识和熟知的。我想绝大部分开源作者对恶意刷票是抵触了,并且也和我一样没有那么去做,因此绝大部分开源作者应该会支持我的这次投诉,我这次不能去北京和大家一起交流,我感到很遗憾,也是莫大的损失,不过没关系,网络是没有地域界限的,如果你想和我交朋友,欢迎关注我的微博:http://weibo.com/fineui/
评论注意事项
1. CSDN这次举行的《2013年度中国优秀开源项目评选》绝对是对国内开源事业的一个促进,这点是毋庸置疑的,因此希望大家不要对CSDN进行无谓的攻击。我们想要是只是CSDN正面自己的监管失误,担负起自己的职责。
2. 请不要说哪个或者哪些项目恶意刷票了,这个我不知道,你也不知道,上面给出的数据只是表面现象,我们只能期待CSDN给出官方答案了。
3. 请不要进行人身攻击。
蒋涛老大的最后回复
蒋涛老大说“目前看到的结果,前20名中有17名都有刷票和拉票的情况,只有3家是比较少的”,我不知道这算不算某种暗示,是不是暗示FineUI也有这种情况,你FineUI就别在闹了。当然这是我的臆想吧了,人家是老大,可能心胸会宽广的多,我似我得想不开事情。
不过蒋涛老大,我一定要让你明白“社区拉票”和“恶意刷票”是完全不同的两件事,请千万千万千万千万千万千万千万千万千万千万千万千万千万千万千万千万千万千万千万千万千万千万不要把刷票和拉票放在一起说好不!!!
我已经不止一次的重复,FineUI所有得票都是靠同事朋友以及社区拉票来的,主要社区拉票来自于FineUI官方论坛和博客园连续三天三篇置顶文章,身正不怕影子斜,FineUI的投票数据也经得起分析,再次我还要郑重承诺:FineUI没有自己恶意刷票!也没有花钱雇刷票公司刷票!
请蒋涛老大公布你们按照新规则统计之后的数据。
24小时监控数据完整版下载
如果你能从中发现新线索,一定不要忘了告诉我。
大家的反馈
- CnPack关于2013CSDN开源项目投票的说明:http://bbs.cnpack.org/viewthread.php?tid=12291
- *作者告知已经删除在CSDN托管的代码:https://code.csdn.net/u010971052/*
- G4Studio微博支持:http://weibo.com/afghan007
- 禅道作者发表文章:写在禅道获得2013年度优秀开源项目之后
- 庄表伟发表微博话题:#开源大家都能玩,但是请别玩坏了!#
后记
6月28日09:43 大会组委会在会上宣布了年度开源项目评选结果,经过网友近三万张公开投票,并经过中国开源软件推进联盟专家委员会的综合评选,Cocos2d-X、UbuntuKylin操作系统、APDPlat、ThinkPHP、DWZ(jUI)、Pomelo、FineUI、zTree、UEditor富文本编辑器、SpringSide、禅道项目管理软件、Node-Webkit当选为2013年度优秀开源项目。
原来号称《中国十大优秀开源项目》的评选评出了12个,并改名为《2013年度优秀开源项目》,唉....
看到禅道的文章,才发觉原来“第八届中国开源世界高峰论坛是由中国开源软件推进联盟主办,CSDN是这一届活动的协办方。”,又发现一直排名第一的*居然没有入选,我似乎有点醒悟了,看来希望CSDN公布最终的投票数据是不可能了。
自从CSDN的Ada李力说出那句骇人的言辞“如果认为是游戏,就抱着玩游戏的态度来参与,就可是又这么在意用劲,给别人贴大字报,loser心态啊。”,自从CSDN的员工说出“认真你就输了”的无耻言论之后,就再也不见CSDN的任何人抛头露面了。
这件事也许很快就会被很多人淡忘,但我想CSDN的老大蒋涛应该不会那么快就忘记,希望你们在下一届评选中认真一点,负责任一点,要记住你们的根本是广大程序员的支持,不要再次寒了程序员的心。
请关注我的微博 FineUI控件库,让更多人参与到这次的#CSDN刷票门#事件来,只有更多人的参与,CSDN才会把我们程序员当回事!!
如果你喜欢这篇文章,支持FineUI揭竿而起的勇气,请点击页面右下角的“推荐”按钮。