• 博客园的成长史,全都烙印在从古至今的 400 多万条评论里了


    by Conmajia

    网站的成长史

    每一个大神都是从菜鸟成长起来的。每一个个人网站,也都是从简陋的HTML开始的。

    这个过程也许对天才来说很短暂,但多数人还是会经历一些漫长的成长。比如博客园BKY

    ▲ BKY 现存的第一篇帖子,编号146

    这个一开始由 dudu 个人完成的向博客堂致敬的网站,在15年前刚刚诞生的时候,谁也没有想到它能活到今天并成长到现在的规模。甚至阿杜本人在当时也只是以一个爱好者的身份在玩,像个初哥似的诚惶诚恐。

    ▲ 现在的站长们可能无法体会和读者商量着来的感觉,毕竟可以一键建站了

    回帖评论,是博客站长和读者最直接的互动方式,也是BKY成长的历史。BKY早期的功能,就是在站长-读者这样的对话当中一步步完善下来的。

    然而不管前端还是后台,BKY的代码写得是真的随心所欲,可能这就是爱好者的风格吧。我在研究(吐槽)过程中,抓取了BKY全部400多万条评论。正是这些评论,让我看到了BKY的几乎整个成长史。

    ▲ 只有闲人,才会去浏览过期的言谈

    读者的故事

    技术网站的文章,也许全都是关于技术。文章下的评论,却折射着读者各自的人生。每条评论都有一个永久编号,只要不删除,它就永远不会改变。这可能正代表着评论者那一刻的人生故事,印在了岁月的年轮上,永远不会磨灭。

    当然,评论里对骂互喷也是家常便饭。

    浩瀚的400多万条评论里,有读者对技术的争辩,也有他们对人生的感慨。这当中,有茫然无助的北漂族,古道热肠的从业者,也有心怀大志的学生仔,奋发图强的后进生,还有为情所困的女学生,捉襟见肘的男老师,养家糊口已经对生活麻木的中年大叔。他们甚至可能是我们身边的任何一个人。

    ▲ 也许技术会让人相聚,但生活的道路不止一条

    我不知道留下这些评论的人后来如何。也许愿望实现了,也许感情清晰了,也许家庭和睦了,等等。当然,事实也可能向完全相反方向走去。即便他们当初只是随口说说,发发牢骚,转头就不记得了,但是不管如何,至少这也是他们活过的证明之一。

    或者某一天,当我再次按下随便看看按钮时,刷新出来的评论,正是这些素未谋面的陌生人的另一部分故事。

    过去的都已经过去

    过去的都已经过去,曾经毕竟只是曾经。
    ——忘了·爱

    这些历史,现在早就淹没在无数文章之中,不是我这么闲,根本不会有人想要去翻看十几年前的坟贴。就像互联网拓荒时代那些潮水般涌起,又泡沫般消失芸芸网站,谁又会去纪念呢?

    只有幸存者的故事能够成为励志的传说。其他的人,不过是他们功成名就的背景墙。

    最后,让我用一条评论来结束这篇文章。

    The End. (Box)

    评论档案柜

    你可以在这里查阅全部评论(截止2019.2.25,大约共418万条),说不定能翻到你看过,甚至是你本人发表的评论。

    演示功能直接从BKY服务器读取,你需要登录你的账号以得到查询权限。如果读到的评论中含有恶意代码,页面有小概率会崩溃或者跳转到其他网站。杠精们不用怀疑我有没有真的采集400万,或者心疼BKY的服务器,我完全不在意它会不会挂。


    你需要登录账号

    登录

    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);
  • 相关阅读:
    简单的运动框架——分享给初学者
    Python数据分析学习日志(1. 书单)
    mysql恢复数据参考
    window cmd 杀掉 java.exe 进程
    转载: Ajax关于readyState和status的讨论
    开发问题bug记录
    vue基础part10
    vue基础part9
    vue基础part(7-8)
    vue基础part(4-6)
  • 原文地址:https://www.cnblogs.com/conmajia/p/old-comment-history.html
Copyright © 2020-2023  润新知