tag 标签: 基于

相关资源
  • 所需E币: 5
    时间: 2024-1-25 15:24
    大小: 4.94MB
    上传者: 丙丁先生
    基于CW32实时时钟DS1302应用源码.zip
  • 所需E币: 5
    时间: 2024-1-25 15:24
    大小: 591.82KB
    上传者: 丙丁先生
    基于CW32的物联网应用源码.zip
  • 所需E币: 5
    时间: 2024-1-25 15:26
    大小: 5.79MB
    上传者: 丙丁先生
    基于CW32的超声波模块的应用源码.zip
  • 所需E币: 5
    时间: 2024-1-25 15:27
    大小: 590.74KB
    上传者: 丙丁先生
    基于CW32的RC522刷卡模块的应用源码.zip
  • 所需E币: 5
    时间: 2024-1-25 15:35
    大小: 7.08MB
    上传者: 丙丁先生
    基于CW32的GY-33颜色识别模块的应用.zip
  • 所需E币: 5
    时间: 2024-1-25 15:47
    大小: 639.83KB
    上传者: 丙丁先生
    (终版)基于CW32的智能家居系统源码.zip
  • 所需E币: 5
    时间: 2024-1-25 15:36
    大小: 8.07MB
    上传者: 丙丁先生
    基于CW32的AS608指纹模块的应用模块资料与源码.zip
  • 所需E币: 5
    时间: 2024-1-25 15:31
    大小: 579.01KB
    上传者: 丙丁先生
    基于CW32的MAX4466麦克风模块的应用源码.zip
  • 所需E币: 5
    时间: 2024-1-25 15:29
    大小: 6MB
    上传者: 丙丁先生
    基于CW32的PID温度控制系统源码.zip
  • 所需E币: 5
    时间: 2024-1-25 15:30
    大小: 1.17MB
    上传者: 丙丁先生
    基于CW32的MPU6050姿态传感器的应用源码.zip
  • 所需E币: 5
    时间: 2024-1-25 15:33
    大小: 5.37MB
    上传者: 丙丁先生
    基于CW32的L9110风扇模块的应用源码.zip
  • 所需E币: 0
    时间: 2024-1-5 14:07
    大小: 3.13KB
    Django是一个由Python编写的一个开放源代码的Web应用框架。Django是一个高级的PythonWeb框架,用于快速开发可维护和可扩展的Web应用程序。使用Django,只要很少的代码,Python的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的Web服务。第一步,安装PythonWindows下安装Python非常简单,去Python官方网站找到Python3的下载地址,根据你的系统选择32位或者64位的安装包,下载好后双击安装即可。第二步,安装django强烈推荐在虚拟环境下进行django的开发。虚拟环境是一种Python工具,使用它可以创建一个独立的Python环境第三步,virtualenv创建和管理虚拟环境virtualenv的使用非常简单,首先安装virtualenv,打开命令行工具,输入下面的命令即可安装第四步,Django框架的View视图展示机制Django框架采用了MTV设计模式,在工作机制上自然也有些特别之处,其中最显著的就是V视图(View)部分。请读者再看一下图2中的描述,MTV模式中的V视图(View)是不负责处理用户输入的,这一点就是MTV模式特殊之处。第五步,Django框架的用户操作流程Django框架设计的MTV模式也是基于传统的MVC模式的,本质上也是为了各组件之间保持松耦合关系,只是定义上有些许不同。MVC模式之所以能够成为Web框架最流行的设计标准,也是因为其比较完美地契合了用户的操作流程。MVC模式是软件工程中的一种通用的软件架构模式,同样也适用于Web应用程序。MVC将Web框架分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),并以一种插件式的、松耦合的方式连接在一起。第六步,Django框架的主要特点这里给大家介绍Django框架的主要特点,其他一些小优点,读者在学习过程中会慢慢体会:基于Python语言及MVC模式,具有开发快捷、低耦合、部署方便、可重用性高和维护成本低等显著特点。通过一个URL分发器模块进行URL分派,分发器使用正则表达式来匹配URL,支持开发人员采用自定义URL方式,且没有框架的特定限定,使用起来非常灵活。可以方便地生成各种表单模型,实现表单的有效性检验,且支持从自定义的模型实例生成相应的表单。具有强大且可扩展的模板语言,支持分隔设计、内容和Python代码,并且具有可继承性。以Python类的形式定义数据模型,通过ORM(对象关系映射)将模型与关系数据库进行连接,开发人员将得到一个非常容易使用的数据库API,同时也支持在Django框架中直接使用原始SQL语句。内置国际化系统,支持开发多种语言的Web网站。缓存系统采用与memcached、Redis等缓存系统联用的方式,提高了页面的加载速度。内置了一个可视化的、自动化管理员界面(AdminSite),其类似于一个CMS系统(内容管理系统),开发人员可以方便快捷地通过该界面进行人员管理和内容更新等操作。第七步,创建Django项目安装了Django之后,我们就可以使用Django的管理工具------>django-admin了我们创建一个名称为loginweb的Django项目,命令如下:#1激活虚拟环境cdD:\djangotestdjangoenv\Scripts\activate#2创建一个loginweb的项目django-adminstartprojectloginweb或者python-mdjangostartprojectloginweb一般一个项目包含多个app应用程序(当然,通用的app也可以在多个项目中使用)下面我们为loginweb项目,创建login#1激活虚拟环境cdD:\djangotestdjangoenv\Scripts\activate#2切到django项目中cdloginweb#3创建一个叫login的应用django-adminstartapplogin在com.example.emos.wx.config.shiro中创建ThreadLocalToken类。packagecom.example.emos.wx.config.shiro;importorg.springframework.stereotype.Component;@ComponentpublicclassThreadLocalToken{  privateThreadLocallocal=newThreadLocal();  publicvoidsetToken(Stringtoken){    local.set(token);  }  publicStringgetToken(){    return(String)local.get();  }  publicvoidclear(){    local.remove();  }}之前我们测试sayHello()方法的时候,因为客户端提交的参数不正确,所以后端系统向客户端返回了大量的异常内容。这里我们要对返回的异常内容做一下精简。在com.example.emos.wx.config中,创建ExceptionAdvice类。packagecom.example.emos.wx.config;importcom.example.emos.wx.exception.EmosException;importlombok.extern.slf4j.Slf4j;importorg.springframework.http.HttpStatus;importorg.springframework.web.bind.MethodArgumentNotValidException;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.bind.annotation.ResponseStatus;importorg.springframework.web.bind.annotation.RestControllerAdvice;@Slf4j@RestControllerAdvicepublicclassExceptionAdvice{  @ResponseBody  @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)  @ExceptionHandler(Exception.class)  publicStringvalidExceptionHandler(Exceptione){    log.error("执行异常",e);    if(einstanceofMethodArgumentNotValidException){      MethodArgumentNotValidExceptionexception=(MethodArgumentNotValidException)e;      //将错误信息返回给前台      returnexception.getBindingResult().getFieldError().getDefaultMessage();    }    elseif(einstanceofEmosException){      EmosExceptionexception=(EmosException)e;      returnexception.getMsg();    }    elseif(einstanceofUnauthorizedException){      return"你不具有相关权限";    }    else{      return"后端执行异常";    }  }}本文到处结束,感谢大家的阅读,有不足的地方大家多多指正!!
  • 所需E币: 0
    时间: 2023-12-25 10:31
    大小: 2.57KB
    上传者: 开心就很好了
    今天我将给大家讲解基于C++的Linux高性能事件驱动网络编程框架的设计方法及技巧,我在文中采取渐进迭代的方式,配合C++11新特性的使用,以及网络编程理论的深度讲解,并手把手带着大家落地实现,助力在网络编程领域有更大的技术提升!Linux系统的性能是指操作系统完成任务的有效性、稳定性和响应速度。Linux系统管理员可能经常会遇到系统不稳定、响应速度慢等问题,例如在Linux上搭建了一个web服务,经常出现网页无法打开、打开速度慢等现象,而遇到这些问题,就有人会抱怨Linux系统不好,其实这些都是表面现象。Linux提供三个「点分十进制字符串表示的IPv4地址和用网络字节序整数表示的IPv4地址之间转换」的接口 publicGraceJSONResultdoLogin(HttpServletRequestrequest,                  HttpServletResponseresponse,                  RegisterLoginBOregisterLoginBO,                  BindingResultresult){  //判断BindingResult是否保存错误的验证信息,如果有,则直接return  if(result.hasErrors()){    Map<String,String>errorMap=getErrors(result);    returnGraceJSONResult.errorMap(errorMap);  }  //获得前端传来的基本信息  StringsmsCode=registerLoginBO.getSmsCode();  Stringmobile=registerLoginBO.getMobile();  //0.校验验证码是否匹配  StringredisSMSCode=redis.get(MOBILE_SMSCODE+mobile);  if(StringUtils.isBlank(redisSMSCode)||!redisSMSCode.equalsIgnoreCase(smsCode)){    returnGraceJSONResult.errorCustom(ResponseStatusEnum.SMS_CODE_ERROR);  }  returnGraceJSONResult.ok();}用户信息其实并不会经常发生变动,所以这块内容完全可以放入缓存,这么一来可以大大减少对数据库的压力。privateAppUsergetUser(StringuserId){  //1.查询redis中是否包含用户信息,如果包含则查询redis返回,如果不包含则查询数据库  StringuserJson=redis.get(REDIS_USER_INFO+":"+userId);  AppUseruser=null;  if(StringUtils.isNotBlank(userJson)){    user=JsonUtils.jsonToPojo(userJson,AppUser.class);  }else{    user=userService.getUser(userId);    //2.由于用户信息不怎么会变动,对于千万级别的网站,这类信息数据不会去查询数据库,完全可以把用户信息存入redis    //哪怕修改信息,也不会立马体现,这也是弱一致性,在这里有过期时间,比如1天以后,用户信息会更新到页面显示,或者缩短到1小时,都可以    //基本信息在新闻媒体类网站是属于数据一致性优先级比较低的,用户眼里看的主要以文章为主,至于文章是谁发的,一般来说不会过多关注    redis.set(REDIS_USER_INFO+":"+userId,JsonUtils.objectToJson(user),1);  }  returnuser;}虽然在表设计的时候把文章阅读数字段进行了设计,但是在大数据量下,文章阅读的累计并发是很高的,在这里我们也是采用redis的计数功能来进行实现。@OverridepublicGraceJSONResultlist(StringarticleId,Integerpage,IntegerpageSize){  if(page==null){    page=COMMON_START_PAGE;  }  if(pageSize==null){    pageSize=COMMON_PAGE_SIZE;  }  PagedGridResultgridResult=         commentPortalService.queryArticleComments(articleId,                           page,                           pageSize);  returnGraceJSONResult.ok(gridResult);}生成html的步骤分为以下几步:定义freemarker生成的html位置配置freemarker基本环境获得ftl模板获得动态数据融合ftl和动态数据,并输出到html@Value("${freemarker.html.target}")privateStringhtmlTarget;@GetMapping("/createHTML")@ResponseBodypublicStringcreateHTML(Modelmodel)throwsException{  //0.配置freemarker基本环境  Configurationcfg=newConfiguration(Configuration.getVersion());  //声明freemarker模板所需要加载的目录的位置  Stringclasspath=this.getClass().getResource("/").getPath();  cfg.setDirectoryForTemplateLoading(newFile(classpath+"templates"));//    System.out.println(htmlTarget);//    System.out.println(classpath+"templates");  //1.获得现有的模板ftl文件  Templatetemplate=cfg.getTemplate("stu.ftl","utf-8");  //2.获得动态数据  Stringstranger=;  model.addAttribute("there",stranger);  model=makeModel(model);  //3.融合动态数据和ftl,生成html  FiletempDic=newFile(htmlTarget);  if(!tempDic.exists()){    tempDic.mkdirs();  }  Writerout=newFileWriter(htmlTarget+File.separator+"10010"+".html");  template.process(model,out);  out.close();  return"ok";}
  • 所需E币: 0
    时间: 2023-12-25 11:06
    大小: 3.48KB
    LinuxSocket网络编程框架主要由3大模块组成:BSDSocketAPIsSocketAbstractionLayerVFSLayerTCP/IP协议在设计和实现上并没有客户端和服务器的概念,在通信过程中所有机器都是对等的。但由于资源(视频、新闻、软件等)都被数据提供者所垄断,所以几乎所有的网络应用程序都很自然地用了客户端/服务器模型,即所有客户端都通过访问服务器来获取所需的资源。BS和CS服务器架构(1)CS架构介绍(clientserver,客户端服务器架构)(2)BS架构介绍(broswerserver,浏览器服务器架构)TCP协议(1)建立连接需要三次握手(2)建立连接的条件:服务器listen时客户端主动发起connect(3)关闭连接需要四次握手(4)服务器或者客户端都可以主动发起关闭packagecom.example.emos.wx.controller.form;importio.swagger.annotations.ApiModel;importlombok.Data;importjavax.validation.constraints.NotBlank;importjavax.validation.constraints.Pattern;@Data@ApiModelpublicclassRegisterForm{  @NotBlank(message="注册码不能为空")  @Pattern(regexp="^[0-9]{6}$",message="注册码必须是6位数字")  privateStringregisterCode;  @NotBlank(message="微信临时授权不能为空")  privateStringcode;  @NotBlank(message="昵称不能为空")  privateStringnickname;  @NotBlank(message="头像不能为空")  privateStringphoto;}在UserController.java中创建login()方法。@PostMapping("/login")@ApiOperation("登陆系统")publicRlogin(@Valid@RequestBodyLoginFormform){intid=userService.login(form.getCode());  Stringtoken=jwtUtil.createToken(id);  Set<String>permsSet=userService.searchUserPermissions(id);  saveCacheToken(token,id);  returnR.ok("登陆成功").put("token",token).put("permission",permsSet);}在CheckinServiceImpl类中,实现抽象方法……publicclassCheckinServiceImplimplementsCheckinService{……publicvoidcreateFaceModel(intuserId,Stringpath){    HttpRequestrequest=HttpUtil.createPost(createFaceModelUrl);    request.form("photo",FileUtil.file(path));    HttpResponseresponse=request.execute();    Stringbody=response.body();    if("无法识别出人脸".equals(body)||"照片中存在多张人脸".equals(body)){      thrownewEmosException(body);    }else{      TbFaceModelentity=newTbFaceModel();      entity.setUserId(userId);      entity.setFaceModel(body);      faceModelDao.insert(entity);    }  }}在CheckinServiceImpl.java类中,实现三个抽象方法。publicclassCheckinServiceImplimplementsCheckinService{……@Override  publicHashMapsearchTodayCheckin(intuserId){    HashMapmap=checkinDao.searchTodayCheckin(userId);    returnmap;  }  @Override  publiclongsearchCheckinDays(intuserId){    longdays=checkinDao.searchCheckinDays(userId);    returndays;  }  @Override  publicArrayList<HashMap>searchWeekCheckin(HashMapparam){    ArrayList<HashMap>checkinList=checkinDao.searchWeekCheckin(param);    ArrayList<String>holidaysList=holidaysDao.searchHolidaysInRange(param);    ArrayList<String>workdayList=workdayDao.searchWorkdayInRange(param);    DateTimestartDate=DateUtil.parseDate(param.get("startDate").toString());    DateTimeendDate=DateUtil.parseDate(param.get("endDate").toString());    DateRangerange=DateUtil.range(startDate,endDate,DateField.DAY_OF_MONTH);    ArrayListlist=newArrayList();    range.forEach(one->{      Stringdate=one.toString("yyyy-MM-dd");      //查看今天是不是假期或者工作日      Stringtype="工作日";      if(one.isWeekend()){        type="节假日";      }      if(holidaysList!=null&&holidaysList.contains(date)){        type="节假日";      }elseif(workdayList!=null&&workdayList.contains(date)){        type="工作日";      }      Stringstatus="";      if(type.equals("工作日")&&DateUtil.compare(one,DateUtil.date())<=0){        status="缺勤";booleanflag=false;        for(HashMap<String,String>map:checkinList){          if(map.containsValue(date)){            status=map.get("status");flag=true;            break;          }        }DateTimeendTime=DateUtil.parse(DateUtil.today()+""+constants.attendanceEndTime);Stringtoday=DateUtil.today();if(date.equals(today)&&DateUtil.date().isBefore(endTime)&&flag==false){          status="";        }      }      HashMapmap=newHashMap();      map.put("date",date);      map.put("status",status);      map.put("type",type);      map.put("day",one.dayOfWeekEnum().toChinese("周"));      list.add(map);    });    returnlist;  }}在EmosWxApiApplicationTests.java类中提供了contextLoads()测试用例方法,我们把生成大量系统消息记录的代码写在其中,程序运行的时候这些消息记录就会写入到MongoDB里面。@SpringBootTestclassEmosWxApiApplicationTests{  @Autowired  privateMessageServicemessageService;  @Test  voidcontextLoads(){    for(inti=1;i<=100;i++){      MessageEntitymessage=newMessageEntity();      message.setUuid(IdUtil.simpleUUID());      message.setSenderId(0);      message.setSenderName("系统消息");      message.setMsg("这是第"+i+"条测试消息");      message.setSendTime(newDate());      Stringid=messageService.insertMessage(message);      MessageRefEntityref=newMessageRefEntity();      ref.setMessageId(id);      ref.setReceiverId(11);//注意:这是接收人ID      ref.setLastFlag(true);      ref.setReadFlag(false);      messageService.insertRef(ref);    }  }}在该页面的模型层里面声明静态数据。list数组保存的是后端Java返回的成员数据,内容上按照部门进行分组。members数组保存的是页面上选择的成员id。#include<stdio.h>#include<sys/socket.h>#include<sys/types.h>#include<stdlib.h>#include<arpa/inet.h>#include<unistd.h>#include<string.h> #defineBACKLOG5 intmain(intargc,char*argv[]){  intfd;  structsockaddr_inaddr;  charbuf[BUFSIZ]={};   if(argc<3){    fprintf(stderr,"%s<addr><port>\n",argv[0]);    exit(0);  }   /*创建套接字*/  fd=socket(AF_INET,SOCK_STREAM,0);  if(fd<0){    perror("socket");    exit(0);  }   addr.sin_family=AF_INET;  addr.sin_port=htons(atoi(argv[2]));  if(inet_aton(argv[1],&addr.sin_addr)==0){    fprintf(stderr,"Invalidaddress\n");    exit(EXIT_FAILURE);  }   /*向服务端发起连接请求*/  if(connect(fd,(structsockaddr*)&addr,sizeof(addr))==-1){    perror("connect");    exit(0);  }  while(1){    printf("Input->");    fgets(buf,BUFSIZ,stdin);    write(fd,buf,strlen(buf));  }  close(fd);  return0;}
  • 所需E币: 0
    时间: 2023-12-14 10:25
    大小: 2.67MB
    上传者: xines广州星嵌
    探索基于事件的视觉,从PROPHESEEEVK4HD开始。这款超轻、紧凑的高清Metavision®评估套件,可承受现场测试条件。集成IMX636(高清),堆叠式事件视觉传感器由索尼半导体解决方案公司发布,由索尼和PROPHESEE合作实现。
  • 所需E币: 0
    时间: 2023-12-6 15:17
    大小: 3.8KB
    网络编程概述管道(父子进程)、消息队列(内核经营消息队列)、共享内存(创建一个空间)、信号(通过pid号通信)、信号量(对临界资源,共享内存做P、V控制)。特点:依赖于Linux内核AB两个通信基于内核。缺陷:无法多机通信(不适用与两台不同的电脑)TCP和UDP对比:TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信TCP首部开销20字节;UDP的首部开销小,只有8个字节TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道传统的进程间通信借助内核提供的IPC机制进行,但是只能限于本机通信。若要跨机通信,就必须使用网络通信,这就需要用到内核提供给用户的socketAPI函数库。2.1网络字节序大端字节序:也叫高端字节序(网络字节序),是高端地址存放低位数据,低端地址存放高位数据小端字节序:也叫低端字节序,是低地址存放低位数据,高地址存放高位数据。在application.yml文件中,填入SaToken的配置信息,如下:sa-token: #HTTP请求头中哪个属性用来上传令牌 token-name:token #过期时间(秒),设置为30天 timeout:2592000 #临时有效期,设置为3天 activity-timeout:259200 #不允许相同账号同时在线,新登陆的账号会挤掉原来登陆的账号 allow-concurrent-login:false #在多人登陆相同账号的时候,是否使用相同的Token is-share:false token-style:uuid #是否读取Cookie中的令牌 isReadCookie:false #同端互斥 isConcurrent:false #SaToken缓存令牌用其他的逻辑库,避免业务数据和令牌数据共用相同的Redis逻辑库 alone-redis:  database:1  host:localhost  port:6379  password:abc123456  timeout:10s  lettuce:   pool:    #连接池最大连接数    max-active:200    #连接池最大阻塞等待时间(使用负值表示没有限制)    max-wait:10s    #连接池中的最大空闲连接    max-idle:16    #连接池中的最小空闲连接    min-idle:8Java语言允许我们自己封装异常类,我们可以自定义各种异常类,比如每种业务一个异常类,或者每个模块一个异常类。我这里不想做的那么复杂,不如我们创建一个通用的异常类,用来封装与业务有关的异常信息。在com.example.his.api.exception包中,创建HisException.java类。packagecom.example.his.api.exception;importlombok.Data;@DatapublicclassHisExceptionextendsRuntimeException{  privateStringmsg;  privateintcode=500;  publicHisException(Exceptione){    super(e);    this.msg="执行异常";  }  publicHisException(Stringmsg){    super(msg);    this.msg=msg;  }  publicHisException(Stringmsg,Throwablee){    super(msg,e);    this.msg=msg;  }  publicHisException(Stringmsg,intcode){    super(msg);    this.msg=msg;    this.code=code;  }  publicHisException(Stringmsg,intcode,Throwablee){    super(msg,e);    this.msg=msg;    this.code=code;  }}SpringBoot提供了全局处理异常的技术,只要我们给某个Java类用上@RestControllerAdvice注解,这个类就能捕获SpringBoot项目中所有的异常,然后统一处理(精简异常信息)再返回给前端项目。在com.example.his.api.config包中,创建ExceptionAdvice.java类。packagecom.example.his.api.config;importcn.dev33.satoken.exception.NotLoginException;importcn.felord.payment.PayException;importcn.hutool.json.JSONObject;importcom.example.his.api.exception.HisException;importlombok.extern.slf4j.Slf4j;importorg.springframework.validation.BindException;importorg.springframework.http.HttpStatus;importorg.springframework.http.converter.HttpMessageNotReadableException;importorg.springframework.web.HttpRequestMethodNotSupportedException;importorg.springframework.web.bind.MethodArgumentNotValidException;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.bind.annotation.ResponseStatus;importorg.springframework.web.bind.annotation.RestControllerAdvice;importorg.springframework.web.multipart.support.MissingServletRequestPartException;@Slf4j@RestControllerAdvicepublicclassExceptionAdvice{  /*   *捕获异常,并且返回500状态码   */  @ResponseBody  @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)  @ExceptionHandler(Exception.class)  publicStringexceptionHandler(Exceptione){    JSONObjectjson=newJSONObject();    if(einstanceofHttpMessageNotReadableException){      HttpMessageNotReadableExceptionexception=(HttpMessageNotReadableException)e;      log.error("error",exception);      json.set("error","请求未提交数据或者数据有误");    }     elseif(einstanceofMissingServletRequestPartException){      MissingServletRequestPartExceptionexception=(MissingServletRequestPartException)e;      log.error("error",exception);      json.set("error","请求提交数据错误");    }     elseif(einstanceofHttpRequestMethodNotSupportedException){      HttpRequestMethodNotSupportedExceptionexception=(HttpRequestMethodNotSupportedException)e;      log.error("error",exception);      json.set("error","HTTP请求方法类型错误");    }     //Web方法参数数据类型转换异常,比如String[]数组类型的参数,你上传的数据却是String类型    elseif(einstanceofBindException){      BindExceptionexception=(BindException)e;      StringdefaultMessage=exception.getFieldError().getDefaultMessage();      log.error(defaultMessage,exception);      json.set("error",defaultMessage);    }    //没有通过后端验证产生的异常    elseif(einstanceofMethodArgumentNotValidException){      MethodArgumentNotValidExceptionexception=(MethodArgumentNotValidException)e;      json.set("error",exception.getBindingResult().getFieldError().getDefaultMessage());    }    //处理业务异常    elseif(einstanceofHisException){      log.error("执行异常",e);      HisExceptionexception=(HisException)e;      json.set("error",exception.getMsg());    }     //微信支付异常    elseif(einstanceofPayException){      PayExceptionexception=(PayException)e;      log.error("微信支付异常",exception);      json.set("error","微信支付异常");    }    //处理其余的异常    else{      log.error("执行异常",e);      json.set("error","执行异常");    }    returnjson.toString();  }  /*   *捕获异常,并且返回401状态码   */  @ResponseBody  @ResponseStatus(HttpStatus.UNAUTHORIZED)  @ExceptionHandler(NotLoginException.class)  publicStringunLoginHandler(Exceptione){    JSONObjectjson=newJSONObject();    json.set("error",e.getMessage());    returnjson.toString();  }}因为Controller类用上@RestController注解之后,Web方法返回的对象会被自动转换成JSON对象,所以我们只需要声明一个封装类,让所有Web方法返回这个封装类的对象即可。除了公共属性之外,不同的Web方法要返回的业务数据也不尽相同,所以选择动态的结构才是最佳的方案,恰好HashMap允许我们随便添加数据,那就选择HashMap作为父类吧。在com.example.his.api.common包中,创建R.java类。packagecom.example.his.api.common;importorg.apache.http.HttpStatus;importjava.util.HashMap;importjava.util.Map;publicclassRextendsHashMap<String,Object>{  publicR(){    //默认创建的R对象中包含了公共的属性    put("code",HttpStatus.SC_OK);    put("msg","success");  }  /*   *覆盖继承的put函数,添加Key-Value数据   */  publicRput(Stringkey,Objectvalue){    super.put(key,value);    //把自己返回,用于链式调用    returnthis;  }  publicstaticRok(){    returnnewR();  }  publicstaticRok(Stringmsg){    Rr=newR();    r.put("msg",msg);    returnr;  }  publicstaticRok(Map<String,Object>map){    Rr=newR();    r.putAll(map);    returnr;  }  publicstaticRerror(intcode,Stringmsg){    Rr=newR();    r.put("code",code);    r.put("msg",msg);    returnr;  }  publicstaticRerror(Stringmsg){    returnerror(HttpStatus.SC_INTERNAL_SERVER_ERROR,msg);  }  publicstaticRerror(){    returnerror(HttpStatus.SC_INTERNAL_SERVER_ERROR,"未知异常,请联系管理员");  }}
  • 所需E币: 0
    时间: 2023-11-27 14:02
    大小: 4.52KB
    众所周知,视觉系统对于理解和推理视觉场景的组成特性至关重要。这个领域的挑战在于对象之间的复杂关系、位置、歧义、以及现实环境中的变化等。作为人类,我们可以很轻松地借助各种模态,包括但不仅限于视觉、语言、声音等来理解和感知这个世界。现如今,随着Transformer等关键技术的提出,以往看似独立的各个方向也逐渐紧密地联结到一起,组成了“多模态”的概念。多功能通过引入灵活的提示引擎,包括点、框、涂鸦(scribbles)、掩模、文本和另一幅图像的相关区域,实现多功能性;可组合通过学习联合视觉-语义空间,为视觉和文本提示组合实时查询,实现组合性,如图1所示;可交互通过结合可学习的记忆提示进行交互,实现通过掩模引导的交叉注意力保留对话历史信息;语义感知通过使用文本编码器对文本查询和掩模标签进行编码,实现面向开放词汇分割的语义感知。超大规模视觉通用感知模型由超大规模图像、文本主干网络以及多任务兼容解码网络组成,它基于海量的图像和文本数据构成的大规模数据集进行预训练,用于处理多个不同的图像、图像-文本任务。此外,借助知识迁移技术能够实现业务侧小模型部署。超大规模视觉通用感知模型面临的挑战:(1)网络参数量庞大,通常超十亿参数,训练稳定性、收敛性、过拟合等问题相较于小网络挑战大很多。(2)原始数据集包含数十亿异质低质量图片与海量文本,多步训练以利用异质的多模态多任务数据,流程复杂,存在灾难性遗忘,难以定位精度等问题。(3)实验成本高,通常需要上千块GPU并行训练数周,需要研究者有敏锐的分析能力和扎实的知识基础。(4)工程挑战多,海量数据的吞吐,大型GPU集群上的并行算法,超大参数量模型的内存管理。提示工程大多数视觉数据集由图像和相应文本标签组成,为了利用视觉语言模型处理视觉数据集,一些工作已经利用了基于模版的提示工程,text_descriptions=[f"Thisisaphotoofa{label}"forlabelincifar100.classes]  text_tokens=clip.tokenize(text_descriptions).cuda()除了此类大型视觉语言基础模型外,一些研究工作也致力于开发可以通过视觉输入提示的大型基础模型。例如,最近META推出的SAM能够执行与类别无关的分割,给定图像和视觉提示(如框、点或蒙版),指定要在图像中分割的内容。这样的模型可以轻松适应特定的下游任务,如医学图像分割、视频对象分割、机器人技术和遥感等从模型训练、模型分发、模型商业化,美图体系化地同创作者和开发者共建模型生态:(1)模型训练:提供二次训练能力,并持续不断地为创作者提供服务,包括培训、社区和模型创作大赛。(2)模型分发:创作者和开发者共建的模型可以在美图的产品内进行分发,在分发过程中持续优化模型。(3)模型商业化:行业客户可通过MiracleVision的API和SDK进行商业使用,创作者和开发者通过商业合作获得经济收益。通用视觉-语言学习的基础模型UNITER:结合了生成(例如掩码语言建模和掩码区域建模)和对比(例如图像文本匹配和单词区域对齐)目标的方法,适用于异构的视觉-语言任务。Pixel2Seqv2:将四个核心视觉任务统一为像素到序列的接口,使用编码器-解码器架构进行训练。Vision-Language:使用像BART或T5等预训练的编码器-解码器语言模型来学习不同的计算机视觉任务。模型整体结构上,抛弃了CNN,将BERT原版的Transformer开箱即用地迁移到分类任务上面,在使用大规模训练集的进行训练时,取得了极好的效果。同时,在大规模数据集上预训练好的模型,在迁移到中等数据集或小数据集的分类任务上以后,也能取得比CNN更优的性能。模型整体结构如下图所示,完全使用原始BERT的Transformer结构,主要是对图片转换成类似token的处理,原文引入了一个patch的概念,首先把图像划分为一个个的patch,然后将patch映射成一个embedding,即图中的linearprojection层,将输入转换为类似BERT的输入结构,然后加上positionembedding,这里的position是1D的,最后加上一个learnableclassificationtoken放在序列的前面,classification由MLP完成。这里我们用RAM提取了图像的语义标签,再通过将标签输入到Grounding-DINO中进行开放世界检测,最后再通过将检测作为SAM的提示分割一切。目前视觉基础大模型可以粗略的归为三类:textuallypromptedmodels,e.g.,contrastive,generative,hybrid,andconversational;visuallypromptedmodels,e.g.,SAM,SegGPT;heterogeneousmodalities-basedmodels,e.g.,ImageBind,Valley.CoCa通过将所有标签简单地视为文本,对web-scalealt-text和annotatedimages进行了从头开始端到端的预训练,无缝地统一了表示学习的自然语言监督。因此,CoCa在广泛的下游任务上实现了最先进的性能,零样本传输或最小的任务特定适应,跨越视觉识别(ImageNet,Kinetics-400/600/700,Moments-in-Time)、跨模式检索(MSCOCO、Flickr30K、MSR-VTT)、多模式理解(VQA、SNLI-VE、NLVR2)和图像字幕(MSCOCO、NoCaps)。在ImageNet分类中,CoCa获得了86.3%的zero-shottop-1准确率,frozenencoderandfinetuneclassifier是90.6%,finetuneencoder可以到91.0%。截止目前国内外已经发布了许多包括NLP,CV和多模态在内的大规模模型,但是这些模型在应用落地上还是有待进一步探究的,目前应用落地较好的有华为的盘古,在电网和金融圈都有应用;智源的悟道系列在诗词图文上都有广泛应用,可以帮助学生看图写作,根据文字生成插图等;百度的文心也发布了在金融方面的应用。但截止目前为止大模型在实际中的应用还不是很理想,大模型发展的初衷是使用一个预训练好的大模型代替一堆小作坊似的根据不同任务训练的小模型,通过模型蒸馏知识迁移等技术在小模型上使用少量数据集达到超过原来小模型性能的目标。CV大模型在应用上的一个难点是与实际应用相结合,目前社会中用的较多的视觉相关的深度学习模型主要包括物体检测,人脸识别以及缺陷检测(部分)相比NLP模型在实际中的使用少很多,因此将CV模型与实际生产相结合发现更多的应用场景很关键。另外一个CV大模型应用的难点就是如何快速高效的使用蒸馏和知识迁移技术提升下游任务的性能,这两点难题的解决在CV大模型的实际应用中都刻不容缓。总结起来,将大模型应用于更高分辨率的下游视觉任务具有以下好处:提高感知能力、改善定位精度、提升语义理解、改善细节保留和边缘清晰度、增加鲁棒性和泛化能力,以及推动研究进展。这些好处使得大模型在处理高分辨率图像时能够获得更准确、更细致和更真实的结果。随着深度学习和计算资源的不断发展,我们可以期待更先进的大模型和相关技术的出现,进一步推动计算机视觉在高分辨率图像任务中的应用和突破
  • 所需E币: 0
    时间: 2023-11-27 11:13
    大小: 5.15KB
    上传者: 开心就很好了
    自动驾驶是高安全型应用,需要高性能和高可靠的深度学习模型,VisionTransformer是理想的选摔。现在主流的自动驾驶感知算法基本都使用了VisionTransformer相关技术,比如分割、2D/3D检测,以及最近大火的大模型(如SAM),VisionTransformer在自动驾驶领域的落地方面遍地开花。5一方面,在自动驾驶或图像处理相关算法岗位的面试题中,VisionTransformer是必考题,需要对其理论知识有深入理解,并且在项目中真实的使用过相关技术。Transformer出自于Google于2017年发表的论文《Attentionisallyouneed》,最开始是用于机器翻译,并且取得了非常好的效果。但是自提出以来,Transformer不仅仅在NLP领域大放异彩,并且在CV、RS等领域也取得了非常不错的表现。尤其是2020年,绝对称得上是Transformer的元年,比如在CV领域,基于Transformer的模型横扫各大榜单,完爆基于CNN的模型。为什么Transformer模型表现如此优异?它的原理是什么?它成功的关键又包含哪些?本文将简要地回答一下这些问题。我们知道Transformer模型最初是用于机器翻译的,机器翻译应用的输入是某种语言的一个句子,输出是另外一种语言的句子。vari*int=nilfmt.Println("i.size:",unsafe.Sizeof(i))//8vari8*int8=nilfmt.Println("i8.size:",unsafe.Sizeof(i8))//8vars*string=nilfmt.Println("s.size:",unsafe.Sizeof(s))//8varps*struct{}=nilfmt.Println("ps.size:",unsafe.Sizeof(ps))//8varsi[]int=nilvarsi1[]int=nilfmt.Println("si.size:",unsafe.Sizeof(si))//24variiinterface{}=nilfmt.Println("ii.size:",unsafe.Sizeof(ii))//16我们以生成我,爱,机器,学习,翻译成<bos>,i,love,machine,learning,<eos>这个例子做生成过程来解释。训练:把“我/爱/机器/学习”embedding后输入到encoder里去,最后一层的encoder最终输出的outputs[10,512](假设我们采用的embedding长度为512,而且batchsize=1),此outputs乘以新的参数矩阵,可以作为decoder里每一层用到的K和V;将<bos>作为decoder的初始输入,将decoder的最大概率输出词向量A1和‘i’做crossentropy(交叉熵)计算error。将<bos>,“i”作为decoder的输入,将decoder的最大概率输出词A2和‘love’做crossentropy计算error。将<bos>,“i”,“love”作为decoder的输入,将decoder的最大概率输出词A3和’machine’做crossentropy计算error。将<bos>,“i”,"love",“machine”作为decoder的输入,将decoder最大概率输出词A4和‘learning’做crossentropy计算error。将<bos>,“i”,"love",“machine”,“learning”作为decoder的输入,将decoder最大概率输出词A5和终止符做crossentropy计算error。那么并行的时候是怎么做的呢,我们会有一个mask矩阵在这叫seqmask,因为他起到的作用是在decoder编码我们的targetseq的时候对每一个词的生成遮盖它之后的词的信息。funcmain(){s:=[]string{"a","b","c"}fmt.Println("s:origin",s)changes1(s)fmt.Println("s:f1",s)changes2(s)fmt.Println("s:f2",s)changes3(s)fmt.Println("s:f3",s)}funcchanges1(s[]string){vartmp=[]string{"x","y","z"}s=tmp}funcchanges2(s[]string){//item只是一个副本,不能改变s中元素的值fori,item:=ranges{item="d"fmt.Printf("item=%s;s[%d]=%s",item,i,s[i])}}funcchanges3(s[]string){fori:=ranges{s[i]="d"}}首先我们需要为每个输入向量(也就是词向量)创建3个向量,分别叫做Query、Key、Value。那么如何创建呢?我们可以对输入词向量分别乘上3个矩阵来得到Q、K、V向量,这3个矩阵的参数在训练的过程是可以训练的。注意Q、K、V向量的维度是一样的,但是它们的维度可以比输入词向量小一点,比如设置成64,其实这步也不是必要的,这样设置主要是为了与后面的Mulit-head注意力机制保持一致(当使用8头注意力时,单头所处理的词向量维度为512/8=64,此时Q、K、V向量与输入词向量就一致了)。我们假设输入序列为英文的"ThinkingMachines"想要深度理解Attention机制,就需要了解一下它产生的背景、在哪类问题下产生,以及最初是为了解决什么问题而产生。首先回顾一下机器翻译领域的模型演进历史:机器翻译是从RNN开始跨入神经网络机器翻译时代的,几个比较重要的阶段分别是:SimpleRNN,ContextualizeRNN,ContextualizedRNNwithattention,Transformer(2017),下面来一一介绍。「SimpleRNN」:这个encoder-decoder模型结构中,encoder将整个源端序列(不论长度)压缩成一个向量(encoderoutput),源端信息和decoder之间唯一的联系只是:encoderoutput会作为decoder的initialstates的输入。这样带来一个显而易见的问题就是,随着decoder长度的增加,encoderoutput的信息会衰减。funcmain(){varc=make(chanint)fmt.Printf("c.pointer=%p\n",c)//c.pointer=0xc000022180gofunc(){c<-1addChannel(c)close(c)}()foritem:=rangec{//item:1//item:2fmt.Println("item:",item)}}funcaddChannel(donechanint){done<-2fmt.Printf("done.pointer=%p\n",done)//done.pointer=0xc000022180}在测试模型的时候,Test:decoder没有label,采用自回归一个词一个词的输出,要翻译的中文正常从encoder并行输入(和训练的时候一样)得到每个单词的embedding,然后decoder第一次先输入bos再此表中的id,得到翻译的第一个单词,然后自回归,如此循环直到预测达到eos停止标记typevisitstruct{a1 unsafe.Pointera2 unsafe.PointertypType}funcdeepValueEqual(v1,v2Value,visitedmap[visit]bool)bool{if!v1.IsValid()||!v2.IsValid(){returnv1.IsValid()==v2.IsValid()}ifv1.Type()!=v2.Type(){returnfalse}//Wewanttoavoidputtingmoreinthevisitedmapthanweneedto.//Foranypossiblereferencecyclethatmightbeencountered,//hard(v1,v2)needstoreturntrueforatleastoneofthetypesinthecycle,//andit'ssafeandvalidtogetValue'sinternalpointer.hard:=func(v1,v2Value)bool{switchv1.Kind(){casePointer:ifv1.typ.ptrdata==0{//not-in-heappointerscan'tbecyclic.//Atleast,allofourcurrentusesofruntime/internal/sys.NotInHeap//havethatproperty.Theruntimeonesaren'tcyclic(andwedon'tuse//DeepEqualonthemanyway),andthecgo-generatedonesare//allemptystructs.returnfalse}fallthroughcaseMap,Slice,Interface://Nilpointerscannotbecyclic.Avoidputtingtheminthevisitedmap.return!v1.IsNil()&&!v2.IsNil()}returnfalse}ifhard(v1,v2){//ForaPointerorMapvalue,weneedtocheckflagIndir,//whichwedobycallingthepointermethod.//ForSliceorInterface,flagIndirisalwaysset,//andusingv.ptrsuffices.ptrval:=func(vValue)unsafe.Pointer{switchv.Kind(){casePointer,Map:returnv.pointer()default:returnv.ptr}}addr1:=ptrval(v1)addr2:=ptrval(v2)ifuintptr(addr1)>uintptr(addr2){//Canonicalizeordertoreducenumberofentriesinvisited.//Assumesnon-movinggarbagecollector.addr1,addr2=addr2,addr1}//Shortcircuitifreferencesarealreadyseen.typ:=v1.Type()v:=visit{addr1,addr2,typ}ifvisited[v]{returntrue}//Rememberforlater.visited[v]=true}switchv1.Kind(){caseArray:fori:=0;i<v1.Len();i++{if!deepValueEqual(v1.Index(i),v2.Index(i),visited){returnfalse}}returntruecaseSlice:ifv1.IsNil()!=v2.IsNil(){returnfalse}ifv1.Len()!=v2.Len(){returnfalse}ifv1.UnsafePointer()==v2.UnsafePointer(){returntrue}//Specialcasefor[]byte,whichiscommon.ifv1.Type().Elem().Kind()==Uint8{returnbytealg.Equal(v1.Bytes(),v2.Bytes())}fori:=0;i<v1.Len();i++{if!deepValueEqual(v1.Index(i),v2.Index(i),visited){returnfalse}}returntruecaseInterface:ifv1.IsNil()||v2.IsNil(){returnv1.IsNil()==v2.IsNil()}returndeepValueEqual(v1.Elem(),v2.Elem(),visited)casePointer:ifv1.UnsafePointer()==v2.UnsafePointer(){returntrue}returndeepValueEqual(v1.Elem(),v2.Elem(),visited)caseStruct:fori,n:=0,v1.NumField();i<n;i++{if!deepValueEqual(v1.Field(i),v2.Field(i),visited){returnfalse}}returntruecaseMap:ifv1.IsNil()!=v2.IsNil(){returnfalse}ifv1.Len()!=v2.Len(){returnfalse}ifv1.UnsafePointer()==v2.UnsafePointer(){returntrue}for_,k:=rangev1.MapKeys(){val1:=v1.MapIndex(k)val2:=v2.MapIndex(k)if!val1.IsValid()||!val2.IsValid()||!deepValueEqual(val1,val2,visited){returnfalse}}returntruecaseFunc:ifv1.IsNil()&&v2.IsNil(){returntrue}//Can'tdobetterthanthis:returnfalsecaseInt,Int8,Int16,Int32,Int64:returnv1.Int()==v2.Int()caseUint,Uint8,Uint16,Uint32,Uint64,Uintptr:returnv1.Uint()==v2.Uint()caseString:returnv1.String()==v2.String()caseBool:returnv1.Bool()==v2.Bool()caseFloat32,Float64:returnv1.Float()==v2.Float()caseComplex64,Complex128:returnv1.Complex()==v2.Complex()default://NormalequalitysufficesreturnvalueInterface(v1,false)==valueInterface(v2,false)}}这便是encoder的整体计算流程图了,Transformer模型中堆叠了多个这样的encoder,无非就是输出连接输入罢了,常规操作。最后再附上一个Transformer的代码实现,读者有兴趣可以跟着自己复现一下Transformer模型的代码。  packagemain  import(    "log"    "sync"  )  funcinit(){    log.SetFlags(log.Lshortfile)  }  funcmain(){    lock:=sync.Mutex{}    //Go1.18新增,是一种非阻塞模式的取锁操作。当调用TryLock()时,    //该函数仅简单地返回true或者false,代表是否加锁成功    //在某些情况下,如果我们希望在获取锁失败时,并不想停止执行,    //而是可以进入其他的逻辑就可以使用TryLock()    log.Println("TryLock:",lock.TryLock())    //已经通过TryLock()加锁,不能再次加锁    lock.Lock()  }
  • 所需E币: 0
    时间: 2023-11-24 13:53
    大小: 7.14MB
    上传者: 瑞福科技
    低功耗及功能强大:这款芯片最大支持分辨率为1366x2048,内置128MbSDRAM,可为内容显示进行快速刷新,同时内置视频解码单元,支持JPEG/AVI硬解码播放,为普通单片机实现视频播放提供可能。显示功能强大:RA8889ML3N提供多段的显示记忆体缓冲区段,支持多图层功能,并提供画中画(PIP)、支持透明度控制与显示旋转镜像等显示功能。技术咨询与交流:QQ2851189731,微信13760238805
  • 所需E币: 5
    时间: 2023-11-10 09:46
    大小: 341.4KB
    上传者: 物联创客
    本资源内容概要:这是基于51单片机的0-5V电压表设计,包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(keil软件打开)、proteus仿真图。本资源适合人群:单片机爱好者、电子类专业学生、电子diy爱好者。本资源能学到什么:可以通过查看电路学习电路设计原理,查看代码学习代码编写原理。本资源使用建议:建议使用者需要具备一定电子技术基础,掌握一些常用元器件原理,例如三极管、二极管、数码管、电容、稳压器等。了解C语言基础设计原理,能看懂基础的电路图,具备一定的电路图软件使用能力。