精华内容
下载资源
问答
  • 开源代码使用指南

    2018-05-14 14:50:46
    开源代码使用指南  开源代码(Open Source):是促进软件发展的一种协作方式。与商用软件不同,它公开源代码, 允许用户直接拿来学习、开发。使用Open Source的应用受到Open Source的许可证限制,如有些 Open ...
  • Scratch开源代码

    2016-05-07 18:26:11
    Scratch是MIT开发的完全免费的针对儿童学习编程而设计的开源软件。 这个软件的特点是: 使用者可以不认识英文单词,也可以不会使用键盘。构成程序的命令和参数通过...本资源是Sratch2.0开源代码。供研究人员开发参考。
  • 3维Gis开源代码,与任何公司都没有关系,只是3D开源代码
  • 扫地机器人 扫地机器人项目开源代码
  • 远程桌面开源代码

    2018-03-01 02:18:46
    远程桌面开源代码, 远程桌面开源代码, 远程桌面开源代码,重要的事情说三遍,完整project
  • 物联网协议开源代码

    2019-01-14 10:08:30
    物联网协议开源代码
  • jdk1.8 javajdk1.8jdk1.8 javajdk1.8jdk1.8 javajdk1.8jdk1.8 javajdk1.8jdk1.8 javajdk1.8jdk1.8 javajdk1.8jdk1.8 javajdk1.8jdk1.8 javajdk1.8jdk1.8 javajdk1.8jdk1.8 javajdk1.8jdk1.8 javajdk1.8jdk1.8 java...
  • 有限元开源代码ADINA

    2018-05-18 10:09:32
    有限元开源代码ADINA, 虽然是神级软件开源代码,但是版本较早。
  • datav的开源代码,内含有datav架包 datav的开源代码,内含有datav架包 datav的开源代码,内含有datav架包
  • 这是工业通信modbus的免费开源代码,主要用于工业通信协议开发人员,参考学习之用。代码比较全,支持linux和arm处理器。
  • 有限元开源代码FreeFEM++,个人感觉是基于OOFEM开发的开源代码
  • 小程序商城开源代码 wechat_shop-master.zip
  • 多体动力学开源代码chrono-develop, 多体动力学开源代码不多,值得学习。
  • OBD开源代码资料

    2016-03-03 11:46:01
    该资源不仅包括了对OBD的开发、应用以及检测功能,而且还包含了最基本的代码资源,以便一些程序员可以自己安装程序,并且对OBD的应用与修改也起到很好的参考作用。
  • 室内地图开源代码

    2014-08-14 15:04:16
    室内地图开源代码,支持安卓和javascript。目前最流行的室内地图开发平台
  • 蓝牙4.0 BLE 协议栈 开源代码,你懂的。
  • 视频会议开源代码

    2014-12-11 15:02:35
    可参考视频会议开源代码,这个代码是我见过最好的,也是在csdn里花10积分下载的,特次再10分奉送给大家,希望大家把这个视频会议开源代码发扬光大
  • 常见开源代码扫描检测技术分析

    千次阅读 2021-02-25 14:43:04
    使用开源代码的好处很多,但也会带来风险,为了更好的使用开源软件,发挥开源软件的价值的同时又避免其带来的风险,就要对使用的开源软件进行管理。而开源软件管理的基础是开源软件的检测。 本文主要对比分析了两种...
    **本文内容基于作者个人对相关技术的理解,难免有偏颇遗漏之处,敬请各位指正。本问中的观点仅代表作者本人!**
    

    开源代码检测的目的和方法

    目前,开源代码可以说是无处不在,几乎所有的软件中都有开源代码的身影。在现在的软件编程中,代码引用极为常见,很少有哪个编程人员敢说自己编写的软件中的每一行代码都是自己写的,基本所有的软件都会或多或少的引用外部代码,这些外部代码中大部分都是开源代码(OSS)。
    使用开源代码的好处很多,但也会带来风险,为了更好的使用开源软件,发挥开源软件的价值的同时又避免其带来的风险,就要对使用的开源软件进行一定的管理,而开源软件管理的基础就是要弄清楚你使用了哪些开源软件,而要弄清楚软件中究竟用了哪些开源代码,通常是件很难的事情。为了发现软件中存在的开源代码,以及由这些开源代码引入的风险,需要对软件代码进行检测。如果想全面准确的找到软件中的开源代码和风险,用人工的方法是不可能的,一般都会使用检测工具来进行这项工作(因为开源代码的总规模是个天量,没有人能知道所有的开源代码,而且现在的软件产品的代码规模通常也很大,用人工方式去阅读所有代码也是不现实的)。
    要实现有效的开源代码检测,对检测工具的要求至少有以下几个方面:

    1. 全面、准确发现软件中的开源代码
      这是基础的要求,只有全面准确的检测出软件中的开源代码,才谈得上分析其中的风险。要实现这一点,不仅需要全面准确的开源软件数据,还需要好的检测技术和分析算法

    2. 准确、详细的开源代码风险信息
      检测出开源代码的同时,还要能分析和展示这些开源代码的风险信息,这需要开源代码检测工具的拥有全面准确的开源软件数据

    3. 持续跟踪并发现新的风险
      每个开源软件都是在不断变化的,其风险也不是固定不变的,开源代码检测工具还要能够持续的发现新的风险,这其实是对开源检测工具的数据更新能力的要求。

    开源代码扫描检测技术简介

    前面已经说过,开源检测工具的优劣主要和三方面相关,即:开源软件数据的准确性与全面性、分析检测的技术、数据更新能力。在数据的准确性与全面性、以及数据更新能力方面,各款工具都标榜自己的知识库是最全、最大、最领先的,也都说自己的数据更新非常及时等等。因为缺乏详细的数据进行对比,所以本文先搁下这些方面不谈,只讨论一下开源代码的检测分析技术。
    目前存在两种主流的扫描检测技术:代码特征分析比对技术代码依赖关系分析技术。在具体分析这两种技术之前,我们先举个例子:

    比如有一种饮料,我们想知道其中都含有哪些化学成分,我们可以通过解读饮料包装上的成分表去了解,也可以通过对饮料本身做各种化学实验分析去得到。在开源代码检测分析中,代码依赖关系分析技术就类似于成分表解读的方式,而代码特征分析比对技术就类似于化学分析的方式。

    技术一:代码特征分析比对

    代码特征分析比对技术的本质是比对两份代码中是否有相同的部分,该技术时对软件源码中的每一个代码文件进行分析和比对,该技术其实不只用于检测代码中是否有开源代码,也可以用于代码同源检测等领域。其工作的基本原理如下:

    代码文件A 	--(特征提取)-->		特征a
    代码文件B	--(特征提取)-->		特征b
    如果a=b,则A和B的内容一致,即:A=B。
    

    这和我们用MD5值验证下载文件的完整性的方法是类似的,只是检测工具在进行代码特征比对分析时要批量处理文件、批量比对和展示结果。

    另外,不同的工具其特征提取的方法也不相同,有些只提取整个代码文件的特征,这种方式只能分析出

    “A=B 或者 A≠B”
    

    而有些工具不仅提取整个代码文件的特征,还对其中的代码片段提取特征,从而不仅能分析出

    “A=B或者 A≠B”
    

    还能分析出

    “A中的部分内容 = B中的部分内容”,
    也就是“A≠B,但A和B中存在相同的代码片段”。
    

    在开源代码扫描检测中使用代码特征分析比对技术时,如果想获得好的效果,取决于以下几个方面:

    • 代码特征提取技术
      如何提取一个代码文件的特征、提取的粒度如何,会直接觉得比对结果的准确性和精确度。
    • 代码特征比对技术
      对两个代码文件的特征进行比对的方式,会影响到比对结果的全面性、比对的效率、以及后期对结果进行筛选和确认的难易程度和准确程度。
    • 代码特征库的质量
      代码特征库就是用来比对用户代码特征的数据源,数据源的全面性和准确性,决定了比对结果的全面性和准确性。
    • 代码特征提取与比对的效率
      在保证全面和准确的前提下,尽量高的比对效率也是非常重要的。

    技术二:代码依赖关系分析

    代码依赖分析技术是基于分析软件中依赖的外部组件列表来分析软件中使用的开源代码,该技术是针对整个软件进行分析的(或者说是对软件中记录依赖关系的文件的内容进行分析,比如Java 代码中的.pom文件),而不是针对每一个代码文件进行分析,其工作原理如下:

    软件A 
    --> 找出A中的依赖关系列表文件 
    --> 读取依赖关系列表内容(B,C,D) 
    --> 得出软件A中引用的开源软件(B,C,D)
    

    不同的检测工具在实现时也有所差别,有的工具不仅能分析出A 中列出的直接依赖的开源组件,还会对依赖的外部开源组件进行递归分析,得出类似于下面这样的结果:

    软件A,依赖:
    -> 软件B,软件B又依赖:
    	--> 软件E
    	--> 软件F
    -> 软件C,软件C又依赖:
    	--> 软件G
    -> 软件D
    

    代码依赖关系分析技术的效果主要取决于:

    • 对代码中引用外部组件方式的识别能力
      各种语言代码对外部组件的引用方式是不同的,工具要支持对更多种类语言的代码进行识别和分析。
    • 递归分析的能力
      只分析出软件中直接依赖的外部开源组件往往是不够的,需要对这些外部开源组件进行递归依赖分析,最终找出软件中引用的全部外部开源组件。
    • 对代码伪装的甄别能力
      代码依赖关系表是易于伪造的,在有些应用场景下(比如检测机构对送检的软件产品进行评测),如何去伪存真是一个难题。

    两种技术的对比

    上述的这两种技术各有利弊,需要根据您的具体需求和应用环境来选择。这两种技术各自的特点对比如下:

    • 代码特征分析比对技术

      优势:
      1、分析的准确性高
      2、能发现直接引用的开源代码片段
      3、不容易被欺骗
      
      不足:
      1、分析速度相对较慢
      2、经常会比对出多个结果,结果的筛选和确认有一定难度
      
    • 代码依赖关系分析技术

      优势:
      1、分析速度快
      2、分析结果唯一,不用筛选和确认
      
      不足:
      1、无法识别直接引用的代码片段
      2、容易被欺骗
      

    以上对这两种技术的对比分析,是基于这两种技术本身的特点来说的,分析的是这两种技术本身的差异,而非使用这些技术的开源代码扫描检测工具之间的差异。使用不同技术的开源代码检测工具之间,因其在技术水平、开源软件数据库质量等方面存在差异,其检测能力也存在差异,不能简单的说使用某种技术的工具就一定优于使用另一种技术的工具;即使是使用相同技术的两种检测工具之间,其检测能力通常也有不小的差别。

    展开全文
  • 开源代码网站

    万次阅读 2018-01-17 09:29:04
    !!!github!!!codepen!!!码云 ...(1)到sourceforge上查找相关代码;...(4)直接到开源项目网站上面寻找代码; (5)到csdn等网站下载代码,偶尔会有意外的收获; (6)到图书出版社下载图书附录的代码

    !!!github!!!codepen!!!码云



    (1)到sourceforge上查找相关代码;

    (2)到google code上面查找具体的代码;

    (3)到apache网站上寻找java的相关代码;

    (4)直接到开源项目网站上面寻找代码;

    (5)到csdn等网站下载代码,偶尔会有意外的收获;

    (6)到图书出版社下载图书附录的代码;

    (7)直接和软件作者联系,看看能不能获取相关的开源代码。


    (8)到阿里云taocode去找,http://code.taobao.org/project/explore/

    http://code.taobao.org/project/lang/list/C/1/


    (9)已有的c/c++框架及开源代码:http://www.cppblog.com/merlinfang/archive/2014/12/26/209311.aspx

    值得推荐的C/C++框架和库


    (10)C开源项目http://www.oschina.net/project/tag/35?lang=21&os=0&sort=time

    下次造轮子前先看看现有的轮子吧

    值得学习的C语言开源项目

    - 1. Webbench 

    Webbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行。

    下载链接:http://home.tiscali.cz/~cz210552/webbench.html

    - 2. Tinyhttpd

    tinyhttpd是一个超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解一个 Http Server 的本质。

    下载链接:http://sourceforge.net/projects/tinyhttpd/

    - 3. cJSON

    cJSON是C语言中的一个JSON编解码器,非常轻量级,C文件只有500多行,速度也非常理想。

    cJSON也存在几个弱点,虽然功能不是非常强大,但cJSON的小身板和速度是最值得赞赏的。其代码被非常好地维护着,结构也简单易懂,可以作为一个非常好的C语言项目进行学习。

    项目主页:http://sourceforge.net/projects/cjson/

    - 4. CMockery

    cmockery是google发布的用于C单元测试的一个轻量级的框架。它很小巧,对其他开源包没有依赖,对被测试代码侵入性小。cmockery的源代码行数不到3K,你阅读一下will_return和mock的源代码就一目了然了。

    主要特点:

    • 免费且开源,google提供技术支持;
    • 轻量级的框架,使测试更加快速简单;
    • 避免使用复杂的编译器特性,对老版本的编译器来讲,兼容性好;
    • 并不强制要求待测代码必须依赖C99标准,这一特性对许多嵌入式系统的开发很有用

    下载链接:http://code.google.com/p/cmockery/downloads/list

    - 5. Libev

    libev是一个开源的事件驱动库,基于epoll,kqueue等OS提供的基础设施。其以高效出名,它可以将IO事件,定时器,和信号统一起来,统一放在事件处理这一套框架下处理。基于Reactor模式,效率较高,并且代码精简(4.15版本8000多行),是学习事件驱动编程的很好的资源。

    下载链接:http://software.schmorp.de/pkg/libev.html

    - 6. Memcached

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态数据库驱动网站的速度。Memcached 基于一个存储键/值对的 hashmap。Memcached-1.4.7的代码量还是可以接受的,只有10K行左右。

    下载地址:http://memcached.org/

    - 7. Lua

    Lua很棒,Lua是巴西人发明的,这些都令我不爽,但是还不至于脸红,最多眼红。

    让我脸红的是Lua的源代码,百分之一百的ANSI C,一点都不掺杂。在任何支持ANSI C编译器的平台上都可以轻松编译通过。我试过,真是一点废话都没有。Lua的代码数量足够小,5.1.4仅仅1.5W行,去掉空白行和注释估计能到1W行。

    下载地址:http://www.lua.org/

    - 8. SQLite

    SQLite是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。 其特点是高度便携、使用方便、结构紧凑、高效、可靠。足够小,大致3万行C代码,250K。

    下载地址:http://www.sqlite.org/ 。

    - 9. UNIX v6

    UNIX V6 的内核源代码包括设备驱动程序在内 约有1 万行,这个数量的源代码,初学者是能够充分理解的。有一种说法是一个人所能理解的代码量上限为1 万行,UNIX V6的内核源代码从数量上看正好在这个范围之内。看到这里,大家是不是也有“如果只有1万行的话没准儿我也能学会”的想法呢?

    另一方面,最近的操作系统,例如Linux 最新版的内核源代码据说超过了1000 万行。就算不是初学者,想完全理解全部代码基本上也是不可能的。

    下载地址:http://minnie.tuhs.org/cgi-bin/utree.pl?file=V6

    - 10. NETBSD

    NetBSD是一个免费的,具有高度移植性的 UNIX-like 操作系统,是现行可移植平台最多的操作系统,可以在许多平台上执行,从 64bit alpha 服务器到手持设备和嵌入式设备。NetBSD计划的口号是:”Of course it runs NetBSD”。它设计简洁,代码规范,拥有众多先进特性,使得它在业界和学术界广受好评。由于简洁的设计和先进的特征,使得它在生产和研究方面,都有卓越的表现,而且它也有受使用者支持的完整的源代码。许多程序都可以很容易地通过NetBSD Packages Collection获得。

    下载地址:http://www.netbsd.org/

    C++ 资源大全

    关于 C++ 框架、库和资源的一些汇总列表,内容包括:标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等。

     

    标准库

    C++标准库,包括了STL容器,算法和函数等。

     

    框架

    C++通用框架和库

    • Apache C++ Standard Library:是一系列算法,容器,迭代器和其他基本组件的集合
    • ASL :Adobe源代码库提供了同行的评审和可移植的C++源代码库。
    • Boost :大量通用C++库的集合。
    • BDE :来自于彭博资讯实验室的开发环境。
    • Cinder:提供专业品质创造性编码的开源开发社区。
    • Cxxomfort:轻量级的,只包含头文件的库,将C++ 11的一些新特性移植到C++03中。
    • Dlib:使用契约式编程和现代C++科技设计的通用的跨平台的C++库。
    • EASTL :EA-STL公共部分
    • ffead-cpp :企业应用程序开发框架
    • Folly:由Facebook开发和使用的开源C++库
    • JUCE :包罗万象的C++类库,用于开发跨平台软件
    • libPhenom:用于构建高性能和高度可扩展性系统的事件框架。
    • LibSourcey :用于实时的视频流和高性能网络应用程序的C++11 evented IO
    • LibU : C语言写的多平台工具库
    • Loki :C++库的设计,包括常见的设计模式和习语的实现。
    • MiLi :只含头文件的小型C++库
    • openFrameworks :开发C++工具包,用于创意性编码。
    • Qt :跨平台的应用程序和用户界面框架
    • Reason :跨平台的框架,使开发者能够更容易地使用Java,.Net和Python,同时也满足了他们对C++性能和优势的需求。
    • ROOT :具备所有功能的一系列面向对象的框架,能够非常高效地处理和分析大量的数据,为欧洲原子能研究机构所用。
    • STLport:是STL具有代表性的版本
    • STXXL:用于额外的大型数据集的标准模板库。
    • Ultimate++ :C++跨平台快速应用程序开发框架
    • Windows Template Library:用于开发Windows应用程序和UI组件的C++库
    • Yomm11 :C++11的开放multi-methods.

     

    人工智能

    • btsk :游戏行为树启动器工具
    • Evolving Objects:基于模板的,ANSI C++演化计算库,能够帮助你非常快速地编写出自己的随机优化算法。
    • Neu:C++11框架,编程语言集,用于创建人工智能应用程序的多用途软件系统。

     

    异步事件循环

    • Boost.Asio:用于网络和底层I/O编程的跨平台的C++库。
    • libev :功能齐全,高性能的时间循环,轻微地仿效libevent,但是不再像libevent一样有局限性,也修复了它的一些bug。
    • libevent :事件通知库
    • libuv :跨平台异步I/O。

     

    音频

    音频,声音,音乐,数字化音乐库

    • FMOD :易于使用的跨平台的音频引擎和音频内容的游戏创作工具。
    • Maximilian :C++音频和音乐数字信号处理库
    • OpenAL :开源音频库—跨平台的音频API
    • Opus:一个完全开放的,免版税的,高度通用的音频编解码器
    • Speex:免费编解码器,为Opus所废弃
    • Tonic: C++易用和高效的音频合成
    • Vorbis: Ogg Vorbis是一种完全开放的,非专有的,免版税的通用压缩音频格式。

     

    生态学

    生物信息,基因组学和生物技术

    • libsequence:用于表示和分析群体遗传学数据的C++库。
    • SeqAn:专注于生物数据序列分析的算法和数据结构。
    • Vcflib :用于解析和处理VCF文件的C++库
    • Wham:直接把联想测试应用到BAM文件的基因结构变异。

     

    压缩

    压缩和归档库

    • bzip2:一个完全免费,免费专利和高质量的数据压缩
    • doboz:能够快速解压缩的压缩库
    • PhysicsFS:对各种归档提供抽象访问的库,主要用于视频游戏,设计灵感部分来自于Quake3的文件子系统。
    • KArchive:用于创建,读写和操作文件档案(例如zip和 tar)的库,它通过QIODevice的一系列子类,使用gzip格式,提供了透明的压缩和解压缩的数据。
    • LZ4 :非常快速的压缩算法
    • LZHAM :无损压缩数据库,压缩比率跟LZMA接近,但是解压缩速度却要快得多。
    • LZMA :7z格式默认和通用的压缩方法。
    • LZMAT :及其快速的实时无损数据压缩库
    • miniz:单一的C源文件,紧缩/膨胀压缩库,使用zlib兼容API,ZIP归档读写,PNG写方式。
    • Minizip:Zlib最新bug修复,支持PKWARE磁盘跨越,AES加密和IO缓冲。
    • Snappy :快速压缩和解压缩
    • ZLib :非常紧凑的数据流压缩库
    • ZZIPlib:提供ZIP归档的读权限。

     

    并发性

    并发执行和多线程

    • Boost.Compute :用于OpenCL的C++GPU计算库
    • Bolt :针对GPU进行优化的C++模板库
    • C++React :用于C++11的反应性编程库
    • Intel TBB :Intel线程构件块
    • Libclsph:基于OpenCL的GPU加速SPH流体仿真库
    • OpenCL :并行编程的异构系统的开放标准
    • OpenMP:OpenMP API
    • Thrust :类似于C++标准模板库的并行算法库
    • HPX :用于任何规模的并行和分布式应用程序的通用C++运行时系统
    • VexCL :用于OpenCL/CUDA 的C++向量表达式模板库。

     

    容器

    • C++ B-tree :基于B树数据结构,实现命令内存容器的模板库
    • Hashmaps: C++中开放寻址哈希表算法的实现

     

    密码学

    • Bcrypt :一个跨平台的文件加密工具,加密文件可以移植到所有可支持的操作系统和处理器中。
    • BeeCrypt
    • Botan: C++加密库
    • Crypto++:一个有关加密方案的免费的C++库
    • GnuPG: OpenPGP标准的完整实现
    • GnuTLS :实现了SSL,TLS和DTLS协议的安全通信库
    • Libgcrypt
    • libmcrypt
    • LibreSSL:免费的SSL/TLS协议,属于2014 OpenSSL的一个分支
    • LibTomCrypt:一个非常全面的,模块化的,可移植的加密工具
    • libsodium:基于NaCI的加密库,固执己见,容易使用
    • Nettle 底层的加密库
    • OpenSSL : 一个强大的,商用的,功能齐全的,开放源代码的加密库。
    • Tiny AES128 in C :用C实现的一个小巧,可移植的实现了AES128ESB的加密算法

     

    数据库

    数据库,SQL服务器,ODBC驱动程序和工具

    • hiberlite :用于Sqlite3的C++对象关系映射
    • Hiredis: 用于Redis数据库的很简单的C客户端库
    • LevelDB: 快速键值存储库
    • LMDB:符合数据库四大基本元素的嵌入键值存储
    • MySQL++:封装了MySql的C API的C++ 包装器
    • RocksDB:来自Facebook的嵌入键值的快速存储
    • SQLite:一个完全嵌入式的,功能齐全的关系数据库,只有几百KB,可以正确包含到你的项目中。

     

    调试

    调试库, 内存和资源泄露检测,单元测试

    • Boost.Test:Boost测试库
    • Catch:一个很时尚的,C++原生的框架,只包含头文件,用于单元测试,测试驱动开发和行为驱动开发。
    • CppUnit:由JUnit移植过来的C++测试框架
    • CTest:CMake测试驱动程序
    • googletest:谷歌C++测试框架
    • ig-debugheap:用于跟踪内存错误的多平台调试堆
    • libtap:用C语言编写测试
    • MemTrack —用于C++跟踪内存分配
    • microprofile- 跨平台的网络试图分析器
    • minUnit :使用C写的迷你单元测试框架,只使用了两个宏
    • Remotery:用于web视图的单一C文件分析器
    • UnitTest++:轻量级的C++单元测试框架

     

    游戏引擎

    • Cocos2d-x :一个跨平台框架,用于构建2D游戏,互动图书,演示和其他图形应用程序。
    • Grit :社区项目,用于构建一个免费的游戏引擎,实现开放的世界3D游戏。
    • Irrlicht :C++语言编写的开源高性能的实时#D引擎
    • Polycode:C++实现的用于创建游戏的开源框架(与Lua绑定)。

     

    图形用户界面

    • CEGUI : 很灵活的跨平台GUI库
    • FLTK :快速,轻量级的跨平台的C++GUI工具包。
    • GTK+: 用于创建图形用户界面的跨平台工具包
    • gtkmm :用于受欢迎的GUI库GTK+的官方C++接口。
    • imgui:拥有最小依赖关系的立即模式图形用户界面
    • libRocket :libRocket 是一个C++ HTML/CSS 游戏接口中间件
    • MyGUI :快速,灵活,简单的GUI
    • Ncurses:终端用户界面
    • QCustomPlot :没有更多依赖关系的Qt绘图控件
    • Qwt :用户与技术应用的Qt 控件
    • QwtPlot3D :功能丰富的基于Qt/OpenGL的C++编程库,本质上提供了一群3D控件
    • OtterUI :OtterUI 是用于嵌入式系统和互动娱乐软件的用户界面开发解决方案
    • PDCurses 包含源代码和预编译库的公共图形函数库
    • wxWidgets C++库,允许开发人员使用一个代码库可以为widows, Mac OS X,Linux和其他平台创建应用程序

     

    图形

    • bgfx:跨平台的渲染库
    • Cairo:支持多种输出设备的2D图形库
    • Horde3D 一个小型的3D渲染和动画引擎
    • magnum C++11和OpenGL 2D/3D 图形引擎
    • Ogre 3D 用C++编写的一个面向场景,实时,灵活的3D渲染引擎(并非游戏引擎)
    • OpenSceneGraph 具有高性能的开源3D图形工具包
    • Panda3D 用于3D渲染和游戏开发的框架,用Python和C++编写。
    • Skia 用于绘制文字,图形和图像的完整的2D图形库
    • urho3d 跨平台的渲染和游戏引擎。

     

    图像处理

    • Boost.GIL:通用图像库
    • CImg :用于图像处理的小型开源C++工具包
    • CxImage :用于加载,保存,显示和转换的图像处理和转换库,可以处理的图片格式包括 BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K。
    • FreeImage :开源库,支持现在多媒体应用所需的通用图片格式和其他格式。
    • GDCM:Grassroots DICOM 库
    • ITK:跨平台的开源图像分析系统
    • Magick++:ImageMagick程序的C++接口
    • MagickWnd:ImageMagick程序的C++接口
    • OpenCV : 开源计算机视觉类库
    • tesseract-ocr:OCR引擎
    • VIGRA :用于图像分析通用C++计算机视觉库
    • VTK :用于3D计算机图形学,图像处理和可视化的开源免费软件系统。

     

    国际化

    • gettext :GNU `gettext’
    • IBM ICU:提供Unicode 和全球化支持的C、C++ 和Java库
    • libiconv :用于不同字符编码之间的编码转换库

     

    Jason

    • frozen : C/C++的Jason解析生成器
    • Jansson :进行编解码和处理Jason数据的C语言库
    • jbson :C++14中构建和迭代BSON data,和Json 文档的库
    • JeayeSON:非常健全的C++ JSON库,只包含头文件
    • JSON++ : C++ JSON 解析器
    • json-parser:用可移植的ANSI C编写的JSON解析器,占用内存非常少
    • json11 :一个迷你的C++11 JSON库
    • jute :非常简单的C++ JSON解析器
    • ibjson:C语言中的JSON解析和打印库,很容易和任何模型集成。
    • libjson:轻量级的JSON库
    • PicoJSON:C++中JSON解析序列化,只包含头文件
    • qt-json :用于JSON数据和 QVariant层次间的相互解析的简单类
    • QJson:将JSON数据映射到QVariant对象的基于Qt的库
    • RapidJSON: 用于C++的快速JSON 解析生成器,包含SAX和DOM两种风格的API
    • YAJL :C语言中快速流JSON解析库

     

    日志

    • Boost.Log :设计非常模块化,并且具有扩展性
    • easyloggingpp:C++日志库,只包含单一的头文件。
    • Log4cpp :一系列C++类库,灵活添加日志到文件,系统日志,IDSA和其他地方。
    • templog:轻量级C++库,可以添加日志到你的C++应用程序中

     

    机器学习

    • Caffe :快速的神经网络框架
    • CCV :以C语言为核心的现代计算机视觉库
    • mlpack :可扩展的C++机器学习库
    • OpenCV:开源计算机视觉库
    • Recommender:使用协同过滤进行产品推荐/建议的C语言库。
    • SHOGUN:Shogun 机器学习工具
    • sofia-ml :用于机器学习的快速增量算法套件

     

    数学

    • Armadillo :高质量的C++线性代数库,速度和易用性做到了很好的平衡。语法和MatlAB很相似
    • blaze:高性能的C++数学库,用于密集和稀疏算法。
    • ceres-solver :来自谷歌的C++库,用于建模和解决大型复杂非线性最小平方问题。
    • CGal: 高效,可靠的集合算法集合
    • cml :用于游戏和图形的免费C++数学库
    • Eigen :高级C++模板头文件库,包括线性代数,矩阵,向量操作,数值解决和其他相关的算法。
    • GMTL:数学图形模板库是一组广泛实现基本图形的工具。
    • GMP:用于个高精度计算的C/C++库,处理有符号整数,有理数和浮点数。

     

    多媒体

    • GStreamer :构建媒体处理组件图形的库
    • LIVE555 Streaming Media :使用开放标准协议(RTP/RTCP, RTSP, SIP) 的多媒体流库
    • libVLC :libVLC (VLC SDK)媒体框架
    • QtAv:基于Qt和FFmpeg的多媒体播放框架,能够帮助你轻而易举地编写出一个播放器
    • SDL :简单直控媒体层
    • SFML :快速,简单的多媒体库

     

    网络

    • ACE:C++面向对象网络变成工具包
    • Boost.Asio:用于网络和底层I/O编程的跨平台的C++库
    • Casablanca:C++ REST SDK
    • cpp-netlib:高级网络编程的开源库集合
    • Dyad.c:C语言的异步网络
    • libcurl :多协议文件传输库
    • Mongoose非常轻量级的网络服务器
    • Muduo :用于Linux多线程服务器的C++非阻塞网络库
    • net_skeleton :C/C++的TCP 客户端/服务器库
    • nope.c :基于C语言的超轻型软件平台,用于可扩展的服务器端和网络应用。 对于C编程人员,可以考虑node.js
    • Onion :C语言HTTP服务器库,其设计为轻量级,易使用。
    • POCO:用于构建网络和基于互联网应用程序的C++类库,可以运行在桌面,服务器,移动和嵌入式系统。
    • RakNet:为游戏开发人员提供的跨平台的开源C++网络引擎。
    • Tuf o :用于Qt之上的C++构建的异步Web框架。
    • WebSocket++ :基于C++/Boost Aiso的websocket 客户端/服务器库
    • ZeroMQ :高速,模块化的异步通信库

     

    物理学

    动力学仿真引擎

    • Box2D:2D的游戏物理引擎。
    • Bullet :3D的游戏物理引擎。
    • Chipmunk :快速,轻量级的2D游戏物理库
    • LiquidFun:2D的游戏物理引擎
    • ODE :开放动力学引擎-开源,高性能库,模拟刚体动力学。
    • ofxBox2d:Box2D开源框架包装器。
    • Simbody :高性能C++多体动力学/物理库,模拟关节生物力学和机械系统,像车辆,机器人和人体骨骼。

     

    机器人学

    • MOOS-IvP :一组开源C++模块,提供机器人平台的自主权,尤其是自主的海洋车辆。
    • MRPT:移动机器人编程工具包
    • PCL :点云库是一个独立的,大规模的开放项目,用于2D/3D图像和点云处理。
    • Robotics Library (RL): 一个独立的C++库,包括机器人动力学,运动规划和控制。
    • RobWork:一组C++库的集合,用于机器人系统的仿真和控制。
    • ROS :机器人操作系统,提供了一些库和工具帮助软件开发人员创建机器人应用程序。

     

    科学计算

    • FFTW :用一维或者多维计算DFT的C语言库。
    • GSL:GNU科学库。

     

    脚本

    • ChaiScript :用于C++的易于使用的嵌入式脚本语言。
    • Lua :用于配置文件和基本应用程序脚本的小型快速脚本引擎。
    • luacxx:用于创建Lua绑定的C++ 11 API
    • SWIG :一个可以让你的C++代码链接到JavaScript,Perl,PHP,Python,Tcl和Ruby的包装器/接口生成器
    • V7:嵌入式的JavaScript 引擎。
    • V8 :谷歌的快速JavaScript引擎,可以被嵌入到任何C++应用程序中。

     

    序列化

    • Cap’n Proto :快速数据交换格式和RPC系统。
    • cereal :C++11 序列化库
    • FlatBuffers :内存高效的序列化库
    • MessagePack :C/C++的高效二进制序列化库,例如 JSON
    • protobuf :协议缓冲,谷歌的数据交换格式。
    • protobuf-c :C语言的协议缓冲实现
    • SimpleBinaryEncoding:用于低延迟应用程序的对二进制格式的应用程序信息的编码和解码。
    • Thrift :高效的跨语言IPC/RPC,用于C++,Java,Python,PHP,C#和其它多种语言中,最初由Twitter开发。注:原文有误,应该是 facebook 在2007年开发的,现在是 Apache 在维护

     

    视频

    • libvpx :VP8/VP9编码解码SDK
    • FFmpeg :一个完整的,跨平台的解决方案,用于记录,转换视频和音频流。
    • libde265 :开放的h.265视频编解码器的实现。
    • OpenH264:开源H.364 编解码器。
    • Theora :免费开源的视频压缩格式。

     

    虚拟机

    • CarpVM:C中有趣的VM,让我们一起来看看这个。
    • MicroPython :旨在实现单片机上Python3.x的实现
    • TinyVM:用纯粹的ANSI C编写的小型,快速,轻量级的虚拟机。

     

    Web应用框架

    • Civetweb :提供易于使用,强大的,C/C++嵌入式Web服务器,带有可选的CGI,SSL和Lua支持。
    • CppCMS :免费高性能的Web开发框架(不是 CMS).
    • Crow :一个C++微型web框架(灵感来自于Python Flask)
    • Kore :使用C语言开发的用于web应用程序的超快速和灵活的web服务器/框架。
    • libOnion:轻量级的库,帮助你使用C编程语言创建web服务器。
    • QDjango:使用C++编写的,基于Qt库的web框架,试图效仿Django API,因此得此名。
    • Wt :开发Web应用的C++库。

     

    XML

    XML就是个垃圾,xml的解析很烦人,对于计算机它也是个灾难。这种糟糕的东西完全没有存在的理由了。-Linus Torvalds

    • Expat :用C语言编写的xml解析库
    • Libxml2 :Gnome的xml C解析器和工具包
    • libxml++ :C++的xml解析器
    • PugiXML :用于C++的,支持XPath的轻量级,简单快速的XML解析器。
    • RapidXml :试图创建最快速的XML解析器,同时保持易用性,可移植性和合理的W3C兼容性。
    • TinyXML :简单小型的C++XML解析器,可以很容易地集成到其它项目中。
    • TinyXML2:简单快速的C++CML解析器,可以很容易集成到其它项目中。
    • TinyXML++:TinyXML的一个全新的接口,使用了C++的许多许多优势,模板,异常和更好的异常处理。
    • Xerces-C++ :用可移植的C++的子集编写的XML验证解析器。

     

    多项混杂

    一些有用的库或者工具,但是不适合上面的分类,或者还没有分类。

    • C++ Format :C++的小型,安全和快速格式化库
    • casacore :从aips++ 派生的一系列C++核心库
    • cxx-prettyprint:用于C++容器的打印库
    • DynaPDF :易于使用的PDF生成库
    • gcc-poison :帮助开发人员禁止应用程序中的不安全的C/C++函数的简单的头文件。
    • googlemock:编写和使用C++模拟类的库
    • HTTP Parser :C的http请求/响应解析器
    • libcpuid :用于x86 CPU检测盒特征提取的小型C库
    • libevil :许可证管理器
    • libusb:允许移动访问USB设备的通用USB库
    • PCRE:正则表达式C库,灵感来自于Perl中正则表达式的功能。
    • Remote Call Framework :C++的进程间通信框架。
    • Scintilla :开源的代码编辑控件
    • Serial Communication Library :C++语言编写的跨平台,串口库。
    • SDS:C的简单动态字符串库
    • SLDR :超轻的DNS解析器
    • SLRE: 超轻的正则表达式库
    • Stage :移动机器人模拟器
    • VarTypes:C++/Qt4功能丰富,面向对象的管理变量的框架。
    • ZBar:‘条形码扫描器’库,可以扫描照片,图片和视频流中的条形码,并返回结果。
    • CppVerbalExpressions :易于使用的C++正则表达式
    • QtVerbalExpressions:基于C++ VerbalExpressions 库的Qt库
    • PHP-CPP:使用C++来构建PHP扩展的库
    • Better String :C的另一个字符串库,功能更丰富,但是没有缓冲溢出问题,还包含了一个C++包装器。

     

    软件

    用于创建开发环境的软件

    编译器

    C/C++编译器列表

    • Clang :由苹果公司开发的
    • GCC:GNU编译器集合
    • Intel C++ Compiler :由英特尔公司开发
    • LLVM :模块化和可重用编译器和工具链技术的集合
    • Microsoft Visual C++ :MSVC,由微软公司开发
    • Open WatCom :Watcom,C,C++和Fortran交叉编译器和工具
    • TCC :轻量级的C语言编译器

     

    在线编译器

    在线C/C++编译器列表

    • codepad :在线编译器/解释器,一个简单的协作工具
    • CodeTwist:一个简单的在线编译器/解释器,你可以粘贴的C,C++或者Java代码,在线执行并查看结果
    • coliru :在线编译器/shell, 支持各种C++编译器
    • Compiler Explorer:交互式编译器,可以进行汇编输出
    • CompileOnline:Linux上在线编译和执行C++程序
    • Ideone :一个在线编译器和调试工具,允许你在线编译源代码并执行,支持60多种编程语言。

     

    调试器

    C/C++调试器列表

     

    集成开发环境(IDE)

    C/C++集成开发环境列表

    • AppCode :构建与JetBrains’ IntelliJ IDEA 平台上的用于Objective-C,C,C++,Java和Java开发的集成开发环境
    • CLion:来自JetBrains的跨平台的C/C++的集成开发环境
    • Code::Blocks :免费C,C++和Fortran的集成开发环境
    • CodeLite :另一个跨平台的免费的C/C++集成开发环境
    • Dev-C++:可移植的C/C++/C++11集成开发环境
    • Eclipse CDT:基于Eclipse平台的功能齐全的C和C++集成开发环境
    • Geany :轻量级的快速,跨平台的集成开发环境。
    • IBM VisualAge :来自IBM的家庭计算机集成开发环境。
    • Irony-mode:由libclang驱动的用于Emacs的C/C++微模式
    • KDevelop:免费开源集成开发环境
    • Microsoft Visual Studio :来自微软的集成开发环境
    • NetBeans :主要用于Java开发的的集成开发环境,也支持其他语言,尤其是PHP,C/C++和HTML5。
    • Qt Creator:跨平台的C++,Javascript和QML集成开发环境,也是Qt SDK的一部分。
    • rtags:C/C++的客户端服务器索引,用于 跟基于clang的emacs的集成
    • Xcode :由苹果公司开发
    • YouCompleteMe:一个用于Vim的根据你敲的代码快速模糊搜索并进行代码补全的引擎。

     

    构建系统

    • Bear :用于为clang工具生成编译数据库的工具
    • Biicode:基于文件的简单依赖管理器。
    • CMake :跨平台的免费开源软件用于管理软件使用独立编译的方法进行构建的过程。
    • CPM:基于CMake和Git的C++包管理器
    • FASTBuild:高性能,开源的构建系统,支持高度可扩展性的编译,缓冲和网络分布。
    • Ninja :专注于速度的小型构建系统
    • Scons :使用Python scipt 配置的软件构建工具
    • tundra :高性能的代码构建系统,甚至对于非常大型的软件项目,也能提供最好的增量构建次数。
    • tup:基于文件的构建系统,用于后台监控变化的文件。

     

    静态代码分析

    提高质量,减少瑕疵的代码分析工具列表

    感谢平凡之路和fffaraz 的整理,转载请注明出处。

    转自http://blog.csdn.net/benpaobagzb/article/details/50768512


    开源项目
    展开全文
  • 这几天,红警1的开源代码重现江湖,这个20年前,甚至25年前的代码,被我们所有的后来者所惊叹,这才是一个艺术品一般的存在。那么如果我们也想写出如此优美的代码,应该注意的事项有哪些?本文将讲述3个编码时需要...

    1.前言

    这几天,红警1的开源代码重现江湖,这个20年前,甚至25年前的代码,被我们所有的后来者所惊叹,这才是一个艺术品(art)一般的存在。其优秀的代码才是一款RTS游戏能够风靡全球的最根本保障。
    其开源链接为:https://github.com/electronicarts/CnC_Remastered_Collection
    如果你想重温这款童年记忆,那么花费140人民币,你就可以在Steam上体验到这款游戏。

    但是,我们的重点,主要在其代码上,因此不放出其游戏截图了,而是专注代码。下面是我随便点开的一个文件内容。大家可以欣赏一下什么是赏心悦目的代码。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2. 我们惊叹它的什么?

    通过上图,我们能够看到什么?我们惊叹的是它的什么?
    先看看小伙伴们的评价(只摘取了部分评价):
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在我看来,我们惊艳的部分至少包含三点:

    1. 清晰的代码注释
    2. 语义化的编码规范
    3. 小而精的逻辑实现

    2.1 清晰的代码注释

    我们可以看到非常工整的文档头注释(图1),还有详细的方法注释(图2),以及代码的字里行间里的逻辑注释(图3)。这些注释不仅仅是简单的重复代码,更把代码背后的业务逻辑详细的呈现了出来,使得我们不用猜测这个的用途,只读代码就可以知道它应该在哪里使用。最为夸张的是第三张,在具体实现中,注释竟然比代码所占篇幅还要大。

    2.2 语义化的编码规范

    我们可以看到它明显的语义化编码,也就是在逻辑实现部分,尽可能的能够少考虑具体的实现,如if判断条件中,使用一个函数来实现具体的判断,而不是直接把判断细节暴露出来。这有助于我们思维的连续性,从而从更高的层面对于代码有一个整体的把握。

    2.3 小而精的逻辑实现

    一般的,尽可能的要让一个函数的实现少,大概一个屏幕可以放得下即可,真正做到一个函数只做1件事,这样既可以避免逻辑混乱,而且也易于维护。对于其中的复杂的逻辑的细节实现,完全可以放到另一个函数中,从而避免一个函数包含了若干个层次的逻辑。

    3. 依葫芦画瓢

    那么在我们感叹之余,我们能不能做些什么向大佬看齐?在我的Blink发出以后,收到了上百个点赞评论,一致认为都想像20多年前的前辈一样优雅的编程。那么,我们就从最简单的、最明显改观的代码注释开始。

    在Python中,代码注释其实就两种,单行代码注释(#)和多行代码注释("""""")。但是我们需要用到的地方则有4个部分:文档级、类级、方法级和行级别。下面我们分别讲解一下这些部分的组成。

    3.1 添加文档级注释

    我们可以看到红警文件开头的那个非常醒目的注释,它展示了整个文件的简要信息,如属于什么项目,谁在什么时候创建的,什么时候更新的,而且以一种非常规范的格式呈现在我们面前。我们能不能拥有这样酷炫的文档开头呢?答案是Yes!
    首先看一下我复现的效果:
    在这里插入图片描述
    尽管看起来可能没有红警原版霸气,但是只要学会了这个技术,我们都可以创建属于自己的风格的文件头。我们只需要利用pycharm中的文件模板设置即可。它总共分为3个步骤:
    首先,点击File->Settings进入设置界面,选择Editor下的File and Code Templates选项。
    在这里插入图片描述
    然后,点击Python Script(你也可以为其他类型文件设置文件头),就可以看到最右侧显式的文件模板了。
    最后,只需要将我们喜欢的文件头复制粘贴进去即可,点击OK即可。

    下面是我仿照红警风格自己设计的文件头,大家可以随意取用(CV一下):

    #!/usr/bin/env python
    # encoding: utf-8
    '''
    #-------------------------------------------------------------------#
    #                   CONFIDENTIAL --- CUSTOM STUDIOS                 #     
    #-------------------------------------------------------------------#
    #                                                                   #
    #                   @Project Name : ${PROJECT_NAME}                 #
    #                                                                   #
    #                   @File Name    : ${NAME}.py                      #
    #                                                                   #
    #                   @Programmer   : Adam                            #
    #                                                                   #  
    #                   @Start Date   : ${DATE} ${TIME}                 #
    #                                                                   #
    #                   @Last Update  : ${DATE} ${TIME}                 #
    #                                                                   #
    #-------------------------------------------------------------------#
    # Classes:                                                          #
    #                                                                   #
    #-------------------------------------------------------------------#
    '''
    

    当然,更多其他的这种内置变量或者自定义变量的使用方法可以参见《详解pycharm新建文件时头部的模板》。

    3.2 添加类级注释

    当添加完文件注释以后,我们就需要添加更加细致的注释,首先来看对于类的注释。下面的例子给出了类注释的两个部分,一个部分是直接处于类下的简要介绍,另一个则是在__init__下的注释。两个部分都是使用"""进行标记的。图上风格为pycharm自带的编码风格,也有google和Numpy风格的注释,详情可以看《python常见的三种注释风格

    class CustomFile:
        """
        This is the main class, the file contains all documents.
        One document contains paragraphs that have several sentences.
        It loads the original file and converts the original file to new content.
        Then the new content will be saved by this class.
        """
        def __init__(self,src_file_name:str):
            """
            Initial the custom file by src file.
            :param src_file_name: string, the original filename.
            :return: None
            """
            file = open(src_file_name, encoding='utf-8').read()
            file="<File>"+file+"</File>"    # Special operation to avoid there is no root. node in original file.
            self.soup = BeautifulSoup(file, 'xml')
            self.document_list=[]
            self._set_documents()
    

    3.3 添加方法级注释

    更加细致的注释是在方法级的注释,如下面代码所示,它注释在方法上,一个好处是可以直接指导这个函数的功能,另一个好处就是当你在查看方法时,不需要点击方法里面查看源代码,也知道它的用途、参数和返回值,这个操作我们下面会介绍。

    def to_string(self):
            """
            Convert the document into string.
            :return: string, example: para\n\npara\n\npara
            """
            paragraph_string_list=[]
            for paragraph in self.paragraph_list:
                paragraph_string_list.append(paragraph.to_string())
            result="\n\n".join(paragraph_string_list)
            return result
    

    3.4 添加行级注释

    最细致的是行级注释,只注释在每一个行上,例如刚才出现过的例子。它可以用来解释一些不是很容易知道操作的目的的代码。

    file="<File>"+file+"</File>"    # Special operation to avoid there is no root.
    

    3.5 其他小技巧

    经过以上4级的注释,我们让代码更加的丰满了,从而能够达到红警里注释的效果。但是我们这东西可不是绣花枕,中看不中用,它是可以实实在在帮助我们提高编程效率的。下面我们介绍一些小技巧来帮助我们更好的利用我们/其他人的注释。

    3.5.1 查看方法注释

    当我们费了千辛万苦注释完毕后,该怎么查看呢?一个方法就是将鼠标放置在我们想要查看的方法上,按住ctrl,就可以查看到其注释了。
    在这里插入图片描述
    另一个方法则是ctrl+Q,它用来查看说明文档呈现的注释,两者的不同大家可以通过下面的图和上面的图对比可得。
    在这里插入图片描述

    3.5.2 生成说明文档

    就像刚才讲的,这些都是在代码里查看的,如果我们想生成一个工业级的软件说明文档该如何呢?这么多注释不能白写了呀。这时候我们就可以使用Sphinx来帮助我们实现自动化的说明文档生成,详情可以看《Sphinx入门——快速生成Python文档》。

    3.5.3 打包项目所需依赖包

    当我们代码也准备好了,说明文档也准备好了,距离交付别人就只差一个依赖包了。我们的项目可能会依赖很多第三方的包,如果不给别人一个依赖清单,那么别人也没有办法非常容易的复现你的程序,因为总会报各种各样的错误。这时候,我们又需要另一个神器了pipreqs
    首先使用命令行执行pip install pipreqs
    然后进入项目的文件夹里,执行下面的命令:

    pipreqs ./  # 报错就执行下面这条
    pipreqs ./ --encoding=utf-8
    

    这样就会生成一个requirement.txt文件,里面就是我们的依赖包了,等到再复现的时候,只需要执行pip install -r requirement.txt即可重装这些依赖了。

    4 小结

    至此,我们基本上讲述了如何实现教科书级的红警开源代码需要注意的事项,为以后我们更好的编码打下了基础。在将来,我们将会磨砺自己的编程技巧,终有一天做出一流的艺术品,为整个虚拟世界真真正正的贡献自己的一份力量!

    展开全文
  • 企业开源指南:开源代码的使用

    千次阅读 2019-05-29 10:05:37
    开源项目办公室最重要的责任之一,是要在整合开源代码与专有的、第三方的源代码到商业产品中时,确保您的组织符合其法定义务。作者/来源:Todo最大限度优化组织中运行开源计划或...
    640?wx_fmt=jpeg开源项目办公室最重要的责任之一,是要在整合开源代码与专有的、第三方的源代码到商业产品中时,确保您的组织符合其法定义务。 作者/来源:Todo

    最大限度优化组织中运行开源计划或启动开源项目的实践。这些资源由 Linux 基金会与 TODO Group 合作开发,代表了我们的员工、项目和成员的经验。

    ◈ 英文: https://todogroup.org/guides/using-open-source/◈ 中文: https://linuxfoundation.cn/using-open-source-code/◈ GitHub: https://github.com/todogroup/todogroup.github.io/blob/master/content/en/guides/using-open-source.md 

    开源项目办公室最重要的责任之一,是要在整合开源代码与专有的、第三方的源代码到商业产品中时,确保您的组织符合其法定义务。

    您需要制定有关开发人员如何使用开源代码,以及追踪开源代码的来源、授权方式及其最终结果的详细流程指南。本指南让您从一个基准的合规项目开始,来使用、发布和分发开源代码。

    本指南的撰稿人

    ◈ Ibrahim Haddad - 三星美国研究院研发副总裁兼开源小组负责人

    为何追踪并审查代码

    简单来说,如果您的公司没有追踪开发人员如何使用开源代码的方式和地点,那么您将面临不遵守适用开源许可证的风险——无论是在法律费用和修正错误所花费的工程时间两个方面都是一种昂贵的途径。忽视开源法律义务也会影响贵公司在开源社区的声誉。

    开源项目办公室帮助集中制定围绕开源消费、分发和发布来集中制定方针和政策,追踪代码来源及其使用情况,并确保组织不违反其合规义务。

    理想情况下,开源项目包含一个在法律顾问的帮助下开发的完整的合规项目。在本指南中,我们将介绍合规项目的一个重要方面:您关于使用、发布和分发开源代码的方针与流程。

    “一个精心设计的开源合规流程应同时确保遵守开源许可证条款,并帮助企业保护自己的知识产权,以及第三方供应商免受意外披露和/或其他后果的影响。” 

    Ibrahim Haddad – 三星美国研究院研发副总裁兼开源小组负责人

    企业可以通过维护开源合规项目获得几点好处:

    ◈ 获得技术优势——因为兼容的软件组合更易于服务、测试、升级和维护。◈ 识别开源代码部分——将发现在多个产品和组织的某些部分使用了哪些代码,且/或对开源战略是具有高度战略价值和益处。◈ 说明与使用开源组件相关的成本与风险——当代码经过多轮审查时,这将是显而易见的。◈ 建立社区信任——如果发生合规性挑战,这样的项目可以展示一个正在进行的善意行为模式。◈ 为适合收购、销售或者新产品或服务的发布做好准备——这是一种罕见的好处,但在完成此类交易之前,合规性保证是强制性的。◈ 建立供应链可信度——可以提高整个软件供应链的合规性,包括提升原始设备制造商(OEM)和下游供应商的合规性。

    合规角色与责任

    在开源计划中,需要创建一个特定的开源合规团队,该团队的任务是确保开源的合规性。

    这个核心团队,通常被称为审计团队或开源审查委员会Open Source Review Board(OSRB),由来自工程团队和产品团队的代表,一名或多名法律顾问以及合规人员Compliance Officer组成(合规人员通常是开源项目经理)。

    各个部门中的其他人员也为开源合规工作提供源源不断的基础:文件、供应链、企业开发、IT、本地化和监督整个开源战略的开源执行委员会Open Source Executive Committee(OSEC)。但与核心团队不同,这些扩展团队的成员只是根据从开源审查委员会(OSRB)收到的任务,在兼职的基础上开展工作。

    开源审查委员会(OSRB)负责创建开源合规战略和一套决定企业如何在日常基础上实施这些规则的流程。该战略确立了必须采取的措施来保证合规性,并为员工如何与开源软件进行互动提供了一套主要原则。它包括了开源的审批、获取与使用的正式流程,以及发布开源软件或经开源许可证授权的软件。

    使用开源代码的一个简单方针

    使用办法是所有合规项目的重要组成部分。这套规则包含在您的开源战略文件中(您有一份开源战略文件,对吗?),并提供给所有人以便参考。

    使用办法确保任何成为产品基础的(专有的、第三方的或开源的)软件都已经过审核、审查与审批。该办法还确保在产品送达客户之前,贵公司已经制定了一个计划来履行因使用各种软件组件所产生的许可证义务。

    无需制作一份冗长或复杂的文件。一个优秀的开源使用办法包括六个简单规则:

    ◈ 在将开源代码整合到产品中之前,工程师必须获得开源审查委员会(OSRB)的许可。◈ 从第三方接收的软件必须经过审核,以识别其包含的所有开源代码,这样可以确保在产品发货之前许可证的义务得以履行。◈ 所有软件都必须经过审核和审查,包括所有的专有软件组件。◈ 产品必须在客户收货前履行开源许可证义务。◈ 即使开源组件是一样的,对于在一个产品中使用给定的开源组件的许可也不等于其他部署许可。◈ 任何变更的组件都必须经过审批流程。

    代码审查过程的五个阶段

    一旦制定办法,就必须计划并创建一个更易于应用办法中规定的流程。您的工作是帮助开发人员顺利地进行开源应用并为开源项目做贡献。

    “如果您的代码审查过程过于繁琐,您将会放慢创新的进程,或是为开发人员完全规避流程提供好借口。“

    Ibrahim Haddad – 三星美国研究院研发副总裁兼开源小组负责人

    该过程首先扫描有问题的软件包的源代码,然后继续识别并解决所有发现的问题,还进行法律和体系构架的审查,并就相关使用许可做出决定。

    下图展示了一个合规使用过程的简单视图。实际上,这个过程本质上更具有迭代性。请记住,这些阶段仅适用于说明目的,可能需要根据公司自身需求和开源项目配置进行相应的修改。

    640?wx_fmt=jpeg

    让我们来看看这个过程中的每个阶段。

    阶段 1:源代码扫描

    在源代码扫描阶段,所有源代码都被专门的软件工具扫描(除了一些开源替代品之外,还有许多商业供应商提供这种工具)。

    当工程师提交线上使用表单时,此阶段通常会启动。(请参阅下文的示例的使用表单和使用规则)该表单包含了关于有问题的开源组件的所有信息,并指定了源代码在源代码库系统中的位置。

    表单提交后会自动在JIRA或Bugzilla等系统中创建合规工单,并将源代码扫描请求发送给指定的审计人员。定期的全平台扫描也应该每几周进行一次,以确保无开源软件组件被整合到平台上却没有相应的表单。如果发现任何问题,那么JIRA工单将自动发出并分配给审计人员。

    可触发源代码扫描的因素包括:

    ◈ 一份传入的使用表单,通常是由工程人员填写的。◈ 定期安排全平台扫描。这样的扫描对于发现隐藏在软件平台中而无使用表单的开源代码非常有用。◈ 更改先前批准的软件组件。在很多情况下,工程师使用特定版本的 OSS 组件来开始评估和测试工作,并在新版本可用时采用该组件。◈ 源代码是从第三方软件供应商处获得的,该供应商可能会也可能不会披露开源。◈ 源代码是从未知作者和/或许可证的网页上下载的,它可能有也可能没有开源代码。◈ 一个新的专有软件组件进入开发系统,在系统中工程可能有也可能没有借用开源代码并将其用于专有软件组件。

    代码被扫描后,扫描工具会生成一份报告,其中提供以下列信息:

    ◈ 已知在用的软件组件,也被称为软件物料清单(BoM)◈ 有效的许可证、许可证文本和义务概述◈ 须经法律验证的许可证冲突◈ 文件清单◈ 识别的文件◈ 依赖性◈ 代码匹配◈ 待识别文件◈ 源代码匹配待定标识

    关于下载的开源软件包的说明:

    将从网页上下载的开源软件包归档到原始表单中是至关重要的。这些软件包将被应用于之后阶段中(在分发阶段之前),通过计算原始软件包和修改后的软件包之间的差异,来验证并追踪引入源代码中的所有变更。

    如果第三方软件供应商使用了开源软件,则将该代码整合到产品中的产品团队必须提交一个开源使用表单来说明所使用的开源代码。如果第三方软件供应商仅提供二进制代码,而不提供源代码,那么负责管理第三方软件供应商关系的产品团队和/或软件供应商经理必须取得在供应商所提供的软件中没有开源代码的确认(例如,扫描报告)。

    阶段 2 :识别和解决

    在识别和解决阶段,审计团队需检查并解析由扫描工具标记的每个文件或摘录。

    例如,扫描工具的报告可以标记诸如冲突和不兼容许可证等问题。如果没有问题,则合规办公室会将合规票据转移到法律审查阶段。

    如果有问题需要解决,那么合规人员会在合规票据中创建子任务,并将其分配给相应的工程师来解决。在某些情况下,代码返工是必要的;在其他情况下,这可能只是一个澄清事宜。这些子任务应包括问题描述、由工程团队实施的建议解决方案,以及具体的完成时间表。

    一旦所有问题都得到解决,合规人员可以简单地关闭子任务,然后将票据传至法律审查阶段。或者,他们可能会首先下令重新扫描源代码,并生成一份新的扫描报告,以确认之前的问题已不存在。一旦他们确信所有问题都已经得到解决,合规人员会将合规票据转发给法律部门的代表进行审查和批准。

    在准备进行法律审查时,您应该将与开源软件相关的所有许可证信息添加到合规票据中,例如 COPYING(版权文件)、README(自述文件)、LICENSE(许可证文件)等。

    阶段 3:法律审查

    在法律审查期间,法律顾问需要决定出入许可证:

    准入许可证 = 专有许可证 + 许可证 A + 许可证 B + 许可证 C

    准出许可证 = ?

    ◈ 有问题:
    如发现许可证有问题,例如具有不兼容许可证的混合源代码,法律顾问将标记这些问题并重新分配JIRA中的合规工单给工程师以重新编写代码。
    例如,在法律审查中可能会发现,密切关注的知识产权已经与开源代码包相结合。法律顾问将对此进行标记,并将合规票据重新分配给工程师以从开源组件中移除专有源代码。如果工程师坚持将专有源代码保留在开源组件中,开源执行委员会(OSEC)将需要根据开源许可证来发布专有源代码。◈ 不确定是否有问题:
    在某些情况下,如果许可证信息是不清楚或者是无法获得的,法律顾问或工程人员要联系项目维护人员或开发人员,以澄清歧义之处并确认特定的软件组件是由哪个许可证所授权的。

    阶段 4 :结构审查

    在结构审查中,合规人员和来自审计团队的工程代表或开源审查委员会对开源代码、专有代码和第三方代码之间的相互作用进行分析。这是通过测试识别以下内容的架构图(参见以下示例)来实现的:

    ◈ 开源组件(“按原样”使用或修改后使用)◈ 专有组件◈ 来自第三方软件供应商的组件◈ 组件依赖性◈ 通信协议◈ 特定软件组件相互作用或取决其他开源代码包,尤其是当它由不同的开源许可证管理时

    结构审查的结果是对许可证的责任分析,许可证义务范围可能从开源软件组件扩展到专有代码或是第三方软件组件(以及还有跨开源组件)。

    如果合规人员发现任何问题,例如链接到 GPL 许可证组件的专有软件组件,那么他们会将合规工单转发给工程师们以解决相应问题。如果没有问题,合规人员则将审批过程中的票据转移到最后阶段。

    阶段 5 :最终审查

    最终审查通常是审计团队或开源审查委员会(OSRB)的面谈会议,在会议期间,该团队批准或拒绝软件组件的使用。

    该团队根据软件组件完整的合规记录来做决定,该记录包括以下内容:

    ◈ 一份由扫描工具生成的源代码报告。◈ 发现问题清单,关于问题如何解决的答案,以及由谁验证解决了这些问题◈ 架构图和关于软件组件如何与其他软件组件相互作用的信息。◈ 关于合规性的法律意见,以及出入许可证决定。◈ 如果适用于嵌入式环境(C 语言/C++ 语言),则进行动态和静态链接分析。

    在大多数情况下,如果一个软件组件到达最终审查阶段,它将被批准,除非特殊情况出现(例如不再使用该软件组件)。一旦获得批准,合格职员将为被批准的软件组件准备许可证义务清单,并将其交给合适的部门来履行义务。

    这份清单可以包括:

    ◈ 更新软件清单,以此来反映特定的 OSS 软件组件版本 x 已被批准在产品 y 的版本 z 中使用。◈ 向文件团队发出工单,让他们更新产品文件中的最终用户注意事项,以反映产品或服务正在应用开源代码。◈ 在产品发货前触发分发流程。

    640?wx_fmt=jpeg

    Steps accomplished after the OSRB approval

    合规人员监测所有开放工单,并确保在产品发货或服务发起时完成工单。

    有关更详细的使用过程和可能场景,请参阅我们的电子书《企业中的开源合规性》

    在 1.0 版本之后该做什么

    初始合规性,也称基准合规性,在开发伊始时发生,并一直持续到第一版产品的发布。合规团队识别软件基线中包含的所有开源代码,并通过前文概述的五阶段批准流程,驱动所有源组件。

    “关键是要记住,开源合规性不会随着1.0版本的发布而停止。”

    Ibrahim Haddad – 三星美国研究院研发副总裁兼开源小组负责人

    一旦产品发货,您将还需要开发一个增量合规流程来检查源代码。当开发从包含附加功能和/或漏洞修复的新分支开始时,这个流程就开始了。

    增量合规流程是当产品功能被添加到基准版本 1.0 时,合规性被维护所通过的流程。

    640?wx_fmt=jpeg

    增量合规

    与建立基准合规性所需要的努力相反,增量合规性只需要相对相对简单的工作。但仍然可能出现一些挑战。您必须正确识别在版本 1.0 和版本 1.1 之间发生变更的源代码,并且验证版本之间的合规性增量:

    ◈ 已引进新软件组件。◈ 已停用现有软件组件。◈ 现有软件组件可能已升级到较新的版本。◈ 软件组件许可证可能在不同版本间发生了变化。◈ 现有的软件组件可能会有关于漏洞修复的代码变更,或功能和架构的变更。

    一个显而易见的问题是:我们该如何保持追踪这些变化?答案很简单:物料清单Bill Of Material(BOM)差异工具。给定产品 1.1 版本的物料清单和 1.0 版本的物料清单,我们计算增量而后工具的输出结果如下:

    ◈ 在1版本中添加的新软件组件的名称◈ 更新软件组件名称◈ 旧版软件组件名称

    掌握这些信息后,实现增量合规性将成为一项相对容易的任务:

    ◈ 将新的软件组件输入到五阶段的使用审批过程中。◈ 在变更的软件组件中逐行计算源代码差异,并决定您想要再次扫描源代码还是依赖先前的扫描结果。◈ 通过移除不再使用的软件组件来更新软件注册表。

    下面的图表提供了增量合规性流程的概述。每个产品版本的物料清单文件都存储在构建服务器上。物料清单差异工具将两个物料清单文件作为输入,每个文件对应于不同的产品版本,并计算增量来生成如前所述的变更清单。

    此时,合规人员将为该版本中所有新版软件组件创建新的合规工单,更新源代码发生变更的合规工单,并可能通过这一过程重新传送,最后更新软件注册表,从批准清单中删除已退休的软件组件。

    640?wx_fmt=jpeg

    增量合规流程示例

    开源使用请求表单

    完成开源使用请求表单是开发人员将开源软件引入贵公司的重要步骤,应作严肃对待。

    开发人员填写在线表单,请求批准使用既定的开源组件。该表单包含若干将为审计团队或开源审查委员会提供必要信息的问题,以让他们批准或不批准所提议的开源组件的使用。

    下面的表单突出显示了开源使用请求表单中所要求的信息。这些数值通常是从下拉菜单中选择的,以使数据输入更高效。

    管理开源审查委员会的使用表单有几条规则,例如:

    ◈ 该表单仅适用于特定产品和环境的开源使用。这不是对于开源组件适用于所有产品中的所有用例的一般认可。◈ 该表单是审计活动的基础,同时提供审查团队需要验证的信息,团队需要验证实际履行是否与表单中表述的使用计划一致,以及是否与审计和架构审查结果一致。◈ 只要该特定开源组件的使用计划发生变化,就必须更新表单并重新提交。◈ 在工程师们整合开源组件到产品开发之前,审计团队或审查委员会必须批准表单。◈ 开源执行委员会必须批准任何许可证条款要求授予专利许可或专利非纠纷条款的开源软件包的使用。

    开源使用请求表单样表:

    640?wx_fmt=png

    结语

    开源合规性是软件开发过程的重要组成部分。如果您在产品中使用开源软件,没有一个可信赖的合规项目,那么您应该将本指南视为行动的号召。

    从它的核心来说,开源合规性包括一系列控制商业产品中使用的开源的准入与分发行为。合规尽职调查的结果是对产品中所使用的所有开源识别(组件和代码片段),以及满足许可证义务的计划。有关开源合规性的详细指南,请下载我们的免费电子书,由 Ibrahim Haddad 所著的《企业中的开源合规性》

    架构图模板

    架构图用于开源流程的结构审查阶段,演示了示例平台中软件组件相互作用。这是一个示例架构图,展示如下:

    ◈ 模块依赖性◈ 专有组件◈ 开源组件(修改版与原版)◈ 动态与静态链接◈ 内核空间与用户空间◈ 共享头文件◈ 通信协议

    问题软件组件相互作用或依赖的其他开源组件,特别是如果它由不同的开源许可证管理时。

    640?wx_fmt=jpeg

    此架构图模板适用于依赖 C 语言或 C++ 语言的嵌入式环境


    640?wx_fmt=png

    TODO Group

    这些资源是与 TODO(Talk Openly,Develop Openly)组织合作创建的, 该组织是 Linux 基金会中专业的开源网络组织。特别感谢奉献自己的时间和知识来制作这些综合指南的开源项目负责人。参与制作的公司包括 Autodesk、Comcast、Dropbox、Facebook、Google、Intel、Microsoft、Netflix、Oath(Yahoo + AOL)、Red Hat、Salesforce、Samsung 和 VMware。如想了解更多信息,请访问:todogroup.org

    640?wx_fmt=jpeg


    展开全文
  • WPF优秀开源代码合集

    千次下载 热门讨论 2013-01-27 23:14:16
    WPF优秀开源代码合集
  • 怎样看开源代码版权 一天,我在查看OpenStack Ceilometer docs的源文件,并注意到顶部有版权声明。 现在,我绝对不想选择尼古拉斯。 OpenStack文档和代码中有数百种此类版权声明,而这只是我碰巧看到的示例。 (请...
  • IEC61850开源代码libIEC61850说明文档

    热门讨论 2016-09-20 16:54:57
    IEC61850开源代码libIEC61850说明文档
  • 仿三菱PLC开源代码

    热门讨论 2012-07-14 10:07:37
    仿三菱PLC源码,可以用三菱软件直接下载,监控运行,8051芯片
  • 波士顿动力开源代码by Hemakshi Sachdev 通过Hemakshi Sachdev 失去动力两年后,我如何开始开源之旅 (How I started my open source journey after being demotivated for two years) Contributing to open source...
  • STM32仿三菱PLC开源代码

    热门讨论 2014-10-25 15:55:46
    用stc32单片机仿三菱plc的源代码,IAR编译通过。
  • 三维重建开源代码汇总【保持更新】

    千次阅读 多人点赞 2021-05-22 22:43:29
    三维重建开源代码汇总,不定期更新。SFM、MVS、SLAM、Mesh
  • 本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管理”、“进程”、“进程间通信”、“设备驱动”等多个方面进行分析介绍,所有的分析都有ReactOS的源代码(以及...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,121,373
精华内容 448,549
关键字:

开源代码