OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

Ruby己死?NodeJS能否取代Ruby?


分享到
分类 编程技巧   发布 ourjs  1387937384000
注意 转载须保留原文链接,译文链接,作者译者等信息。  

By jmoses

我最近一直在使用nodejs,我跟我的小伙伴们一直在讨论nodejs是否会最终取代Ruby。我认为评价一门语言的是否流行最重要的指标就是使用这门语言和框架开始新的项目的数量。

我认为一张基于gems的发布项目数量的图表可以很好的解决我的问题。rubygems首页上的就有最新的流行数据显示,但是我对最近的一些数据非常地感兴趣。我认为如果开发者向gems(不同版本)贡献的代码缓慢下降,那么这就表明了这门语言的就不怎么流行了。

 

拿数据说话

 

在简单的搜索之后,我无法找到适合的数据去做成一张图表。不过我抓取了一些网站并发现一些有意思的数据。我使用的是nodejs cheerio库。gem的可执行文件给了我们一张清单,它告诉我们都有谁在跑gem。幸运的是每一个gem的主页都是一个很漂亮的地址(url),比如:Rails的主页是:http://rubygems.org/gems/rails

下面是我抓取用的源代码:

var request = require('request'),
    cheerio = require('cheerio'),
    bytes = require('bytes'),
    sys = require('sys'),
    fs = require('fs'),
    exec = require('child_process').exec;

console.log('program begin: ' + new Date());
fs.openSync('out.csv', 'w');

exec("gem list --remote", { maxBuffer: 20000*1024 }, processGems);

function processGems(error, stdout, stderr){
    var gems = stdout.split("\n");
    console.info('total gems parsed: ' + gems.length);
    gems.forEach(function(gem){
        gem = gem.substring(0, gem.indexOf(' '));
        console.info('crawling gem: ' + gem);
        request({
            uri: 'https://rubygems.org/gems/' + gem,
        }, getContent);
    });
}

function parseSize(size){
    size = size.replace(' ', '');
    size = size.replace(/\)|\(/g, '');
    size = size.toLowerCase();
    try{
        size = bytes(size);
    }
    catch(e){
        console.error('unable to parse :' + size);
    }
    return size;
}

function escape(s){
    if (s.indexOf('"') != -1) {
        s = s.replace(/"/g, '""');
    }
    if (s.match(/"|,/)) {
        s = '"' + s + '"';
    }
    return s;
}

function getContent(error, response, body){
    if (error && response.statusCode != 200) {
        console.error(error);
        console.error(response);
        return;
    }
    console.info(response.request.href + ' complete, status: ' + response.statusCode);

    var $ = cheerio.load(body),
        gem = $('div.title h2 a').text(),
        latest = $('div.versions ol li').last(),
        version = $(latest).children('a').text(),
        date = $(latest).children('small').text(),
        size = $(latest).children('span.size').text(),
        line;
    line = escape(gem) + ',' +
        escape(version) + ',' +
        escape(date) + ',' +
        parseSize(size) + '\n';
    fs.appendFile('out.csv', line);
}

 

整理数据

 

结果文件有2.7Mb,可以在这里下载,这不是可以做成图表的数据源。我希望我的图表y轴显示当天发布程序的数量,x轴显示发布日期。下面的一段nodejs可以整理之前的csv(数据)文件成我想要的格式。

var __ = require('lodash'),
    moment = require('moment'),
    csv = require('csv'),
    fs = require('fs');
    
fs.openSync('releasedate.csv', 'w');

csv()
    .from.path(__dirname+'/gems.csv', { delimiter: ',', escape: '"' })
    .to.array( function(data){
        var csv = '';
        var grouped = __.groupBy(data, function(gem) {
            return gem[2];
        });
        
        var array = []
        for(var gem in grouped) {
            array.push({
                date: escape(gem),
                unixtime: moment(gem, 'MMM D, YYYY').valueOf(),
                released: grouped[gem].length
            });
        }
        arraySorted = __.sortBy(array, 'unixtime');
        arraySorted.forEach(function(gem){
            csv += gem.date + ',' + gem.released + '\n'; 
        });
        fs.appendFile('releasedate.csv', csv);
    } );

function escape(s){
    if (s.indexOf('"') != -1) {
        s = s.replace(/"/g, '""');
    }
    if (s.match(/"|,/)) {
        s = '"' + s + '"';
    }
    return s;
}

 

用R绘制图表

 

非常完美。现在开始绘图了。我刚开始想用Excel,但是我发现我只能在一张图上面创建255个点。这对于65K的数据文件来说是远远不够的,所以我最终使用了R。下面的两行代码解释了我为什么喜欢用R的原因:

data<-read.csv('releasedate.csv')
plot(zoo(data$Released,as.Date(data$Date,"%m/%d/%y")),xlab="Release Date",ylab="Releases",main="RubyGems Release Date Trend")


最终结果是我期望看到的一条曲线:

起我初惊呆了。这结果跟我之前预想的不太一样,这张图表显示越来越多的开发者正在使用gems,我从这张图表上面得到了三个结论:

1.Rubby的meetup组织有一大群虔诚的追随者,并且有很强的领导力。
2.网上有非常多的关于Ruby的学习资源。
3.使用Rails创建网站非常非常容易。

 

原文地址: 点此
社区评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. 一名靠谱的JavaScript程序员应备的素质
  2. PayPal为什么从Java迁移到Node.js,性能提高一倍,文件代码减少44%
  3. 人类只占到互联网流量的40%不到
  4. JS学习:JavaScript的核心
  5. Node初学者入门,一本全面的NodeJS教程
  6. 我为什么想把比特币一把火烧了
  7. 程序员最艰巨的十大任务
  8. 我和共享软件的那些事:我赚到了十万块
  9. 长时间工作意味着什么
  10. 编写更好的jQuery代码的建议
  11. AirJD-简单好用的免费建站工具

 相关阅读 - 编程技巧
  1. 永远不要在Linux执行的10个最危险的命令
  2. 代码审查:写出好的 commit message
  3. 性能测评:Ngix_Lua, Node.JS Python三者性能相当,均比php快近一倍
  4. 技术干货:Nginx 战斗准备 — 优化指南
  5. 高级JavaScript调试—— console.table()
  6. NodeJS on Nginx: 使用nginx反向代理处理静态页面
  7. 优秀工具推荐:超实用的 CSS 库,样板和框架
  8. 写给 Node.js 学徒的 7 个建议
  9. 一些达成共识的JavaScript编码风格约定
  10. 十大关系数据库SQL注入工具一览

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号