Go 语言技术大佬们在 Twitter 上打起了口水战

如何评估IT可观测性技术? IT领域的可观测技术,源自自动控制领域。 控制领域中,可观测性是一个系统可控的必要条件。 与之相对应,在IT领域中,可观测性是为了保证IT系统的稳定性。 随着业务系统不断上云,容器、微服务、持续发布等云原生技术被广泛采用,从而为IT系统的可控性带来了全新挑战。为保障云原生应用的稳定性(控制的目的就是稳定),可观测技术被越来越多的企业所采用。 可观测技术的本质,是通过系统的外部数据,分析系统的内部状态,从而做出控制指令。针对于IT系统,尤其是面相云原生应用,可观测技术应包含如下需求: 1)零侵扰:传 阅读详情

640?wx_fmt=png

转载链接:https://zhuanlan.zhihu.com/p/41627929

即将发布的Go 1.11将加入对go mod的支持,解决了go一直存在的依赖管理的短板。不过这篇文章并不是要介绍go module本身,而是打算说一下go团队和社区之间的冲突——你可以从中看到go team的做事风格,也可以当做是单纯的八卦。

先说一下背景。Go作为Google内部孵化的项目,其对的设计非常符合Google内部的使用场景:所有的源代码都在一个巨大的repo,依赖就是VCS里面的路径,构建的时候全部从最新源代码编译,最终只产出一个单一的可执行文件。然而并不是所有的公司都是像Google这样使用Go,Google之外的使用者们需要更好的依赖管理,主要有:

  1. 依赖版本的控制,以不受依赖模块代码修改的影响,产生稳定的可预测的构建结果

  2. 稳定的依赖路径,以在项目vcs地址改变或者fork vcs之后能够兼容

最早有gopkg.in/这样的方案,通过一次跳转指向真正的VCS地址,URL里不同的版本跳转到不同的分支。后来有了各种第三方的依赖管理工具,在vendor机制出现后,这些工具实现上把拉下来的依赖固化到vendor里。之后,社区人员在Go团队的认可下成立了包管理工具的委员会和工作组,组织开发了dep,作为——或者说他们以为作为——官方的依赖管理实现。

640?wx_fmt=jpeg

Russ Cox

然而到了18年Russ Cox又开发了vgo的实验项目,这也引起了迷惑,Go出现了两个官方的依赖管理工具? vgo和dep是什么关系?随着vgo最终标准化并进入Go 1.11称为go module的实现,尘埃落定,dep所谓的官方只是社区开发者的一厢情愿,根正苗红的只有vgo。

故事是这样开始的。

vgo进入Go 1.11,Russ Cox 发了一个Twitter:

640?wx_fmt=jpeg
Russ Cox: 对于在Go 1.11里的Go Module的实现方式我感到非常兴奋。我上次瞅了一下最流行的大约1000个项目,93%的能够直接转换为Go Module。

640?wx_fmt=jpegSam Boyer

Twitter发出来之后,Sam Boyer(dep的主要开发者),转推了一条(后面不放英文原文截图了,可以到文章后面的连接去看):

Sam Boyer: 最初的(旧项目到Go Module的)转换从来不是问题,问题是从不拿工资的贡献者们那里偷走工作成果。
我上周GoSF的演讲是关于这个的。现在视频找不到了,不过我截了个图。

Russ Cox回复了这条推:

Russ Cox: 我听了你的演讲。虽然我们谈了很长时间,但是明显你现在对于这一切,对于我还是感觉很受挫败,很沮丧。对此我真的很抱歉,我知道那是什么感受。

Sam Boyer: 你能这样说我很感激。你肯定也很不容易,对于这件事造成的过分的压力我也很抱歉。
但是这并不是你我之间的事情,我之所以在演讲中提到你,是因为你是后来社区文化和机制争论的源头。

640?wx_fmt=jpegPeter Bourgon

另一个Go社区的重要贡献者,Peter Bourgon说:

Peter Bourgon: 因为私下认识事件中的一些人,我承认我是有偏向的。不过作为一个外人看到这个事故现场,我可能以后对Rust兴趣更多一些了。为什么Go团队领导层总是拒绝从其他现代语言(的做法)中学习呢?

Russ Cox: Go并不是要满足所有人的所有需求。如果你喜欢Rust的方式,就去用Rust吧。我也欣赏Rust,事实上我花了很多时间研究Rust,Swift中的好的地方,但是适合一个语言的未必适合其他语言。

Peter Bourgon: 是的。但是我想不到原因为什么go的依赖管理没有从其他的依赖管理中学习到任何东西。我从局外人的角度来看,Go歇斯底里的尝试不去达成任何其他人已经达成的共识,我不明白为什么要这样做。
并不仅仅是你的问题。我参与了dep开始之前的讨论,在之前还一直在关注glide。我不知道为什么go的依赖管理社区就是不从其他(包管理)已经遇到的问题中学习。
作为一个已经在提供开箱即用的工具方面证明了自己的语言和社区,我非常困惑为什么这么关键的一个部分(指包管理)几乎是刻意的设计得这么挫。

好吧,Peter Bourgon其实有点歪楼了。

Russ Cox:我们是一个小团队,还有其他优先的事情要做。确实我们在这个领域晚了几年,但是事情正在往好的方面发展,几年之后再来看看我们做成什么样子。

640?wx_fmt=jpeg

Matt Farina(Glide作者)跳出来了

你说你们是一个小团队,是因为你们把Go当做Google下面团队的一个产品,Google这个团队是小的。如果你们创建一个社区,借助其他人的力量,那就是一个很大的团队。比如Rust的依赖管理团队就有不是Mozilla的人。

围攻之下Russ Cox开启了疯狂发推模式,连发N条Twitter阐述前因后果。

Russ Cox: 
非常有道理的批评。我们并没有处理好依赖管理的社区进程。Go的核心团队没有今早和足够的参与这个进程,没有能够引导平滑的落地。作为Go的技术负责人,这是我的责任,我为此道歉。

自从一开始写下"go get",Go核心团队就希望社区能够接手依赖管理方面的事情。Keith Rarick的goven,之后是godep, 还有Matt Butcher'的glide, 已经Dave Cheney的gb,都是达到最终方案中的一步。

2015年春天Jason Buberel调研了这些方案,试图寻找统一各种方案的方法。他收集的信息说明了这些方案的主要问题缺乏在go工具链中的支持,也就是我们现在的vendor机制。
Jason收集的证据让我和Rob Pike相信我们需要增加vendor机制,我们在1.5中作为实验特性添加,在1.6中正式发布。
Daniel Theophanes领导编写了vendor.json的格式标准,以便不同的依赖管理工具能够互相交互。我把vendor作为社区的成功案例写在了go blog中。但是我们没有统一的语言来描述go的依赖关系。

2016年夏天,Gophercon上有有个go包管理的讨论,最终创建了工作小组和顾问委员会。我那时候正在休陪产假,Andrew Gerrand代表Go团队参与。

到11月份的时候,Andrew要去做其他的事情了,我开始参与。工作组一开始就要马上开发一个可使用的单独工具,我想要确保总体的设计能够是的最终良好的集成到go命令中。

2016年12月,我开始给Sam写邮件讨论设计。我希望把版本管理作为go build的一部分,以免用户需要额外的流程。我问他是否这样代价太高。我还写了一个Version SAT问题的文章。
我们还讨论了依赖同一个package多个版本造成的冲突问题,Sam高度评价了cargo(Rust的包管理工具)中的实践。
我们还讨论了和go工具链的集成需要go compile和build的支持,包括改变GOPATH和vendor的语义。
我说虽然最终集成到go中的会和现在的不一样,dep依然有必要继续开发,提供更多的经验。Sam看起来是同意的。

2017年1月,dep要发布时名字改成了hoard,在讨论中我再次提到dep不会简单的集成到go变成go dep或者go hoard。

2017年三月,Sam发邮件给golang-nuts邮件组,带了一个merging into go toolchain的链接。这个roadmap看起来就是要直接把dep 放到go的软件包里。
我在回复中重申了需要修改才能把dep集成到go toolchain,以及对Sam把dep当成了其本应的角色更官方的解决方案的顾虑。
Sam的回复中使用了"official experiment"这个词,我现在依然觉得这个词很合适。一个experiment是用来验证一个假说,获得关于某些东西更多的知识。

2017年6月,我和包管理的工作组分享了一个文档,关于对go工具集成的设想。Sam和其他人帮助我发现了其中的一些缺陷。我现在把它发布在这里。
几天后我和工作组的人见面讨论这个设计。因为Andrew缺席所以我记了笔记给他。我现在把它发布在这里。

我们在GopherCon contributor summit讨论了dep。Matt Farina说我当时说如果我自己去搞能做的更好,我确认我没有(说这句话)。印象里我说的是dep需要修改才能集成到go命令。
讨论的一个主题是关于dep的未来。我再次强调(包管理工作组的)进程是为了更好的理解我们面临的问题,以及最终在go命令中提供平滑的集成。

我认识到集成到go命令需要相当的工作量来修改go命令内部的一些东西,在2017年中期我花了一些时间来实现build cache,在go1.10中发布。build cache让GOPATH/pkg过时了,在版本化的依赖中也不需要这个。
GopherCon之后我休假了,然后又去另外一个项目帮忙,之后回来完成了build cache。build cache能用之后,我就能验证多版本的依赖问题了。这时已经是2017年11月。

11月晚些时候我给工作组发了一份草稿,然后和他们见面了解他们的想法。我那时候还没有写代码,我仍在试图搞明白和go集成应该怎么做。
草稿结尾建议dep支持semantic import versioning。Sam and Peter 争论说修改已经太晚了,dep不做修改,应该集成为go dep。
我想要发表import versioning 的草稿,公开讨论。Sam让我等等,别破坏了他的假期。我同意了。12月开始,Sam和我每周碰两次,讨论go集成的问题。

既然dep不愿意支持import versioning,我直接修改了go命令来验证这个想法。我发现了import versioning和minimal version selection最佳结合的方式,并且实现了它。

2018年1月初我有了一个想要公开讨论的设计,但还没有可以验证好坏的实现。但是Sam 2月3号在FOSDEM有一个关于dep的演讲,我不想事情复杂化,所以我和Sam持续沟通但是没有发布。
2月中旬我完成了可以工作的demo,并且确信设计没有什么大的问题。Sam的FOSDEM演讲也结束了,所以我发布了我的设计和原型实现。炸了。

剩下的事情大家都知道了。设计修正了几个月之后,成为正式的 proposal,被接受,然后实现,然后merge进主干,在1.11中preview。

最初的go get已经有10年了,我们替换了它。我们的目标是创建一个能够为go用户继续服务十年的工具,尤其是在代码规模和开发团队都越来越大的情况下。

Dep是个成功的实验。它验证了在Bundler 和 Cargo中使用的"tag versions, record Boolean constraints, solve with SAT"方式,我也从dep中学到了很多:
(列了很多条从dep学到的东西,这里省略了,感兴趣的自己去看Twitter上的原文)

为什么Go团队说go要支持版本(指sementic import versionging)呢?首先,我们创建了Go,我设计了Go命令。我们要保证的最重要的一件事是一致的愿景,让Go成为Go。愿景的一部分是让开发large-scale软件更容易,包括internet-scale的开源项目。虽然现在说什么方式是最好的还太早,但是我们可以从其他的系统中学习他们不scale的原因,并且避免掉。

无论或大或小,我们有个一修改go的流程:提Proposal。Go核心团队帮助支持重要的点,以符合Go的设计和愿景。我们引导社区的讨论去达成一致。
并不是任何时候社区都能达成一致,这时候Go核心团队来做决定。原则上来说我是最终决定者,实际上Go团队内部会长时间来讨论达成内部的一致。
而Dep从来没有一个Proposal。而Go Module Proposal,受到了社区广泛的欢迎,虽然Sam和一小撮其他人不是这样。我把决定的权利留给其他Proposal的reviewer,他们考虑其中的问题,最终接受了我的Proposal(好吧,谁敢不接受呢)。

Go Module的设计不是完美的,但是他解决了上述的问题,为下一个时代打下了良好基础。我们非常愿意和任何愿意帮助我们的人去改进它。

回顾过去,就像我一开始所说的,我们Go团队没能处理好社区进程,我为此道歉。我们应该持续参与和修正路线,以能够集成到go工具链。

无论如何,我确实钦佩Rust团队的社区参与。为了成功,他们明白关键点并且和社区贡献者全力投入。而在这个进程中,太长的时间我没有做到。

我们让人难以接受的放弃了dep,让Go module看起来是一个巨大的路线修正。整个社区知道结果后非常的震惊,因为我们之前只和包管理工作组的人沟通到了。
我以为我只需要专注在技术细节上面,让工作组的人和社区交流,结果导致了整个社区都认为dep是官方的实现,虽然在我和工作组的沟通中明确表明了不是这样。
回想起来我犯的最大的错误,是没有更广泛和公开的讨论dep的问题,我想让工作组对外用一个声音说话。
看起来我只是和Sam以及工作组的其他人讨论dep和dep集成到go中需要做的事情,但这些都被Sam忽略了,结果是dep无法作为合适的实现集成到go中。
通过各种途径,dep以go包管理的最终方案的名义出现在了大家面前,即使我们早在2016年12月就告诉Sam dep只是过程中的一步,并且是最终会被取代的。
如果公开的讨论,大家的预期可能会不一样。也许还会让dep的设计变得更容易被go吸收和集成。

再次,我为在此期间所犯的所有错误道歉。我从中学到了很多,成功的社区合作需要做什么,不需要做什么。希望后面的进程能够更好的运作。

太长了,简单的总结一下:我有管理责任,我道歉。dep一开始就不是作为官方实现,是个实验,你们想多了。我想要sementic import versioning,dep不支持,所以没法把dep集成到go中。现在我搞了go module Proposal和原型实现(vgo),大家都说好。

下面围观的吃瓜群众纷纷表示你不需要道歉,你干的很好,项目干的比这个差的多的去了。

Matt Farina又发了几条Twitter回应:

首先感谢你公开的分享了这么多的想法。
我想你没有抓到我非常重要的一个点。在Gophercon的包管理工作组会议你说dep代码行太多了,go团队维护不了。这说明了一个问题,Go的问题最终都是Go团队决定的,其他人没有话语权。在你的回复中你说的都是你做的工作,不管过去的还是最近的。关注点都是你和Go团队的工作。导师-徒弟的关系怎么变成让社区参与主导,怎么考虑社区意见?

社区是作为主导者的一份子,还是单纯的产品使用者?依赖管理为什么就不能是一个独立的团队?一个在这个问题上富有经验并且聚焦这个问题的团队。工具和复杂度在膨胀,为什么不能交出一部分主导权给社区?其他的语言都是这么做的。

还有vgo,或者说go module有各种各样的问题,有些你对我承认过的。你快速构思出来的解决方案让事情变得更加复杂,并且对go用户不透明。
vgo和dep都有各自的问题。vgo的问题我和你认可的一些人谈过,他们对此也有顾虑。这些顾虑主要是风格方面的。

Go的问题主要有两个:
1. Go是一个Google提供的产品,其他人可以使用,但是没有话语权。小的高度控制的团队和社区是分离的,嫌隙正在越来越大。
2. 一个新的依赖管理模型(大概值得是import versioning),有不熟悉和没有验证过的问题

Peter Bourgon 在其自己的博客上发表文章"A response about dep and vgo"回应。只摘关键部分

Russ Cox狂发Twitter从他的视角描述了dep/vgo的故事。再去争论历史不是愉快的事情,但是叙述中有一些微妙和重要的事情,这对于我很重要,因为我经历过这些事情,我的记忆和这些叙述不一致。我认为它重要是因为Go团队花了很多时间和精力去推广社区文化,我认为这次事件,虽然有点乱有点复杂,是一个完美的证据证明他们还没有搞清楚正确的方式。有一个精确的历史记录非常重要,这样将来才能够尽量避免再出现类似的问题。

Russ一开始讲了一些历史,我跳过去直接到有争论的地方。

(引用了2017年7月其分享设计文档给工作组,以及在 GopherCon上讨论的Twitter)
当时我也在场,在contributor summit,主持了包管理工作组的多次会谈。我不记得Russ精确的字词了,但是我记得最终的结果。当会议进程过半的时候,Russ来了,他说他现在明白他需要自己去解决问题,他可能刚刚开始搞了或者已经搞了一半了,他希望能够给一些反馈。
明显的印象是,Russ并不打算——至少还没打算——参与到委员会中来,包括我们提供给他的研究成果,以及研究的原型实现dep。Russ有他自己的关于最终方案的理论,他更想自己验证这些理论。这是在第一次委员会和Russ有意义的沟通,当时我们正在为我们最终得到了核心团队的关注而兴奋,保持着谨慎的乐观,结果却是噩耗的开始。
Matt写到:
"我看到 Jess, Sam和其他人发出了一声叹息,低下了头。看起来就好像空气被从房间里抽干了。我非常的沮丧,以至于直接告诉你,这不是正确的对待把时间和努力投入这个事情上的人们的方式。"
我也清楚的记得这个时刻,就像Matt所写的一样。

(引用2017年11月draft提议dep支持semantic import versioning的Twitter)
这绝对是不正确的:委员会没有人想要把dep简单的搞成go dep。我们是提议增加一些子命令的集成,作为初稿以让讨论继续下去,但是我们从来没有坚持在最终产品上加上一个类似于ensure这样的子命令,从第一天开始所有人都清楚这个事情。
确实,我们从一开始就知道深度集成到go中是必要的。我们还知道要需要go命令的作者-Russ的同意才能提出Proposal,所以我们谨慎的把做决定推迟到了Russ参与会谈之后。事实上,我们避免在我们认为是go工具领域做决定,以让将来的集成变得容易。dep提出了很多的初稿,比如ensure,以在Russ缺席的时候工作能够继续下去。
当时关于semantic import versioning我们是有几次讨论,Russ没有能够说服委员会它是必要的,我们也没有一致的同意修改dep支持它。可能这就是他记得的东西。

(文章好长中间关于细节的撕逼跳过去了。。想了解的看原文吧)

(引用关于不可接受的放弃了dep那段Twitter)
这么说是不诚实的。路线的修正也震惊到了所有的包管理工作组人员,因为直到vgo的文章出来之前,我们每个人依然有希望和期望核心团队继续和我们一起工作,以让dep达到可以被接受的状态,而不是提议一个全新的东西。
我们有意谨慎的避免在和核心团队建立更正式的沟通渠道之前,提出一个Proposal。很多dep的开发工作实在(和核心团队)完全没有沟通的情况下进行的。我们——至少我自己——在vgo的文章出现之后,仍然希望Russ和Sam的技术冲突能够解决,并提出一个dep的Proposal。请记住:到那时位置,Russ只有两三次出现在我们的会议中,而这个会议已经进行两年了。
Russ的技术主张我们肯定没有忽视,我们广泛的争论了这些主张。他们只是没有说服Sam和委员会。与其优化那些主张让它们更有说服力,或是与委员会一起找到一个妥协点,Russ决定自己去实现自己的想法,抛开我们自己提出Proposal,并且直到完成之后才告诉我们。必须说明:作为Go的技术负责人,Russ当然有权利做所有的这些事情。但是这样一个项目反映了什么?

(这里再省略一段。。)

当dep委员会成立的时候,我竭尽所能的,让它以及它推进的工作,尽可能的可靠和无懈可击,以保护工作组的信用,工作组成员的声誉,以及产出的产品的有效性。为了代替自核心团队的指导,甚至基本的交流,我们决定:
- 从社区的领袖和专家中征集成员
- 成立一个次级的顾问组支持所有相关的项目
- 花费了半年时间收集用户反馈和进行领域内的研究
- 详细Review了所有其他有意义的包管理工具
- 步调一致的进行设计,目标在所有的主要决策上达成一致
- 所有的一切,都煞费苦心的,公开的记录文档

我们做了所有的这一切,因为我们想要成为社区能够更近一步,解决一直被核心团队忽视的问题的典范。我无法找到比我们比我们所做过的事情更好的事情了。但是结果,这些努力就像我们从来没有做过任何事一样:核心团队最终不参与进我们所贡献的成果上面,而是坚持自己完成,本质上一个全新的重头开始的项目。

我想dep/vgo的结局很好的说明了,虽然Go领导层很乐意接受对issue和无争议的Proposal这样的贡献,但仍然在与大规模的自主自治的贡献者斗争。权利掌握在Google的核心开发团队里。

如果有一天我做关于这个最终失败的项目的演讲,我要在最后放一页幻灯片,上面有一个图,一艘船在岛上失事了,船长说: "你生命的意义就在于警告其他人"。我希望这个故事给别人一个警告:"如果你有兴趣对Go做出大的实质性的贡献,独立的勤奋工作不能补偿你那不是来自核心团队的设计"。

也许一些读者读到这里会说:“Perter,这不是很显然的事情吗”。可能是吧。(没能认识到是)我的错。

Addendum(作者看完在Reddit上的讨论添加的):
这次引发的讨论启发了我。我想我对于发生的事情,有了更好的全景的视角。我认为dep团队和核心团队各自有完全不同的对对话的理解,直到vgo文章的出现让量子态塌缩了。
Dep团队相信dep和之前出现的工具是不一样的,是一个经过研究和详细考虑,社区驱动的最终go依赖管理解决方案。核心团队认为dep和之前的工具本质上是同一类,是他们设计的最终的方案的前奏的一部分。
我相信dep团队很清楚他们的地位,能够从核心团队的表述中能够看出来是处于什么样的地位的。但是明显(dep团队成员)没有能够普遍的理解这个地位,直到为时已晚,直到已经太晚。唉,事后来看是很显然的事情,但是当时谁又能够看得透呢?
点击「阅读原文」,给本文作者点赞

640?wx_fmt=jpeg

关注公众号「码洞」,阅读更多有趣文章

基于Golang的个人博客-goblog 文章目录goblog介绍goblog界面截图goblog技术组件goblog安装部署安装获取goblog源码安装go运行环境安装mysql部署编译并部署goblog运行goblog goblog介绍 goblog基于go语言开发的一个简约版个人博客系统,基于Golang语言编写,后端基于了Beego的web框架,目前具备博文系统最基础的功能模块.基本上是一个拿来即用的个人博文平台,只需要部署一个... 阅读详情

相关推荐

两路半桥LLC谐振变换器软开关Simulink仿真(模拟谐振参数不同、分裂电容)

内容概要:本文介绍了“两路半桥LLC谐振变换器软开关Simulink仿真”资源包,重点在于基于Simulink平台对两路半桥LLC谐振变换器进行高精度建模与动态仿真,特别考虑了谐振参数不一致及分裂电容等非理想工况对系统性能的影响。该仿真模型不仅涵盖了主电路拓扑、软开关实现机制与谐振网络设计,还深入分析了不同参数配置下系统的启动特性、稳态效率、动态响应及软开关条件的满足情况。通过参数扫描与对比仿真,帮助用户掌握LLC变换器的关键设计要素与优化方法,具备较强的工程指导价值和科研教学意义。; 适合人群:电力电子、电气工程及其自动化等相关专业的高校师生,以及从事高频开关电源、新能源变换器、车载充电机等领域的研发工程师和技术人员。; 使用场景及目标:① 掌握两路并联半桥LLC谐振变换器的建模与仿真方法;② 理解软开关技术在提升变换器效率与降低EMI方面的关键作用;③ 分析谐振参数偏差与分裂电容结构对系统均流特性、增益曲线及软开关范围的影响;④ 支持科研项目中的拓扑验证、控制策略开发与故障工况分析; 阅读建议:建议结合Simulink仿真模型与配套说明文档进行学习,重点关注谐振腔参数设置、驱动时序设计及软开关波形观测;可通过调整谐振电感、电容值或引入参数失配,观察系统行为变化,深入理解LLC变换器的稳定边界与优化设计原则。

码农翻身,卧虎藏龙

写公众号是很不容易的,在现在信息爆炸的情况下,好文章也很容易被标题党埋没,在我的知识星球“码农翻身”中,我发起了一个活动:免费给写公众号的球友们做个推广。这个不是互推,...

码农翻身 1111

双向全桥CLLC谐振变换器仿真模型(Simulink仿真实现)

内容概要:本文系统介绍了双向全桥CLLC谐振变换器的Simulink仿真模型,重点阐述了变频控制、闭环仿真及其与多种电力电子拓扑(如维也纳整流器、DAB变换器、图腾柱PFC等)的联合仿真设计。资源包涵盖2.5kW双向全桥LLC、V2G电动汽车充放电系统、三相PFC、多相交错LLC等多种变换器的仿真案例,并深入展示了三电平VIENNA整流器在双闭环PI控制与SVPWM调制策略下,结合上下电容电压差值补偿实现中点电位平衡的先进控制方法。通过仿真验证,该策略不仅有效维持了800V直流母线电压的稳定,还在动态工况下显著提升了电容电压的均衡度,同时保持了较低的输入电流THD,充分体现了SVPWM与中点平衡控制协同优化的技术优势。; 适合人群:具备电力电子与自动控制理论基础,从事新能源发电、电动汽车、工业电源、微电网等领域的研究生、工程师及科研人员。; 使用场景及目标:① 学习并构建高频谐振变换器(如LLC、CLLC)的Simulink仿真模型,掌握其变频与混合控制策略;② 深入理解并应用中点电位平衡、双闭环PI控制、SVPWM调制等核心技术于VIENNA等三电平变换器中;③ 复现高水平期刊论文中的控制算法,服务于科研项目申报、学术论文撰写或工程产品开发。; 阅读建议:该资源为综合性仿真资料库,建议使用者结合自身研究方向(如电动汽车充电、新能源并网)选择对应案例进行精学,重点关注控制策略的设计逻辑、仿真参数的整定方法以及SVPWM与中点平衡的协同机制,并充分利用附带的计算书和参考文献深化理解,以实现从仿真模型到实际工程应用的顺利转化。

从零构建 Dask 自定义集合(Custom Collection):接口协议、核心方法内幕与实战示例

当内置的 `dask.array`、`dask.dataframe`、`dask.bag` 和 `dask.delayed` 无法满足你的领域建模需求时,Dask 允许你定义自己的"集合"(Collection)——只要你的类实现了 `dask.typing.DaskCollection` 协议规定的若干方法,就能免费获得 `dask.compute`、`dask.persist`、`dask.o

gitblog_00031的博客 443

全桥LLC谐振(变频+移相混合控制)变换器闭环仿真模型(Simulink仿真实现)

全桥LLC谐振(变频+移相混合控制)变换器闭环仿真模型(Simulink仿真实现)

薛定谔虚拟筛选实战:如何用PDB文件快速构建受体格点(避坑指南)

本文提供了薛定谔虚拟筛选实战指南,聚焦于如何从PDB文件快速、精准地构建受体格点。文章详细解析了可变残基的理性处理策略、基于配体尺寸的盒子量化设置方法,并分享了高级约束与排除体积的实战技巧,旨在帮助用户避开常见陷阱,提升虚拟筛选的成功率与效率。

weixin_28419039的博客 254

Go 语言的前生今世与介绍

简洁性(Simplicity): Go语言的语法简单直白,结构清晰。语法规则少,容易学习和使用。同时去掉了C++中未使用的复杂功能,就是让你用Python代码的开发效率编写C语言程序代码。可读性(Readability): Go语言追求代码的简洁和可读性。通过格式化标准,命名规范等使代码易于阅读和理解。功能性(Usability): Go语言注重软件工程中的可用性。内置并发、垃圾回收等功能让开发者可以高效编写软件。还提供了完善的标准库和工具。

淘小欣的博客 1521

一文介绍Linux EAS

EAS只在系统负载不重时,即系统中每个CPU的利用率都低于其算力的80%时才被启用,而且选出的最节能CPU只有比线程当前运行的CPU节约能量大于6%时,线程才会迁移到该CPU运行。因此EAS为线程选择最节约能量的CPU来运行的前提条件是很苛刻的,针对重载场景(比如游戏),EAS的功能应该很少被使用起来,针对重载场景的功耗优化,这里可能是一个值得尝试的点。算力(capacity)是CPU调度中的一个基础概念,它反映的是一个CPU的计算能力,是个规格化的值,可以通过读取Android手机的文件节点。

youzhangjing_的博客 1235

Go 1.8中值得关注的几个变化

http://studygolang.com/articles/9298 本文来自:Tony Bai 感谢作者:bigwhite 查看原文:Go 1.8中值得关注的几个变化 在已经过去的2016年,Go语言继在2009年之后再次成为编程语言界的明星- 问鼎TIOBE 2016年度语言。这与Go team、Go community和全世界的Gophers的努力是分

优秀技术文章收录 4845

给新人的储能系统入门图解:从电芯到EMS,一张图看懂BESS里那些‘黑话’

本文通过视觉化拆解储能系统,从电芯到EMS详细解析BESS中的关键组件和行业术语。涵盖电芯参数、模组组装、PCS功能、BMS与EMS分工,以及SOC、DOD等关键运维参数,帮助新人快速理解储能系统的核心技术和应用场景。

weixin_42522964的博客 595

从零开始:使用Python实现基于深度强化学习的柔性车间调度系统

本文详细介绍了如何使用Python和深度强化学习(DRL)构建柔性车间调度系统,特别关注图神经网络(GNN)与近端策略优化(PPO)算法的结合应用。通过实战指南,读者将学习从环境准备、异构图构建到PPO算法实现的全流程,最终实现生产效率的显著提升。

weixin_29074295的博客 245

记一次 golang 实现Twitter snowFlake算法 高效生成全局唯一ID

记一次 golang 实现Twitter snowFlake算法 高效生成全局唯一ID holdno · 2018-05-08 01:34:36 · 430 次点击 · 预计阅读时间 5 分钟 · 34分钟之前 开始浏览     这是一个创建于 2018-05-08 01:34:36 的文章,其中的信息可能已经有所发展或是发生改变。 最近在着手准备一个H5游戏  因为这是我第一次接触游戏这个...

u010412301的博客 1910

vectorCast——Probe point 功能实现故障注入,局部变量打印,断点调试。

选择一个测试用例,选择coverage窗口进行查看。点击edit probe point,如图所示绿色的小圆圈。 选代码中选择需要打断点的地方进行点击。黑色的小圆点都可以选。 点击黑色小圆点,小圆点变绿,表示打断点成功。 此时就可以根据自己的需求在打断点的位置编写一些C语言的命令语句。 点击编译,成功会弹出窗口显示编译成功,失败会在下方报错error,并显示错误的原因。 点击应用保存,选择yes to all就可以了。 点击用例执行就可以看到打断点情况下的执行结果了。

weixin_59334478的博客 2077

golang微信机器人_如何使用Golang从头开始创建Twitter机器人

golang微信机器人by Kofo Okesola 由Kofo Okesola 如何使用Golang从头开始创建Twitter机器人 (How to create a Twitter bot from scratch with Golang) So a little background: I recently picked up Golang and decided to create a...

cumian9828的博客 1024

如何成为一名高级数字 IC 设计工程师(6-7)数字 IC 验证篇:DEBUG 技巧

不懂验证的设计不是好的设计;UVM 验证思维是指导缜密的芯片设计的导师;推荐书籍《芯片验证漫游指南》。

新芯设计的博客 1607

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的体育赛事目标检测系统(Python+PySide6界面+训练代码)

本文详细介绍了一个基于YOLOv5/v6/v7/v8的体育赛事目标检测系统的设计与实现。系统采用先进的深度学习算法,结合PySide6图形界面,实现了对体育赛事中运动员、球类、裁判等多种目标的实时检测与跟踪。本文将全面阐述系统的架构设计、算法原理、训练流程、界面实现以及实际应用效果,并提供完整的代码实现。

YOLO 510

Metrics, tracing 和 logging 的关系

为什么80%的码农都做不了架构师?>>> ...

weixin_34212189的博客 2169

用长tree方式做等长线

1)写一个sdc,把等长线的起点设置成clock source,用于创建create_clock,至于period和waveform等参数随便写即可。然后clock_opt -from build_clock -to route_clock即可。3)在正式cts之前或之后,给自己创建的scenario长tree并don't touch。前面讲过了如何用set_data_check做等长线,这里再讲一下如何用cts的方式做。2)为该clock创建一个新mode,并创建对应的scenario。

m0_61544122的博客 623

推荐几位硬核 Go 大佬

关注菜刀的读者想必都是 Go 语言爱好者。在 Go 这个技术栈,其实有很多不错的原创作者,为社区贡献了不少高质量文章。今天为大家推荐几位我常读的号主,一起来学习吧。小白debug 号主小白,一个从游戏服务端开发转互联网后端开发的打工人。擅长 golang/网络 相关领域,有时硬核图解+分析源码,有时骚话连篇!分享的一系列动图图解的文章非常赞,文风骚气,还可以保存超多表情包...

slphahaha的博客 589

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Go Twitter

发现太正经了blog就写不出来了,比如最近在搞专利,害得我很多东西都不敢写,结果最后也没心情写了。 转念一想既然随便写,何不直接用twitter算了?今天有人竟然通过workingwithrails那个站点找到我,去那边刷新一下个人资料多了好多新功能,什么del.icio.us, twitter都有整合。顺便注册一个twitter吧,id: piggybox。一直以为那是很闲的人才用的,不过...

猪宝斋 333

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

go语言抓取twitter

1. 第一步修改anaconda库, 以获取Search_meta_data ; 2. 调用anaconda, 抓取search数据,略 package anaconda import ( "net/url" ) type Search_meta_data struct { Completed_in float32 `json:"completed_in"` Max_id

云上的日子 2626

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Go 资料

该资料来自《Go 语言编程》一书,在次向该书作者许式伟、吕桂华表示十分感谢。 邮件组  http://groups.google.com/group/golang-nuts 中文邮件组  http://groups.google.com/group/golang-china 服务端开发  http://groups.google.com/group/ecug 官方网站 http:/

u012884711的专栏 540

C++程序员是如何评价GO的

原文:A C++ developer looks at Go (the programming language), Part 1: Simple Features 作者:Murray 翻译:王江平 译者注:此文主要对GO语言的简单语法做了详细描述,并与C、C++、Java作了比较,以下为译文。我正在读由Brian Kernighan和Alan Donovan编写的《The ...

博客 6153

推荐个专注分享 Go 知识的大佬

大家好,我是杨文。很高兴认识大家,也很高兴在这里跟大家介绍自己。我是「Go 夜读」发起人,同时也是「Go 夜聊」的主播之一。Go、TiDB 等多个开源项目的 Contributor。推荐关...

EDDYCJY的博客 1482

学习Go语言第一周的感受

                                                学习Go语言第一周的感受 一、 首先,由于生活中的所需,需要对go语言进行一套系统的学习,下面就是学习过程的几种情况: 1.书籍,主要看了《学习 Go 语言(Golang)》,《go语言编程》这两本适合团队开发中,在较短的时间下,熟悉语言的语法,以及代码举例、思考学习;  《Go语言圣经》这本适合...

IT_model的博客 7万+
上一篇: 《快学 Go 语言》第 6 课 —— 字典
下一篇: 《快学 Go 语言》第 7 课 —— 冰糖葫芦串
codehole_
博客等级 码龄7年 34粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值