1
2022年7月,瑞典程序员丹尼尔·斯坦伯格收到了一封姗姗来迟的邮件, 邮件来自微软,通知他的开源项目cURL获得了微软自由和开源软件(FOSS)基金会的大奖。

FOSS每个月会选取一个项目进行资助,奖金是一万美元,分十个月支付,cURL是今年1月份的赢家。
一万美元的奖金对一个开源项目来说看起来不少,但是如果你了解cURL的话,就知道这和他的地位实在太不相称了。

cURL提供了一个库(liburl)和一个命令行工具,让大家可以轻松地来传输数据。
它支持几乎所有的传输协议,除了最知名的HTTP、HTTPS之外,还支持 FTP, FTPS, Gopher IMAP, Kerberos, LDAP, MQTT, POP3, RTSP, SCP, SMTP, SMB。
可以说,在数据传输领域,只有你想不到,没有它做不到。
正是由于这个特点,它被广泛地安装在这些设备和软件中:
Linux、Windows、iOS、Android、MacOS 等主流操作系统。

Nintendo Switch, Xbox and Sony PS5等游戏机。

Roku、Apple TV 等媒体播放器和机顶盒。

几乎所有现有的物联网设备如智能厨房和医疗设备、打印机、智能手表、智能汽车。

丹尼尔自己估计,curl以及liburl被安装于全球超过100亿台设备中!
100亿台设备,即使每台设备给Daniel 0.01美元的话,他已经是亿万富翁了。
2
丹尼尔从1996年开始开发cURL,当时他就是想从一个网站上自动下载汇率数据,像大家一样,他一开始先在网上找了一个开源的项目叫httpget,用得不亦乐乎。
但和大多数人不同的是,他后来成为了httpget的维护者,开始进一步扩展功能,增加了对Gopher和FTP的支持。
1998年3月,他正式发布了2200行代码的cURL,悲催的是,并没有多少人关注,两年的时间只有区区300次下载。

但是丹尼尔毫不在意,他在业余时间不断地打磨cURL,就是想提供一个良好的、快速的、可靠的传输工具。
这一打磨就是24年,到2021年,丹尼尔已经在上面花费了15000小时,平均每天1.78小时。
cURL发布了197个版本,支持26种传输协议,修复了6787个Bug,代码增长到17万行,也拥有了2300位贡献者。
3
在商业世界中,丹尼尔的curl就像下图的那个努力干活,但是并没有多大回报的挖掘机一样。

他的付出和对世界的贡献并没有获得对应的回报!
大约在2004年,丹尼尔曾经从瑞典的Internet基金会申请资金,“以便获取一些专注于curl的开发时间”,后来又从Adobe那里获得了一些资金来支持SFTP的开发。
除此之外,在opencollective网站上,可以看到curl的赞助商和赞助个人,分为几个等级:

Backer :每月5美元
Supporter :每月10美元
Sliver Sponsor :每月100美元
Gold Sponsor :每月500美元
我粗略计算了一下curl每月的捐赠收入是:
52*5 + 3*25 + 46*100 + 1*500 = 5435 美元
相比curl用户的数量,这点钱完全不匹配。
就像微信公众号篇篇10万+,但是打赏只有几块钱。
当然,丹尼尔自己可能不会这么想,他能24年如一日的维护curl,肯定不仅仅是因为金钱。
他在stackoverflow在回答关于curl动力的问题时说:
当然,二十多年每天都在做这件事,我有时候也会感到厌倦,有时会有障碍,有些事情很难,有些人也很丑陋和烦人.... 但是最大的奖赏时我知道我的代码有助于推动无处不在的互联网革命。
4
丹尼尔的境界非常之高,在对他深表敬意的同时,我们不由想到:
curl这么厉害,这么流行都难以带来相匹配的收入,别的开源项目会怎么样呢?
粗略总结一下,开源软件的发展有这些路径:
1.自己搞了一个小开源软件,star 不少,写到简历中也有光彩
有不少程序员做到了这一步。
2. 开源软件解决了一个重要的、非常细分领域的问题,主要作为库的形式存在
典型的就是curl 、log4j、openSSL, 他们支持着全球互联网的运行,知名度不高,相应收入也不高,出了问题还得背锅。

开发者能坚持下去的纯粹是爱好和成就感:我的软件支撑着全世界的运转,世界离了我不行。
3.开源软件一不小心满足了一个超级大的需求,有着巨大的商机。
于是成立了公司,社区版负责拉流量,商业版/企业版卖钱,顺便做技术支持。
将来可能会被收购,运气好还能上市,从此生活美滋滋。
这似乎是个主流的商业模式,典型的如Nginx、MySQL、Elastic Search、MongoDB、Docker、Redis、IDEA等。
可恨的是有些云厂商会把开源软件拿过来包装一下,当成云服务来卖,逼得开源软件不得不修改协议。
4. 开源软件实在太牛了,以至于各个巨头公司都不得不低头迎合,成立基金会来支持后续发展。
典型代表是Linux。
(完)
点击下方图片,查看更多精彩
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
我打算为ruby脚本创建一个安装程序,但我希望能够确保机器安装了RVM。有没有一种方法可以完全离线安装RVM并且不引人注目(通过不引人注目,就像创建一个可以做所有事情的脚本而不是要求用户向他们的bash_profile或bashrc添加一些东西)我不是要脚本本身,只是一个关于如何走这条路的快速指针(如果可能的话)。我们还研究了这个很有帮助的问题:RVM-isthereawayforsimpleofflineinstall?但有点误导,因为答案只向我们展示了如何离线在RVM中安装ruby。我们需要能够离线安装RVM本身,并查看脚本https://raw.github.com/wayn
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(
我刚刚为fedora安装了emacs。我想用emacs编写ruby。为ruby提供代码提示、代码完成类型功能所需的工具、扩展是什么? 最佳答案 ruby-mode已经包含在Emacs23之后的版本中。不过,它也可以通过ELPA获得。您可能感兴趣的其他一些事情是集成RVM、feature-mode(Cucumber)、rspec-mode、ruby-electric、inf-ruby、rinari(用于Rails)等。这是我当前用于Ruby开发的Emacs配置:https://github.com/citizen428/emacs
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象