JavaSE官方团队成员为何“抛弃”Java,成JavaScript和Node死忠?

游戏“中台”的故事——架构演进、团队协同与产品创新的深度剖析 什么是中台?在游戏行业里,中台并不是把所有技术都归口管理、统一“圈养”。更不是简单的工具集合。它代表的,是一种“模块化底座”——把业务的通用能力、基础支撑和数据结合,变成可复用、可扩展、可创新的技术体系。让“前台”专注于创新玩法、极致体验;让“后台”稳健保障数据、安全、性能;让“中台”统合各种资源、流程、工具,形成平台型生产力。游戏中台是团队协同、技术创新、业务增长并行的产物。它让开发从重复劳动解脱,带着创新冲锋;让运营靠数据说话,精准制胜;让产品实现高效迭代,生态爆发。 阅读详情

在这里插入图片描述
我是前 Sun 公司 Java SE 团队的一名成员,在工作了 10 多年之后——2009 年 1 月——也就是在甲骨文收购 Sun 公司之前,我离开了公司,然后迷上了 Node.js。

我对 Node.js 的痴迷到了怎样的程度?自 2010 年以来,我撰写了大量有关 Node.js 编程的文章,出版了四本与 Node.js 开发有关的书籍,以及与 Node.js 编程有关的其他书籍和众多教程。

在 Sun 公司工作期间,我相信 Java 就是一切。我在 JavaONE 上发表演讲,共同开发了 java.awt.Robot 类,组织 Mustang 回归竞赛(Java 1.6 版本的漏洞发现竞赛),协助推出了“Java 发行许可”,这在后来的 OpenJDK 项目启动过程中起到了一定的作用。我在 java.net(这个网站现已解散)上每周写一到两篇博文,讨论 Java 生态系统中所发生的主要事件,并坚持了 6 年。这些博文的主要主题是关于“保卫”Java,因为总有人在预言 Java 的“死期”。

在这篇文章中,我将会解释我这个 Java 死忠是如何变成一个 Node.js 和 JavaScript 死忠的。

但其实我并没有完全脱离 Java。在过去的三年中,我编写了大量 Java/Spring/Hibernate 代码。但两年的 Spring 编码经历让我明白了一个道理:隐藏复杂性并不会带来简单性,它只会产生更多的复杂性。

Java 是负担,Node.js 充满了乐趣

有些工具是设计师花费数年磨砺和精炼的结果。他们尝试不同的想法,去掉不必要的属性,最终得到一个只带有恰到好处属性的工具。这些工具的简洁性甚至达到让人感到惊艳的程度,但 Java 显然不属于这一类。

Spring 是一个非常流行的用于开发 Java Web 应用程序的框架。Spring(特别是 Spring Boot)的核心目的是成为一个易于使用的预配置的 Java EE 栈。Spring 程序员不需要直接接触 Servlet、数据持久化、应用程序服务器就可以获得一个完整的系统。Spring 框架负责处理所有这些细节,你只需要把精力放在业务编码上。例如,JPA Repository 类为“findUserByFirstName”方法合成数据库查询——你不需要编写任何查询代码,只需按照特定方式给方法命名,并添加到 Repository 中即可,Spring 将负责处理其余的部分。

这原本是一个伟大的故事,一种很好的体验,但其实并不然。

当你遇到 Hibernate 的 PersistentObjectException 时,你知道是哪里出了问题吗?你可能花了几天时间才找到问题所在,导致这个异常的原因是发给 REST 端点的 JSON 消息里带有 ID 字段。Hibernate 想要自己控制 ID 值,所以抛出了这个令人感到困惑的异常。看,这就是过度简化所带来的恶果。除了这个,还有其他成千上万个同样令人感到困惑的异常。在 Spring 栈中,一个子系统套着另一个子系统,它们坐等你犯错,然后再抛出应用程序崩溃异常来惩罚你。

然后,你会看到满屏的堆栈跟踪信息,里面满是这样那样的抽象方法。面对这种级别的抽象,显然需要更多的逻辑才能找到你想要的内容。如此多的堆栈跟踪信息不一定是不好的,但它也是在提醒我们:这在内存和性能方面的开销究竟有多大?

而零代码的“findUserByFirstName”方法又是如何被执行的?Spring 框架必须解析方法名称,猜测程序员的意图,构造类似抽象语法树的东西,生成一些 SQL 语句……那么完成这个过程需要多少开销?

在反反复复经历这样的过程之后,在花了大量时间学习你本不该学习的东西之后,你可能会得出相同的结论:隐藏复杂性并不会带来简单性,它只会产生更多的复杂性。

Node.js 是清流

Spring 和 Java EE 非常复杂,而 Node.js 却是一股清流。首先是 Ryan Dahl 在核心 Node.js 平台上所应用的设计美学。他追求别样的东西,花了数年时间磨练和改进了一系列核心的 Node.js 设计理想,最终得到一个轻量级的单线程系统。它巧妙地利用了 JavaScript 匿名函数进行异步回调,成为一个实现了异步机制的运行时库。

然后是 JavaScript 语言本身。JavaScript 程序员似乎更喜欢无样板的代码,这样他们的意图才能发挥作用。

我们可以通过实现监听器的例子来说明 Java 和 JavaScript 之间的差别。在 Java 中,监听器需要实现抽象接口,还需要指定很多啰七八嗦的细节。程序员的意图的这些繁琐的样板中渐渐淹没。

而在 JavaScript 中,可以使用最简单的匿名函数——闭包。你不需要实现什么抽象接口,只需要编写所需的代码,没有多余的样板。

大多数编程语言都试图掩盖程序员的意图,这让理解代码变得更加困难。

但在 Node.js 中有一点需要注意:回调地狱。

没有完美的解决方案

在 JavaScript 中,我们一直难以解决两个与异步相关的问题。一个是 Node.js 中被称为“回调地狱”的东西。我们很容易就掉入深层嵌套回调函数的陷阱,每个嵌套都会使代码复杂化,让错误和结果的处理变得更加困难。但 JavaScript 语言并没有为程序员提供正确表达异步执行的方式。

于是,出现了一些第三方库,它们承诺可以简化异步执行。这是另一个通过隐藏复杂性带来更多复杂性的例子。

const async = require(‘async’); const fs = require(‘fs’); const cat =
function(filez, fini) { async.eachSeries(filez, function(filenm,
next) { fs.readFile(filenm, ‘utf8’, function(err, data) { if (err)
return next(err); process.stdout.write(data, ‘utf8’, function(err) {
if (err) next(err); else next(); }); }); }, function(err) { if
(err) fini(err); else fini(); }); }; cat(process.argv.slice(2),
function(err) { if (err) console.error(err.stack); });

这是个模仿 Unix cat 命令的例子。async 库非常适合用于简化异步执行顺序,但同时也引入了一堆模板代码,从而模糊了程序员的意图。

这里实际上包含了一个循环,只是没有使用循环语句和自然的循环结构。此外,错误和结果的处理逻辑被放在了回调函数内。在 Node.js 采用 ES 2015 和 ES 2016 之前,我们只能做到这些。

Node.js 10.x 中,等价的代码是这样的:

const fs = require(‘fs’).promises; async function cat(filenmz) { for
(var filenm of filenmz) { let data = await fs.readFile(filenm,
‘utf8’); await new Promise((resolve, reject) => {
process.stdout.write(data, ‘utf8’, (err) => { if (err) reject(err);
else resolve(); }); }); } } cat(process.argv.slice(2)).catch(err =>
{ console.error(err.stack); });

这段代码使用 async/await 函数重写了之前的逻辑。虽然异步逻辑是一样的,但这次使用了普通的循环结构。错误和结果的处理也显得很自然。这样的代码更容易阅读,也更容易编码,程序员的意图也更容易被理解。

唯一的瑕疵是 process.stdout.write 没有提供 Promise 接口,因此用在异步函数中时需要丢 Promise 进行包装。

回调地狱问题并不是通过隐藏复杂性才得以解决的。相反,是语言和范式的演变解决了这个问题。通过使用 async 函数,我们的代码变得更加美观。

通过明确定义的类型和接口提升清晰度

当我还是 Java 的死忠时,我坚信严格的类型检查对开发大型的应用程序来说是有百利而无一害的。那个时候,微服务的概念还没有出现,也没有 Docker,人们开发的都是单体应用。因为 Java 具有严格的类型检查,所以 Java 编译器可以帮你避免很多错误——也就是说可以防止你编译错误的代码。

相比之下,JavaScript 的类型是松散。程序员不确定他们收到的对象是什么类型,那么程序员怎么知道该怎么处理这个对象?

但是,Java 的严格类型检查同样导致了大量样板代码。程序员经常需要进行类型转换,或以其他方式确保一切都准确无误。程序员需要花很时间确保类型是准确的,所以使用更多的样板代码,希望通过及早捕获和修复错误来节省时间。

程序员不得不使用复杂的大型 IDE,仅仅使用简单的编辑器是不行的。IDE 为 Java 程序员提供了一些下拉列表,用于显示类的可用字段、描述方法的参数,帮助他们构建新的类和进行重构。

然后,你还得使用 Maven……

在 JavaScript 中,不需要声明变量的类型,所以通常不需要进行类型转换。因此,代码更易于阅读,但可能会出现未编译错误。

这一点会让你更喜欢 Java 还是痛恨 Java,取决于你自己。十年前,我认为 Java 的类型系统值得我们花费额外的时间,因为这样可以获得更多的确定性。但在今天,我认为代价太大了,使用 JavaScript 会要简单得多。

使用易于测试的小模块来扫除 bug

Node.js 鼓励程序员将程序划分为小单元,也就是模块。模块虽小,却能从一定程度上解决刚刚提到的问题。

一个模块应该具备以下特点:

自包含——将相关代码打包到一个单元中;
强壮的边界——模块内部的代码可以防止外部代码入侵;
显式导出——默认情况下,代码和模块中的数据不会导出,只将选定的函数和数据暴露给外部;
显式导入——声明它们依赖哪些模块;
可能是独立的——可以将模块公开发布到 npm 存储库或其他私有存储库,方便在应用程序之间共享;
易于理解——更少的代码意味着更容易理解模块的用途;
易于测试——小模块可以轻松进行单元测试。
所有这些特点组合在一起,让 Node.js 模块更容易测试,并具有明确定义的范围。

人们对 JavaScript 的恐惧源自它缺乏严格的类型检查,所以可能很容易导致错误。但在具有清晰边界的模块中,受影响代码被限于模块内部。所以,大多数问题被安全地隐藏在模块的边界内。

松散类型问题的另一个解决方案是进行更多的测试。

你必须将节省下来的一部分时间(因为编写 JavaScript 代码更容易)用在测试上。你的测试用例必须捕获编译器可能捕获的错误。

对于那些想要在 JavaScript 中使用静态检查类型的人,可以考虑使用 TypeScript。我没有使用 TypeScript,但听说它很不错。它与 JavaScript 兼容,同时提供了有用的类型检查和其他特性。

但我们的重点是 Node.js 和 JavaScript。

包管理

一想起 Maven 我就头大。据说一个人要么爱它,要么鄙视它,没有第三种选择。

问题是,Java 生态系统中并没有一个核心的包管理系统。Maven 和 Gradle 其实也很不错,但它们并不像 Node.js 的包管理系统那样有用、可用和强大。

在 Node.js 世界中,有两个优秀的包管理系统,首先是 npm 和 npm 存储库。

有了 npm,我们就相当于有了一个很好的模式用来描述包依赖性。依赖关系可以是严格的(指定具体的版本),或者使用通配符表示最新版本。Node.js 社区已经向 npm 存储库发布了数十万个包。

不仅仅是 Node.js 工程师,前端工程师也可以使用 npm 存储库。以前他们使用 Bower,现在 Bower 已被弃用,他们现在可以在 npm 存储库中找到所有可用的前端 JavaScript 库。很多前端框架,如 Vue.js CLI 和 Webpack,都是基于 Node.js 开发的。

Node.js 的另一个包管理系统是 yarn,它也是从 npm 存储库中拉取包,并使用与 npm 相同的配置文件。yarn 的主要优点运行得更快。

性能

曾几何时,Java 和 JavaScript 都因为运行速度慢而横遭指责。

它们都需要通过编译器将源代码转换为由虚拟机执行的字节码。虚拟机通常会进一步将字节码编译为本地代码,并使用各种优化技术。

Java 和 JavaScript 都有很大的动机让代码运行得更快。在 Java 和 Node.js 中,动机就是让服务器端代码运行得更快。而在浏览器端,动机是获得更好的客户端应用程序性能。

甲骨文的 JDK 使用了 HotSpot,这是一个具有多种字节代码编译策略的超级虚拟机。HotSpot 经过高度优化,可以生成非常快的代码。

至于 JavaScript,我们不禁在想:我们怎么能期望在浏览器中运行的 JavaScript 代码能够实现复杂的应用程序?基于浏览器 JavaScript 实现办公文档处理套件似乎是件不可能实现的事情?是骡子是马,拉出来溜溜就知道了。这篇文章是我用谷歌文档写的,它性能非常好。浏览器端 JavaScript 的性能每年都在飞涨。

Node.js 直接受益于这一趋势,因为它使用的是 Chrome 的 V8 引擎。

下面是 Peter Marshall 的演讲视频链接,他是谷歌的一名工程师,主要负责 V8 引擎的性能增强工作。他在视频中描述了为什么 V8 引擎使用 Turbofan 虚拟机替换了 Crankshaft 虚拟机。

V8 引擎中的高性能 JavaScript:

https://youtu.be/YqOhBezMx1o

在机器学习领域,数据科学家通常使用 R 语言或 Python,因为他们十分依赖快速数值计算。但由于各种原因,JavaScript 在这方面表现很差。不过,有人正在开发一种用于数值计算的标准 JavaScript 库。

JavaScript 中的数值计算:

https://youtu.be/1ORaKEzlnys

另一个视频演示了如何通过 TensorFlow.js 在 JavaScript 中使用 TensorFlow。它提供了一个类似于 TensorFlow Python 的 API,可以导入预训练模型。它运行在浏览器中,可用于分析实时视频,从中识别出经过训练的对象。

基于 JavaScript 的机器学习:

https://youtu.be/YB-kfeNIPCE

在另一个演讲视频中,IBM 的 Chris Bailey 讨论了 Node.js 的性能和可伸缩性问题,特别是在 Docker/Kubernetes 部署方面。他从一组基准测试开始,演示了 Node.js 在 I/O 吞吐量、应用程序启动时间和内存占用方面远远超过 Spring Boot。此外,得益于 V8 引擎的改进,Node.js 每次发布的新版在性能方面都有显著的提升。

Node.js 的性能和高度可伸缩的微服务:

https://youtu.be/Fbhhc4jtGW4

在上面的这个视频中,Bailey 说我们不应该在 Node.js 中运行计算密集型的代码。因为 Node.js 采用了单线程模型,长时间运行计算密集型任务会导致事件阻塞。

如果 JavaScript 的改进还无法满足你的应用程序的要求,还有其他两种方法可以将本地代码直接集成到 Node.js 中。最直接的方法是使用 Node.js 本地代码模块。Node.js 工具链中包含了 node-gyp,可用于处理与本地代码模块的链接。下面的视频演示了如何集成 Rust 库和 Node.js:

JavaScript 与 Rust 集成,远比你想象得简单:

https://youtu.be/Pfbw4YPrwf4

WebAssembly 可以将其他语言编译为运行速度非常快的 JavaScript 子集。WebAssembly 是一种可在 JavaScript 引擎内运行的可执行代码的可移植格式。下面的视频做了一个很好的概述,并演示了如何使用 WebAssembly 在 Node.js 中运行代码。

在 NodeJS 中使用 WebAssembly:

https://youtu.be/hYrg3GNn1As

富 Internet 应用程序(RIA)

十年前,软件行业一直热议利用快速的 JavaScript 引擎实现富 Internet 应用程序,从而取代桌面应用程序。

这个故事实际上在二十多年前就已经开始了。Sun 公司和 Netscape 公司达成了共识,在 Netscape Navigator 中使用 Java 小程序(Applet)。

JavaScript 语言在某种程度上是作为 Java 小程序的脚本语言而开发出来的。服务器端有 Java Servlet,客户端有 Java Applet,这样就可以在两端使用同样的一门编程语言。然而,由于各种原因,这种美好的愿望并没有实现。

十年前,JavaScript 开始变得足够强大,可以实现复杂的应用程序。因此,RIA 被认为是 Java 客户端应用程序的终结者。

今天,我们开始看到 RIA 的想法得以实现。服务器端的 Node.js 和两端都有的 JavaScript 让这一切成为可能。

当然,Java 作为桌面应用程序平台的消亡并不是因为 JavaScript RIA,而是因为 Sun 公司忽视了客户端技术。Sun 公司把注意力放在要求快速服务器端性能的企业客户身上。当时我还在 Sun 公司任职,我亲眼看着这件事情发生。真正杀死 Applet 的是几年前在 Java 插件和 Java Web Start 中发现的一个安全漏洞。这个漏洞导致全球一致呼吁停止使用 Java Applet 和 Java Web Start 应用程序。

我们仍然可以开发其他类型的 Java 桌面应用程序,NetBeans 和 Eclipse IDE 之间的竞争仍然存在。但是,Java 在这个领域工作是停滞不前的,除了开发工具之外,很少有基于 Java 的应用程序。

JavaFX 是个例外

10 年前,JavaFX 意欲成为 Sun 公司对 iPhone 的反击。它用于开发基于 Java 的手机 GUI 应用程序,想把 Flash 和 iOS 应用程序打垮。然而,这一切都没有发生。JavaFX 现在仍然可以使用,但没有了当初的喧嚣。

这个领域的所有兴奋点都发生在 React、Vue.js 和类似的框架上,JavaScript 和 Node.js 在很大程度上要得益于此。

结论

现在,开发服务器端应用程序有很多选择。我们不再局限于“P”开头的语言(Perl、PHP、Python)和 Java,我们还有 Node.js、Ruby、Haskell、Go、Rust 等等。

至于为什么我会转向 Node.js,很明显,我更喜欢在使用 Node.js 编程时的那种自由的感觉。Java 成了负担,而 Node.js 没有这样的负担。如果我再次拿起 Java,那肯定是因为有人付了钱。

每个应用程序都有其真实需求。只是因为个人喜欢而一直使用 Node.js 也不见得是对的。在选择一门语言或一个框架时总归是有技术方面的考量的。例如,我最近完成的一些工作涉及 XBRL 文档,由于最好的 XBRL 库是用 Python 实现的,所以就有必要学习 Python。

欢迎工作一到五年的Java工程师朋友们加入Java技术交流:611481448
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

喜欢小编轻轻点个关注了哦!

YOLO26涨点改进 | 小目标损失函数独家改进篇 | TGRS 2025 | 引入AdaFocalLoss损失函数,改进小目标检测,自适应聚焦小目标与样本分布不平衡,提升检测精度与训练稳定性 目录一、前言:YOLO26原生损失函数在小目标检测中的核心痛点(涨点瓶颈)1.1 小目标权重不足,聚焦能力薄弱1.2 样本分布不平衡适配性差,正负样本权重失衡1.3 训练不稳定,易出现梯度消失/震荡1.4 未区分小目标与背景的冗余干扰,误检率高二、TGRS 2025顶刊灵感解析:自适应聚焦损失的核心逻辑三、全网独家创新:AdaFocalLoss损失函数设计与YOLO26适配(核心重点,可复现)3.1 AdaFocalLoss函数整体设计(独家设计,清晰可复现)3.2 各核心模块详细设计(独家创新,可直接复现 阅读详情

相关推荐

LLaMA-Factory全面指南:从训练到部署

LLaMA-Factory项目是一个专注于大模型训练、微调、推理和部署的开源平台。其主要目标是提供一个全面且高效的解决方案,帮助研究人员和开发者快速实现大模型的定制化需求。简化大模型训练流程:通过提供一系列预设的训练脚本和参数配置,降低用户在训练大模型时的技术门槛,使得即使是初学者也能轻松上手。增强模型微调能力:支持多种微调方法,如LoRA、QLoRA等,使用户能够根据特定任务需求对模型进行精细调整,从而提升模型性能。优化推理和部署体验。

全世界的博客 1万+

JAVA与Javascript JAVAEE,JAVASE,JAVAME区别是什么?

在javaScript中,变量的定义和java不一样,java里面要详细指明变量的类型,如:inta;JSP页面中的java代码,首先被解析成对应的Servlet,然后被编译并运行,在服务器端就被执行了;而客户端脚本语言如JavaScript,在JSP被编译的时候,就像普通的HTML代码一样,作为打印信息存在于Servlet中,只有它混合着HTML被传送到客户端浏览器是,才最终被浏览器执行。JavaME包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。

qq_46885456的博客 755

WRF替换静态地理数据中的土地利用数据(WRF替换下垫面数据)

   在进行自己的WRF项目模拟的时候,因为需要用中国土地利用数据替换WRF内嵌老旧的土地利用数据,故需要将土地利用进行替换。我使用的中国的土地利用数据是来自中国土地利用数据(1980-2015)。其中我以下载的lucc1980为例进行演示。 1、坐标转换    (1)下载的lucc1980数据如下图所示:    (2)在ArcMap中打开如下图所示: 打开属性表可以看到,lucc1980的坐标系为投影坐标系Krasovsky_1940_Albers,数据格式为GRID。这里需要将投影坐标系转换成地理坐

GIS 1万+

Java和Node.js的优点区别,Nodejs与Java你选哪一个?

网络上充斥着技术比较,但是为什么我们需要比较呢?我们试图找出编程语言、开发平台、框架、工具和API之间的差异,但原因是什么? 原因很简单——技术的最初选择会造成很大的不同。对于企业主来说,特定技术的使用决定了其产品的性能和增长可能性。对于开发团队,该技术定义了产品支持的易用性和最终迁移到其他平台的无缝性。对于开发人员来说,学习特定技术的决定可能是他们职业生涯中的关键点。 Java V.S. NodeJS 概述 乍一看,我们似乎在比较不能做比较的两样东西,一个是编程语言,另一个是运行环境,风牛马不相及

SUNXIOAJIE的博客 2823

MLX90640 热成像 STM32

MLX90640 热成像

zhaocundang's blog 5008

基于PLC的立体车库控制系统设计

本文介绍了基于西门子S7-1511-1PN PLC和KTP700 Basic PN HMI的立体堆垛式停车场自动化控制系统。系统通过PLC逻辑控制滑台运动,配合传感器实现车辆存取自动化,包含初始化、入库、出库和安全保护程序。程序采用模块化设计,分为安全互锁、动画显示、模式切换等六个功能模块,运用边沿触发、定时器和多级联锁确保安全。HMI界面提供模式切换、车位选择、状态显示和手动控制功能。该系统具有模块化、安全性和可扩展性特点,可应用于多车位立体停车场场景。

sxs3030787796的博客 1266

javaSE--java和JavaScript比较

比较一下 Java 和 JavaSciprt? 1,java和javaScript都是面向对象语言 2,他两除了名字相似之外没有任何关系3,java是一种真正的面向对象语言,不管开发什么程序都要设计对象; 而JavaScript是种脚本语言,主要实现前端页面的交互,比如验证表单,弹窗提醒等等 它是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言,因而它本身提供了非常丰富的内部对 象供设计人员使用。 4,执行环境不一样,java在jvm或者Web服务器执行比较耗费内存,

weixin_54504960的博客 3605

ComfyUI中一个超好用的变量管理类节点-KJNodes

在AI绘图中,ComfyUI的热度开始慢慢起来一些,但是这个软件在使用的过程中,需要很多连线,仅仅一个最简单的动画生成,就需要连接这么多线条,而且有些线会飞的很远,看起来就很不美观,尤其是一些复杂工作流,连接到最后自己可能已经分不太清楚到底连接好了没有。今天在研究C站的大佬们的工作流的时候,发现一个有意思的工作流,看起来大概是这种感觉:干净整洁。他用到了KJNodes这么个节点来管理变量,git上星标也不算很多,所以我想很多朋友可能还不知道,所以这里简单介绍下用法。

聚梦小课堂 7524

从Sun离职后,我“抛弃”了Java,拥抱JavaScript和Node

我是前 Sun 公司 Java SE 团队的一名成员,在工作了 10 多年之后——2009 年 1 月——也就是在甲骨文收购 Sun 公司之前,我离开了公司,然后迷上了 Node.js. 我对 Node.js 的痴迷到了怎样的程度?自 2010 年以来,我撰写了大量有关 Node.js 编程的文章,出版了四本与 Node.js 开发有关的书籍,以及与 Node.js 编程有关的其他书籍和众多教程...

AdleyTales的技术博客 1万+

ZYNQ实战:手把手教你用AXI4-Full IP核打通PL与PS的DDR数据通道

本文提供了一份详细的ZYNQ实战指南,手把手教你创建并使用具备AXI4-Full Master接口的自定义IP核,实现PL(可编程逻辑)通过AXI HP接口直接读写PS(处理系统)的DDR内存。文章涵盖了从Vivado硬件设计、IP核配置、地址映射到Vitis软件验证的完整流程,并深入解析了数据一致性(禁用Cache)等关键要点,旨在帮助开发者掌握ZYNQ异构计算中高效数据搬运的核心技术。

weixin_29193359的博客 284

汇川Easy系列PID_AT指令弹簧质量阻尼系统闭环控制仿真测试

汇川Easy系列PLC系统PID指令(温度控制PID应用编程)

RXXW_Dor的博客 766

java面试之javaSE——java基础(java和JavaScript的区别)

java和JavaScript的区别 可以从四个方面来说: 1、诞生背景:java由sun公司开发,前身是Oak语言;JavaScript由Netscape公司为实现浏览器扩展开发,前身是LiveScript语言。 2、思想:java是面向对象编程,它要求有严格的对象设计;JavaScript是基于对象和事件驱动的编程语言。 3、运行机制:Java是先编译后解释执行的开发语言,而JavaScrip...

qq1354452957的博客 1361

【部署优化篇三】《DeepSeek边缘计算实战:把目标检测模型塞进树莓派,让AI在巴掌大的设备上“开天眼“》

谁说只有超级计算机才能跑AI?今天咱们就要在树莓派上玩转DeepSeek目标检测,让这个巴掌大的小盒子变成会‘看’世界的智能终端!本文手把手教你从零开始,把最潮的目标检测模型塞进树莓派。全程高能预警,建议准备好你的树莓派4B/5和散热风扇,咱们这就开启边缘计算的魔法之旅!

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1306

为什么我这个 Java 死忠倒向了 Node.js?

作为一个在Sun微系统公司Java SE团队工作了十多年的人,难道不应该是体内流淌着Java字节码的血、只要一息尚存就要不断实现抽象接口吗?但对于我这个前Java SE团队成员来说,2011年学习了Node.js平台后就像是呼吸到了新鲜空气一样——我在2009年1月被Sun裁退之后(正好在Oracle收购之前),开始学习Node.js并被它深深所吸引。 我是怎样被吸引的?从2010年起,我就开始写...

java1856905的博客 497

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

深度学习工具包 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")

Java、Javascript、Javaweb三者的区别

首先,我们来说一下java 与 javaweb之间的关系 : 我们平常说的Java一般指Java SE,也就是Java Standard Edition,Java的标准版,一般用来开发桌面应用程序,但是在开发桌面应用程序上相对VB,Delphi,VC++并没有什么优势。 JavaWeb则到了Java EE领域了,也就是Java Enterprise Edition,Java的企业版,看那

MAC--芳 5万+

WINCC7.3破解文件

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

黑马程序员之java,javase,JavaScript,javaee,javaweb的区别。

Java 平台有三个版本,这使软件开发人员、服务提供商和设备生产商可以针对特定的市场进行开发:          1.Java SE(Java Platform,Standard Edition)。Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为 Java Pla

等我到黑马,一切都好说!!! 4823

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

网页设计中JS与Java的区别

在各种网页制作技术论坛中,常常有人询问javascript与Java有什么区别,甚至有人误认为javascript就是Java。javascript与Java确实有一定的联系,但它们并不像我们想象的那样联系紧密,甚至可以肯定地说它们有很大的区别。   什么是JavaScript ?   JavaScript 是对 ECMA 262 语言规范的一种实现。本教程的目的就是引导您学习使用 JavaScr

桂林哈秋 - 我想学编程 6045

Java和JavaScript之间的区别

1.简介 我们将在本文中比较Java语言和JavaScript语言。 JavaScript由Netscape开发。 它最初是用于客户端的脚本语言,后来又用作客户端和服务器脚本的语言。 Java由James Gosling由Sun Microsystems开发。 这些天来,JavaScript在服务器中以node.js的形式使用。 Java和JavaScript之间在程序编码,编译和运行方式方...

最佳 Java 编程 1万+

Go会否给Java带来冲击?

根据最新的数据统计,Java和JavaScript主导了开发者的忠诚度。然而,随着更多的应用程序转移到云上,这种情况可能会发生变化。 当苹果公司和Facebook争相着去推出新的编程语言,以吸引开发者的想象力和创造力时,已经被证明可靠、屡试不爽的java语言作为开发者的首选语言,占据着至高无上的地位,有趣的是,虽然对Java的一般兴趣(以及c#php之类的同行)似乎在一段时间内都在减弱,

Jason's BLOG 2万+

nodejs替代java_像NodeJS一样写Java(一)

六月过了将近2个星期了,马上要期末考试了,就没有多少心情去写一些自己感兴趣的东西了.这个模型是我很早就想去做的,因为网上吹捧NodeJS很过分.貌似到了膜拜的境地,虽然对JavaScript并不是很感冒,但作为圈子里的人,也是要看一下的.所以就有了前一篇文章《初识NodeJS》其中,我就对NodeJS的事件机制有了兴趣,因为从来没有想过代码可以这样写,完全基于事件进行编写,虽然之前在写SWING,...

weixin_39575212的博客 548

javaFX的几个新特性,让swing彻底过时

这是专栏第一篇非Vert.x相关的文章,既然是真全栈,那就要拿出全栈的样子来,从GUI到数据库,从App到NoSQL,我们都要会,而不仅仅是Vert.x,当然Vert.x很好,只是挨踢世界这么大,总有Vert.x覆盖不到的地方,比如今天要说的JavaFX。 首先声明,Java的GUI曾经是最弱的一环,毋庸置疑,而且历史上因为跟M$的斗争,导致Java失去了Desktop发展的最佳时间点,即便

Just do it! 2万+

(翻译)第五回 开始使用JavaFX2.0

原文地址http://download.oracle.com/javafx/2.0/get_started/jfxpub-get_started.htm   如果想用 JavaFX快速开发富用户体验的应用,就好好读本文吧。我们将创建一个简单应用并了解到用少量代码实现复杂图形效果是多么容易。当然了,JavaFX不仅仅只是异常漂亮生动的形状而已。读完本文后去看看样例将大有好处。 Fig...

经过一个过程,然后成为自己 303

Java 已死?听听这些重量级大咖是怎么说的

在 Java 的世界发生了什么事?事实上,很多。Java 9 在 9 月将会来临,Jigsaw 终于获批,而 Java 大咖正在给我们提供关于这一编程语言的未来的有价值的洞察。在这分为 3 部分的访谈系列中,我们阐明了 Java 的发展趋势以及什么语言才是值得尊敬的对手。 Java 哪都没去 在其发布之后的二十年,Java 依然是开发人员的最爱。如果说这门编程语

程序猿开发日志【学习永无止境】 4086

js与java语法的区别对比

数据类型的不同 js常见的数据类型有 ,Number ,bool,null,undefine,string 对象有 object function 数组 (函数和数组都是特殊的对象) js中的对象是用于存储数据的 函数是特殊的对象有对象的特性但是可以执行 数组也是特殊的对象里面的数据有序 js中对象的写法 var obj ={ name:"wanwan...

qq_42756994的博客 859

java于Javascript的关系

java于Javascript的关系,就像是刘德与刘德华的关系 JavaScript 与Java是两个公司挨得特别近, JavaScript 与Java是两个公司开发的不同的两个产品。Java 是原Sun Microsystems公司推出的面向对象的程序设计语言,特别适合于互联网应用程序开发;而JavaScript是Netscape公司的产品,为了扩展Netscape浏览器的功能而开发的一种可以嵌...

weixin_45384029的博客 4264

java11删除javafx,JavaFX正式从JDK中移除

从JDK11的发布开始,JavaFX已经不被包含在JDK中了。在JDK11的release notice中可以看到,当前JavaFX需要单独下载。当前JavaFX新增加了官方网站:https://openjfx.io/,暂时内容都不够丰富,只有JavaFX11运行的简单教程。据介绍,JavaFX 11是在JDK 11的基础上,但又是一个独立的组件。虽然可以通过使用JavaFX SDK或者mave...

weixin_33481663的博客 9428
上一篇: 不理解Zookeeper一致性原理,谈何异地多活改造
下一篇: Java 危矣!统治地位已不复存在?
java1856905
博客等级 码龄8年 100粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值