当前位置: 首页 > 编程日记 > 正文

Spark MLlib之使用Breeze操作矩阵向量

这下面的练习中,需要自己将spark的jar包 添加进来。

1.spark Mlib 底层使用的向量、矩阵运算使用了Breeze库。

scalaNLP 是一套 机器学习和数值技算的库。它主要是关于科学技术(sc)、机器学习(ML)和自然语言处理(NLP)的。它包括三个库,Breeze、Epic 和 Puck。

Breeze :是机器学习和数值技术库 ,它是sparkMlib的核心,包括线性代数、数值技术和优化,是一种通用、功能强大、有效的机器学习方法。

Epic     :是一种高性能能统计分析器和结构化预测库

Puck    :是一个快速GPU加速解析器

在使用Breeze 库时,需要导入相关包:

import breeze.linalg._import breeze.numerics._

具体练习如下:

package leaningimport breeze.linalg._
import breeze.numerics._
import breeze.stats.distributions.Rand/*** Created by dy9776 on 2017/12/5.*/object Practise_breeze{def main(args: Array[String]) {val matrix: DenseMatrix[Double] = DenseMatrix.zeros[Double](3,2)println(matrix)/*0.0  0.00.0  0.00.0  0.0*///全0向量val testVector: DenseVector[Double] = DenseVector.zeros[Double](2)println(testVector)//全1向量val allOneVector=DenseVector.ones[Double](2)println(allOneVector)//按数值填充向量val haveNumberFill =DenseVector.fill[Double](3,2)println(haveNumberFill)//生成随机向量val rangeNUm= DenseVector.range(1,  10 , 2)//DenseVector(1, 3, 5, 7, 9)val rangeNUmD= DenseVector.rangeD(1,  9 , 2)//DenseVector(1.0, 3.0, 5.0, 7.0)val rangeNUmF= DenseVector.rangeF(1,  7 , 2)//DenseVector(1.0, 3.0, 5.0)println(rangeNUm)println(rangeNUmD)println(rangeNUmF)//单位矩阵val unitMatrix=DenseMatrix.eye[Double](4)
//    println(unitMatrix)/*1.0  0.0  0.0  0.00.0  1.0  0.0  0.00.0  0.0  1.0  0.00.0  0.0  0.0  1.0*///对角矩阵val doubleVecoter=diag(DenseVector(3.0, 4.0 , 5.0))
//    println(doubleVecoter)/*3.0  0.0  0.00.0  4.0  0.00.0  0.0  5.0*///按照行创建矩阵val byRowCreateMatrix= DenseMatrix( (4.0, 5.0, 6.0 ) , (7.0 ,8.0 ,9.0))
//    println(byRowCreateMatrix)/*4.0  5.0  6.07.0  8.0  9.0*///按照行创建向量val denseCreateVector = DenseVector((4.0, 5.0, 6.0, 7.0, 8.0, 9.0))
//    println(denseCreateVector) ///DenseVector((4.0,5.0,6.0,7.0,8.0,9.0)//向量装置val vectorTranspostion= DenseVector( (4.0, 5.0, 6.0, 7.0, 8.0, 9.0) ).tprintln(vectorTranspostion)//Transpose(DenseVector((4.0,5.0,6.0,7.0,8.0,9.0)))//从函数创建向量val funCreateVector=DenseVector.tabulate(5)(i=> i*i)println(funCreateVector)//DenseVector(0, 1, 4, 9, 16)val funCreateVector2=DenseVector.tabulate( 0 to 5)(i=> i*i)println(funCreateVector2)//DenseVector(0, 1, 4, 9, 16, 25)//从函数创建矩阵val createFuncMatrix= DenseMatrix.tabulate(3, 4) {case (i ,j ) => i*i + j*j}
//    println(createFuncMatrix)/*0  1  4  91  2  5  104  5  8  13*///从数组创建矩阵val createFunctionMatrix= new DenseMatrix[Double](3, 2, Array(1.0, 4.0, 7.0, 3.0, 6.0, 9.0))
//    println(createFunctionMatrix)/*1.0  3.04.0  6.07.0  9.0*///0 到 1的随机向量val formZeroToOneRandomVector= DenseVector.rand( 9, Rand.uniform)println(formZeroToOneRandomVector)
//    DenseVector(0.7978222133507369, 0.48978247271729325, 0.24943434133065834, 0.6619447026155139, 0.5324942068054981, 0.9051865626036415, 0.5989291014099107, 0.9221881029987078, 0.17371486701192662)val formZeroToOneRandomVector2= DenseVector.rand( 9, Rand.uniform)println(formZeroToOneRandomVector2)
//DenseVector(0.7978222133507369, 0.48978247271729325, 0.24943434133065834, 0.6619447026155139, 0.5324942068054981, 0.9051865626036415, 0.5989291014099107, 0.9221881029987078, 0.17371486701192662)//0 到 1 的随机矩阵val formZeroToOneRandomMatrix= DenseMatrix.rand(3, 2, Rand.uniform)println(formZeroToOneRandomMatrix)/*0.8036324612618653  0.5381120878900350.6864375371630702  0.31239932725490750.9458628172312897  0.01137554621536796*/val formZeroToOneRandomMatrix2=DenseMatrix.rand(3, 2, Rand.gaussian)println(formZeroToOneRandomMatrix2)/*0.9510499901472648   0.287812938654061-0.5266499883462216  0.9380426076781263-0.3959295333472151  -0.9057610233257112*///Breeze元素访问val a = new DenseVector[Int](Array(1 to 20 : _*))println(a)//DenseVector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)//指定位置println(a(0)) //1//向量子集println( a(1 to 4) )//DenseVector(2, 3, 4, 5)println( a(1 until 4) )//DenseVector(2, 3, 4)//指定开始位置至结尾println( a(1 to -1) )//DenseVector(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)//按照指定步长去子集  这个是倒序方式println( a(5 to 0 by -1) )//DenseVector(6, 5, 4, 3, 2, 1)//最后一个元素println( a(-1)) //20val m = DenseMatrix((1.0, 2.0, 3.0), (4.0, 5.0, 6.0))println(m)/*1.0  2.0  3.04.0  5.0  6.0*///指定位置println( m(0 ,1) ) //2.0//矩阵指定列println( m(:: ,1) ) // DenseVector(2.0, 5.0)//Breeze元素操作//调整矩阵形状val justAdjustMatrix =m.reshape(3, 2)println(justAdjustMatrix)/*DenseVector(2.0, 5.0)1.0  5.04.0  3.02.0  6.0*///矩阵转成向量val toVector=m.toDenseVectorprintln(toVector)//DenseVector(1.0, 4.0, 2.0, 5.0, 3.0, 6.0)println(toVector.toDenseMatrix)//1.0  4.0  2.0  5.0  3.0  6.0//复制下三角println(lowerTriangular(m))///*1.0  0.04.0  5.0*///复制上三角println(upperTriangular(m))/*1.0  2.00.0  5.0*///矩阵复制println(m.copy)//m 原始为这样的//    1.0  2.0//    0.0  5.0//取对角线元素println(diag(upperTriangular(m)))//DenseVector(1.0, 5.0)   个人觉得很怪异,不是应该为(1.0, 6.0)吗?上面上、下三角 也好像出乎的意料//子集赋数值println(a(1 to 4 ):=5)//(1.0, 5.0)//子集赋向量println( a(1 to 4):=DenseVector(1,2,3,4) )//DenseVector(1, 2, 3, 4)println(m)//矩阵赋值
//    println( m( 1 to 2, 1 to 2) := 0.0 )
//Exception in thread "main" java.lang.IndexOutOfBoundsException: Row slice of Range(1, 2) was bigger than matrix rows of 2println("-==========m1================-")println( m( 0 to 1, 1 to 2) := 0.0 )println("-==========m================-")println(m)println("-==========m end================-")/*-==========m1================-0.0  0.00.0  0.0-==========m================-0.0  0.0  3.00.0  0.0  6.0-==========m end================-*///矩阵列赋值val re=m(::, 2) := 5.0println(re.toDenseMatrix)//5.0  5.0val a1 = DenseMatrix((1.0, 2.0, 3.0), (4.0, 5.0, 6.0))val a2 = DenseMatrix((7.0, 8.0, 9.0), (10.0, 11.0, 12.0))//垂直连接矩阵val verticalLike=DenseMatrix.vertcat(a1, a2)println(verticalLike)println("-==========================-")/*1.0   2.0   3.04.0   5.0   6.07.0   8.0   9.010.0  11.0  12.0*///横向连接矩阵val twoMatrixConn=DenseMatrix.horzcat( a1, a2)println(twoMatrixConn)println("-==========================-")
/*
1.0  2.0  3.0  7.0   8.0   9.0
4.0  5.0  6.0  10.0  11.0  12.0*///向量的连接val connnectVector1=DenseVector.vertcat(DenseVector(20, 21, 22), DenseVector(23, 24, 25))val connnectVector2=DenseVector.horzcat(DenseVector(20, 21, 22), DenseVector(23, 24, 25))println(connnectVector1)//DenseVector(20, 21, 22, 23, 24, 25)println(connnectVector2)/*20  2321  2422  25*///Breeze数值计算函数//元素加法println(a1 + a2)/*8.0   10.0  12.014.0  16.0  18.0*///元素乘法println(a1 :* a2)/*7.0   16.0  27.040.0  55.0  72.0*///元素除法println(a1 :/ a2)/*0.14285714285714285  0.25                 0.33333333333333330.4                  0.45454545454545453  0.5*///元素比较println(a1 :< a2)/*true  true  truetrue  true  true*///元素相等println(a1 :== a2)/*false  false  falsefalse  false  false*///元素追加println(a1 :+=2.0)/*3.0  4.0  5.06.0  7.0  8.0*///元素追乘println(a1 :*=2.0)/*6.0   8.0   10.012.0  14.0  16.0*///向量点积val vectorDot=DenseVector(1, 2, 3, 4) dot DenseVector(1, 1, 1, 1)println(vectorDot)//10//元素最大值println(max(a1))//16.0//元素最小值println(min(a1))//6.0//元素最大值的位置println(argmax(a1))// (1,2)//元素最小值的位置println(argmin(a1))// (0,0)//Breeze求和函数val m1 = DenseMatrix((1.0, 2.0, 3.0, 4.0), (5.0, 6.0, 7.0, 8.0), (9.0, 10.0, 11.0, 12.0))println(m1)/*1.0  2.0   3.0   4.05.0  6.0   7.0   8.09.0  10.0  11.0  12.0*/println("-==========================-")//元素求和println(sum(m1))//78.0//每一列求和println(sum(m1, Axis._0))//res59: breeze.linalg.DenseMatrix[Double] = 15.0  18.0  21.0  24.0//每一行求和println(sum(m1, Axis._1))//res60: breeze.linalg.DenseVector[Double] = DenseVector(10.0, 26.0, 42.0)//对角线元素和println(trace(lowerTriangular(m1)))// res61: Double = 18.0//累积和val a3 = new DenseVector[Int](Array(10 to 20: _*))println(accumulate(a3)) // DenseVector(10, 21, 33, 46, 60, 75, 91, 108, 126, 145, 165)//Breeze布尔函数val c = DenseVector(true, false, true)val d = DenseVector(false, true, true)//元素与操作println(c :& d) // DenseVector(false, false, true)//元素或操作println(c :| d) //DenseVector(true, true, true)//元素非操作println(!c) //DenseVector(false, true, false)val e = DenseVector[Int](-3, 0, 2)//存在非零元素println(any(e)) //true//所有元素非零println(all(e)) //false//Breeze线性代数函数val f = DenseMatrix((1.0, 2.0, 3.0), (4.0, 5.0, 6.0), (7.0, 8.0, 9.0))val g = DenseMatrix((1.0, 1.0, 1.0), (1.0, 1.0, 1.0), (1.0, 1.0, 1.0))//线性求解,AX = B,求解Xprintln(f \ g)/* breeze.linalg.DenseMatrix[Double] =-2.5  -2.5  -2.54.0   4.0   4.0-1.5  -1.5  -1.5*///转置println(f.t)/* breeze.linalg.DenseMatrix[Double] =1.0  4.0  7.02.0  5.0  8.03.0  6.0  9.0*///求特征值println(det(f)) // Double = 6.661338147750939E-16//求逆println(inv(f))/*-4.503599627370499E15  9.007199254740992E15    -4.503599627370495E159.007199254740998E15   -1.8014398509481984E16  9.007199254740991E15-4.503599627370498E15  9.007199254740992E15    -4.5035996273704955E15*///求伪逆println(pinv(f))/*-3.7720834019330525E14  7.544166803866101E14    -3.77208340193305E147.544166803866094E14    -1.5088333607732208E15  7.544166803866108E14-3.772083401933041E14   7.544166803866104E14    -3.772083401933055E14*///特征值和特征向量println(eig(f))/*Eig(DenseVector(16.116843969807043, -1.1168439698070427, -1.3036777264747022E-15),DenseVector(0.0, 0.0, 0.0),-0.23197068724628617  -0.7858302387420671   0.40824829046386363-0.5253220933012336   -0.08675133925662833  -0.816496580927726-0.8186734993561815   0.61232756022881      0.4082482904638625)*///奇异值分解val svd.SVD(u,s,v) = svd(g)println(u)/*-0.5773502691896255  -0.5773502691896257  -0.5773502691896256-0.5773502691896256  -0.2113248654051871  0.7886751345948126-0.5773502691896256  0.7886751345948129   -0.21132486540518708*/println("==============================")println(s) //DenseVector(3.0000000000000004, 0.0, 0.0)println("==============================")println(v)/*-0.5773502691896256  -0.5773502691896257  -0.57735026918962560.0                  -0.7071067811865474  0.70710678118654770.816496580927726    -0.4082482904638629  -0.4082482904638628*///求矩阵的秩println(rank(f))  //2//矩阵长度println(f.size) //9//矩阵行数println(f.rows) // 3//矩阵列数f.cols // 3//Breeze取整函数val h = DenseVector(-1.2, 0.7, 2.3) // breeze.linalg.DenseVector[Double] = DenseVector(-1.2, 0.7, 2.3)//四舍五入println( round(h)  ) // breeze.linalg.DenseVector[Long] = DenseVector(-1, 1, 2)//大于它的最小整数println( ceil(h) ) // breeze.linalg.DenseVector[Double] = DenseVector(-1.0, 1.0, 3.0)//小于它的最大整数println( floor(h) ) // breeze.linalg.DenseVector[Double] = DenseVector(-2.0, 0.0, 2.0)//符号函数println( signum(h) ) // breeze.linalg.DenseVector[Double] = DenseVector(-1.0, 1.0, 1.0)//取正数println( abs(h) )  // breeze.linalg.DenseVector[Double] = DenseVector(1.2, 0.7, 2.3)}}

转载于:https://www.cnblogs.com/nucdy/p/7988959.html

相关文章:

兄弟们,TechEd见!

马上就要TechEd啦&#xff01;11月6日到11月7日&#xff0c;在北京举办TechEd&#xff0c;嘿嘿&#xff0c;那就是中国最大的微软技术庙会&#xff01;盆盆是在2005年时第一次参加TechEd的&#xff0c;当时拿的是MVP的赠票。啥都不懂&#xff0c;就好比刘姥姥进了大观园&#x…

Java - 框架之 SpringBoot 攻略day01

Spring-Boot 攻略 day01 spring-boot 一. 基本配置加运行 1. 导入配置文件&#xff08;pom.xml 文件中&#xff09; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1…

关于 RMAN 备份 数据块 一致性的讨论

今天和 杭州恒生 的一个朋友讨论一个RMAN 在备份时数据块一致性的问题。 关于RMAN 的备份原理参考blog&#xff1a; RMAN 系列&#xff08;一&#xff09;---- RMAN 体系结构概述 http://blog.csdn.net/tianlesoftware/archive/2010/06/09/5659701.aspx 先看官方文档上的一段话…

常用git命令

常用 Git 命令清单。专用名词的译名如下。半支烟 Workspace&#xff1a;工作区Index / Stage&#xff1a;暂存区Repository&#xff1a;仓库区&#xff08;或本地仓库&#xff09;Remote&#xff1a;远程仓库一、新建代码库 # 在当前目录新建一个Git代码库 $ git init# 新建一个…

springboot 读取配置文件内容的几种方式

1 使用 Environment 进行读取 env.getProperty("配置文件中的值") 2 使用注解的方式 PropertySource("classpath:application.properties") // 获取属性文件 //将其注解到类上 获取属性值 Value("${pictureSearchDemo.apiUrl}") // 获取属性…

Ubuntu9.10使用windows的字体的方法!

使用Ubuntu9.10已经有好几天了&#xff0c;安装字体算是我遇到的比较头疼的一件事&#xff0c;原本按照Ubuntu9.04的方法操作&#xff0c;发现无法使用windows中的字体&#xff0c;换了好几个方法&#xff0c;最终找打了解决方法&#xff0c;过程如下&#xff1a;1、新建一个文…

jmeter笔记(8)--关联

关联是jmeter中比较重要的一个点&#xff0c;在测试过程中有些数据是经常发生变化的&#xff0c;要获取这些数据&#xff0c;就需要使用关联&#xff0c;Jmeter可以通过“后置处理器”中的“正则表达式提取器”来处理关联。。 正则表达式提取器 1、在取样器下点击【添加】--【后…

java连接mysql以及增删改查操作

java连接数据库的代码基本是固定的&#xff0c;步骤过程觉得繁琐些&#xff0c;代码记起来对我来说是闹挺。直接上代码&#xff1a; &#xff08;温馨提醒&#xff1a;你的项目提前导入连接数据库的jar包才有的以下操作 &#xff09; 1 class DBConnection{2 3 // 驱动类…

Jrebel 热部署插件的使用和破解

生成GUIDS 的网站&#xff1a;https://www.guidgen.com/ Jrebel 介绍和破解说明&#xff1a;https://www.cnblogs.com/wang1024/p/7211194.html 本地服务器软件,在使用eclipse或者idea 时打开就可以了。链接&#xff1a;百度云链接 密码&#xff1a;buin

微软SCRUM 1.0流程模板在中文版TFS2010上无法创建项目的解决办法(续)

原文&#xff1a; http://www.almnetworks.net/zh-CN/post/2010/08/04/Microsoft-Visual-Studio-Scrum-10-Template-on-Chinese-Version-of-TFS.aspx 经过我的进一步测试&#xff0c;发现以上步骤不能解决这个问题&#xff0c;但是我找到了一个可以暂时保证我们使用SCRUM模板的…

《父亲家书》选:给初为人师的儿子

文飞&#xff1a;离家已二十九天了&#xff0c;可能是年纪大了的缘故&#xff0c;不要说你妈妈&#xff0c;就连我也想念你了&#xff01;为不影响你工作&#xff0c;我坚持不够一个月“决”不给你去信。这不到期了&#xff0c;就按时给你去信。你上次来信&#xff0c;早已收到…

vue-cli脚手架

安装 全局环境安装&#xff0c;不必要在项目地址下安装&#xff1a;npm install -g vue-cli 卸载 全局卸载&#xff1a;npm uninstall -g vue-cli 查看是否安装成功&#xff1a;vue list 查看vue版本&#xff0c;vue -V 回车&#xff0c;查看vue最新的版本。 使用 进入到编辑器…

JackJson 使用记录

Map<String,Object> map new HashMap();map.put("ssss","sadsad");// 定义JackJson 对象ObjectMapper mapper new ObjectMapper();//将map转换成JSON字符串String image_json mapper.writeValueAsString(map); https://blog.csdn.net/a123demi/art…

APUE 学习笔记 - Chapter 6. System Data File and Infomation

1.密码文件 每个系统都会有一个文件统一记录用户名与密码&#xff0c;通常是/etc/passwd。关于这个文件有&#xff1a;root 的 uin 通常为 0 .文件中的 x为占位符&#xff0c;代表真实的加密密码保存在另外的文件。没有这一列的时候&#xff0c;表示该用户没有设立密码。将用户…

加密工具和unlocker的使用

在我的电脑上&#xff0c;一些不想让人翻看的程序和资料都使用一款《E-钻文件夹加密大师》的伪加密软件来加密。 这个程序只防君子不防小人&#xff0c;真正想看的人还是可以找到方法看的。并且这个软件还有些bug和不方便之处。 我在电脑上编程之前需要对多个代码文件夹进行解密…

第四章:操作列表

第四章&#xff1a;操作列表4.1 遍历整个列表如果名单很长&#xff0c;将包含大量反复的代码。另外&#xff0c;每当名单的长度发生变化时&#xff0c;都必须修改代码。通过for循环&#xff0c;可让Python去处理这些问题1&#xff09;使用for循环来打印魔术师名单中的所有名字&…

约束,索引,rownumrownum

--constraint --not null 非空约束 --unique 唯一键 --非空&唯一 --自定义检查约束 --创建约束时&#xff0c;为约束起名 --在添加完列后&#xff0c;还可以添加约束 --除了not null不可以 --主键约束 --为了保证该列的数据能够证明行记录在表中是唯一的 --主键约束从形式看…

微信小程序如何搭建本地环境开发

必要软件 ngrok :用来搭建内网穿透微信小程序开发工具微信小程序账号 如何使用ngrok 搭建内网穿透 在官网下载windows版本的ngrok&#xff0c;并且注册一个免费的账号&#xff0c;至此会给你生成一个认证码。ngrok官网&#xff0c;附一个下载好的文件&#xff0c;里包括官方版…

跨域部署Silverlight时需要注意的问题

当我们的Silverlight程序(.xap)发布地址和网页发布地址处于不同服务器上(跨域状态)时&#xff0c;由于安全机制在Silverlight和Javascript调用时会出现一些问题&#xff0c;如&#xff1a;Silverlight调用页面中的Javascript方法或页面中的Javscript调用Silverlight方法时报错或…

做国内最好的ITSM服务管理软件

E8.HelpDesk支持多种服务台管理体系&#xff0c;支持事件管理、问题管理、变更管理、配置管理、发布管理、运行管理的全程自动化&#xff1b;整个处理工作以流程自动化的任务贯穿&#xff0c;形成闭环的工作流&#xff0c;并有计划任务机制、报警提醒机制、事件升级机制、跟踪反…

AppBaseJs 类库 网上常用的javascript函数及其他js类库写的

AppBaseJs类库。一个借鉴了网上常用的函数及其他js类库写的,方便大家的调用。代码如下:/*----------------------------------- Web Application JavaScript Library 2009.11 janchie ------------------------------------*///String原生对象扩展 置空左右端空格 String.proto…

字符串转换整数 (atoi)

题目&#xff1a; 请你来实现一个 atoi 函数&#xff0c;使其能将字符串转换成整数。 首先&#xff0c;该函数会根据需要丢弃无用的开头空格字符&#xff0c;直到寻找到第一个非空格的字符为止。 当我们寻找到的第一个非空字符为正或者负号时&#xff0c;则将该符号与之后面尽可…

Spring boot 忽略对mybatis的配置

SpringBootApplication(exclude{DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class}) https://blog.csdn.net/wo541075754/article/details/73379962

Git远程仓库地址变更

简单方法 使用方法三 方法有很多&#xff0c;这里简单介绍几种&#xff1a; 以下均以项目git_test为例&#xff1a; 老地址&#xff1a;http://192.168.1.12:9797/john/git_test.git 新地址&#xff1a;http://192.168.100.235:9797/john/git_test.git 远程仓库名称&#xff…

如何优化你的网站快速提高流量

网站页面优化的SEO策略 对那些会主动产生成百上千甚至成千上万页面的网站优化&#xff0c;一定要转换思维方式。传统SEO程序&#xff0c;先调查选定关键词&#xff0c;然后针对每个关键词主题产生页面&#xff0c;手动书写标题标签&#xff0c;段落标题标签 和页面简介&#xf…

c#正则表达式使用详解

正则表达式(Regular expressions)是一套语法匹配规则&#xff0c;各种语言&#xff0c;如Perl&#xff0c; .Net和Java都有其对应的共享的正则表达式类库。在.Net中&#xff0c;这个类库叫做Regex。简单的说&#xff0c;Regex是从字符窗中查找匹配字符串的应用类。通过Regex&am…

软件安装(ubuntu) --Linux基础编程

Ubuntu&#xff1a;一个以桌面应用为主的开源GNU/Linux操作系统 1、在线安装&#xff08;Ubuntu Example&#xff09; 【安装】&#xff1a;sudo apt-get install 安装包的名字&#xff0c;或者&#xff1a;sudo apt install 安装包的名字&#xff08;16.04及以上版本&#xff…

Springboot结合 framework 加载静资源 出现404 问题解决 记录

<!- 在HTML页面加入这样--><#assign ctxrequest.contextPath /> 在引入的静态资源路径上 添加以下内容

studyLink

http://order.csdn.net/myorder/detail?id850343 csdn 转载于:https://www.cnblogs.com/zhujiasheng/p/8010861.html

CCNA的一个综合实验(经典)

【背景描述】 该企业的具体环境如下&#xff1a; 1、企业具有2个办公地点&#xff0c;且相距较远&#xff0c;公司总共大约有200台主机。 2、A办公地点具有的部门较多&#xff0c;例如业务部、财务部、综合部等&#xff0c;为主要的办公场所&#xff0c;因此这部分的交换网络对…