我和Google的故事 (2012-08-10 02:58:52) (王垠 blog)

王垠的解释器学习材料 王垠虽然疯了,但是他写的解释器教材还是引入的蛮好的。 阅读详情
我和Google的故事 (2012-08-10 02:58:52)
分类: 杂谈
也许有人看见过我批判 Google 的那篇英文文章。它好像有一部分片面性,所以被我从英文博客上拿下来了。我一直在反思自己在 Google 的经历,因为在这个公司工作总是感觉不对劲,但是却总也说不清楚为什么。也许现在用自己的母语,我可以得出一个准确一点的结论吧。


受命于危难

先说说我的项目是怎么开始的吧。当我加入的时候,我的老板 Steve Yegge 的小组试图制造一个跨语言的“服务式”编程工具,叫做 Grok。你可以把它想象成 Eclipse 和 Visual Studio, 但是 Grok 的设计目标不只是检索和分析本机的某一种语言的代码,而是大规模的检索和分析 Google 的所有项目,所有语言,所有代码。这包括 Google 的“四大语言”:C++, Java, JavaScript, Python,一些工具性的语言:Sawzall,protobuf 等,还有一些“build file”和所有第三方的库。Grok 的初期设计目标是一个静态的代码索引服务,只要程序员点击任何一个变量或者函数名,就能“准确”的跳转到它定义的位置。动态的编辑功能稍后也在陆续加入。

这种检索不是像 ctags, etags 那种简单的正则表达式匹配,而是像 Eclipse 和 Visual Studio 那样的准确的“语义检索”,所以它必须真正的理解程序语言的语义。在 Grok 诞生以前,市面上和 Google 内部都没有一个工具能正确的支持所有“四大语言”,所以我不得不说,Steve 的项目比起 Google 的其他程序语言相关的项目是相当先进的。

虽然 Grok 的技术含量挺高,但是 Google 的管理层对东西的评价并不是看技术含量的,而是看你有多少“影响力”(impact),说白了也就是有多少用户。Google 当时本来就只有不到一万个程序员,一个“内部编程工具”能有多少“用户”呢?所以 Grok 比起像 CodeSearch 一类利用正则表达式来查询程序的“低端”项目来说,在管理层心目中并不占任何优势。而且由于其它项目界面好看些,用户多些,Grok 随时有被取消的危险,这使得 Steve 心理压力很大。我就是在这个“危难关头”进入他们的小组的。我当然没蠢到会自己进入这样一个组,但是 Steve 在电话面试时把一切都说得很美好的样子。当时小组里只有三个人:Steve 和另外两个组员。


恐惧和疑惑

当我开始的时候,Grok 小组已经初步完成了 Java 和 JavaScript 的检索模块。但是他们的检索并不是自己设计的,而是从 Eclipse (JDT) 和 JSCompiler (开源后叫 closure compiler) 里面分别“挖取”了对 Java 和 JavaScript 语义检索的部分,修改之后插入到项目里的。Eclipse 的设计非常的不模块化,以至于项目进行了一年多,大家还在忙着解决它带来的各种 bug。

最开头的时候 Steve 给了我两个选择:检索 C++ 或者是 Python。我觉得 C++ 的设计太繁琐,所以就选择了看起来好一点的 Python。Steve 就让我去找一个开源的 Python IDE,然后把里面的语义检索部分挖出来插入到项目里面。可是在看过十个左右的“Python IDE”之后,我发现它们没有一个能够正确的“跳转到定义”。分析其原因,是因为这些 IDE 基本上做的是正则表达式匹配,而完全不理解 Python 的语义。所以我对 Steve 说,我要自己从头写一个。但他反对这个提议,因为他觉得这是三个月的时间之内不可能完成的。不但是我不能,而且就算一个小组的人也不可能完成。就算完成了,他也不想“维护”这些代码。所以他宁愿让我去拿一个不怎么样的开源项目,因为这样“维护”的工作就转嫁到开源项目身上去了。

可是我很清楚的看到,这样一个语义检索,不过是一个抽象解释器 (abstract interpreter)。写解释器是我很在行的,所以我告诉他这是我可以完成的,而且由于设计上的简洁,我的代码的维护代价会比使用一个开源项目小很多。他没有说话。我同时也在进行一些内部培训,看一些视频,折腾 MapReduce 一类的内部工具教程,就这样过了一个星期。我隐约的感觉到 Steve 的不快,因为他不怎么说话了,可是也没有太在意,仍然傻乎乎的到处凑热闹。到了周五的时候,Steve 下午很早就回家了。另一个组员还待在哪里,闷声闷气的。我对她说:“Steve 是不是不高兴了?我知道我说话有点太自信,可能打击到他了。”她好像打满的气球被开了一个孔:“他怎么会被你打击到?你知道他以前做的项目有多厉害吗?他是怕你做不出来。之前有一些 intern 设的目标太高,以至于到最后没有完成他们的项目。你知道我们以前一个类似的项目 JSCompiler,花了多少时间才完成吗?一个小组的人,四年的时间!”于是她打开 Eclipse,把一块代码给我看:“看这一个文件就有 9000 多行代码。你三个月能写出这么多代码吗?”我翻了一下白眼,搞笑似地说:“啊~ 怎么可能有 9000 多行?这些人真的知道怎么写这种代码吗……”

后来具体的对话我忘记了,但是她说得那么战战兢兢的,确实给了我一些压力。再加上 Steve 那个闷声子,真是不好受。所以那个周末我没有出去玩,我下载了一个 Jython,把它的 parser 文件 (ANTLR) 拿出来。自己设计了一个更简单的 AST 数据结构,把这个 parser 生成的 AST 转换成我的结构。然后就开始在上面写一个抽象解释器。由于 Java 的限制,我想出了一个更简洁的用 Java 实现解释器的方法,从而避免了使用繁琐的 visitor pattern。一个周末之后,我做出了一个基本的原型。当然因为 Python 语言的复杂性,有很多细节的东西到后来才完全的实现。

等到星期一的时候,我告诉 Steve 我做了一个原型出来,而且因为我拿了 Jython 的 parser,我们以后可以用这个理由把这代码 merge 回 Jython,给他们提供功能,让他们帮我们维护代码,对两方都有好处。他居然一点也不高兴,把我叫到一个白板前面,板着脸说:“你知道我为什么担心吗?我怕在你离开四个月以后,我还在跟别人说,我仍然在改正我的 intern 代码里的 bug!来,给我讲一下你打算怎么做。”我就画了一个 AST 的类关系图,在每个类插入一个叫 interp 的方法,然后指出这个东西就是一个解释器。最后他豁然开朗了一样,说:“好。我相信你知道你在干什么了。就这样做吧。”


陌路

在 Google 的整个夏天,我都觉得跟其他人没有共同语言。我感兴趣的东西,他们一点都不了解,所以我也不想谈。我觉得不以为然的一些东西,却被捧上了天。总体感觉就是过度“和谐”,像是回到了小学。每个人都像是“祖国的花朵”,对 Google 的一切都赞不绝口。你本来有时不想笑,不想说好话,身边的“社会压力”却让你不得不满脸堆笑,所以很累。没有人说真话,以至于你不知道到底什么好,什么不好。

人们总是喜欢谈论一些人的显赫“地位”,传说他们如何的“牛”。比如,有一次几个人在谈论一个 Google 的“牛人”,说他做了一个多么了不起的项目,很快就升为了 Staff Software Engineer (“Staff”是比“Senior”高一级的职位,Steve 就是个 Staff)。我去看了一下这项目,发现不过就是 JUnit 的“C++ 版本”。JUnit 这东西技术含量本来就是相当低的,做这样一个东西就能当“Staff”,那我岂不是轻而易举就可以成为“Principal”了?哈哈。我心里这样想,但是没有说出来。一个 Staff 就如此,谈到 Google 的两个创始人的时候,有些人就简直是黑白不分了。对他们的各种武断的甚至不讲理的做法,居然都津津乐道。创始人在他们眼里俨然就跟皇帝一样,他们做什么都是对的。甚至有人以自己的办公室在创始人办公室的正下方为豪。这种浮夸和互相吹捧之风,恐怕是在其它公司也少见的。Google 要求员工们保持一种“Googley”的态度,原来就是这样的态度,过度的“正面”和“积极”。美国所崇尚的“个人主义”和“批判性思维”,在 Google 貌似高度缺乏。

另一些时候,我会遇到一些对某种语言或者技术有宗教情绪的人。有一次吃午饭,一个工程师主动坐到我面前,像是在面试我一样,正儿八经的开始自我介绍,后来我们就谈到 C++。我说 C++ 设计实在是太繁琐了,其实很多简单的语言效率并不比 C++ 低,C++ 最近其实在向其它高级语言学一些东西…… 后来这人就不说话了。那天以后我就发现跟他打招呼他都不理了。后来我才发现,在 Google 是不可以指出某种语言,特别是 C++ 的缺点的。C++ 在 Google 的“势力”之大,连 Java 都只能算二流货色。

最搞笑的其实是 Google 总喜欢故弄玄虚,把一些微不足道的东西说得很玄乎。很多文档,视频,活动都挂着“Google Confidential”的标签。等你去看了,却发现其实是众所皆知的东西,没有什么机密可言。可是大部分的实习生们却有一种受宠若惊的感觉,以至于产生优越感。每个星期五,都会有一个“TGIF”,两个创始人会像主持人一样组织一个大会。本来无可非议,但是总感觉气氛过于群情激昂了,有点像小学的时候升国旗开大会的感觉。好不容易大家聚在一起,总是在听新闻发布,不然就是谈工作进度,不然就是表彰某些人。总之,你总是感觉在受到某种挑拨,有一种传销公司大会的感觉。大家轻轻松松一起玩的真正的 party,却非常稀少。

由于 Google “免费”提供一日三餐和娱乐,健身设施,你总是感觉欠了公司什么一样,而其实这些钱都是出自你自己的劳动。而且因为这些设施离工作的地方太近,你总是感觉 Google 在你的生活里无所不在,连玩的时候都在想着它。Steve 经常叫几个人出去 Starbucks 买咖啡,我开头还觉得奇怪,因为 Google 有上好的咖啡机。后来才明白原来他们只是想出去换个环境和人气。一些别的公司的人(比如我寄宿房子的主人)也在疑惑,Google 的员工到底有没有下班的时间。

我就是这样度过在 Google 的每一天,以至于后来我都不怎么在饭桌上吃饭了。自己把饭端到靠墙的吧台去吃,或者坐在“冰激凌吧”跟里面的厨师聊天,省得遇到一些高谈阔论的人无语。我发现自己跟打扫卫生的大妈小妹们也谈得来,她们也喜欢跟我说话。后来我发现有这种感觉的不只是我,另外两个比较厉害的博士生也懒的在那边吃饭了。其中一个说他一个星期就把自己的项目做完了,然后假装仍然在做,免得又被增加任务。这就是所谓“能者多劳”吧。掌握了核心技术的人,往往会有一般程序员几十,上百倍的效率,可是得到的“回报”却是更多的任务量和压力。


皇帝的织布工

虽然 Steve “允许”我自己从头做一个 Python 分析器,但这却不是没有压力的。这种感觉就像是“皇帝的新装”里的织布工一样。我扬言自己会做出精美绝伦的布料,皇帝的大臣们却看不见,所以他们就相当的小心。总是对我很敬畏的样子,有时会来问候一下,做得怎么样了。可是一旦扯到深入的话题,却又怕被看穿其实他们不懂很多东西。因为我的教授们研究 Scheme,所以 Steve 有时候也会很激动的表扬 Scheme,或者类似 Scheme 的语言比如 Clojure。这种奉承真的让我受不了,生搬来的术语都是错乱的,所以经常来回两句之后,他就无语了。为什么程序语言总是引起这种宗教的态度,不是抵制就是膜拜?

有一次一个 Staff Software Engineer 来访。看我在做这个 Python 分析器,很鄙夷的样子,说:“你做那个东西干什么。Python 本来是没有类型的,怎么推导得出类型来?我倒希望 Java 的类型推导做得更好一些,不用手写很多类型。”显然他不知道什么是类型推导,他也不知道如何把 Java 的类型推导做得更好。很多人把自己的命运寄托在语言的设计者身上,自己没有能力去改进它们,所以他们才会对程序语言顶礼膜拜。


压力

直到有一天,我才发现 Steve 为什么这么紧张。那天有另一个“分舵”的 director 来访,给我们做了一个关于“创新”(innovation)的演讲。基本内容就是说,技术上的创新,如果吸引不到用户,那就不算什么创新,拉得到用户的东西才叫创新。完全就是扯淡嘛,可是他那个气势真像是在宣布圣旨一样。

那天下午,这个 director 来到我们的办公室。表情严肃的“审问”Steve:“你说你每天有 5000 个用户。可是 Google 总共还不到 10000 个程序员。你是怎么算的?你把接受你的服务的那些下游项目的用户全都算进去了吧!”唉,想不到大名鼎鼎的 Steve Yegge 在这种钦差大臣面前也只能唯唯诺诺。

我可以说,这个 Python 的东西,虽然没有费特别多力气,但却是 Google 里很少有人可以做出来的。所以实际上这个东西在很大程度上拯救了这个濒临灭亡的项目,因为一旦 Grok 支持所有的“Google 语言”,就会有很多人注意到这个东西,从而会有“影响力”。这确实是后来发生的事,我走了之后,Grok 开始通过 API 给很多项目提供服务,包括 CodeSearch。

Google 给我的那点工资,其实是根本买不起这样的软件的。你可以参考一下像 CodeSonar 之类“静态分析”软件的价格,一份基本上就是我三个月的工资。由于我上学想找点外快,让他们捡了一个便宜。可是这种“上级领导”的压力居然也间接的传到了我身上,而且是以一种非常不尊重的方式。这种感觉就是,你做得再多再出色,你相对于 Google 的“大拿”们,什么都不算。这也许就是 Google 为什么雇佣 Dennis Ritchie, Brian Kernighan, Ken Thompson, Rob Pike, Peter Norvig, Guido van Rossum 等大牛吧。因为它就可以说:“看我们 Google 有这些顶尖牛人,你算个什么,要不断努力!”Steve 不止一次的对我说:“你要为 Google 做出杰出的贡献啊!Google 的东西总是最好的,你要做出 Google 一贯的品质来。你知道 Python 的创造者 Guido 也是 Google 的员工吗?我一定会在他面前给你美言几句。” 这种语气,我好像在几十年前的中国听说过呢?“你要为祖国做出杰出的贡献!”他也许以为我会受宠若惊,可是我心里却不是个滋味。

有时候他又会突然把脸一翻,做出一副“博学”的样子,说:“你得把这个问题解决了。不然的话你的 intern 项目就是一个失败的项目!” 其它组员如果看我貌似心情比较轻松,也会不时的提一下:“这个做完了吗?如果这个做完了,你可以做那个。反正我们有的是事情给你做……” 我心里其实在想,说得轻松,你自己来做一下,看看一年之内你做得出来不。总之他们就是用这种奉承,利诱,竞争,加威胁的方式,想方设法让我多做事情。

本来这系统能做出来就不错了,一个组员却一直催着我写 test。她根本不明白,一个程序并不是写了测试就会是个好程序。这个程序经过我多次的大规模修改甚至推翻重来,即使一早写了测试,那些测试也会很快作废。这种大公司给人灌输的“test-driven”编程方式,在这种创造性的程序设计里是根本就是行不通的。要写出这样一个系统,必须全神贯注,深入到语言的本质。而去写测试,往往会打乱原来的思路,所以测试应该是最后完成之后才写的。当我最后完成这个系统,可以大规模的处理 Python 代码的时候,却听见从她的桌上传来一声沉闷的咆哮:“WRITE--THE--TESTS---”这真的非常 Googley!


结果

最后我顺利完成了整个项目,从头到尾都是我一个人设计实现的(除了 Jython 里的 parser)。现在它每天都会把 Google 所有的 Python 代码索引一遍。很多内部工具比如 CodeSearch 里面的 Python 文件上的链接,都是这东西做出来的。我所有的代码加起来才 4000 行。我怎么也想不通为什么他们一个文件就有 9000 行。


总结

这些就是我对 Google 的印象。有好几次我都看到很不错的工程师进入 Google 之后就销声匿迹了,为 Google “默默奉献”,不再有自己的发明创造。我感觉 Google 就是一个埋没人才的机器,而它的“创造性”的名声,却让越来越多的人才被埋没。主动找上门的人才被埋没了不说,还吞并其它公司,并且对他们施行同样的“Google 文化”,埋没更多的人才。

Google 总是号称自己的工程师“build things ground up”,实际上却总是拿一些现成的代码来修修补补,往往耗费更多的时间。当你真的想要“从头”做起,却发现重重的阻碍和压力。

Google 跟其它公司有一个明显的区别就是,Google 不稀罕你,你不被尊重,你活在某些你说不出他哪里牛的“大牛”的阴影下。我没有很多其他公司的工作经历,但是我面试过其它一些公司。也许它们在技术上或者名气上会比 Google 差一些,可是我能感觉到他们对人才的渴望和尊重。所以如果你有很强的能力,何必去 Google 受气呢?无论你走到哪里,那个地方就随你而改进。
程序员职业成长手记:从.NET实践看技术人的三层修炼 程序员成长的本质,不是技术栈的堆叠,而是思维范式与工程心智的持续进化。在.NET这一兼具历史纵深与现代演进的典型技术生态中,开发者得以系统性地经历‘做人→做技术人员→做程序员’的三层递进:从协作边界与认知共情,到技术选型背后的组织适配与风险权衡,再到语法特性在真实Code Review与生产环境中的落地校验。这种以问题为起点、以源码为依据、以人因变量为标尺的反思路径,超越了框架教程与API文档,直指软件工程的核心矛盾——如何让代码既正确,又可持续、可协作、可传承。本文即基于十年持续更新的.NET技术博客实践 阅读详情

相关推荐

数字考古指南:如何挖掘与验证地下音乐资源

在数字时代,信息检索与验证已成为一项核心技能,尤其在挖掘小众文化资源时。其原理在于通过系统化的方法,在海量网络信息中筛选、交叉验证,最终确认资源的真实性与价值。这项技术的价值不仅在于获取稀有内容,更在于培养信息素养和构建个人知识体系。应用场景广泛,从学术研究到文化保存,都能发挥重要作用。本文以地下音乐资源为例,详细介绍了从基础信息核实到音频文件鉴别的完整流程,并融入了 **Discogs** 数据库查询和 **Audacity** 频谱分析等实用工具,为爱好者提供了一套清晰可操作的“数字考古”方法论。

weixin_34111790的博客 429

王垠:我和Google的故事

也许有人看见过我批判 Google 的那篇英文文章。它好像有一部分片面性,所以被我从英文博客上拿下来了。我一直在反思自己在 Google 的经历,因为在这个公司工作总是感觉不对劲,但是却总也说不清楚为什么。也许现在用自己的母语,我可以得出一个准确一点的结论吧。 受命于危难 先说说我的项目是怎么开始的吧。当我加入的时候,我的老板 Steve Yegge 的小组试图制造一个跨语言的“服务式

梦想起航的地方 1741

【十万字拆解】从零开始实现GPT-2(完整版)

本文是一篇 14 万字、从零硬核实现 GPT 的保姆级指南。内容全面覆盖四个阶段:①从最基础的 Bigram 语言模型切入,跑通数据处理与训练闭环;②仿照 Transformer 架构,深度研究 Multi-Head Attention、残差网络、LayerNorm 及 Dropout 的底层数学与代码实现;③从零构建BPE 分词器,对齐 GPT-2 规范;④从头搭建 GPT-1/2 工业级预训练流程,包含混合精度、梯度累积等十余项硬件级工程调优,并在 AutoDL 算力平台上从0开始训练!适合所有层次!

Pi_Nick的博客 1230

王垠

4. 相关链接 王垠的Email:shredderyin@gmail.com 王垠的自建博客:http://www.yinwang.org/ 王垠的新浪博客:http://blog.sina.com.cn/yinwang0 知乎上的[王垠]话题:http://www.zhihu.com/topic/19587684 王垠在IUB的个人主页:https://www.cs.indiana.e

xu_ya_fei的专栏 4304

【OpenCV】复杂场景下的高精度圆检测实战(附完整代码)

本文针对OpenCV霍夫圆检测在复杂场景下易失效的问题,提出了一套基于轮廓分析的高精度圆检测实战方案。通过图像预处理、轮廓发现及多轮几何筛选(面积、周长、椭圆拟合、多边形逼近),有效排除噪声和类圆干扰物,显著提升复杂场景下的检测鲁棒性,并附完整可调参的Python代码实现。

weixin_29095587的博客 200

【读代码】TradingAgents:基于多智能体LLM的金融交易框架深度解析

TradingAgents是由Tauric Research团队开源的创新型金融交易框架,其核心思想是通过多智能体协作系统模拟专业交易机构的决策流程。项目采用模块化设计,整合了LLM、实时数据分析、风险控制等组件,实现了从市场分析到交易执行的完整闭环。

kakaZhui的博客 2004

王垠博客 linux,前段时间花了一个通宵把王垠(Yin Wang)博客的所有文章看完了...

前段时间花了一个通宵把王垠的博客看完了,觉得还是受益匪浅的,所以也给大家谈谈感想。首先说起王垠这个人嘛,最早了解他的是因为他那篇神一般的传教洗脑文章《完全用Linux工作》,虽然后来被喷成狗。这篇文章在国内的Linux圈子里面非常有名,甚至可以说是国内Linux宗教里的一面旗帜了。虽然我不是完全因为这篇文章入的Linux大坑,但是不可否认当时的我也成功被煽动成了一个Linux脑残粉…甚至到了现在我...

weixin_36250058的博客 4497

手把手教你用DLP4500和海康相机搭建双目结构光系统(附完整代码获取路径)

本文详细介绍了如何利用DLP4500投影仪和海康工业相机搭建低成本双目结构光三维测量系统。从硬件选型、软件配置到结构光编码解码实现,再到三维重建全流程,提供了完整的实战指南和优化技巧,帮助用户以不到2万元的预算实现0.05mm精度的三维扫描。

weixin_32447969的博客 317

王垠:我和权威的故事

原文链接:https://www.douban.com/note/747557052/ 文章目录幻觉Donald KnuthUnixGo 语言Cornell(康奈尔大学)图灵奖常青藤联盟和“世界一流大学”程序语言专家逻辑学家再见了,权威们后记(关于 IU) 幻觉 每个人小时候心里都是没有权威的,就像每个人小时候也都不相信广告一样。可是权威就像广告,它埋伏在你的潜意识里。听一遍不信,听两遍不信……直到一千遍的时候,它忽然开始起作用了,而且这作用越来越强。 消灭广告所造成的幻觉,最好的办法就是去尝试,去.

汉密士的博客 2373

Altair HyperWorks 2022.3.0 Suite下载

Altair HyperWorks开发团队提供了新的一流技术,以设计和优化高性能、高效和创新的产品,并发布了HyperWorks 2021.2套件。与所有新版本一样,这个版本包含了新特性、增强功能,并修复了前一个版本中用户报告的各种问题,提供了总体上更稳定的体验。链接: https://pan.baidu.com/s/1rYietmQLQUboHiJzYoE9WQ?pwd=m9yh 提取码: m9yh 复制这段内容后打开百度网盘手机App,操作更方便哦。

weixin_48469365的博客 2129

东方马达步进电机AZM66AK-HS100+AZD-KD调试经验记录

东方马达步进电机AZM66AK-HS100+AZD-KD调试经验记录(20170803YC) 本次总结主要实现的功能如下:用MEXE02软件在步进电机驱动器中设置好控制动作,每个控制动作有一个特定的编号。之后通过PC和驱动器之间的485通讯,发送相关指令,使步进电机按照一定编号的控制动作运转。 参考资料:东方马达步进电机AZM66AK-HS100+AZD-KD的产品手册,可在官网下载。 A....

dahailuoa6的博客 1万+

牛人专题-王垠

我喜欢厉害的人,更喜欢追随厉害的人的脚步,但是我也接受资历平庸的自己,希望能在漫长的岁月里更新迭代,企及厉害的人物的一点点的交集。 其实我是不算很能尊敬网红的,因为我觉得厉害的人当如那些科学家,院士等,不张扬,低调。后来,慢慢的了解后发现,其实就连曾国藩都会因为得失而欣喜,所以那些低调的人,其实也没什么值得称赞的,他们不张扬,更多是性格使然,没有对错,而也会更少的给自己带来麻烦。反而是这些张扬的...

u010338755的博客 1040

ArcGIS 10.8软件安装包免费下载及安装教程

ArcGIS 10.8安装教程

qq_44894692的博客 2万+

尘埃落定!清华才子王垠​加入华为职级 22,前阿里 P10 赵海平加入字节跳动,职级或为 4+...

事件具体来龙去脉,请参见我们之前文章报道:王垠受邀面试阿里P9,被P10面跪后网上怒发文,惨打325的P10赵海平回应了!神仙打架!传言阿里P10赵海平被P11多隆判定3.25离职,如...

Java和Android架构 13万+

HQChart实战教程64-自定义分时图标题栏

分时图标题栏显示的是当前十字光标所在位置的分钟信息,显示在分时图窗口顶部。一般会显示品种的名称,日期,时间,价格,均价 涨幅,成交量,金额等等,hqchart内置会显示这些信息。如果要额外显示其他的字段,就需要通过替换格式化标题输出函数来是现实。我们在hqchart实例创建完成以后,通过OnCreatedCallback回调函数替换自己的格式化输出函数。返回 { AryText:[ { Text:文字, Color:颜色},…入参 data={ Data: 当前十字光标所在位置的分钟线 }

小银 1056

第六部分:VTK进阶(第182章 体素化与隐式建模)

本文系统介绍了基于点云构建有符号距离场(SDF)的核心原理与VTK实现方法。主要内容包括:1)SDF的基本概念与算法原理,通过体素网格隐式表达几何表面;2)关键参数配置指南,如体素分辨率、边界范围和影响半径的选择;3)点云法向估计、SDF计算与等值面提取的完整工作流程;4)常见问题解决方案与性能优化建议。文中提供了详细的C++代码示例,展示从随机点云生成SDF并重建曲面的完整过程,特别强调了法向估计、参数调优和后处理等关键环节。该方法适用于点云表面重建、几何处理等应用场景。

仰望星空的博客 528

【Reading Notes】(10.3)Favorite Articles from 2026 March

是目前很受国内欢迎的国产开源 AI 桌面客户端,它把 DeepSeek、Claude、Gemini、Ollama 等 300+ 模型一键接入,还原生支持 OpenClaw(小龙虾)快速安装,让你几分钟内就能拥有一个“有灵魂”的持久 AI 伙伴——它会记住你是谁、怎么说话、有底线,还能定时干活、管日程、写代码。他展示了一个实验室管理系统,包括数据分析、实验管理、采购等功能。2)网络安全,就是行业笑话:你以为你是在玩AI,其实,你是把GitHub、Slack、邮箱、API key、数据库的全部钥匙,都给了它。

bryant_meng 1059

visio安装包

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

51c深度学习~合集8

方法的完整数学描述略显复杂,如果只是想了解主要思想,可以只看上面 PatchMix的流程图即可(其实只是公式多,每个公式也不复杂,后续有机会做个演示动画,帮助大家理解。这个方法也可以用简单的 Mask 方法实现,但是本方法在大规模图像处理上效率是最高的),对该工作感兴趣的同行可以看一下,我尽量写得清楚一些。结合 PatMix 的流程图,主要过程如下:由于混合图像和混合图像之间,重叠比例的不同,mix-to-mix label 中每一项的权重分数是不同的,根据上图,可以得到权重系数可以表示为。

whaosoft~aiotの开发板商城 2963

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Xcode

在线安装下载地址 https://developer.apple.com/xcode/index.php    下载地址 登录进入 connect.apple.com,就可以看到下载列表 1. 编译时找不到源文件 编译项目时常报如  Undefined symbols: ".objc_class_name_PlacardView", referenced from: li

6769

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

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

Elastic:开发者上手指南

你们好,我是Elastic的刘晓国。如果大家想开始学习Elastic的话,那么这里将是你理想的学习园地。在我的博客几乎涵盖了你想学习的许多方面。在这里,我来讲述一下作为一个菜鸟该如何阅读我的这些博客文章。 我们可以按照如下的步骤来学习: 1)Elasticsearch简介:对Elasticsearch做了一个简单的介绍 2)Elasticsearch中的一些重要概念:cluster,n..........................................................

Elastic 中国社区官方博客 17万+

Android Hilt:依赖注入解耦与 Hilt MVVM 解耦思路

Android Hilt:依赖注入解耦与 Hilt MVVM 解耦思路、@HiltAndroidApp、@AndroidEntryPoint、@Inject、@Binds、@Provides、Qualifier、@InstallIn、@HiltViewModel

OuO-1 的博客 415

Python机器学习:从零基础到项目实战

当您翻开此书,您正踏入一场数据与智慧的修行。机器学习,并非冰冷的符码,而是机器模拟人类洞察世界的法门。本书将带您,以Python为舟,泛游于算法之海。我们不只传授“术”,更探求其后的“道”——从数据的生灭流转中观照规律,于模型的迭代演进里体悟得失。愿您合上书卷时,收获的不仅是驾驭数据的技能,更有一双洞悉复杂、化繁为简的“智慧之眼”。现在,让我们一同启程。

YunWisdom 969

51c大模型~合集110

为了解决这一问题,在稠密化过程中,我们对容易引起退化和梯度集中的具有极端延展率的高斯面片进行了筛选,并对其增殖过程进行了限制,从而在不牺牲性能的情况下有效稳定了训练过程,保障了优化过程的顺利进行。大规模场景的重建往往还意味着显著的训练开销,要重建 1.97 平方千米的区域会产生接近两千万的高斯点,这意味着 4.6G 的存储以及 31.5G 的显存开销,以及超过三小时的训练时长。站在 AI 研究者的角度,得到了《苦涩的教训》,意味着在总结教训的过程中明确了什么是「更好」的。第二类则瞄准了相对复杂的问题。

whaosoft~aiotの开发板商城 2604

脑语言2500单字v1.5.1

如果人和 AI 说同一种语言,文明会怎样?我用 2500 个单字试了试。2500个单字是不同领域、不同知识的共同体,无论你学编程或者是数学或写作,你都要用汉字,而常用的2500个汉字几乎可以涵盖不同行业做的不同事情。

脑语言 2009

王垠:如何掌握程序语言

文章目录前言对程序语言的各种误解如何掌握程序语言几种常见风格的语言从何开始 ?过渡到面向对象语言说明 前言 学习程序语言是每个程序员的必经之路,可是这个世界上有太多的程序语言,每一种都号称具有最新的“特性”。所以程序员的苦恼就在于总是需要学习各种稀奇古怪的语言,而且必须紧跟“潮流”,否则就怕被时代所淘汰。作为一个程序语言的研究者,我深深的知道这种心理产生的根源。程序语言里面其实有着非常简单,永恒不变的原理。看到了它们,就可以在很短的时间之内就能学会并且开始使用任何新的语言,而不是花费很多功夫去学习一个又一

汉密士的博客 1020

江湖一代大佬-王垠

第一次知道王垠,很多年了,对这样的大佬,当然是仰慕已久,也早已动了念头要写写他,今天就聊聊这位大佬。 一、王垠其人 作为IT人,听过王垠这个名字的人应该不是特别多。在王垠身上,光环和争议并存,先来看看他牛逼闪闪的经历: 王垠[yín],四川大学97级本科毕业,保送到清华大学计算机系直博。期间曾在清华大学计算机系软件工程专业就读,主要进行集成电路布线算法的研究。在此期间,他因《完全用GNU/L...

十步杀一人-千里不留行 1万+
上一篇: 关于《完全用Linux工作》的思考
下一篇: 如何掌握程序语言 作者:王垠
Courage_Insight
博客等级 码龄14年 2粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值