by Conmajia
网站的成长史
每一个大神都是从菜鸟成长起来的。每一个个人网站,也都是从简陋的HTML开始的。
这个过程也许对天才来说很短暂,但多数人还是会经历一些漫长的成长。比如博客园。
这个一开始由 dudu 个人完成的向博客堂致敬的网站,在15年前刚刚诞生的时候,谁也没有想到它能活到今天并成长到现在的规模。甚至阿杜本人在当时也只是以一个爱好者的身份在玩,像个初哥似的诚惶诚恐。
回帖评论,是博客站长和读者最直接的互动方式,也是BKY成长的历史。BKY早期的功能,就是在站长-读者这样的对话当中一步步完善下来的。
然而不管前端还是后台,BKY的代码写得是真的随心所欲,可能这就是爱好者的风格吧。我在研究(吐槽)过程中,抓取了BKY全部400多万条评论。正是这些评论,让我看到了BKY的几乎整个成长史。
读者的故事
技术网站的文章,也许全都是关于技术。文章下的评论,却折射着读者各自的人生。每条评论都有一个永久编号,只要不删除,它就永远不会改变。这可能正代表着评论者那一刻的人生故事,印在了岁月的年轮上,永远不会磨灭。
当然,评论里对骂互喷也是家常便饭。
浩瀚的400多万条评论里,有读者对技术的争辩,也有他们对人生的感慨。这当中,有茫然无助的北漂族,古道热肠的从业者,也有心怀大志的学生仔,奋发图强的后进生,还有为情所困的女学生,捉襟见肘的男老师,养家糊口已经对生活麻木的中年大叔。他们甚至可能是我们身边的任何一个人。
我不知道留下这些评论的人后来如何。也许愿望实现了,也许感情清晰了,也许家庭和睦了,等等。当然,事实也可能向完全相反方向走去。即便他们当初只是随口说说,发发牢骚,转头就不记得了,但是不管如何,至少这也是他们活过的证明之一。
或者某一天,当我再次按下随便看看
按钮时,刷新出来的评论,正是这些素未谋面的陌生人的另一部分故事。
过去的都已经过去
过去的都已经过去,曾经毕竟只是曾经。
——忘了·爱
这些历史,现在早就淹没在无数文章之中,不是我这么闲,根本不会有人想要去翻看十几年前的坟贴。就像互联网拓荒时代那些潮水般涌起,又泡沫般消失芸芸网站,谁又会去纪念呢?
只有幸存者的故事能够成为励志的传说。其他的人,不过是他们功成名就的背景墙。
最后,让我用一条评论来结束这篇文章。
The End. (Box)
评论档案柜
你可以在这里查阅全部评论(截止2019.2.25,大约共418万条),说不定能翻到你看过,甚至是你本人发表的评论。
演示功能直接从BKY服务器读取,你需要登录你的账号以得到查询权限。如果读到的评论中含有恶意代码,页面有小概率会崩溃或者跳转到其他网站。杠精们不用怀疑我有没有真的采集400万,或者心疼BKY的服务器,我完全不在意它会不会挂。
你需要登录账号
评论发表的时间可以根据它的编号*大致*判断,对应的范围大约是:
1000 - 远古(2004);100000 -(2005);4000000 - 现在(2019)
用法:输入一个编号作为起点,再输入要读取的数量,开始。或者你也可以随便看看
。
正在读取 ?,你可以不用管进度,直接开始翻阅。
永久编号 | 评论内容 |
---|
var f1 = function (id) {
if (id < 146) id = 146;
jQuery.ajax({
url: '/mvc/comment/GetCommentBody.aspx',
type: 'post',
data: '{commentId:' + (id) + '}',
dataType: 'text',
success: function (e) {
if (e) jQuery('#dTable').DataTable().row.add([id, e]).draw(false);
},
error: function () {
jQuery('#dTable').DataTable().row.add([id, '(消失的评论)']).draw(false);
}
});
};
var f2 = function () {
var c = 0;
var strt = Math.abs(numeral(jQuery('#nStart').val()).value());
jQuery('#nStart').val(strt);
var cnt = Math.abs(numeral(jQuery('#nCount').val()).value());
jQuery('#nCount').val(cnt);
var tid = 'id' + strt + '-' + cnt;
set('tid', tid);
jQuery('#nStart').attr('disabled', true);
jQuery('#nCount').attr('disabled', true);
jQuery('#bStart').addClass('disabled');
jQuery('#bStart').attr('disabled', true);
jQuery('#bRandom').addClass('disabled');
jQuery('#bRandom').attr('disabled', true);
jQuery('#bStop').removeClass('disabled');
jQuery('#bStop').attr('disabled', false);
get('fnClear')();
jQuery('#loading').removeClass('hidden');
jQuery.doTimeout(tid, 100, function () {
get('fnGet')(strt + c);
jQuery('#ld-percent').text(numeral(c / cnt).format('0.0%'));
c++;
if (c != cnt) return true;
else get('fnStop')();
});
};
var f3 = function () {
jQuery.doTimeout(get('tid'));
jQuery('#nStart').attr('disabled', false);
jQuery('#nCount').attr('disabled', false);
jQuery('#bStart').removeClass('disabled');
jQuery('#bStart').attr('disabled', false);
jQuery('#bRandom').removeClass('disabled');
jQuery('#bRandom').attr('disabled', false);
jQuery('#bStop').addClass('disabled');
jQuery('#bStop').attr('disabled', true);
jQuery('#loading').addClass('hidden');
};
var f4 = function () {
jQuery('#dTable').DataTable().clear().draw();
};
var f5 = function () {
var strt = Math.floor(Math.random() * 4186614) + 1;
jQuery('#nStart').val(strt);
var cnt = Math.floor(Math.random() * 300) + 1;
jQuery('#nCount').val(cnt);
get('fnRetrieve')();
};
set('fnGet', f1);
set('fnRetrieve', f2);
set('fnStop', f3);
set('fnClear', f4);
set('fnRandom', f5);
if(isLogined) {
jQuery('#need-authentication').hide();
jQuery('#authenticated').removeClass('hidden');
}
jQuery('#dTable').DataTable({
scrollY: 480,
scrollCollapse: true,
"deferRender": true,
"lengthMenu": [
[10, 25, 50, 100, -1],
[10, 25, 50, 100, "全部(小心你的浏览器)"]
],
language: {
"sProcessing": "整理中...",
"sLengthMenu": "每页显示:\_MENU\_",
"sZeroRecords": "没有找到内容",
"sInfo": "上面是第 \_START\_ 至 \_END\_ 条,一共找到 \_TOTAL\_ 条",
"sInfoEmpty": "什么都没有",
"sInfoFiltered": "(由 \_MAX\_ 条过滤)",
"sSearch": "文字过滤器:",
"sEmptyTable": "什么都没有",
"sLoadingRecords": "整理中...",
"oPaginate": {
"sFirst": "第一页",
"sPrevious": "◄",
"sNext": "►",
"sLast": "最后一页"
},
"oAria": {
"sSortAscending": ": 升序",
"sSortDescending": ": 降序"
}
}
});
jQuery('#bStart').click();
jQuery('#nStart').val(200);
jQuery('#nCount').val(100);