开源|优酷动态模板研发体系为分发提效30%

基于优酷业务特色的跨平台技术 | GaiaX 开源解读 GaiaX 跨端模板引擎,是在阿里优酷、淘票票、大麦内广泛使用的 Native 动态化方案,本系列文章《GaiaX 开源解读》,将带大家看看过去三年GaiaX的发展过程。 阅读详情

简介:动态模板技术方案将客户端研发链路实现了串联,通过完备的工具化支撑体系,让开发者可以高效完成组件由原始设计稿到可运行代码的最短通路,本文将对研发体系中涉及到的核心模块就行介绍,希望对技术社区及广大开发者有一定帮助。

​作者 | 阿里巴巴文娱技术
来源 | 阿里开发者公众号

一 概述

优酷是一个多屏、多端,以内容分发及内容消费为主体的文娱生态综合体。在内容分发场景,存在大量的客户端开发需求,包括视觉升级、各场景的业务需求迭代、大小屏设备需求同步等,为了降低研发在跨端场景中组件重复开发的技术成本,优酷技术团队于2019年底开始探索跨端动态化研发提效解决方案,经过2年多时间的努力,目前跨端动态化能力已经在优酷各业务场景落地,帮助研发团队在分发业务上实现提效30%左右。
 

​动态模板技术体系以跨端动态化SDK为中心,通过在设计阶段、研发阶段、联调阶段降低对接、开发、调试等核心工作的技术成本,从而真正实现研发提效。目前整个技术方案包括画眉跨平台动效解决方案、智能化设计平台GaiaSketch、跨端模板动态化方案GaiaX、动态模板可视化少代码搭建平台GaiaStudio、辅助调试工具快速预览FastPreview。

​动态模板技术方案将客户端研发链路实现了串联,通过完备的工具化支撑体系,让开发者可以高效完成组件由原始设计稿到可运行代码的最短通路,本文将对研发体系中涉及到的核心模块就行介绍,希望对技术社区及广大开发者有一定帮助。

​二 智能化设计平台 - GaiaSketch

Sketch作为一款优秀的设计软件,目前已经是绝大多数互联网企业设计部门的主要设计工具。与Photoshop相比,Sketch对矢量元素具有更强的处理能力,并且其本身提供了丰富的二次开发接口,具有很强的开放性。

针对标注导出及组件还原两部分日常工作量占比较高的工作,优酷技术团队基于Sketch插件架构体系,研发了自动化标注构建导出、组件代码自动生成以及标准素材库建库等能力。对于设计师来说可以通过插件建立起标准库(包括:组件库、样式库、图标库、页面库),也可以通过插件导出更为简单易用的【标注文件】;对于开发来说,可以通过插件能将Sketch设计稿中的图层导出为代码(GaiaX、React、Rax、Vue、小程序等)。

1 标准素材库

每个组件库由一个或者多个 Symbol 构成,每个 Symbol 按照一定的格式命名后,插件就能读取并可视化展示在插件中,并可将可视化后的组件直接拖拽到 Sketch 设计稿中且与原库保持关联。

​每个 Symbol 的名称遵循着标准的格式命名,名称以 / 连接,比如 Foundation/Bar/TabBar ,导入到插件后,可视化展示的效果如上图所示。

2 标注导出

将Sketch源文件中的画板导出为标注文件供开发使用,导出的【标注文件】具有更好的兼容性、更易用的界面。

​标注导出的产物主要包含两个部分,一部分是标注模板文件,另一部分包括设计稿相关数据信息,比如画板截图,图层数据、切图等。

3 代码导出

将Sketch设计稿中选中的图层导出为选定的语言类型的代码,比如GaiaX模板、React、Rax、Vue、小程序等,导出的代码布局方式基于盒子模型布局(Flexbox)和绝对布局(Absolute);对于节点的层级,【导出代码】会在导出的过程中进行不断的优化,使层级尽可能的少且合理。

​4 开源项目

详见文末[1]。

三 动态模板引擎 - GaiaX

GaiaX是动态模板引擎项目在优酷内部的代号,它是解决跨端组件开发提效方案的关键技术。在项目前期的需求分析阶段,团队从优酷的实际场景和各团队开发中的切实诉求出发,将问题空间定位在组件这个层级,不仅很好的规避了如Weex、ReactNative等技术方案的复杂度和工程量,其次也在根本上让技术方案脱离JS Bridge的老路,保证了端侧的落地性能保障。

1 架构设计

按照分层设计理念共分为4层。基础依赖层坚持最小依赖原则,要重点说明的是,为了保证模板布局计算的高性能,我们引入了由RUST编写的StretchKit高性能布局计算引擎[github.com/vislyhq/str…

​2 总线设计

对于动态模板引擎来说,输入结构化的模板文件,经过文件IO、数据解析、虚拟节点树构建、布局计算、表达式运算、渲染树构建到真实视图树组成了完整的总线链路。

​3 性能表现

​由于动态模板DSL具备严格的标准化和规范化,因此在设计研发交付一体化链路上,GaiaSketch的组件代码导出可直接生成GaiaX动态模板DSL代码,这样,开发工程师可以减少模板框架的从0到1的搭建工作,经过简单的编辑优化,便可完成一个模板文件的构建。

4 开源项目

详见文末[2]。

四 动态模板低代码IDE - GaiaStudio

动态模板引擎可以解决跨端组件渲染的一致性,通过一套统一的DSL对组件布局、样式、数据进行描述,从而实现多端开发的提效。但对于客户端开发来说,类前端的DSL本身存在一定的学习成本,另外,如何编写更加合理、简洁的模板代码,对模板在终端最终的渲染及性能表现都会产生直接的影响。

为了解决上述问题,优酷技术团队在动态模板引擎上线后,着手构建了GaiaStudio动态模板低代码IDE。开发者通过该IDE,可以对模板进行可视化搭建,引擎支持的所有布局及样式属性,都在IDE中进行了内置,开发者只需进行选择,便可用户界面中即可得到渲染反馈。

​1 技术方案

考虑到开发便捷性和后续的跨平台,我们选用了Electron作为底层跨平台方案,用Sematic UI作为CSS组件库,保证在没有设计的情况下,也能够写出比较美观的用户界面。与网页前端对比,Electron有更好的性能、并且可更便捷的实现有手机端的互联互通。

​2 功能简介

​模板创建

模板是GaiaX技术体系的核心介质,也是跨端动态渲染的关键点。模板的构建质量决定了端侧渲染的性能和还原效果。GaiaStudio提供了非常全面的模板管理能力,支持从0-1直接构建一个新的模板,也可通过GaiaSketch导出模板代码的方式,导入到GaiaStduio简化编辑成本。

​模板编辑

模板编辑是模板构建过程中工作量最大的,为了降低开发者的技术成本及对FlexBox的学习曲线,GaiaStudio提供了可视化、参数化的产品功能,即使操作者对FlexBox、CSS了解甚少,也可以快速上手完成一个模板的编辑工作。

对于一个模板,一般来说我们要进行一组完整的编辑处理,才能完成整个构建工作,包括:基础属性、布局、样式、动画、数据绑定。

​模板调试

GaiaStudio的模板调试功能主要有两个功能构成,即模板代码静态分析及模板真机预览(FastPreview)。

  1. 模板代码静态分析可以帮助开发者检查模板代码的语法及合理性,针对如模板命名是否合法、布局设置则、模板嵌套层级等问题实时反馈给开发者,帮助开发者更合理的完成模板搭建。

​2) 模板预览FastPreview,GaiaStudio提供了亚秒级的模板真机预览能力,让开发者可以实时在真机端查看自己搭建的模板的正确性和还原效果,让Native开发也可以具备类似H5、小程序的开发体验。

​3 下载地址

GaiaStudio目前对社区提供通用版本安装包,源码暂时未开源,具体的下载地址在GaiaX开源项目中可获取[3]。

五 跨平台动效解决方案 - 画眉

在客户端开发的日常工作中,存在着大量动效场景需求,如 ToastView 显示与消失、Dialog弹出、按钮的显隐等。当动效设计需求交付给研发后,往往要达到最终的效果,需要经过多轮的走查和调优,归纳起来造成这种结果的原因主要有:1)同一动画,不同的开发人员实现的效果有差别 2)同一动画,iOS 端和 Android 端实现的效果有差别 3)对于曲线动效,设计师无法提供准确参数,实现效果随机性强 4)部分开发人员对系统自带曲线函数不熟悉,会导致降级应用线性或减速曲线,影响动态效果。为了彻底解决端侧动画实现的研发效率及效果保障,技术团队与设计中心共同推出了跨平台动效解决方案-画眉(Motion-curve)。在GaiaX动态模板引擎中,曲线动效的实现也依赖画眉提供基础服务。

1 架构设计

​2 技术方案

iOS端技术方案

SDK 接口层采用 Category 方案,通过 AOP 思想来简化调用复杂度。

CALayer + MotionCurveX 为 CALayer 的所有可动画属性,按照动效曲线能力提供支持,且在动画完成后,无需再次设置目标值。画眉SDK将常用的 7 种动效曲线,进行底层算法实现,使用者只需指定曲线枚举,即可实现标准化的动效。

Android端技术方案

为了降低java调用C的性能损耗,Android端采用差值器Interpolator来实现曲线动效。

3 实现效果

​4 开源项目

详见文末[4]。

六 总结

动态模板研发体系在优酷落地运行后,对设计规范化、设计与研发的对接及视觉还原提效、端侧研发的交付提效来说,都取得了不错的成果。目前优酷技术团队正在对技术方案进行整体开源,希望通过这篇文章的介绍能让大家对该研发体系有一个初步的了解,也希望大家关注优酷技术团队相关的开源项目,一起共建让社区受益。


作者:阿里云云栖号
链接:https://juejin.cn/post/7094538445669793800
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

GaiaX开源解读 | 基于优酷业务特色的跨平台技术 文章会从优酷的业务特色、客户端研发效能的瓶颈问题、提出解决研发效能问题的思路这三个方面分别来进行介绍,带大家进一步了解GaiaX的起源。 阅读详情

相关推荐

已开源 优酷动态模板研发体系为分发提效30%

概述 优酷是一个多屏、多端,以内容分发及内容消费为主体的文娱生态综合体。 在内容分发场景,存在大量的客户端开发需求,包括视觉升级、各场景的业务需求迭代、大小屏设备需求同步等,为了降低研发在跨端场景中组件重复开发的技术成本,优酷技术团队于2019年底开始探索跨端动态化研发提效解决方案,经过2年多时间的努力,目前跨端动态化能力已经在优酷各业务场景落地,帮助研发团队在分发业务上实现提效30%左右。 动态模板技术体系以跨端动态化SDK为中心,通过在设计阶段、研发阶段、联调阶段降低对接、开发、调试等核心工作的技术成

阿里文娱技术 3278

GaiaX模板可视化搭建完全指南:从Studio工具到真机调试的全链路技巧

GaiaX作为一款轻量化、跨平台、高性能的纯原生移动端卡片渲染动态化解决方案,为开发者提供了模板可视化搭建的完整流程。本文将带您从Studio工具的使用到真机调试,掌握GaiaX模板开发的全链路技巧,让移动端动态化开发变得简单高效。 ## GaiaX核心优势与应用场景 🚀 GaiaX动态模板引擎以其独特的优势在移动端开发中占据重要地位。它采用纯原生渲染,保证了高性能和流畅的用户体验,同时支持

gitblog_00142的博客 456

[开源]可视化大数据交互动态模板网页前端模板.zip

代码来源@fanny188 各种统计,大数据图形化展示 html+js+css

阿里巴巴GaiaX:引领跨端动态化新纪元

阿里巴巴GaiaX:引领跨端动态化新纪元 GaiaX动态模板引擎是一套轻量化、跨平台、高性能的纯原生移动端卡片渲染动态化解决方案项目地址:https://gitcode.com/gh_mirrors/ga/GaiaX 在这个高度数字化的时代,应用和网站的快速迭代已成为常态。为了满足这一需求,阿里巴巴优酷技术团队推出了一款革命性的产品——GaiaX动态模板引擎。这款轻量级、高性能且易于集成的解决方...

gitblog_00351的博客 751

ads设计Doherty功放(1)

Doherty功放的设计

qq_40995480的博客 2万+

【软碟通 | UltraISO】刻录光盘教程(制作U盘启动盘)

前言 今天老师说办公室的电脑有点卡,让我给重新安装一个 Windows 7 系统。于是就用软碟通(UltraISO)在 U 盘上刻录了一个 Windows 7 镜像,然后给老师重装了系统。顺便把制作 U 盘启动盘的教程也分享给大家。 软件 UltraISO v9.7.1.3519:点击跳转(密码:dd2k) 教程 将 U 盘插到电脑上,然后鼠标右击选择格式化(制作启动盘必须格式化) 点击文件-打开 选择下载好的系统镜像(如:Windows 7) 点击启动-写入硬盘映像 选择硬盘

XavierJ的博客 2万+

十款开源在线视频播放器

转http://blog.lixiphp.com/10-top-free-opensource-flv-player/ 10 Free Open Source embeddable Video Players,在现在网络中比较流行在线视频播放器,比如优酷、土豆、酷六、六间房、腾讯等都自带有在线视频播放的功能。 今天我就目前收集到的十个开源视频播放器与大家一起分享。 Vcast

fendou4533的专栏 1万+

Delphi开发者必备:CEF4Delphi跨平台浏览器嵌入实战指南(含Lazarus适配)

本文详细介绍了Delphi开发者如何利用CEF4Delphi实现跨平台浏览器嵌入,包括环境配置、Lazarus适配、ARM架构优化及Firemonkey集成等实战技巧。通过Chromium引擎的强大功能,开发者可以轻松为传统桌面应用添加现代浏览器特性,提升多平台开发效率。

weixin_29233333的博客 230

优酷全自研跨平台动态模板引擎重磅开源啦!

动态模板引擎大大提升了优酷的线上用户体验,同时也大大减少了研发门槛。为了和大家交流以及让更多的人享受这一技术,优酷已经将其开源。通过和社区合作,动态模板引擎将会发展的越来越好,实现多赢。前言优酷客户端是一个多平台【Phone、Pad、OTT、MacPC】的文娱生态综合体,为了降低多端产品迭代的开发成本,并提供给用户高性能、一致的产品体验,优酷技术团队在19年底启动了跨平台...

过往记忆大数据 542

104报文解析工具

可选择包含报文的文本文件或日志文件进行解析,可选择按条数范围或时间范围,输出结果可以在报文解析显示区,也可以输出到文件。可以对文本内容的报文文件进行高级分析,包括遥信遥测等通讯数据的具体信息,通讯帧的统计,通讯次数的统计,各种错误的分析,报文的定位功能,传输的文件具体内容等。输入完成后点击工具栏的解析报文按钮或使用右键菜单的解析就可以对报文进行解析。在报文输入区输入待解析报文并解析后,解析结果就显示在报文解析显示区和报文定位展示区及报文定位条目区。当有多条报文解析后,可以通过报文列表树具体定位某条报文。

XZHOUMIN的博客 5952

23种设计模式-享元(Flyweight)设计模式

软考中级-软件设计师 享元设计模式

片言可决讼,半纸能缚龙 3224

Adobe Photoshop CC 中如何改变形状图层颜色

在 Adobe Photoshop CC 中,改变。的颜色可以通过以下简单步骤快速完成。修改形状的填充或描边颜色。

hu5566798的博客 207

华为昇腾开发——多模型资源管理(C++)

在使用Ascend ACL(Ascend Computing Language)的ACLLite库进行多模型推理时,合理的资源管理至关重要。

如果想成为中心,那么就到中心去吧。 577

全球地形瓦片怎么拼成整幅 GeoTIFF:下载、对账、8bit/dem 与 Photoshop 验收

本文详述了在CosearthDesktop中从全球地形图层下载切片、拼接生成连续DEM的全流程。通过设置一致范围与层级,分别导出8bit灰度图与原始高程DEM(GeoTIFF),并附带配准文件,实现高程分析与可视化交付。强调拼接格式选择、文件完整性校验及常见问题排查,适用于GIS分析与三维场景构建。

limit0075的博客 342

【图像处理】德里奇( Deriche)边缘检测器

Deriche边缘检测,同canny算法齐名,因此,知道canny原理,也有必要知道德里奇的检测原理。本篇专门针对德里奇算法展开讨论。

gongdiwudu的专栏 8685

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 301

IEM模型,地表粗糙度模拟

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

第三篇 第 6 课

前置:第三篇第 1 课(stdx 引入),第二篇第 1 课(std.regex)。环境:仓颉 SDK 1.2.0。本文所有代码与输出均逐行实测。

weixin_41618057的博客 524

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 353

信创环境下PageOffice文档控件适配与实践

信创适配做到文档控件这一层,拼的已经不是"有没有国产版本",而是同一个功能在两类终端上是否真的等价。等价的标准很具体:同一次点击能得到同样的结果,同一份公文能得到同样的版式,同一个项目不需要维护两套代码。这背后是三件并不轻松的工作:服务端用一套接口同时支撑两类终端,客户端把两种系统与四种芯片的安装包分发清楚,文档内核层由产品侧跟着 WPS 的版本走。浏览器这一层的压力,则被收进了产品自己的窗口里——升级节奏由产品掌握,不再交给运气。

zi_wu_xian的专栏 328

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 560

Java 集合容器高频面试题全解:HashMap 树化阈值、1.7 死循环与 ConcurrentHashMap 演进(2026 招聘 JD 真题复盘)

HashMap 树化阈值 8 的泊松分布依据、退化阈值 6 的防抖设计、JDK 1.7 头插成环死循环的排查与修复、1.8 尾插后为何仍线程不安全、ConcurrentHashMap 放弃分段锁的原因与 ForwardingNode 协作扩容、computeIfAbsent 死锁陷阱、大集合找重复的场景题选型,附三层追问链自测。题目来源为 38 期公开招聘 JD 样本与字节、拼多多、建行、美团、快手公开面经。

蒙眼过河 421

spdlog 同步日志库使用详解

spdlog是一个轻量级 C++ 日志库,支持同步日志、异步日志、多线程日志、日志文件轮转和自定义日志格式。对于嵌入式 Linux 应用开发,我建议先使用。它可以帮我们完成:日志级别过滤。时间戳和线程 ID 输出。日志格式化。终端和文件输出。多线程安全写入。日志文件按大小或时间轮转。我们不需要自己实现互斥锁、文件写入、日志格式化和轮转等底层功能。

zengjiajun2006的博客 1121

JavaSE通关手册:数据类型与变量

代码无需额外处理,编译时编译器自动完成转换。

xys_678的博客 231
上一篇: 如何高效的阅读最难的JDK源码?
下一篇: 专科出身,2年进入苏宁,5年跳槽阿里,论我是怎么快速晋升的?
JavaAOE
博客等级 码龄7年 27粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值