开放源代码的精神是否意味着免费?
上次和一个技术领域的大V沟通去帮一个专栏写个推荐,大V对我说:如果是收费课程的话,我就先不写啦,与我一贯推崇的开源有些矛盾
,也有可能这是大V的推辞而已,但这其实已经代表了很大一部分人的观点。那么收费课程和开源精深真的有矛盾吗?开源就意味着是免费吗?
前一段时间,Redis 变更模块开源许可证,不想让云提供商白白获利。许可证的变更意味着自研 Redis 模块 - RediSearch,Redis Graph,ReJSON,ReBloom 和 Redis-ML 将不再是开源软件。Redis Labs 并不是唯一一家做出这样改变的公司。5月,Neo4j 图数据库在其 AGPL 许可证中添加了 Commons Clause。
这是为什么呢?在以往开源组织免费推出开源软件提供给行业内使用,但同时提供商业解决方案来挣钱,比如大名鼎鼎 Pivotal、Elasticsearch、Redis 。现在很多云厂商将这些开源软件做成了他们的产品,出售给使用云服务的客户们,他们给这些客户提供服务,也就相当于云厂商们挣了以前开源软件提供商业解决方案的钱,导致这些开源软件组织很多都快活不下去了。
这样真的合理吗?其实有很多的软件有基金会,比如 linux\Apache 基金会,一些大厂出资加入基金会,给基金会提供人员和资金,促进基金会的发展,这些大厂会得到基金会的技术支持等服务,研发出来的技术推进整个行业的发展,从而到达共赢的目的,这才是一个真正合理的模式,如今云服务厂商的快速发展,让很多开源组织的运行模式受到挑战。
任何事情都是有因果,如果一个人付出了大量的精力,去做了一件帮助N多人的好事,但他却一直没有因此获取到任何收益,那这件事情合理吗?这件事件是否能够真正坚持下去?作者也是需要生活的,这世界上没有无缘无故的爱也没有无缘无故的恨,如果一件事情的付出和收益不能够对等,那么注定这件事情无法长久下去。
就像有的朋友非常厌倦技术公号内会出现广告,我就想这样问一句,你平时看电脑有没有广告?在腾讯、优酷、爱奇艺看视频有没有广告,使用百度、谷歌搜索的时候有没有广告?你每天可以免费的去看很多优质的文章,却不能容忍公号偶尔出现的一篇技术软文,如果技术公号主在运营公号的过程中,没有任何收入,那有什么动力会持续的激励他运营下去?
现在IT界经常出现这么一批人,想免费使用他人开源产品,还要求对开源产品的文档安装、使用编写得特别详细,并且要求作者必须及时回复你的任何问题,如果没有及时回复,就大骂就这种水平还出来开源。对作者没有任何付出,还要高质量免费分享再加无底限服务,这作者是上辈子欠你的吗?这不是开源精神,这是流氓精神。
开源精神是为了降低知识获得的成本,知识的获得总有成本,实践证明,互助共享才是学习的最快法则,只想获得不想付出,那么距离开源精神很远。知识付费丝毫不违逆历史潮流,按现在的社会状态看,还会愈演愈烈。
知识付费
随着罗振宇的跨年演讲的刷屏,一条颇有争议的话在互联网上流行:罗振宇不断在贩卖焦虑,从而引导大家进行知识付费。进而发展到很多人问知识付费是不是骗人的?
那么知识付费是不是骗人的?可能众说纷纭,有的同学通过知识付费学到了很多东西,有的同学购买之后草草看了几眼就没有下文了,然后就喊着知识付费是骗人的。我们暂且放下这些疑问,先了解下什么是知识付费,它是如何发展而来。
知识付费源起
百度百科对知识付费的定义:知识付费的本质,就是把知识变成产品或服务,以实现商业价值。知识付费有利于人们高效筛选信息,付费的同时也激励优质内容的生产。腾讯研究院对“分享经济”的定义:知识分享经济是公众将自己的闲置资源(认知盈余),通过互联网平台与他人分享,从而获得收入的经济现象。
用大白话来讲,知识付费就是由某个领域内比较著名的资深人士,将自己的经验和知识抽取出来,以更加简单易懂的形式分享出去,让人们付费去订阅、学习。
人们普遍认为知识付费起源于2011年至2015年。2011年,豆丁网推出付费阅读产品;2013年,罗缉思维开始招募付费会员;2014年微博开通打赏功能、豆瓣阅读开启付费专栏;2015年微信推出赞赏功能……免费的知识分享(开始)进入到知识分享(付费)经济的萌芽阶段。这一阶段,打赏、赞赏尚属于小规模的、随机的个体行为。
2016年,被称为知识付费元年。在这一年,知乎、果壳(在行分答)、喜马拉雅FM、得到及其他知识付费平台相继出现,知识付费的用户迅速增长,知识付费产品面临井喷。2016年的迅速爆发其实离不开微信赞赏这个大平台对用户的付费教育,
2016年,几乎每个月都有知识付费的产品出现。当年4月,问咖、值乎上线;5月分答、知乎live上线,王思聪在分答上32个问题赚20多万的新闻刷遍了整个互联网;6月,得到app“李翔商业内参”、果壳“职场沙龙”推出;8月,知乎专栏赞赏功能、雪球问答、vipabcV来秀直播、联想“知了问答”上线;9月,虎嗅推出付费会员,提供深度报告等内容……12月,李开复在一次采访中说:知识和经验变现的时代到来了。
上面这些知识付费产品,有些已经暗淡离场,有些停滞不前,还有一些发展越来越好。但凡发展不错的平台都是聚焦了某些领域的意见领袖,利用这些意见领袖和平台的利益相互捆绑,作者可以通过平台获取曝光率和收益,平台利用这些作者的知名度推广平台赚取佣金,从而实现共赢。纵观整个知识付费领域,仍然处在知识付费的初级阶段,未来知识付费应该还有更广大的市场。
随着平台型知识付费公司不断发展,商业模式得到进一步验证之后,慢慢诞生了很多垂直领域的知识付费产品,比如在商业、英语、技术、职场等领域诞生的知识付费产品不断;也促进了服务于知识付费平台的工具类产品迅速崛起,比如新榜、西瓜数据、知识星球、小鹅通等。
技术领域知识付费
不过今天我们主要聊的是纯技术领域的知识付费产品,写博客和做公号的原因,和国内的技术平台多多少少都建立过合作,所以对他们的产品、运营模式了解更多一些。
比如我是 Gitchat 平台的付费会员,也在 Gitchat 平台发起过多场 chat,每次参与人数都超过千人;在极客时间拥有 20 多个付费专栏,同时和极客时间合作过多起活动;在慕课网上录制过免费视频,参加过慕课网讲师的:慕课之夜;技术领域的知识付费还有掘金小册、51CTO专栏、博文视点图书、****学院等等。今天我们在其中拿出几个平台做分析。
Gitchat
纯技术领域的专栏知识付费最早诞生于一个小的创业公司叫:Gitchat,网站上线于2016年的6月,这个公司是由前百度文库阅读和图灵公司的出版负责人谢工创立,创立之初就有 **** 创始人蒋涛和小道消息的冯大辉给予天使投资。最早的形式是 Chat ,由一个技术人发起一个技术讨论的话题,同时设定一个参与的价格,传播开来吸引感兴趣的朋友加入。
早期 GitChat 选择和很多技术大 V 来合作,一方面技术大 V 自带流量,第二他们可以依此作为宣传点来宣传他们的平台。所以早期就会看到他们在各个渠道,寻找有技术影响力的技术人,和很多技术公号、博客建立联系,帮他们变现,帮自己宣传。我就是因为他们工作人员在我的公号留言而了解的这个平台。
每次 Chat 举办者可以分成几百到几千元,后来这个网站创建了另外一个频道叫做达人课,以专题系列的形式来分享某一门课程,相比较 Chat ,达人课的形式周期更长,学习起来更系统一些。Gitchat 算是技术知识付费最早的先行者,但真正掀起技术领域知识付费高潮的却是极客时间。
极客时间
极客时间创建于2017年10月,极客时间由极客邦科技公司创建,公司的总裁是技术大V池建强。极客邦旗下拥有比较有名的就是 InfoQ 网站,常年在国内举办各种技术峰会,因此公司积累了一批活跃的技术资源,这些资源被充分的利用到了极客时间。
极客时间玩法最具互联网化,专栏采用技术大V+暴力营销的模式来疯狂发展。极客时间刚上线就玩起了大V站台的模式,最早在极客时间开课程的大V有:左耳朵耗子、西雅图飞总、美女程序员朱赟等。这些技术圈内最知名的大V给极客时间带来了第一批用户。
但真正的高潮还是来自营销,转折点在《从0开始学架构》以阿里 P9 架构师为宣传背景,同时强调推荐购买课程可以返利24元。在课程上线初期,在技术公号领域全面轰炸了一遍,导致当天朋友圈持续刷屏,几天内课程销量过万,真正算是打响了产品。后面又增加了很多拼团、限时购等营销策略,应该是所有技术在线课程中最会玩营销的一家平台。
掘金和51CTO
掘金也是一个比较新的技术社区网站,创建于2015年8月,掘金最初来自于稀土,是稀土的一个子版块,没想到稀土没有火起来,反而做为技术分享网站的掘金火爆了起来,于是创始人阴明随即调整了方向,大力发展掘金。
2018年初的时候掘金也开通了自己的专栏、掘金小册,刚开始以前端领域的专栏为主,后期也慢慢覆盖了整个技术领域,掘金小册最大的特点是为作者提供了专业的文章管理平台,对专栏作者来讲体验较好,同时掘金小册新课上线时会在技术公号内做营销,一般是通过固定链接购买可以享受半价,这个营销策略很有效和实惠。
最后一个上线的技术付费专栏是51CTO,51CTO 是一个老牌的技术社区, 成立于2005年,目前已成为专注于IT人职业成长平台;拥有1500万注册用户,覆盖了中国主流城市大多数IT从业人群,是国内排名第一的服务IT技术人员的专业性服务平台。
51CTO 网站的用户群体以网络、运维为主,因此在所有的付费专栏中,这两方面的课程最为受到欢迎,课程定价也比较有特点都是51元,51CTO付费专栏算是中规中矩,也会做一些营销,但更多是在网站的体系内来做,很少在外打广告做宣传。
慕课网
慕课网不同于以上几个平台专栏,他诞生的更早但也相对更传统,一直在深耕技术领域的在线视频教学,经过几年的发展也成为了在知识付费领域的一匹大黑马,不论是师资力量还是产品建设都非常不错,唯一有缺陷的地方是运营能力稍弱。
慕课网目前应该是 IT 领域内最好的在线视频学习网站,慕课网成立于2013年,是一家从高校走出来的创业公司,慕课网创始人陈志锋。现有用户超过1500万,合作讲师规模已超过1500+,且均来自国内外一线互联网公司。
我算是慕课网的第一批用户,2014年我想在地铁上学习PHP,网上搜索了一下没找到几个,好像当时就发现了网易云课堂和慕课网。慕课网当时的视频课程很少,而且绝大部分视频课程都是入门级的课程,但课程免费、讲师内容幽默易懂、质量很高,这为以后慕课网的发展做了积淀。
慕课网早期凭借着优质内容、免费观看、移动端使用体验很好等特点,迅速占领了一大批IT小白用户。从2013年到2016年,整整近3年时间,慕课网都在推免费、优质的视频课程,通过这些占领了IT领域视频教育第一把手。
慕课网从2017年开始商业模式的灰度测试,推出了两种不同形式的课程,第一种是就业班的形式,主要讲知识的使用,按照语言或者框架分不同的类型来学习,占比较少;第二种就是实战课程,也是它们网站主推的一种模式,以实战项目为内容,讲解各个技术的使用,特别受到欢迎。
去年1月时候我参加了慕课网的慕课之夜,慕课网邀请了慕课网大部分知名讲师一起开了个晚会,在一个酒吧搞得很互联网化(有钢管舞)。在那天了解到已经有几位慕课网的老师,在慕课网一年的分成已经达到了百万级别。并且慕课网在目前的IT视频教学领域几乎没有对手,不过极客时间已经慢慢推出了多个视频专栏,可能最终免不了两者大战一番,我们拭目以待。
对比
各个平台产品的特点:
- Gitchat :Gitchat 平台的付费产品最为丰富,包含 Chat 、达人课、精品课、极客书等领域,并且其中的课程都比较接地气,偏向于实践这个领域。因为创世人来自于出版行业,因此运营手段偏传统。
- 极客时间:极客时间的专栏走高大上领域,因此课程更多偏向于理论或者基础,所以专栏读者的覆盖面比较广,因此对原理、基础、思维等方面比较突出,运营手段多样极具互联网化。
- 掘金小册:掘金小册目前上线产品较少,主要以前端和编程语言本身为主,专栏内容还在不断的完善中,内容质量也不错。
- 51CTO:作为最后一个上线的技术付费产品,51CTO的产品还在不断打磨中,专栏以网络、运维领域的课程为主,课程也在不断的丰富中。
- 慕课网:专业做 IT领域的视频课程,产品体验最好、用户量最大、课程质量好、销量比较可观,他们公司的玩法也很互联网化,我比较喜欢。缺点是课程都需要后期制作、排期,往往录制一个课程到发布需要大半年的时间。
需要说明的是在平台写专栏/录制视频是一个非常耗费时间和精力的事情,几乎需要花费你所有的业余时间,并且一旦决定开一个专栏,必须要做大量的学习、调研、总结,结合自己掌握的知识重新把这些知识理解,用通俗的语言来讲述出来。真的很费时间和精力!但开通一个专栏对作者也是一个非常好的学习、锻炼机会,如果清晰的讲解整个技术,至少需要再次深度理解一遍这些内容,也算是更深度的再次学习。
这些平台和作者的分成,以及各个平台做为普通作者收益的相关信息,因为可能涉及到对方的商业信息,这里暂时不方便直接透露,感兴趣的朋友可以在我的知识星球就聊挣钱查阅。
知识付费的价值
在互联网发展到如今,可以说任何你想学习的知识都有可能在互联网找到,但正是因为内容太过于丰富,质量参差不齐,会对初学者造成很大的困扰。就拿技术领域来说,如果你想学习 Spring Boot ,使用谷歌搜索 Spring Boot 关键字会有 3.8 亿条搜索结果,如何在这个 3.8 亿中筛选出合适的资料就变得非常具有挑战性。
就我个人理解来讲,知识付费的价值最主要有三个方面,第一,虽然互联网上有大量的免费文章,但需要花费大量的时间去尝试、总结,购买对应的付费产品,可以节省大量的筛选成本;第二,知识付费的作者一般在领域内有多年的从业经验,会将复杂的内容以简单易懂的形式去教学,方便学习者快速吸纳知识;第三,作者会将实践过的经验编写在课程中,避免初学者在实际应用中走弯路,他的经验经过你的学习也会成为你的实践经验。
总结一下,技术领域的知识付费,可以让你快速学习、少走弯路、收获经验,最终节约了你的宝贵时间,可以说是付费购买了你的时间。其实现在技术领域的知识付费真的非常便宜,因为课程的销量都比较大,平摊到每个人身上的价格就只有几十块钱。如果需要一对一的服务,估计给这些老师一天一万块钱,他们也不想这样费力去干这件事情,这其实也是互联网的价值之一。
现在知识付费其实还在一个很初级的阶段,很多人还不是很认可这个模式。我经常喜欢举这样一个例子,大家经常乐意付费几十元左右去看一场 3D 美国大片,因为它不用费脑子,看完之后挺爽,爽完之后也就没什么了,大众已经非常认可这个模式;但同样需要付费几十元去学习一门知识的时候,大家就需要犹豫半天,一方面学习是一个被动的过程,需要克服逆心理过程,同样因为它是一个新事物,会比较容易怀疑是否被套路。
但确实也不排除,知识付费的迅速发展有一些质量不太好的课程混入其中,让用户购买后后悔不已,但大部分课程质量应该都是可以得到保障的,特别是头部平台公司的课程。现在技术领域的知识付费公司,大部分都在亏钱,几乎没有几个可以通过课程收费能够覆盖成本的,都处在一个教育市场的阶段,后期知识付费应该会越来越普及,未来将是一个非常广阔的市场。
推荐阅读
-
epoll简介及触发模式(accept、read、send)-epoll的简单介绍 epoll在LT和ET模式下的读写方式 一、epoll的接口非常简单,一共就三个函数:1. int epoll_create(int size);创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大。这个参数不同于select中的第一个参数,给出最大监听的fd+1的值。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close关闭,否则可能导致fd被耗尽。2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);epoll的事件注册函数,它不同与select是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。第一个参数是epoll_create的返回值,第二个参数表示动作,用三个宏来表示:EPOLL_CTL_ADD:注册新的fd到epfd中;EPOLL_CTL_MOD:修改已经注册的fd的监听事件;EPOLL_CTL_DEL:从epfd中删除一个fd;第三个参数是需要监听的fd,第四个参数是告诉内核需要监听什么事,struct epoll_event结构如下:struct epoll_event { __uint32_t events; /* Epoll events */ epoll_data_t data; /* User data variable */};events可以是以下几个宏的集合:EPOLLIN :表示对应的文件描述符可以读(包括对端SOCKET正常关闭); EPOLLIN事件:EPOLLIN事件则只有当对端有数据写入时才会触发,所以触发一次后需要不断读取所有数据直到读完EAGAIN为止。否则剩下的数据只有在下次对端有写入时才能一起取出来了。现在明白为什么说epoll必须要求异步socket了吧?如果同步socket,而且要求读完所有数据,那么最终就会在堵死在阻塞里。 EPOLLOUT:表示对应的文件描述符可以写; EPOLLOUT事件:EPOLLOUT事件只有在连接时触发一次,表示可写,其他时候想要触发,那要先准备好下面条件:1.某次write,写满了发送缓冲区,返回错误码为EAGAIN。2.对端读取了一些数据,又重新可写了,此时会触发EPOLLOUT。简单地说:EPOLLOUT事件只有在不可写到可写的转变时刻,才会触发一次,所以叫边缘触发,这叫法没错的!其实,如果真的想强制触发一次,也是有办法的,直接调用epoll_ctl重新设置一下event就可以了,event跟原来的设置一模一样都行(但必须包含EPOLLOUT),关键是重新设置,就会马上触发一次EPOLLOUT事件。1. 缓冲区由满变空.2.同时注册EPOLLIN | EPOLLOUT事件,也会触发一次EPOLLOUT事件这个两个也会触发EPOLLOUT事件 EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);EPOLLERR:表示对应的文件描述符发生错误;EPOLLHUP:表示对应的文件描述符被挂断;EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);等待事件的产生,类似于select调用。参数events用来从内核得到事件的集合,maxevents告之内核这个events有多大,这个maxevents的值不能大于创建epoll_create时的size,参数timeout是超时时间(毫秒,0会立即返回,-1将不确定,也有说法说是永久阻塞)。该函数返回需要处理的事件数目,如返回0表示已超时。-------------------------------------------------------------------------------------------- 从man手册中,得到ET和LT的具体描述如下EPOLL事件有两种模型:Edge Triggered (ET)Level Triggered (LT)假如有这样一个例子:1. 我们已经把一个用来从管道中读取数据的文件句柄(RFD)添加到epoll描述符2. 这个时候从管道的另一端被写入了2KB的数据3. 调用epoll_wait(2),并且它会返回RFD,说明它已经准备好读取操作4. 然后我们读取了1KB的数据5. 调用epoll_wait(2)......Edge Triggered 工作模式:如果我们在第1步将RFD添加到epoll描述符的时候使用了EPOLLET标志,那么在第5步调用epoll_wait(2)之后将有可能会挂起,因为剩余的数据还存在于文件的输入缓冲区内,而且数据发出端还在等待一个针对已经发出数据的反馈信息。只有在监视的文件句柄上发生了某个事件的时候 ET 工作模式才会汇报事件。因此在第5步的时候,调用者可能会放弃等待仍在存在于文件输入缓冲区内的剩余数据。在上面的例子中,会有一个事件产生在RFD句柄上,因为在第2步执行了一个写操作,然后,事件将会在第3步被销毁。因为第4步的读取操作没有读空文件输入缓冲区内的数据,因此我们在第5步调用 epoll_wait(2)完成后,是否挂起是不确定的。epoll工作在ET模式的时候,必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。最好以下面的方式调用ET模式的epoll接口,在后面会介绍避免可能的缺陷。 i 基于非阻塞文件句柄 ii 只有当read(2)或者write(2)返回EAGAIN时才需要挂起,等待。但这并不是说每次read时都需要循环读,直到读到产生一个EAGAIN才认为此次事件处理完成,当read返回的读到的数据长度小于请求的数据长度时,就可以确定此时缓冲中已没有数据了,也就可以认为此事读事件已处理完成。Level Triggered 工作模式相反的,以LT方式调用epoll接口的时候,它就相当于一个速度比较快的poll(2),并且无论后面的数据是否被使用,因此他们具有同样的职能。因为即使使用ET模式的epoll,在收到多个chunk的数据的时候仍然会产生多个事件。调用者可以设定EPOLLONESHOT标志,在 epoll_wait(2)收到事件后epoll会与事件关联的文件句柄从epoll描述符中禁止掉。因此当EPOLLONESHOT设定后,使用带有 EPOLL_CTL_MOD标志的epoll_ctl(2)处理文件句柄就成为调用者必须作的事情。然后详细解释ET, LT:LT(level triggered)是缺省的工作方式,并且同时支持block和no-block socket.在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错误可能性要小一点。传统的select/poll都是这种模型的代表.ET(edge-triggered)是高速工作方式,只支持no-block socket。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知,直到你做了某些操作导致那个文件描述符不再为就绪状态了(比如,你在发送,接收或者接收请求,或者发送接收的数据少于一定量时导致了一个EWOULDBLOCK 错误)。但是请注意,如果一直不对这个fd作IO操作(从而导致它再次变成未就绪),内核不会发送更多的通知(only once),不过在TCP协议中,ET模式的加速效用仍需要更多的benchmark确认(这句话不理解)。在许多测试中我们会看到如果没有大量的idle -connection或者dead-connection,epoll的效率并不会比select/poll高很多,但是当我们遇到大量的idle- connection(例如WAN环境中存在大量的慢速连接),就会发现epoll的效率大大高于select/poll。(未测试)另外,当使用epoll的ET模型来工作时,当产生了一个EPOLLIN事件后,读数据的时候需要考虑的是当recv返回的大小如果等于请求的大小,那么很有可能是缓冲区还有数据未读完,也意味着该次事件还没有处理完,所以还需要再次读取: 这里只是说明思路(参考《UNIX网络编程》) while(rs) {buflen = recv(activeevents[i].data.fd, buf, sizeof(buf), 0);if(buflen < 0){// 由于是非阻塞的模式,所以当errno为EAGAIN时,表示当前缓冲区已无数据可读// 在这里就当作是该次事件已处理处.if(errno == EAGAIN)break; else return; }else if(buflen == 0) { // 这里表示对端的socket已正常关闭. } if(buflen == sizeof(buf) rs = 1; // 需要再次读取 else rs = 0; } 还有,假如发送端流量大于接收端的流量(意思是epoll所在的程序读比转发的socket要快),由于是非阻塞的socket,那么send函数虽然返回,但实际缓冲区的数据并未真正发给接收端,这样不断的读和发,当缓冲区满后会产生EAGAIN错误(参考man send),同时,不理会这次请求发送的数据.所以,需要封装socket_send的函数用来处理这种情况,该函数会尽量将数据写完再返回,返回-1表示出错。在socket_send内部,当写缓冲已满(send返回-1,且errno为EAGAIN),那么会等待后再重试.这种方式并不很完美,在理论上可能会长时间的阻塞在socket_send内部,但暂没有更好的办法. ssize_t socket_send(int sockfd, const char* buffer, size_t buflen) { ssize_t tmp; size_t total = buflen; const char *p = buffer; while(1) { tmp = send(sockfd, p, total, 0); if(tmp < 0) { // 当send收到信号时,可以继续写,但这里返回-1. if(errno == EINTR) return -1; // 当socket是非阻塞时,如返回此错误,表示写缓冲队列已满, // 在这里做延时后再重试. if(errno == EAGAIN) { usleep(1000); continue; } return -1; } if((size_t)tmp == total) return buflen; total -= tmp; p += tmp; } return tmp; } 二、epoll在LT和ET模式下的读写方式 在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK) 从字面上看, 意思是: * EAGAIN: 再试一次 * EWOULDBLOCK: 如果这是一个阻塞socket, 操作将被block * perror输出: Resource temporarily unavailable 总结: 这个错误表示资源暂时不够, 可能read时, 读缓冲区没有数据, 或者, write时,写缓冲区满了 。 遇到这种情况, 如果是阻塞socket, read/write就要阻塞掉。 而如果是非阻塞socket, read/write立即返回-1, 同 时errno设置为EAGAIN. 所以, 对于阻塞socket, read/write返回-1代表网络出错了. 但对于非阻塞socket, read/write返回-1不一定网络真的出错了. 可能是Resource temporarily unavailable. 这时你应该再试, 直到Resource available. 综上, 对于non-blocking的socket, 正确的读写操作为: 读: 忽略掉errno = EAGAIN的错误, 下次继续读 写: 忽略掉errno = EAGAIN的错误, 下次继续写 对于select和epoll的LT模式, 这种读写方式是没有问题的. 但对于epoll的ET模式, 这种方式还有漏洞. epoll的两种模式 LT 和 ET
-
开放源代码的精神是否意味着免费?
-
volte 是否收费(volte 是免费的还是收费的)
-
41 个下载免费 3D 模型的最佳网站-使用说明:使用权限可能因型号而异。因此,在下载文件之前,请仔细检查每个下载页面上的许可证和使用权限。 17. Clara.io Clara.io 是一个创建 3D 内容的全球平台,也是一个培养新 3D 艺术家的社区。Clara.io 提供+100,000个免费的3D模型,包括OBJ,Blend,STL,FBX,DAE,Babylon.JS,Three.JS格式,用于 Clara.io,Unity 3D,Blender,Sketchup,Cinema 4D,3DS Max和Maya。 使用说明:免费,标准和专业帐户仅供个人使用,如果您需要将 clara.io 用于商业用途,请与销售团队联系。 18. 3DExport 3DExport是一个市场,您可以在其中购买和销售用于CG项目的3D模型,3D打印模型和纹理。它提供15 +不同的3D格式供下载,如3DS MAX(.max),Cinema4D(.c4d),Maya(.mb,.ma),Lightwave(.lwo),Softimage(.xsi),Wavefront OBJ(.obj),Autodesk FBX(.fbx)等。它还提供15种不同的语言! 使用说明:免费下载仅供个人和非商业用途。 19. 3D Warehouse 3D Warehouse是一个开放的库,允许用户共享和下载SketchUp 3D模型,用于建筑,设计,施工和娱乐!任何人都可以免费制作,修改和重新上传内容到3D仓库,您可以找到任何您能想到的东西,如家具,电子产品,室内产品等。 使用说明:3D Warehouse中的所有模型都是免费的,因此任何人都可以下载文件以用于SketchUp甚至其他软件,如AutoCAD,Revit和ArchiCAD。 20. CadNav.com CadNav是CGI平面设计师和CAD / CAM / CAE工程师的在线3D模型库,我们提供超过50000 +免费3D模型和CAD模型下载。在CadNav网站上,您可以下载高质量的多边形网格3D模型,3D CAD实体对象,纹理,Vray材料,3D作品,CAD图纸等。 使用说明:免费下载仅供个人和非商业用途。 21. All3dfree.net 就像网站名称一样,它提供免费的3D模型,还包括Vray材料,CAD块,2d和3d纹理集合,无需注册即可免费下载。它是不断更新的,因此您可以查找或请求3DS,MAX,C4D,skp,OBJ,FBX,MTL等格式的模型。 使用说明:所有资源均不允许用于商业用途,否则您将承担责任。 22. Hum3D 自2005年以来,Hum3D帮助来自3多个国家的80D艺术家节省3D建模时间,并制作逼真的3D模型,用于电影,视频游戏,AR应用程序和可视化。所有模型均由首席3D艺术家进行验证,他们检查其是否符合专业要求和最新的3D建模标准。 使用说明:免费下载仅供个人和非商业用途。 23. Artist-3D.com 艺术家-3D 库存的免费 3D 模型下载按通用类别排序。它为人体解剖学、汽车、家具、火箭、卫星等模型提供 AutoDesk 3DS Max 格式。您还可以在浏览他们的网站时找到教程和类似类型的建模。 使用说明:使用权限可能因型号而异。因此,在下载文件之前,请仔细检查每个下载页面上的许可证和使用权限。 24. Free the models 就像本网站的标题一样,它为3d应用程序和3d游戏引擎提供免费的内容模型。您可以为您的任何项目找到许多有趣且有用的模型!它提供3ds,wavefront,bryce,poser,lightwave,md2和unity3d格式的模型。还有一个很棒的纹理集合,可以在您最喜欢的建模和渲染程序中使用。 使用说明:您从这里下载的所有内容都可以免费使用,除非它不能包含在另一个免费的网络或CD收藏中,也不能单独出售。否则,您可以在商业游戏,3D应用程序或渲染作品中使用它。您不必提供信用,但如果您这样做,那就太好了。 25. Resources.blogscopia 本网站由一家名为Scopia的公司创建。他们制作3D图像和视频,您可以找到许多为CGI工作的信息架构设计的模型,所有这些都可以在现实生活中使用。您可以免费下载它们,但是,如果您想一次下载它们,您可以支付 3 到 9 欧元。 使用说明:您可以免费下载模型部分的所有文件。每个压缩文件都包含您也可以在此处找到的许可证。基本上,您可以对文件执行任何操作。唯一的限制是不归属于Scopia的重新分发。 26.ambientCG 1000+公共领域PBR材料适合所有人!环境CG是使用许多不同的方法和资产类型创建的,例如照片纹理(PBR),贴花(PBR),图集(PBR),照片纹理(普通),物质存档(SBSAR),雕刻画笔,3D模型和地形。您可以在所有项目中*使用它们! 使用说明:在 ambientCG 上提供下载的所有 PBR 材料、画笔、照片和 3D 模型均根据知识共享 CC0 1.0 通用许可提供。您可以复制、修改、分发和执行作品,即使是出于商业目的,也无需征得许可。信用将不胜感激。 不要满足于平庸的大理石纹理 - 立即使用我们的免费PBR大理石纹理升级您的3D设计。 27.Pixar One Twenty Eight 这是一个提供官方动画行业经典纹理的网站:皮克斯,创建于 1993 年,该纹理库包括 128 个重复纹理,现在免费提供。 它包含您来到的纹理,包括砖块和动物毛皮。肯定会有一些你可以使用的东西。 使用说明:皮克斯动画工作室的《Pixar One Twenty Eight》根据知识共享署名4.0国际许可协议进行许可。即使出于商业目的,您也可以重新混合、调整和构建您的作品,只要您以相同的条款对新创作进行信用和许可。 访问数以千计的免费纹理并提升您的设计游戏 - 立即开始下载! 28. 3DXO 即使有近 620 个免费贴纸可供下载,3DXO 也不是最大的资源,但它的内容非常有用,不需要注册。无论是简单的墙壁或地板,还是一些奇怪的小东西,您都需要的纹理都可以在此网站上看到。 使用说明:使用权限可能因型号而异。因此,在下载文件之前,请仔细检查每个下载页面上的许可证和使用权限。 29. 3DModelsCC0 3DModelsCC0 与其他产品的不同之处在于它包含超过 250+ 个高质量 3D 模型,并且本网站上的所有内容都是免费的,完全是公共领域!使用我们的模型时无需信用或归属! 使用说明:为每个人提供完全免费的公共领域内容。 30.Sketch up texture club Sketchup Texture Club是一个非营利性的教育和信息门户网站,由3D社区的图像促进协会管理,特别强调面向学生和建筑和室内设计专业人士的可视化和渲染技术,以及所有正在学习3D可视化的人。 使用说明:您无需支付版税或使用费。纹理可以免费下载和使用。不允许将纹理作为竞争产品出售或重新分发,即使图像被修改也是如此。 31. FlippedNormals FlippedNormal 是一个提供计算机图形和 3D 资产的市场,您可以找到许多用于雕刻、建模、纹理、概念艺术、3D 模型、游戏资产或课程的高级资产! 使用说明:使用权限可能因型号而异。因此,在下载文件之前,请仔细检查每个下载页面上的许可证和使用权限。 32. NASA 3D NASA 3D网站是一个在线门户,提供与太空和各种NASA任务相关的大量三维模型和模拟。该网站是用户友好的,并提供有关每个型号的详细信息。该网站允许用户探索和下载几种不同格式的模型,包括 OBJ、STL 和 FBX,只需单击下载按钮即可。 使用说明: 要下载模型,只需单击模型页面上的下载按钮并选择所需的格式。 33. 3DAGOGO (Astroprint) 3DAGOGO 是一个提供广泛 3D 模型的网站,包括角色、车辆和建筑物。3DAGOGO 的独特功能之一是它专注于适合 3D 打印的模型,使其成为希望创建物理原型或模型的设计师的绝佳资源。要使用 3DAGOGO,设计师只需在网站上搜索他们正在寻找的模型类型,然后下载 STL 格式的文件。 使用说明: 要使用 3DAGOGO,只需搜索所需的 3D 模型类型并下载 STL 格式的文件。根据需要自定义模型,并确保在将其用于商业目的之前检查使用权限。 34. FreeCAD FreeCAD是一款了不起的3D建模软件,可让您在计算机上创建令人难以置信的3D设计。该软件可免费下载和使用,它提供了广泛的工具和功能,可用于创建用于各种目的的3D模型。 该网站易于浏览,您可以找到开始使用FreeCAD的所有必要信息。此外,该网站还提供一系列教程和指南,可帮助您了解 3D 建模的来龙去脉。 使用说明: 要下载模型,请访问网站并从库中选择所需的模型。该网站还提供了一系列使用该软件的教程和指南。 35. Pinshape Pinshape是一个提供一系列3D打印模型的网站。网站上提供的型号质量很高,因此您可以确保您的最终印刷产品看起来很棒。该网站提供了广泛的模型,包括从家居用品到小雕像和珠宝的所有物品。 但这还不是Pinshape所能提供的全部!该网站还允许用户上传和共享自己的3D模型。这意味着您不仅可以下载出色的模型,还可以通过分享自己的设计为社区做出贡献。此外,Pinshape 提供了一系列自定义选项,因此您可以调整和调整模型以满足您的特定需求。 使用说明: 要下载模型,请在网站上创建一个帐户,搜索所需的模型,然后单击下载按钮。该网站还为每种型号提供了一系列定制选项。 36.Yeggi Yeggi 提供了大量免费的 3D 模型,您可以下载各种格式的模型,例如 STL、OBJ 和 FBX。该网站易于使用,您可以按关键字、类别或特定网站搜索模型。 Yeggi 对于任何寻找 3D 模型的人来说都是一个很好的资源。它提供了大量的模型集合,从日常物品到复杂的机械,以及介于两者之间的一切。该网站的收藏量在不断增长,每天都有新的型号增加。 使用说明: 要下载模型,请在网站上搜索所需的模型,然后单击下载按钮。该网站还提供指向托管模型的原始网站的链接。 37. Open3DModel 来自开放3D模型的图像 Open3DModel具有各种类别的模型,包括建筑,车辆和角色。无论您需要建筑物,汽车还是人的3D模型,都可以在此网站上找到。 该网站易于浏览,您可以按类别或关键字搜索模型。每个模型都附带预览图像和详细信息,例如文件格式、大小和多边形数量。此信息可以帮助您选择适合您需求的模型。 使用说明: 要下载模型,请访问网站,从库中选择所需的模型,然后单击下载按钮。 使用最好的 3D 资产管理工具简化您的 3D 制作流程。立即试用它们,将您的 3D 项目提升到一个新的水平! 38. 3DExport 对于那些为其 3D 设计项目寻找 3D 模型、纹理和其他资源的人来说,该平台是一个很好的资源。该网站有大量模型可供选择,包括 3D 打印对象、游戏资产等。用户可以按类别、文件格式或价格范围浏览,以找到适合其项目的完美资源。此外,3DExport 还提供一系列教程和其他 3D 资源,以帮助用户提高技能并创建更令人印象深刻的设计。 使用说明: 要使用 3DExport,只需创建一个帐户并浏览可用型号。您可以按类别、格式和价格进行搜索,以找到所需的型号。找到喜欢的模型后,只需下载它并开始在您的项目中使用它。 39.Blend Swap Blend Swap是一个社区驱动的市场,提供与Blender软件兼容的各种免费3D模型。该平台允许用户共享和下载模型、纹理和其他资产,以便在他们的项目中使用。 使用说明: 创建免费帐户后,您可以浏览社区上传的大量3D模型。当您找到要使用的一个时,只需下载它并将其导入您选择的 3D 软件即可。 40. 3DShook 3DShook 是一个高级 3D 模型市场,提供一系列用于建筑、游戏等各个行业的高质量模型。该平台提供基于订阅的模型,具有不同的定价计划,允许用户访问一系列模型。 使用说明: 注册免费帐户后,只需浏览3D模型库,选择您喜欢的模型,然后以您需要的格式下载它们。 41. Smithsonian X 3D 史密森尼 X 3D 对于正在寻找历史文物和文物的高质量 3D 模型的设计师来说,这是一个独特的资源。该平台提供了大量3D模型,这些模型是根据史密森尼博物馆和研究中心中的真实物体扫描创建的。 使用说明:
-
MinIO 是免费的吗?它的开源协议从 Apache 2.0 变为 AGPLv3 意味着什么?
-
NVIDIA 完成对 Arm 的收购,这是否意味着开放源代码 RISC-V 架构的新机遇来临?
-
程序员辞职后卖卷饼,4天就赚到1个月的薪水!这是否意味着我该转行卖卷饼呢?
-
程序员辞职后卖卷饼,4天就赚到1个月的薪水!这是否意味着我该转行卖卷饼呢?
-
【Netty】「萌新入门」(七)ByteBuf 的性能优化-堆内存的分配和释放都是由 Java 虚拟机自动管理的,这意味着它们可以快速地被分配和释放,但是也会产生一些开销。 直接内存需要手动分配和释放,因为它由操作系统管理,这使得分配和释放的速度更快,但是也需要更多的系统资源。 另外,直接内存可以映射到本地文件中,这对于需要频繁读写文件的应用程序非常有用。 此外,直接内存还可以避免在使用 NIO 进行网络传输时发生数据拷贝的情况。在使用传统的 I/O 时,数据必须先从文件或网络中读取到堆内存中,然后再从堆内存中复制到直接缓冲区中,最后再通过 SocketChannel 发送到网络中。而使用直接缓冲区时,数据可以直接从文件或网络中读取到直接缓冲区中,并且可以直接从直接缓冲区中发送到网络中,避免了不必要的数据拷贝和内存分配。 通过 ByteBufAllocator.DEFAULT.directBuffer 方法来创建基于直接内存的 ByteBuf: ByteBuf directBuf = ByteBufAllocator.DEFAULT.directBuffer(16); 通过 ByteBufAllocator.DEFAULT.heapBuffer 方法来创建基于堆内存的 ByteBuf: ByteBuf heapBuf = ByteBufAllocator.DEFAULT.heapBuffer(16); 注意: 直接内存是一种特殊的内存分配方式,可以通过在堆外申请内存来避免 JVM 堆内存的限制,从而提高读写性能和降低 GC 压力。但是,直接内存的创建和销毁代价昂贵,因此需要慎重使用。 此外,由于直接内存不受 JVM 垃圾回收的管理,我们需要主动释放这部分内存,否则会造成内存泄漏。通常情况下,可以使用 ByteBuffer.clear 方法来释放直接内存中的数据,或者使用 ByteBuffer.cleaner 方法来手动释放直接内存空间。 测试代码: public static void testCreateByteBuf { ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(16); System.out.println(buf.getClass); ByteBuf heapBuf = ByteBufAllocator.DEFAULT.heapBuffer(16); System.out.println(heapBuf.getClass); ByteBuf directBuf = ByteBufAllocator.DEFAULT.directBuffer(16); System.out.println(directBuf.getClass); } 运行结果: class io.netty.buffer.PooledUnsafeDirectByteBuf class io.netty.buffer.PooledUnsafeHeapByteBuf class io.netty.buffer.PooledUnsafeDirectByteBuf 池化技术 在 Netty 中,池化技术指的是通过对象池来重用已经创建的对象,从而避免了频繁地创建和销毁对象,这种技术可以提高系统的性能和可伸缩性。 通过设置 VM options,来决定池化功能是否开启: -Dio.netty.allocator.type={unpooled|pooled} 在 Netty 4.1 版本以后,非 Android 平台默认启用池化实现,Android 平台启用非池化实现; 这里我们使用非池化功能进行测试,依旧使用的是上面的测试代码 testCreateByteBuf,运行结果如下所示: class io.netty.buffer.UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeDirectByteBuf class io.netty.buffer.UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf class io.netty.buffer.UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeDirectByteBuf 可以看到,ByteBuf 类由 PooledUnsafeDirectByteBuf 变成了 UnpooledUnsafeDirectByteBuf; 在没有池化的情况下,每次使用都需要创建新的 ByteBuf 实例,这个操作会涉及到内存的分配和初始化,如果是直接内存则代价更为昂贵,而且频繁的内存分配也可能导致内存碎片问题,增加 GC 压力。 使用池化技术可以避免频繁内存分配带来的开销,并且重用池中的 ByteBuf 实例,减少了内存占用和内存碎片问题。另外,池化技术还可以采用类似 jemalloc 的内存分配算法,进一步提升分配效率。 在高并发环境下,池化技术的优点更加明显,因为内存的分配和释放都是比较耗时的操作,频繁的内存分配和释放会导致系统性能下降,甚至可能出现内存溢出的风险。使用池化技术可以将内存分配和释放的操作集中到预先分配的池中,从而有效地降低系统的内存开销和风险。 内存释放 当在 Netty 中使用 ByteBuf 来处理数据时,需要特别注意内存回收问题。 Netty 提供了不同类型的 ByteBuf 实现,包括堆内存(JVM 内存)实现 UnpooledHeapByteBuf 和堆外内存(直接内存)实现 UnpooledDirectByteBuf,以及池化技术实现的 PooledByteBuf 及其子类。 UnpooledHeapByteBuf:通过 Java 的垃圾回收机制来自动回收内存; UnpooledDirectByteBuf:由于 JVM 的垃圾回收机制无法管理这些内存,因此需要手动调用 release 方法来释放内存; PooledByteBuf:使用了池化机制,需要更复杂的规则来回收内存; 由于池化技术的特殊性质,释放 PooledByteBuf 对象所使用的内存并不是立即被回收的,而是被放入一个内存池中,待下次分配内存时再次使用。因此,释放 PooledByteBuf 对象的内存可能会延迟到后续的某个时间点。为了避免内存泄漏和占用过多内存,我们需要根据实际情况来设置池化技术的相关参数,以便及时回收内存; Netty 采用了引用计数法来控制 ByteBuf 对象的内存回收,在博文 「源码解析」ByteBuf 的引用计数机制 中将会通过解读源码的形式对 ByteBuf 的引用计数法进行深入理解; 每个 ByteBuf 对象被创建时,都会初始化为1,表示该对象的初始计数为1。 在使用 ByteBuf 对象过程中,如果当前 handler 已经使用完该对象,需要通过调用 release 方法将计数减1,当计数为0时,底层内存会被回收,该对象也就被销毁了。此时即使 ByteBuf 对象还在,其各个方法均无法正常使用。 但是,如果当前 handler 还需要继续使用该对象,可以通过调用 retain 方法将计数加1,这样即使其他 handler 已经调用了 release 方法,该对象的内存仍然不会被回收。这种机制可以有效地避免了内存泄漏和意外访问已经释放的内存的情况。 一般来说,应该尽可能地保证 retain 和 release 方法成对出现,以确保计数正确。
-
对于深度学习,你是否有兴趣了解国内首本免费的相关书籍?