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框架,目前具备博文系统最基础的功能模块.基本上是一个拿来即用的个人博文平台,只需要部署一个... 阅读详情

相关推荐

改进差分进化算法及其求解柔性作业车间调度问题(Python代码实现)

内容概要:本文系统探讨了改进差分进化算法在求解柔性作业车间调度问题中的应用,并结合Python代码实现,展示了该算法相较于传统方法在全局搜索能力和收敛速度方面的优势。研究不仅聚焦于算法本身的改进策略,如变异、交叉和选择操作的优化,还深入分析了其在复杂制造环境中应对多目标、多约束调度问题的有效性。文中通过标准测试实例验证了算法性能,并与其他智能优化算法进行了对比分析,体现了其在实际工程应用中的潜力。此外,文档还关联了多无人机路径规划、电力系统状态估计、微电网优化、图像与信号处理等多个前沿技术领域,展现了智能优化算法在跨学科工程仿真与决策支持中的广泛适用性。; 适合人群:具备一定编程基础和工程背景,从事智能制造、自动化、工业工程、电气工程、控制科学与工程、计算机科学及相关领域的科研人员、高校研究生及企业研发技术人员。; 使用场景及目标:①为科研工作者提供可复现的智能优化算法代码框架,支持柔性作业车间调度、多无人机协同路径规划、电力系统优化等复杂工程问题的建模仿真;②辅助完成学术论文复现、课程设计、毕业设计或科研项目开发;③推动智能算法在生产调度、能源管理、交通规划等实际场景中的落地应用。; 阅读建议:建议读者结合文中提供的算法原理与代码实现,动手调试并验证不同参数设置对优化结果的影响,同时可参考荔枝科研社提供的完整资源包进行扩展学习与实践,以加深对算法机制与工程应用的理解。

码农翻身,卧虎藏龙

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

码农翻身 1111

复现基于改进秃鹰算法的微电网群经济优化调度研究(Matlab代码实现)

内容概要:本文聚焦于“基于改进秃鹰算法的微电网群经济优化调度”研究,提出一种改进的秃鹰优化算法(IBOA)以解决传统智能优化算法在求解过程中易陷入局部最优、收敛速度慢等问题。通过引入自适应权重、动态搜索机制及种群多样性保持策略,显著增强了算法的全局搜索能力和收敛精度。研究构建了包含光伏发电、风力发电、储能系统、可控负荷及电网交互的微电网群多主体协同调度模型,以系统综合运行成本最小化为目标函数,综合考虑功率平衡、设备出力能力、储能荷电状态、爬坡速率等多种实际约束条件。利用Matlab平台进行仿真验证,并与标准BOA、PSO、GA等经典智能算法进行对比,结果表明所提算法在降低系统运行成本、提高可再生能源消纳率及优化调度效率方面具有明显优势。; 适合人群:适用于具备电力系统基础、优化理论知识及Matlab编程能力的高校研究生、科研人员及从事微电网、综合能源系统优化调度相关工作的工程技术人员。; 使用场景及目标:①用于微电网群或多微网系统的经济调度建模与仿真;②开展新型智能优化算法的设计、改进与性能评估;③支撑含高比例可再生能源的配电系统优化运行决策; 阅读建议:建议结合提供的Matlab代码深入理解算法实现细节与调度模型构建过程,重点分析改进策略对优化性能的影响,并可通过替换场景参数或引入其他算法进行横向对比实验,进一步掌握智能优化在能源系统中的应用方法。【复现】基于改进秃鹰算法的微电网群经济优化调度研究(Matlab代码实现)

从零构建 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

改进-基于新扩展移相角下的双有源桥DAB变换器仿真(EPS调制、软开关、最小应力优化)(Simulink仿真实现)

内容概要:本文系统阐述了基于新扩展移相角的双有源桥(DAB)DC-DC变换器的先进仿真研究,聚焦于EPS调制策略、软开关技术实现及最小应力优化控制目标的协同设计。通过Matlab/Simulink平台构建双闭环控制系统模型,深入剖析变换器在高频隔离、双向功率传输场景下的动态响应特性与效率优化机制。该仿真方案复现了顶级EI期刊研究成果,具备高学术参考价值,并集成于一套完整的电力电子与新能源系统仿真资源体系中,涵盖微电网、PWM整流器、LLC谐振变换器、储能管理等多个关键技术方向,配套完整的仿真代码、设计文档与理论资料,支持深度学习与二次开发; 适合人群:面向电力电子、电气工程及其自动化、新能源科学与工程等领域的研究生、科研人员以及从事高性能DC-DC变换器研发的工程师,要求具备扎实的电路理论基础、电力电子拓扑分析能力及一定的Matlab/Simulink仿真实践经验; 使用场景及目标:①深入掌握DAB变换器的核心工作原理及其在EPS调制与软开关协同下的最优控制策略;②支撑高水平科研论文的复现、改进与创新性研究;③服务于硕士课题、博士研究或企业级新能源变换器产品的前期验证与算法开发; 阅读建议:建议结合文中提供的Simulink模型与引用的权威文献进行系统学习,重点理解控制架构设计、参数整定方法与优化算法实现路径,同时可横向对比其他电力电子变换器案例,拓展系统级工程思维与科研创新能力。

IEPE传感器4mA恒流源接口电路

另外传感器的偏置电压大概在10V多点,一般接个电容把直流分量去掉。这里我们要把恒流源的电流设置在4毫安左右,R1取33Ω差不多正好。经过CR的隔直流电路后的波形是这样的。

老白的博客 6107

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

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

优秀技术文章收录 4844

具身智能数据采集的工程化指南:从时间同步到质量校验

具身智能的模型训练离不开高质量的多模态轨迹数据,而数据采集并非简单的传感器记录。真实场景中,相机图像、机械臂关节状态与力觉信息必须在时间轴上精确对齐,标定的漂移和格式混乱会让看似正常的数据无法用于训练。时间同步与标定一致性,是决定数据质量的核心技术环节。在机器人抓取、操作等工程应用中,一套包含多传感器同步、轻量记录脚本、自动化质量校验与版本管理的数据采集流程,能大幅降低数据生产的失败率。本文从工程视角拆解具身数据采集中的典型问题,并给出可落地的流程设计与校验方法,帮助团队构建可持续迭代的高质量数据集。

weixin_30603633的博客 510

Go 语言的前生今世与介绍

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

淘小欣的博客 1519

Claude Code VSCode集成开发指南:AI编程助手完整配置

Claude Code与Visual Studio Code的深度集成为开发者提供了强大的AI编程支持。本文详细介绍Claude Code VSCode扩展的安装配置、功能特性和实际应用方法。通过完整的配置流程和代码示例,帮助开发者充分利用Claude AI的智能编程能力。文章涵盖从环境搭建到高级功能应用的完整指南,包括代码自动补全、智能重构、实时代码分析等核心功能的使用技巧,以及与现有开发工作流的整合方案。

2501_93058131的博客 5980

FPGA实现16x16点阵汉字滚动显示:Verilog代码与Quartus仿真详解

本文详细介绍了如何使用FPGA实现16x16点阵汉字滚动显示,包括Verilog代码设计、Quartus仿真及硬件连接技巧。通过字模数据存储和扫描控制逻辑,实现汉字的动态显示效果,并提供了优化建议和常见问题解决方案,适合FPGA开发者和硬件爱好者学习参考。

weixin_29172963的博客 350

记一次 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

ARM Cortex-M系列授权解析:从研发到量产的免费与付费之路

本文深入解析了ARM Cortex-M系列内核从研发到量产过程中的授权模式。研发阶段可利用ARM DesignStart等免费资源进行原型验证,但产品商业化量产则需支付授权费与版税。文章对比了采购商用MCU与自研芯片的成本差异,并探讨了RISC-V作为免费替代方案在IoT领域的应用前景与挑战,为开发者提供了清晰的选型指南。

weixin_29292431的博客 493

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

SIMetrix教程-001.SIMetrix软件简介与安装

  由于某些原因需要用到SIMetrix仿真软件,然而网上的资料并不是特别多,故在此记录一下这款仿真软件的学习过程,也给有需要的人提供一些参考,免走弯路。如果使用过Pspice或者LTspice软件,学习SIMetrix会很容易入门,仿真软件都是大同小异的,会一样后都可以快速入门其他软件。   SIMetrix是一款以SPICE模型为基础的仿真软件,集成了SIMetrix和SIMPLIS两款内核,为工程师提供了可靠的、易于使用的、并完美结合了速度与精度的电路仿真方式。官方的话不多说,和LTspice一样,优

gaoyong_wang的博客 2万+

量化交易新手入门:从零开始搭建你的第一个Python交易策略(附完整代码)

本文为量化交易新手提供从零开始搭建Python双均线策略的完整指南,涵盖环境配置、数据获取、策略实现及风险管理等关键步骤。通过详细的代码示例和实践建议,帮助读者快速掌握量化交易的核心技术,并避免常见陷阱。文章特别强调Python在量化交易中的技术革新优势,适合希望进入金融科技领域的初学者。

weixin_26905487的博客 443

Metrics, tracing 和 logging 的关系

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

weixin_34212189的博客 2169

指纹对抗指南:如何绕过Cloudflare与Akamai的5s盾与浏览器指纹检测

现在的CDN反爬技术虽然越来越强,但是道高一尺魔高一丈,只要掌握了指纹伪造、流量伪装、行为模拟这些核心技术,就可以绕过绝大多数的防护措施。对抗过程中要注意效率和成本的平衡,小规模爬取用Playwright+stealth最方便,大规模爬取用curl_cffi+代理池性价比最高,遇到验证码用打码平台或者自动识别服务,不需要死磕破解。本文介绍的方案已经在实战中验证过,可以绕过95%以上的Cloudflare/Akamai防护,成功率非常高。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 295

推荐几位硬核 Go 大佬

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

slphahaha的博客 588

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

学习Go语言第一周的感受

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

IT_model的博客 7万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

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

EDDYCJY的博客 1482

Go Twitter

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

猪宝斋 332

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

云上的日子 2623

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
上一篇: 《快学 Go 语言》第 6 课 —— 字典
下一篇: 《快学 Go 语言》第 7 课 —— 冰糖葫芦串
码洞
博客等级 码龄10年 41粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值