为什么开源?curl 作者:让世界变得更美好

cURL原作者Daniel Stenberg分享了为何选择开源cURL及其带来的全球影响。自1998年发布以来,cURL已成为全球使用最广泛的网络传输库,安装量达60亿,覆盖数十亿设备。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

笔者今日在浏览 Stack Overflow 的时候,看到有开发者发表了一个这样的问题 —— What is the incentive for curl to release the library for free?,大意是想知道 curl 作者为什么会选择将其开源并且免费提供。

cURL 是一个利用 URL 语法在命令行下工作的数据传输工具,于1998年首次发布,支持 DICT、FILE、FTP、FTPS、Gopher、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、POP3、POP3S、RTMP、RTSP、SCP、SFTP、SMB、SMBS、SMTP、SMTPS、Telnet 和 TFTP。cURL 的原作者是 Daniel Stenberg (目前是 cURL 的核心开发者),同时也是 IETF HTTPbis 工作组的资深成员。

175029_SMuV_2720166.png

这名开发者表示最近开始在自己的 VC++ 项目中使用 libcurl,并且了解到 curl 和 libcurl 不但开源,而且完全免费。他好奇作者这样做纯粹是为了帮助开发者吗?

没想到 curl 作者本尊 Daniel Stenberg 亲自现身回答,他详细解答了这位开发者的疑问。以下内容编译自 Daniel 在问题下的回答。

Daniel 在 1998 年创建了 curl 项目,他编写了最初的 curl 版本,并创建了 libcurl 库。到目前为止,代码仓库包括的 24000 次 commit 有超过一半是 Daniel 本人提交的,他依然是项目的核心开发者。Daniel 表示已将 curl 视为自己的孩子。

Daniel 在完成 curl 的第一版开发后就将其开源了,和许多开源作者一样,Daniel 表示之所以选择开源 curl,是因为他使用过很多开源软件,并从中获益甚多,而回馈开源世界的最好方式当然就是「开源」,而且他也想跟其他开源作者一样 cool。

因为开源,来自全球各地的成千上万开发者参与进来一起帮助改进 curl,包括项目本身、文档、网站以及其他的周边细节。Daniel 认为,如果当初没有选择开源,curl 和 libcurl 绝对不会有今天的成就。现在的贡献者名单已超过 1900 个名字,并且每年保持新增几百个名字的速度。

正因为开源和不受限制的使用许可,curl 和 libcurl 推出后就被许多产品采用,并被迅速集成到无处不在的操作系统和 Linux 发行版上,最终覆盖的范围超乎想象。

最后也正因为 curl 的这种“无处不在”,它被全球各地的所有人使用 —— 从而成为了一个事实上的标准「传输库」

据统计,curl 在全球拥有大约 60 亿的安装量,它运行在数十亿部移动电话、Windows 10 设备、游戏机和电视机上,毫无疑问 curl 是世界上使用最广泛的网络传输库。而这离不开最初创建它的人选择将它开源。

Daniel 表示不会为 curl 选择一个“合适”的许可证进而向用户收取费用,过去不会,未来也不会这样的计划。

为什么现在仍参与到 curl 的开发中?

Daniel 解释了自己仍继续参与开发 curl 并免费提供给大家使用的原因(Daniel 表示他不能代表其他的 curl 开发成员,每个人都有自己参与到其中的原因,所以下面只是他的个人观点):

  1. 我认为这仍然是一件值得去做的事。我为自己所取得的成就感到骄傲,我也真心想让世界变得更美好,但我觉得 curl 在这方面做得很少。
  2. 还要修复 bug 和增加新功能!
  3. 虽然 curl 是免费的工具,但我的时间不是,我有一份收入不错的工作来保证生活。curl 获得的捐赠足以维持它的发展,并保证它足够自由和中立而不被任何人和机构所控制。
  4. curl 作为我的业余时间项目已有二十年,而投身到 curl 让我认识到了更多的朋友、改变了我的生活,还把我带到了我曾以为不会去的地方。
  5. 如果能重来,我还是会这样做

虽然 curl 已有瞩目的成就,但 Daniel 依旧在不断改进它,修复错误、增加功能等,希望能为开发者提供最优秀的文件传输解决方案。

二十年来,一如既往地坚持一个项目会累吗?Daniel 表示这是当然的,偶尔会感到疲倦,毕竟这不是一项轻松的工作,而且有时候问题会很困难,而外界的声音有时也不是那么友好。但 curl 作为他生命的一部分,经历了困难时刻后,大部分的时光都是很美好的 —— 可以和优秀的人共事,而奖励也不一般:自己编写的这些代码参与到了推动互联网革命发展的进程中。

会有结束的那一天吗?Daniel 表示 curl 永远不会结束,他认为,到目前为止,开发 curl 是他能想象到的最有趣的工作。即使这项工作已经持续了二十年,他仍然这样认为,并计划坚持下去。

<think>好的,我现在要处理用户关于Android 12中RKNN开发配置和使用教程的问题。首先,我需要回顾用户提供的引用内容,看看是否有相关的信息。 用户提供了三个引用。引用1提到了RKNN Model Zoo和RKNN Toolkit2的环境配置,包括安装Miniconda3。引用2是关于系统镜像下载,特别是Ubuntu 22.04版本和导出ONNX模型。引用3讨论了RV1808/1126使用RKNN作为MediaPipe推理后端的步骤,包括配置参数如use_rga、use_mmap和data_type的设置,以及反量化的处理。 用户的问题集中在Android 12上,所以需要将引用中的信息与Android系统关联起来。引用3提到了MediaPipe和RKNN的集成,这可能适用于Android开发,但需要确认是否支持Android 12。此外,RKNN Toolkit2的环境配置可能在不同平台上有所不同,用户可能需要针对Android进行调整。 接下来,我需要考虑Android开发中RKNN的一般步骤,比如环境准备、模型转换、集成到Android应用、配置参数和性能优化。结合引用中的信息,模型转换部分可以参考引用2提到的导出ONNX模型,然后使用RKNN Toolkit转换为RKNN格式。引用3中的配置参数(如use_rga、use_mmap、data_type)可能在Android中同样适用,但需要查阅相关文档确认。 可能还需要指导用户如何将RKNN库集成到Android项目中,比如添加依赖项或NDK配置。此外,性能优化方面,引用3提到的反量化处理可能需要特别注意,尤其是在Android设备上的实现。 最后,确保回答结构清晰,分步骤说明,并引用提供的资料。需要验证引用中的信息是否适用于Android 12,例如系统镜像是否支持,或者是否有特定版本的要求。如果某些步骤在引用中没有明确说明,可能需要提示用户参考官方文档或社区资源。</think>### Android 12 RKNN 开发配置与使用教程 #### 1. **环境准备** - **系统镜像与工具链**: 根据引用[2],建议使用Ubuntu 22.04作为开发环境,并下载Orange Pi 5 Pro等支持RKNN的硬件镜像。对于Android 12开发,需确保RKNN Toolkit2适配Android NDK版本(推荐NDK 21+)[^2]。 - **安装RKNN Toolkit2**: 参考引用[1],通过Miniconda3配置Python环境(建议Python 3.8),并安装RKNN Toolkit2以支持模型转换与推理。命令示例: ```bash pip install rknn_toolkit2 ``` #### 2. **模型转换(ONNX转RKNN)** - **导出ONNX模型**: 使用PyTorch或TensorFlow等框架导出模型为ONNX格式(引用[2])。 - **转换为RKNN格式**: 编写RKNN配置文件(`config.yml`),指定输入尺寸、量化方式等参数。示例代码: ```python from rknn.api import RKNN rknn = RKNN() rknn.config(target_platform='rk3568', mean_values=[[127.5]], std_values=[[127.5]]) rknn.load_onnx(model="model.onnx") rknn.build(do_quantization=True, dataset="dataset.txt") rknn.export_rknn("model.rknn") ``` #### 3. **Android项目集成** - **添加RKNN库依赖**: 将编译好的RKNN动态库(`librknnrt.so`)和模型文件(`model.rknn`)放入Android项目的`jniLibs`目录。 - **JNI接口开发**: 通过JNI调用RKNN的C/C++ API实现推理。关键配置参考引用[3]: ```cpp #include <rknn/rknn_runtime.h> rknn_context ctx; int ret = rknn_init(&ctx, model_path, 0, 0, nullptr); ret = rknn_inputs_set(ctx, input_num, input_attrs); ret = rknn_run(ctx, nullptr); ret = rknn_outputs_get(ctx, output_num, output_attrs, nullptr); ``` #### 4. **关键配置参数** - **use_rga与use_mmap**: 根据引用[3],若Android设备不支持硬件加速(如RGA),需将`use_rga`和`use_mmap`设为`false`。 - **数据量化类型**: `data_type`可选`uint8`或`fp32`。若选`uint8`,需手动实现反量化;若选`fp32`,RKNN会自动处理[^3]。 #### 5. **性能优化** - **多线程推理**: 利用Android的`ThreadPoolExecutor`并行处理输入数据。 - **内存优化**: 启用`use_mmap`(若支持)减少内存拷贝开销,或通过零拷贝技术直接操作物理内存。 #### 6. **调试与验证** - **日志输出**: 启用RKNN的调试模式(`RKNN_LOG_LEVEL=DEBUG`)查看详细运行信息。 - **性能分析**: 使用`rknn.query(RKNN_QUERY_PERF_DETAIL)`获取各层耗时,针对性优化模型结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值