平台非依赖性建议及使用抽象隔离变化

操作系统第一章四根支柱:抽象、隔离、调度与系统调用 操作系统是连接硬件与应用程序的核心软件层,其本质在于通过抽象屏蔽硬件差异、借助隔离保障安全稳定、依赖调度实现资源公平共享、依托系统调用构建受控交互通道。虚拟内存和进程作为最基础的运行时概念,共同支撑起现代多任务、多用户环境的技术底座;而内核作为所有机制的执行中枢,通过特权级划分与中断驱动,将物理世界不可预测的事件转化为可编程的确定性行为。理解这四大支柱,是掌握Linux进程管理、内存管理、I/O模型及容器隔离等高阶技术的前提,也是调试段错误、上下文切换开销、系统调用延迟等真实工程问题的起点。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 要使程序具有不依赖于平台的特性,在设计的初始就必须考虑如何使程序不依赖于特定平台,并在开发的整个过程中不断对程序的平台依赖性进行审视。 一. 前言: 本文的目的是给出一些建议,这些建议可以帮助开发人员以比较小的代价,使程序运行在多个目标平台之上。 如果程序只运行在特定的平台之上,则不需要使之具有平台非依赖性。但是:1.用户使用多种平台; 2.技术平台本身不断升级; 3.为满足性能或其他方面的要求,软件转移到另一个平台 使得程序可能会在多个平台上运行,或者迁移到新的平台上,因此,不得不考虑这种迁移的代价。 本文的受众是公司内部的全体开发人员,因而所有的环境都是针对公司目前的开发环境的。 由于作者本身的限制,提出的建议不可能具有完善的体系,希望尽我所能对大家有所帮助,如有疏漏错误,还望补充指正。 二. 依赖的平台: 程序运行依赖于:硬件平台、操作系统平台、数据库平台、网络通讯平台、语言平台、java虚拟机平台。上述平台中,语言平台可能是其他平台的组成部分,但是在考虑平台依赖性时,单独的提出来。理论上,开发java程序只与java虚拟机平台有关,但是: 1. 程序编制时不加注意,暴露了本来已经被抽象出的对象。例如:不使用File. separator,而使用特定于平台的文件分隔符“//”。这样,程序不仅依赖与虚拟机,还与特定的其他平台相关。 2. Java虚拟机本身就不能对所有的平台进行抽象。比如,现在已知Sun JRE 和 Symantec JIT(Just in Time Library)与Intel P4处理器不兼容,即jvm与硬件相关;java的线程使用操作系统提供的线程服务,即jvm与操作系统相关;JDBC接口由各个数据库厂商自己实现,通常都不会被完全支持,即java平台与数据库相关;java对字符的处理与本地语言和字符编码相关(java已经尽量减少了这种相关性,详细说明请见第六节),如果语言平台不是国际化的,那么java的国际化和本地化处理就会受到阻碍,即java平台与语言平台相关;我们的应用程序基本上只使用TCP/IP的有线网络,但是应用层的不同(例如http和https)使我们会依赖于网络通讯平台。 第一种情况可以避免,但第二种情况是必须接受的现象,由于java平台本身就与其他平台相关,所以在它之上的应用程序就不可避免的与平台相关了。同时java平台的各个版本有许多不同,在java平台升级时不得不考虑这些不同点。 在这里,特别提出数据库平台需要引起注意。ANSI先后发布了多个关系数据库的标准,众所周知的是SQL92,并于1999年再次更新成SQL99标准。虽然各个开发商都声明支持SQL标准,但是没有一个开发商实现了SQL标准中的全部特性。事实上,各个开发商的实现都与标准相差甚远,如果按照SQL92或SQL99来编写数据库程序,根本就无法在任何一个现实世界中存在的系统中运行。在这种参差不齐的基础上,sun制定了JDBC标准,各个厂商也纷纷宣布支持,但是每个厂商的手册中都会详细说明自己的实现与JDBC标准的差异,因此,你不可能指望在所有的数据库上使用JDBC的大多数特性。 为了使程序具有较好的平台非依赖性,开发人员就必须对各个平台的特性和不同之处有所了解,并在开发过程中不断作出努力。 三. 平台非依赖性的权衡: 当程序从一个平台转移到另一个平台时,程序所具有的平台非依赖性就会产生好处,但是在获得这种好处之前,必须为此付出代价。有时,程序的平台非依赖性会和程序要达到的其他要求产生矛盾。 例如,你可能需要在数据库中执行这样一条语句: select * from table1 where substr(field1, 2, 2) = ‘aa’ 但是并不是所有的数据库都会支持substr函数,有的数据库可能不支持自定义函数,因此,为了获得在不同数据库平台上的可移植性,你只能不使用函数,而只使用数据库的基本特性:select * from table1 ,然后在程序中判断每条记录是否符合substr(field1, 2, 2) = ‘aa’的条件。但这样做将可能增加大量的IO,并使程序更加复杂。 因此,你必须在程序的平台非依赖性和其他环境要求之间作出权衡。为此,需要先确定程序可能运行的目标和范围,在约束条件下考虑程序的平台非依赖性,并尽量考虑未来约束条件可能发生的变化。 四. 处理变化: 当你必须在程序中处理平台非依赖性问题的时候,事情归根结底就变成如何处理变化的问题。我的意思是:正是由于不同平台有所区别,才使得程序可能依赖于某个特定的平台,而要使程序能适应多种平台,你就必须处理不同平台之间的变化。Java平台已经处理了这些变化的大部分,这使得对于java应用程序而言,这些变化中的大部分都是不可见的。然而正如前面所展示的,即便如此,仍然有许多变化需要我们处理,并且只有付出努力,才能使应用程序利用到java平台的优点。 1. 规避变化: 处理变化的一个方法是避开它。如果你的程序代码不涉及到在不同平台上发生变化的部分,那么它就不会受到平台变化的影响。 例如,你可能想编制一个系统管理程序,使用图形用户界面。该程序只有一个对话框,对话框中包含两个按钮,一个是红色,一个是绿色。对话框上还有一行提示:按绿色按钮启动服务,按红色按钮停止服务。但是由于该程序属于后台的系统程序,可能运行该程序的计算机只配备单色显示器,这样的话用户无法正常的使用,因此这时最好的选择是不使用颜色而使用文字区分不同功能的两个按钮。另外,该程序还可能运行在只有字符输入设备的计算机上,为了不依赖于可变的输入设备(鼠标),最好将该程序编制成控制台形式:输入“1. run”启动服务,输入“2. stop”停止服务。 通常,为了回避可能发生的变化,程序应当只使用通用的特性,即不同平台上都具有的一些相同的特性。例如,为了回避数据库平台的变化,就仅使用关系数据库和JDBC的基本能力,例如仅使用简单的语句,尽量不使用较复杂的连接、子查询、集合运算,以及存储过程、扩展函数、触发器等,只使用简单的ResultSet,而不使用可滚动、可更新的结果集。但是回避引起变化的部分,就会受到各种限制,通常在需要实现相对复杂的功能和相对高的性能时,就无法使用这种方式了。 2. 隔离变化: 现在,我们先回顾一下在前言中提出的本文的目的。隔离变化是把变化的部分和不变的部分隔离起来,这样,开发人员就仅需要在程序的一小部分里去适应变化,而大部分代码都不随平台变化而变化,从而降低了实现平台非依赖性的成本。 隔离变化的方法是使用抽象。例如File.separator是对文件分隔符的抽象,在不同的平台上具有不同的值。在Windows操作系统上File.separator=”//”;在UNIX操作系统上File.separator=”/”。这样,File.separator隔离了变化,实现了平台非依赖性。(File.separator是一个static final的类成员,作者认为对它的处理属于编译器,因而是否需要将源代码在目标平台上再编译一遍是个问题,详细请参考附录。)再举一个例子,假如需要更新数据库中的一条记录,被更新的字段是日期类型,在SQL Server中,可以以字符串形式表示: insert into table1 (date1) values('2001-9-11 10:10:10') 而在Oracle数据库中日期不能用字符串表示,因此,需要写成: insert into table1 (date1) values(to_date('2001-9-11 10:10:10', 'YYYY-MM-DD HH24:MI:SS')) 如果使用Statement.executeUpdate(String sql),则必须处理这种变化,对每一种可能的数据库平台使用不同的SQL语句。但是如果我们把更新日期类型的数据库操作抽象成PreparedStatement. setDate,则可以隔离出这种变化,由各个数据库的JDBC驱动来处理变化,从而使程序变得不依赖于特定的数据库平台。 下面以数据库的“select top”语句为例,说明如何在程序中使用抽象来隔离变化。在SQL Server中,select语句可以使用top子句,但是top不是标准的SQL,不被其他数据库所支持,要在其他数据库中实现top子句的功能,就必须使用各个数据库独特的方式。因此,将select top语句抽象出来: public class SelectCode { public static String getSelectCode(String select, int top) { if (top < 1) return select; switch (DBType) { case SQLServer: return SQLServerSelectCode; case Oracle: return OracleSelectCode; case MySQL: return MySQLSelectCode; } } } 假如需要使用这样的SQL语句:select top 10 * from table1 无论使用哪一种数据库,都只需要这样调用: String s = SelectCode.getSelectCode(“select * from table1”, 10); ResultSet rs = stmt.executeQuery(s); 上面的方法有一个问题:就是不见得所有的数据库都可以使用SQL语句来实现select top的功能,因此,为了更广泛的适用性,必须修改类SelectCode,成为下面的样子: public class SelectStatement { public static Collection select (String selectCode, int top) { switch (DBType) { case SQLServer: ResultSet rs = stmt.executeQuery(SQLServerSelectCode); return toCollection(rs, 0); case Oracle: ResultSet rs = stmt.executeQuery(OracleSelectCode); return toCollection(rs, 0); case MySQL: ResultSet rs = stmt.executeQuery(MySQLSelectCode); return toCollection(rs, 0); default: ResultSet rs = stmt.executeQuery(selectCode); return toCollection(rs, top); } } private static Collection toCollection(ResultSet rs, int top) { Collection c = new ArrayList(); int count = 0; while (rs.next() && (top < 1 || count < top)) { Row row = new Row (rs); c.add(row); } return c; } } 通过返回Collection类型的结果,就使不能用sql语句完成select top的数据库也能完成相同的功能。假如需要使用:select top 10 * from table1,则调用修改成: Collection c = SelectStatement.select (“select * from table1”, 10); 当访问数据时,使用下面的语句: Iterator iterator = c. iterator(); while(iterator.hasNext()) { Row row = (Row)iterator.next(); display(row.getString(“content”)); } 上面的方法仍旧存在问题,因为用户除了访问ResultSet中的数据外,还可能需要得到其他信息,比如ResultSetMetaData,这样就需要将Collection类型的数据、ResultSetMetaData类型的元数据和其他信息封装在一起返回。 上面的问题还可以使用代理模式(java提供Proxy类支持该模式)来解决,即给客户提供和ResultSet、ResultSetMetaData等一致的界面,在此,就不详述了。 随着项目的发展,也许程序不止需要select top的功能,还会需要得到从第m条到第n条之间的数据。这时,你会发现select (String selectCode, int from, int to)才是更好的抽象,select (String selectCode, int top)只是它的一个子集,为了适应新的变化,不得不修改所有的接口。因而,在实际开发工作中,只有了解了可能的变化,才能做出合适的抽象。为了适应更多的变化,程序必须具有更复杂的结构,因此需要在灵活性和复杂性之间要作出取舍和权衡,确定程序可能运行的平台范围,以免耗费不必要的工作。 除了select语句外,数据库操作还需要insert、update、delete等。因此,最终的类结构可能如下: public interface DB { public void select(); public void insert(); public void update(); public void delete(); } public class Oracle implements DB { public void select() { 。。。。。。。。。。。 } 。。。。。。。。。。。 } public class SQLServer implements DB { public void select() { 。。。。。。。。。。。 } 。。。。。。。。。。。 } public class MySQL implements DB { public void select() { 。。。。。。。。。。。 } 。。。。。。。。。。。 } public class DBFactory { public static DB getDB() { if(db == null) db = createDB(); return db; } private static DB createDB() { //在这里,有两种可能, //一种是:每个数据库平台上的DBFactory创建一种相应的DB,也 //只部署一种DB类,例如部署Oracle类,程序就写成: // return new Oracle(); //另一种是:处理每一种数据库平台的可能,这样对所有平台的部署//都相同: //switch(DBType) //{ //case Oracle: return new Oracle(); //case SQLServer: return new SQLServer(); //…….. //} } private static DB db = null; } 使用时像这样: DBResultSet rs = DBFactory.getDB().select(“select * from table1”, 1, 1); Handle(rs.getMetaData()); Display(rs.getData()); 五. 结论: 现在,先回顾一下以前的章节。由于平台的变化是我们必须面对的事情,所以我们必须使这种变化带来的负面影响降到最小。为此,我们首先必须了解程序的目标、环境和范围,这是前提,必须在满足前提的条件下做出决定;然后,为了处理变化,我们要熟悉它,了解有那些变化,这些变化的特性是什么;最后,在前提下作出权衡,尽量使用通用的特性来回避变化,使用抽象来隔离变化,使满足约束条件(即前面所说的前提,例如性能、功能,以及平台非依赖性的程度)和减小适应不同平台的代价达到平衡,有时,也许需要适当的降低程序的平台非依赖性来满足这种平衡。 在这里要补充的,却是非常重要的一点是:使程序具有更好的正确性和健壮性将对提高平台非依赖性有很大帮助,让代码中没有任何重复的部分,这样,当平台变化时,即使需要修改,也只需修改一处,从而降低平台变化的成本。而提高平台非依赖性的一个副作用是使程序设计更好,可维护性更高,因为为了适应不同的平台,程序已经进行了抽象。 提高程序的平台非依赖性需要不断适应变化,因而其本身也是一个变化的过程,最后,请回到本文的开头,再审视一下开篇的总论。 六. 讨论Java对提高多语言平台的处理能力所作出的努力: 结论之后,让我们看一下java对适应多语言平台所作出的努力,用这作为例子来思考一下平台非依赖性这个问题。 从jdk1.4起,java.net.URLEncoder类添加了public static String encode(String s, String enc) throws UnsupportedEncodingException方法,而原先的public static String encode(String s)已经作为不被推荐的方法;对应的,java.net.URLDecoder类也添加了decode(String s, String enc)方法。 现在,我们来看一下下面的情况。一款软件由服务器和浏览器端组成,浏览器使用URLEncoder对请求进行编码,然后发送给服务器,服务器解码后进行相应的响应。假设浏览器的使用者是一位位于德国的德语用户,使用encode(String s)进行编码,则相当于使用缺省的语言(德语)进行编码,而服务器位于中国大陆,使用decode(String s)进行解码,即使用简体中文进行解码,最后的结果自然是错误的。因而该软件无法解决不同语言平台的问题。而jdk1.4已经提供了解决这一问题的工具,你可以使用下面的方法:浏览器的编码自然仍旧是使用本地(即德语)编码,而服务器对不同的请求,首先判断客户语言设置,根据客户使用的编码方式,使用decode(String s, String enc)进行解码,在这个例子中就是decode(request, “Deutsch”),这样就解决了跨语言平台的问题。 附:对File.separator和java编译器的讨论 因为File.separator是静态常量,所以java编译器有可能会直接使用它的值(而不是File.separator的引用)编译出类文件,这样的话,在一个平台编译出的类文件就不能直接在其他平台上使用,而必须将源文件在目标平台上再编译一遍。 那么编译器到底会怎么做呢?下面让我们看一下windows平台上的jdk1.4的情况。下面的程序1: import java.io.File; public class test2 { public void test() { String s = “//”; } } 进行编译后,再使用javap反汇编,得到: Method void test() 0 ldc #2 2 astore_1 3 return 然后再对下面的程序2进行编译: import java.io.File; public class test2 { public void test() { String s = File.separator; } } 如果编译器使用静态的File.separator的值来进行编译,那么反汇编的结果就应该和程序1的结果相同,然而实际的反汇编结果是: Method void test() 0 getstatic #2 3 astore_1 4 return 可以发现,编译器使用的是对File.separator的引用。那么说直接把Window平台上编译好的类部署到其他平台上是没有问题的么?我认为并不见得所有的编译器都会有同样的结果,毕竟,jdk编译时的优化可能会产生一些隐藏的危险(详见http://www.5xsoft.com/data/200112/2508270501_1.htm),所以对编译器的了解、谨慎的态度、在目标平台上进行充分的测试才是安全之道。
EduIntro:面向嵌入式教育的轻量级硬件抽象层 硬件抽象层(HAL)是嵌入式系统开发中连接底层寄存器与上层应用的关键桥梁,其核心原理在于通过封装I/O操作、中断管理与外设初始化逻辑,降低软硬件耦合度。在教育与快速原型场景中,HAL的技术价值尤为突出——它能屏蔽MCU架构差异(如AVR/SAMD/ESP32),统一引脚定义与传感器交互范式,显著提升代码可移植性与教学可理解性。典型应用场景包括Arduino初学者实验、物联网教学套件开发及跨平台课程代码复用。EduIntro作为专为教育设计的C++ HAL库,以动词式接口(如button.pressed()) 阅读详情

相关推荐

7、探索运动:编舞技术与符号系统抽象

本文探讨了编舞技术与动作符号系统的抽象发展,分析舞蹈作为表达新思想的探索过程,梳理不同流派的动作演变与编舞知识的传承方式。文章对比音乐符号的发展历程,揭示动作符号化在抽象表示、跨平台应用和商业保护方面的挑战,并通过杰奎尔·奈特等案例展现现实困境。同时,文章指出技术创新、跨领域合作和社会需求为编舞与动作符号化带来的发展机遇,提出未来应建立通用符号系统、推动智能化发展、加强教育与版权保护,以促进舞蹈艺术与动作科学的深度融合与持续进步。

k8s6orchestrator的博客 94

2.1.2 抽象隔离

2.1.2 抽象隔离 在继续关于复合数据和数据抽象的更多的例子之前,让我们考虑一些由有理数例子 产生的一些问题。我们定义了有理数的操作,是用make-rat和numer,denom. 总之,数据抽象的根本思想是为每种数据对象标识出一个基本的操作集合。 这个集合能把那种类型的数据对象的所有的操作都表达出来,然后仅使用 那些已定义的操作来操作数据。    我们能够重审视一下有理数系统的结构。见图2。...

红孩儿编程大师 472

ESP8266与OneNet平台集成使用HAL库进行IoT数据交互

OneNet云服务平台是为物联网设备提供集中管理、数据存储、消息分发和API服务的一个开放平台。该平台不仅为开发者提供了丰富的API接口,还提供了设备管理和数据可视化等服务。其基本架构如下图所示:graph LRA[设备层] -->|上报数据| B[接入层]B -->|数据处理| C[应用层]C -->|API服务| D[开发者/用户]D -->|数据查询和控制| CC -->|数据下发| BB -->|指令执行| A架构由设备层、接入层、应用层和用户层四部分组成。

weixin_42602726的博客 867

依赖在代码中的几种表现形式

1.依赖关系用虚线加箭头表示,依赖关系是五中关系中耦合最小的一种关系 2.依赖关系的三种表现形式(以动物和水为例): (1)Water类是public的,Animal类可以调用它。 (2)water类是animal类中某个方法的局部变量,则animal类可以调用它。代码如下: class Animal { public void Metabolism()

颗粒归仓 4189

【python快速编程入门(第二版)黑马程序员课后编程题】

python快速编程入门(第二版)黑马程序员课后编程题

weixin_46167259的博客 1万+

VXLAN技术详解

VXLAN(虚拟可扩展局域网)是一种Overlay二层虚拟化技术,通过MAC-in-UDP封装在IP网络上构建大规模虚拟二层网络。核心组件包括VTEP(隧道端点)、24位VNI(支持1600万个虚拟网络)和VXLAN网关。相比VLAN,VXLAN具有超大规模扩展、跨三层互联、支持虚拟机无缝迁移等优势,适用于云数据中心多租户隔离、跨数据中心互联等场景。其基于IP路由的封装方式无需改造物理网络,为现代云网络提供了弹性、安全的虚拟化解决方案。

kjkdd的博客 594

1195_SICP学习笔记_抽象数据的多重表示

全部学习汇总:GitHub - GreyZhang/g_SICP: learn SICP and hack lisp. 为了能够让设计有一定的通用性,这里再次强调了抽象隔离。并且,为通用操作引入了一个“范式处理”的概念。而数据抽象以及分层设计的理念,在之前接触到的有理数的计算设计例子算是一个非常有代表的处理例程。 这里引入了一个新的典型问题:复数的表达。类似之前看过的有理数的表达,复数可以表示为两部分:实部和虚部。这样,实部和虚部分别通过一个坐标信息...

小灰笔记 800

手把手教你解决Windows 10网络驱动器无法访问问题(附详细排查步骤)

本文详细指导Windows 10用户解决网络驱动器无法访问的常见问题。通过从现象快速定位到系统排查,提供了从检查网络连通性、修复凭据权限到调整高级设置的完整步骤,特别是针对“找不到网络路径”等错误,帮助用户高效恢复对共享资源的访问。

weixin_29233857的博客 516

空间计量分析全流程详解:如何用SPSSAU处理空间依赖性数据

当我们研究各省GDP增长、区域房价变化或疾病传播模式时,这一假设往往不再成立——北京的经济活动会辐射影响天津,上海的房价波动会传导至苏州,传染病的扩散更是具有明显的空间传播路径。作为地理学与计量经济学的交叉学科,它通过引入空间权重矩阵,将地理位置的相互影响纳入分析框架,从而更准确地揭示变量间的真实关系。SPSSAU的空间面板模块支持主流的面板空间计量模型,并提供相应的检验统计量,方便研究者进行全面的时空分析。空间权重矩阵是空间计量的核心工具,它将抽象的空间关系量化为具体的数值矩阵。

SPSSAU的博客 918

海康VisionMaster全局通信实战:从数据接收到流程触发

本文详细解析了海康VisionMaster全局通信的实战应用,重点阐述了如何通过配置通信模块与编写全局脚本,实现从外部设备(如PLC)接收数据并触发内部视觉流程。文章以TCP/IP通信为例,深入讲解了数据接收、解析、全局变量设置及流程触发的核心代码与调试技巧,帮助用户打通自动化项目中的设备联动关键环节。

weixin_29295541的博客 569

YOLOv8安防监控实战:跌倒/闯入/徘徊实时检测(附TensorRT加速+声光报警部署代码)

精准性:针对跌倒/闯入/徘徊的行为特征优化,准确率达89.3%,误报率低于5次/天;实时性:TensorRT加速到50+FPS,报警延迟<1秒,满足安防“黄金响应时间”;低成本:无需专用AI芯片,RTX 3060或Jetson Orin就能跑,硬件成本比传统方案低60%;易部署:代码全开源,提供从模型训练到硬件联动的完整流程,2天即可搭起原型系统。如果你的安防监控还在“漏报误报”“响应慢”,建议先从跌倒检测的姿态过滤改起——用100张样本测试,再集成TensorRT加速,90%能看到明显改善。

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

SimpleFOC硬件抽象层的设计哲学:跨平台兼容性实践剖析

本文深入解析SimpleFOC硬件抽象层(HAL)的设计哲学与跨平台兼容性实践,重点介绍其如何通过统一接口支持STM32、ESP32、Arduino等多平台。文章详细剖析了PWM配置、死区时间处理等关键技术实现,并提供了性能优化策略和新平台扩展指南,为无刷电机控制开发提供高效解决方案。

vscode5coder的博客 456

SAP会计凭证导入ABAP开发模板+注意点—附带源码

开发并不仅仅只要考虑实现的功能,只实现功能的是程序,考虑到使用场景的是工程。使用bapi校验创建会计凭证的数据,报错和参数和正式创建一致。用途,防止产生错误的凭证,即使财务凭证可以冲销。正式创建会计凭证。隐藏的坑。

小九啥也不会 1232

架构师成长之路:抽象思维能力

培养抽象思维能力需要持续的学习与实践,通过解决问题、学习设计模式、总结经验、阅读经典书籍、参与团队讨论等途径,程序员能够逐步将抽象思维能力内化为自己的技术素养,最终成为一名合格的架构师。学习并应用设计模式,是提升抽象思维能力的重要途径之一。例如,在面对分布式系统中的数据一致性问题时,架构师通过抽象出一致性模型,可以更清晰地理解问题的根源,并提出合理的解决方案。每当完成一个项目或模块设计时,程序员应该花时间回顾自己的设计决策,思考如何将设计进行抽象,是否可以有更优的设计方式,以及是否存在可以复用的通用模式。

ctotalk 665

C# 与华中数控设备通信:数控机床自动化控制与实时监测系统

华中数控系统与C#通信开发指南 核心要点 通信基础 支持串口(RS232/RS485)和以太网两种连接方式 协议选择:通用Modbus协议或华中自定义HNC协议 关键数据映射表明确各参数对应的寄存器地址和功能码 系统架构 四层架构:设备层→通信层→业务层→应用层 包含实时数据采集、指令下发、状态监控、异常处理全流程 支持Modbus和HNC协议动态切换 代码实现 串口通信使用NModbus库简化开发 提供连接管理、数据读取、指令下发完整示例 包含异常处理和超时重连机制 应用价值 实现数控机床远程监控和自动化

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 2018

1.14、基于NARX神经网络的磁悬浮建模(matlab)

数据准备:首先,需要准备用于训练和测试的磁悬浮系统的输入和输出数据,包括磁力、电流、位置、速度等信息。数据可以被保存在MATLAB的数据文件中,并加载到工作空间中。使用MATLAB的神经网络工具箱,创建一个NARX神经网络。需要定义网络的层次结构、节点数、激活函数等参数。通常,NARX网络包括自回归层和外部输入层。数据预处理:对加载的数据进行预处理,包括去除噪声、归一化处理等操作,以确保数据质量和网络训练的稳定性。使用MATLAB的训练函数,如trainlm或者trainbr,对NARX神经网络进行训练。

XU157303764的博客 1996

快速入门低代码开发:平台比较与实际应用建议

低代码开发作为一种创新的软件开发方法,通过图形化用户界面和少量手写代码,旨在简化应用程序开发过程。本文探讨了低代码开发的优势和局限性,指出它在简化和加速应用程序开发方面的重要作用,但也强调了它不太可能完全取代传统编程的原因。还提供了进入低代码开发领域的建议,包括了解不同平台、学习基础知识、实践项目、参与社区以及持续改进技能。最后,列举了几个流行的低代码平台,并呼吁开发者根据项目需求选择最适合的平台来提高开发效率和创新能力。

cooldream2009的博客 316

visio安装包

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

使用 OpenCLAW 重写 CUDA 内核:从传统 CUDA 到跨平台异构计算的迁移实践

# 1. 引言:为什么需要 OpenCLAW?

balala_1998的博客 352

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

跨平台开发者的经验之谈

导读 Andreia Gaita 在 OSCON 开源大会上发表了一个题为跨平台开发者的自白的演讲。她长期从事于开源工作,并且为 Mono 工程(LCTT 译注:一个致力于开创 .NET 在 Linux 上使用的开源工程)做着贡献,主要以 C#/C++ 开发。Andreia 任职于 GitHub,她的工作是专注构建 Visual Studio 的 GitHub 扩展管理器。 ...

weixin_34321753的博客 424

VB摄像头监控

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

什么是虚拟化技术,有什么优缺点?

虚拟化技术是一种通过软件或硬件手段将物理资源抽象化,从而创建虚拟资源的技术。它在计算、存储、网络等多个领域得到广泛应用,并带来了诸多优点,同时也存在一些缺点。

蒲松龄 1790

设计模式初学者系列-开篇以及抽象工厂模式

一、设计模式定义、来历 类似的一些问题在开发中经常遇到,经过前人的整理得出的一些好的解决方案,面向对象设计模式就是为了实现面向对象的一些原则的。 那么我们可以得到设计模式的定义:设计模式就是重复问题的一些好的解决方案 设计模式起源于建筑,首先由建筑设计师亚历山大提出的,然后经过前人推广到软件设计行业来。在他的那本著名“模式语言”(A Pattern Language)一...

liu_yanhui的专栏 163

提升平台工程中的开发人员体验的6大策略

了解如何提升平台工程中的开发人员体验

PE_community的博客 602

基于低代码平台快速搭建应用

近年来,SaaS行业的迅猛发展带动了低代码领域的快速兴起。国外的低代码创业公司如Mendix、Outsystems,以及国内的软件业巨头如华为、用友、金蝶等和小众高性价比的引迈JNPF都已经纷纷涉足低代码市场。根据Transparency Market Research的报告,全球低代码开发平台市场将以惊人的54.5%年增长率发展,预计在2025年市场规模将超过1260亿美元。

xuxian的博客 413

Cube-Studio:企业级AI模型部署平台的架构与实践

在数字化转型浪潮中,企业面临着AI模型从开发到生产部署的严峻挑战。传统模型部署流程复杂、环境依赖性强、运维成本高,严重制约了AI技术的规模化应用。Cube-Studio作为开源云原生一站式机器学习平台,通过深度整合Kubernetes生态,为企业提供了完整的AI模型部署解决方案。 ## 核心问题:AI模型部署的四大痛点 ### 环境配置复杂化 不同AI框架(TensorFlow、PyTorch

gitblog_00875的博客 1237
上一篇: JXTA开发以内容为中心的聊天软件项目
下一篇: Look and Feel---JAVA界面(换肤术)
java169
博客等级 码龄18年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值