22.项目开发之量化交易抓取数据QuantTradeData(一)

项目创建及后端业务:定时更新“股票列表基础信息”数据

项目创建

该量化交易数据平台用于数据库的数据抓取、分析等操作。
和QuantTrade使用同一个数据库,无需重新创建

01
02
03
04
pom.xml


<properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.3.12.RELEASE</spring-boot.version>
</properties>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.17</version></dependency><dependency><groupId>com.opencsv</groupId><artifactId>opencsv</artifactId><version>5.7.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>
</dependencies>
<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.quanttrade_bk.QuantTradeBkApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins>
</build>

05

application.properties


# 应用服务 WEB 访问端口
server.port=8082
# 配置数据库连接信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3380/db_quant?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=1234
#配置mapper.xml的路径
mybatis.mapper-locations=classpath:mapper/*/*.xml

Application

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
import springfox.documentation.swagger2.annotations.EnableSwagger2;@SpringBootApplication
@EnableSwagger2
public class QuantTradeDataApplication {public static void main(String[] args) {SpringApplication.run(QuantTradeDataApplication.class, args);}/*** 向spring注册RestTemplate工具* @return*/@Beanpublic RestTemplate getRestTemplate(){return new RestTemplate();}
}

06

RestObject

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class RestObject {private Integer code;           //前端的状态码 0:业务失败  1:业务成功private String msg;              //前端需要展示的信息private Object data;            //前端需要的复杂数据//业务成功的方法----------/*** 业务成功,自定义返回msg和返回的数据* @param msg* @param data* @return*/public static RestObject OK(String msg,Object data){return new RestObject(1,msg,data);}/*** 业务成功,自定义返回msg,无返回数据* @param msg* @return*/public static RestObject OK(String msg){return OK(msg,null);}/*** 业务成功,自定义返回的数据,无返回msg* @param data* @return*/public static RestObject OK(Object data){return OK(null,data);}//业务失败的方法----------/*** 业务失败,自定义返回msg和返回的数据* @param msg* @param data* @return*/public static RestObject ERROR(String msg,Object data){return new RestObject(0,msg,data);}/*** 业务失败,自定义返回msg,无返回数据* @param msg* @return*/public static RestObject ERROR(String msg){return ERROR(msg,null);}/*** 业务失败,自定义返回的数据,无返回msg* @param data* @return*/public static RestObject ERROR(Object data){return ERROR(null,data);}
}

搭建Const和TuShareAPI工具
07
Const

public interface Const {//平台地址String TUSHARE_BASE_URL     =   "http://api.tushare.pro";//令牌String TUSHARE_TOKEN        =   "自己的token";//股票基本信息String STOCK_BASIC = "stock_basic";//股票日线基本行情String STOCK_DAILY = "daily";
}

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;import java.util.HashMap;
import java.util.List;
import java.util.Map;@Component
public class TuShareAPI {@AutowiredRestTemplate template;/*** 用于向tushare平台发送请求,并接收到响应* @param api* @param params* @param fields* @return*/public JSONObject get(String api, Map<String, String> params, List<String> fields) {Map<String, Object> allParam = new HashMap<>();allParam.put("api_name", api);allParam.put("token", Const.TUSHARE_TOKEN);// 请求参数allParam.put("params", params);// 设置 需要响应回来的字段if (fields != null && fields.size()>0) {StringBuffer buffer = new StringBuffer();int size = fields.size();for (int i = 0; i <size; i++) {buffer.append(fields.get(i));if(i!=size-1){buffer.append(",");}}allParam.put("fields", buffer.toString());}//设置并发送请求,获取并返回响应HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);HttpEntity<Map> entity = new HttpEntity<>(allParam, headers);String str = template.postForObject(Const.TUSHARE_BASE_URL,entity, String.class);JSONObject json = JSON.parseObject(str);return json;}
}

08

启动时,运行: http://localhost:8082/swagger-ui/index.html

09

后端业务:定时更新“股票列表基础信息”数据

需求说明

为了获取前一天的最新数据,我们需要每个工作日的晚上10点定时刷新stock_basic股票列表基础信息,并将最新数据插入或更新到数据库中,将已经退市的数据删除。

前置知识:Quartz定时框架

Apache提供定时框架Quartz来帮助我们进行定时任务。

依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
其中作业:Job (其中去编写要执行的任务)
作业详情:JobDetail (对任务属性进行调整)
触发器:Trigger(负责执行具体的某个作业)都是执行任务必不可少的组件。我们将需要执行的任务写入Job,并通过JobBuilder来构建JobDetail。
通过TriggerBuilder来构建触发器,并加入任务与执行周期&频率,让任务执行。
其中,Cron表达式无需独立学习,通过在线构建即可:https://cron.qqe2.com/

Job:

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;import java.util.Date;public class TestJob1 extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {//定时去做什么事情System.out.println("TestJob1:"+new Date().toLocaleString());}
}

任务配置:


import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class QuartzConfig {/*** 构建任务详情* @return*/@Beanpublic JobDetail getTestJob1(){//1、通过构建,获取任务详情并返回//storeDurably()  脱离Trigger进行独立保存return JobBuilder.newJob(TestJob1.class).storeDurably().build();}@Beanpublic Trigger getTestJob1Trigger(JobDetail getTestJob1){//1、创建Cron表达式//1秒执行一次
//        CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("* * * * * ?");//从00秒开始  每10秒执行一次CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("0/10 * * * * ? ");//2、通过构建,完成触发器的创建并返回return TriggerBuilder.newTrigger().forJob(getTestJob1).withSchedule(cron).build();}
}

案例:定时点名 每秒定时抽一个学生姓名

1、创建一个Job,读取txt里的数据,随机获取其中一个

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.util.ResourceUtils;import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class RandomNameJob extends QuartzJobBean {private static List<String> names = new ArrayList<>();static {//读取txt获取数据//获取file文件File file;try {file = ResourceUtils.getFile("classpath:test.txt");} catch (FileNotFoundException e) {throw new RuntimeException(e);}//获取缓冲字符流try (BufferedReader reader = new BufferedReader(new FileReader(file));){//读取数据,保存到namesString line = null;while ((line=reader.readLine())!=null){names.add(line);}} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}private static Random r = new Random();@Overrideprotected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {System.out.println("随机点名:"+names.get(r.nextInt(names.size())));}
}

2、创建JobDetail,创建Trigger 给于cron

import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class QuartzConfig {/*** 构建任务详情* @return*/@Beanpublic JobDetail getTestJob1(){//1、通过构建,获取任务详情并返回//storeDurably()  脱离Trigger进行独立保存return JobBuilder.newJob(TestJob1.class).storeDurably().build();}@Beanpublic Trigger getTestJob1Trigger(JobDetail getTestJob1){//1、创建Cron表达式//1秒执行一次
//        CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("* * * * * ?");//从00秒开始  每10秒执行一次CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("0/10 * * * * ? ");//2、通过构建,完成触发器的创建并返回return TriggerBuilder.newTrigger().forJob(getTestJob1).withSchedule(cron).build();}/*** 构建任务详情* @return*/@Beanpublic JobDetail getRandomNameJob(){//1、通过构建,获取任务详情并返回//storeDurably()  脱离Trigger进行独立保存return JobBuilder.newJob(RandomNameJob.class).storeDurably().build();}@Beanpublic Trigger getRandomNameJobTrigger(JobDetail getRandomNameJob){//1、创建Cron表达式//1秒执行一次CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("* * * * * ?");//2、通过构建,完成触发器的创建并返回return TriggerBuilder.newTrigger().forJob(getRandomNameJob).withSchedule(cron).build();}
}

股票列表基础信息表(tb_stock_basic_info)

09

股票列表基础信息实体(StockBasicInfo)

10
11

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class StockBasicInfo {private String tscode;          //TS代码private String stockcode;    //股票代码private String stockname;   //股票名称private String stockarea;     //地域private String industry;       //所属行业private String cnspell;         //拼音缩写private String market;         //市场类型private String list_date;       //上市日期private String is_hs;            //是否沪深港通标的,N否 H沪股通 S深股通private String op_date;       //操作日期  yyyy-MM-dd
}

三层搭建

12

13
StockBasicInfoMapper


import org.springframework.stereotype.Repository;@Repository
public interface StockBasicInfoMapper {
}

Application

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
import springfox.documentation.swagger2.annotations.EnableSwagger2;@SpringBootApplication
@EnableSwagger2
@MapperScan("com.quanttradedata.stock.mapper")
public class QuantTradeDataApplication {public static void main(String[] args) {SpringApplication.run(QuantTradeDataApplication.class, args);}/*** 向spring注册RestTemplate工具* @return*/@Beanpublic RestTemplate getRestTemplate(){return new RestTemplate();}
}StockBasicInfoMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.quanttradedata.stock.mapper.StockBasicInfoMapper"></mapper>

StockService


import com.quanttradedata.stock.mapper.StockBasicInfoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class StockService {@Autowiredprivate StockBasicInfoMapper stockBasicInfoMapper;
}

StockController


import com.quanttradedata.stock.service.StockService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/stock")
@CrossOrigin //跨域在开发环境可以有,在生产环境中尽可能去除
public class StockController {@Autowiredprivate StockService stockService;
}

业务实现

StockBasicInfoJob


import com.quanttradedata.stock.service.StockService;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;@Component
public class StockBasicInfoJob extends QuartzJobBean {@Autowiredprivate StockService stockService;private SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");@Overrideprotected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {//1、准备需要传递给tuShare 参数HashMap<String, String> param = new HashMap<>();param.put("exchange","SSE");param.put("list_status","L");//2、请求 SSE上交所的股票基本信息System.out.println("请求SSE上交所的股票基本信息......");stockService.saveStockBasicInfoFromNet(param);//3、请求 SZSE深交所的股票基本信息System.out.println("请求 SZSE深交所的股票基本信息......");param.put("exchange","SZSE");stockService.saveStockBasicInfoFromNet(param);//4、数据更新完毕,删除退市失效数据stockService.delStockBasicInfosByOpDate(sdf1.format(new Date()));}
}

QuartzConfig


import com.quanttradedata.stock.job.StockBasicInfoJob;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class QuartzConfig {//股票基本信息的 任务详情创建 及 触发器创建@Beanpublic JobDetail getStockBasicInfoJob(){return JobBuilder.newJob(StockBasicInfoJob.class).storeDurably().build();}@Beanpublic Trigger getStockBasicInfoJobTrigger(JobDetail getStockBasicInfoJob){//1、编写cron表达式,指定触发的时间和周期//开发执行: 每个工作日的晚上22点//CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("0 0 22 ? * MON-FRI");//测试执行: 每5秒执行一次CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("0/5 * * * * ? ");//2、构建触发器,执行任务return TriggerBuilder.newTrigger().forJob(getStockBasicInfoJob).withSchedule(cron).build();}
}

StockService


import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.quanttradedata.stock.javabean.StockBasicInfo;
import com.quanttradedata.stock.mapper.StockBasicInfoMapper;
import com.quanttradedata.utils.javabean.Const;
import com.quanttradedata.utils.javabean.TuShareAPI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.sql.SQLIntegrityConstraintViolationException;
import java.text.SimpleDateFormat;
import java.util.*;@Service
public class StockService {@Autowiredprivate StockBasicInfoMapper stockBasicInfoMapper;@Autowiredprivate TuShareAPI tuShareAPI;private SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");/*** 根据参数,请求并更新股票列表信息* @param param*/public void saveStockBasicInfoFromNet(HashMap<String, String> param) {//1、指定TuShare平台需要给项目返回哪些字段数据List<String> fields = new ArrayList<>();Collections.addAll(fields,"ts_code","symbol","name","area","industry","cnspell","market","list_date","is_hs");//2、向TuShare平台发请求,请求json数据JSONObject jsonObject = tuShareAPI.get(Const.STOCK_BASIC, param, fields);//3、解析json数据,转为List集合List<StockBasicInfo> stockBasicInfos = new ArrayList<>();//3.1、获取所有的行数据JSONArray jsonArray = jsonObject.getJSONObject("data").getJSONArray("items");//3.2、遍历每行数据,每行转为一个StockBasicInfo对象Date today = new Date();String todayStr = sdf1.format(today);for (int i = 0; i < jsonArray.size(); i++) {JSONArray array = jsonArray.getJSONArray(i);//3.3、将StockBasicInfo对象保存到List中stockBasicInfos.add(new StockBasicInfo(array.getString(0),array.getString(1),array.getString(2),array.getString(3),array.getString(4),array.getString(5),array.getString(6),array.getString(7),array.getString(8),todayStr));}//4、进行数据插入或更新操作int insertCount=0,updateCount=0;//插入或更新if(stockBasicInfos.size()>0){//有需要插入或更新的数据,开始更新for (StockBasicInfo sbi : stockBasicInfos) {try {int rows = stockBasicInfoMapper.insertStockBasicInfo(sbi);insertCount+=rows;} catch (Exception e) {//1、判断是否为SQLIntegrityConstraintViolationException类型的异常if(e.getCause() instanceof SQLIntegrityConstraintViolationException){//2、如果是该类型,判断是否为重复主键错误String errorMsg = e.getMessage();//System.out.println(errorMsg);if(errorMsg.contains("Duplicate entry") && errorMsg.contains("PRIMARY")){//3、如果是重复主键错误,说明该数据,数据库已经存在了,没必要在Insert,进行该数据的update 即可int rows = stockBasicInfoMapper.updateStockBasicInfo(sbi);updateCount+=rows;}}}}}//5、展示结果System.out.println("插入成功了"+insertCount+"条数据");System.out.println("更新成功了"+updateCount+"条数据");}/*** 根据今天日期,删除不是今天数据的退市数据* @param todayStr*/public void delStockBasicInfosByOpDate(String todayStr){//更新完毕后,已经退市的数据要从数据库删除掉int delCount = stockBasicInfoMapper.delStockBasicInfosByOpDate(todayStr);System.out.println("删除成功了"+delCount+"条失效数据");}
}

StockBasicInfoMapper


import com.quanttradedata.stock.javabean.StockBasicInfo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;@Repository
public interface StockBasicInfoMapper {/*** 添加一条股票基本信息* @param sbi* @return*/int insertStockBasicInfo(@Param("sbi") StockBasicInfo sbi);/*** 更新一条股票基本信息* @param sbi* @return*/int updateStockBasicInfo(@Param("sbi") StockBasicInfo sbi);/*** 删除不是今天的股票基本信息(删除退市数据)* @param todayStr* @return*/int delStockBasicInfosByOpDate(@Param("todayStr")String todayStr);
}

StockBasicInfoMapper.xml


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.quanttradedata.stock.mapper.StockBasicInfoMapper"><insert id="insertStockBasicInfo">insert into tb_stock_basic_info values (#{sbi.tscode},#{sbi.stockcode},#{sbi.stockname},#{sbi.stockarea},#{sbi.industry},#{sbi.cnspell},#{sbi.market},#{sbi.list_date},#{sbi.is_hs},#{sbi.op_date})</insert><update id="updateStockBasicInfo">update tb_stock_basic_info setstockname=#{sbi.stockname},stockarea=#{sbi.stockarea},industry=#{sbi.industry},cnspell=#{sbi.cnspell},market=#{sbi.market},list_date=#{sbi.list_date},is_hs=#{sbi.is_hs},op_date=#{sbi.op_date}where stockcode = #{sbi.stockcode}</update><delete id="delStockBasicInfosByOpDate">delete from tb_stock_basic_info where op_date!=#{todayStr}</delete>
</mapper>

后端业务:定时更新“股票列表基础信息”数据业务完成!!!
下篇进入项目开发之量化交易抓取数据QuantTradeData(二):后端业务之定时更新“A股日线行情”数据—传送门

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/161848.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为数通方向HCIP-DataCom H12-831题库(单选题:301-310)

第301题 关于配置防火墙安全区域的安全级别的描述,错误的是 A、同一系统中,两个安全区域不允许配置相同的安全级别 B、只能为自定义的安全区域设定安全级别 C、安全级别一旦设定不允许更改 D、新建的安全区域,系统默认其安全级别为1 答案:D 解析: 新创建的安全区域缺省未…

在UniApp中使用uni.makePhoneCall方法调起电话拨打功能

目录 1.在manifest.json文件中添加权限 2. 组件中如何定义 3.如何授权 4.相关知识点总结 1.在manifest.json文件中添加权限 {"permissions": {"makePhoneCall": {"desc": "用于拨打电话"}} }2. 组件中如何定义 <template>…

成都瀚网科技有限公司:开抖音店铺有哪些注意事项?

成功经营一个小店不仅仅是发布产品视频那么简单&#xff0c;还需要注意一些重要的事情。开抖音店铺需要注意以下几点&#xff1a; 1、开抖音店铺有哪些注意事项&#xff1f; 合规管理&#xff1a;在抖音开店&#xff0c;首先要确保自己的运营合规。遵守相关法律法规及平台规定&…

分享一下怎么开发一个陪诊小程序

开发一个陪诊小程序需要综合考虑许多方面&#xff0c;包括但不限于市场需求、用户体验、技术实现和运营策略。以下是一篇以开发陪诊小程序为主题的文章。 一、背景介绍 随着社会的发展和人口老龄化的加剧&#xff0c;越来越多的老年人、病患和孕妇需要就医&#xff0c;而由于各…

地理知识笔记:Haversine距离

1 介绍 Haversine距离用于计算地球上两点之间的大圆距离当考虑地球的真实曲率时&#xff0c;它特别适用于计算两个经纬度坐标之间的距离 其中&#xff1a; 2 python 实现 def haversine_distance(lat1, lon1, lat2, lon2):R 6371 # Earth radius in kilometersdlat np.r…

斯坦福JSKarel编程机器人使用介绍

斯坦福JSKarel编程机器人使用介绍 为了避免被编程语言固有的复杂性所困扰&#xff0c;有一个被称为卡雷尔&#xff08;Karel&#xff09;机器人的微型世界&#xff08;microworld&#xff09;的简化环境&#xff0c;可以让编程初学者从中学习理解编程的基本概念&#xff0c;而…

限频差分探头N2060Apro

N2060Apro 差分探头提供一个安全的仪器给所有的示波器使用&#xff0c;它可以转换由高输入的差动电压进入一个低电压(≤7V)&#xff0c;并且显示波形在示波器上&#xff0c;使用频宽高达 200MHz&#xff0c;非常适合大电力测试、研发、维修使用。差分探头输出标示是设计在操作示…

【六、docker中hyperf项目怎么进行跨域设置】

1、第一步就是新建跨域文件,即跨域中间件 跨域中间件的代码如下 <?phpdeclare(strict_types=1);namespace App\Middleware; namespace App\Middleware; namespace App\Middleware;use Hyperf\Context\Context; use Psr\Http\Message\ResponseInterface;

【网络编程】从网络编程、TCP/IP开始到BIO、NIO入门知识(未完待续...)

目录 前言前置知识一、计算机网络体系结构二、TCP/IP协议族2.1 简介*2.2 TCP/IP网络传输中的数据2.3 地址和端口号2.4 小总结 三、TCP/UDP特性3.1 TCP特性TCP 3次握手TCP 4次挥手TCP头部结构体 3.2 UDP特性 四、总结 课程内容一、网络通信编程基础知识1.1 什么是Socket1.2 长连…

python代码调用文件或数据库中保存的脚本

这里采用的读取excel 1、先写一个测试方法 def demo5():import xlrdimport randomwb xlrd.open_workbook("code.xls")st wb.sheet_by_index(0)code st.cell_value(0, 0)list ["6666", asd, 1ad23, 1f23, 12g3, 1b3, 12r3]code2 st.cell_value(0, 1)…

ubuntu20.04安装FTP服务

安装 sudo apt-get install vsftpd# 设置开机启动并启动ftp服务 systemctl enable vsftpd systemctl start vsftpd#查看其运行状态 systemctl status vsftpd #重启服务 systemctl restart vsftpdftp用户 sudo useradd -d /home/ftp/ftptest -m ftptest sudo passwd ftptest…

蓝桥杯双周赛算法心得——三带一(暴力枚举)

大家好&#xff0c;我是晴天学长&#xff0c;枚举思想&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。 1) .三带一 2) .算法思路 1.通过Scanner读取输入的整数n&#xff0c;表示接下来有n个字符串需要处理。 2.使用循环遍历每个字符串&#xff1a;…

面试算法29:排序的循环链表

问题 在一个循环链表中节点的值递增排序&#xff0c;请设计一个算法在该循环链表中插入节点&#xff0c;并保证插入节点之后的循环链表仍然是排序的。 分析 首先分析在排序的循环链表中插入节点的规律。当在图4.15&#xff08;a&#xff09;的链表中插入值为4的节点时&…

【精选】目前我国网络安全人才市场状况

网络安全人才市场状况 本章以智联招聘多年来形成的丰富的招聘、求职信息大数据为基础&#xff0c;结合了奇安信集团 在网络安全领域多年来的专业研究经验&#xff0c;相关研究成果具有很强的代表性。对涉及安全人才 的全平台招聘需求与求职简历进行分析&#xff08;注&#xf…

c# xml 参数配置表的使用

使用简介 实际使用界面 配置表管理界面 进入 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;…

【Spring Cloud】网关Gateway的请求过滤工厂RequestRateLimiterGatewayFilterFactory

概念 关于微服务网关Gateway中有几十种过滤工厂&#xff0c;这一篇博文记录的是关于请求限流过滤工厂&#xff0c;也就是标题中的RequestRateLimiterGatewayFilterFactory。这个路由过滤工厂是用来判断当前请求是否应该被处理&#xff0c;如果不会被处理就会返回HTTP状态码为42…

linux部署gitlab

1. 配置yum源&#xff1a; vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] nameGitlab CE Repository baseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/ gpgcheck0 enabled1 2. 更新本地缓存 sudo yum install -y gitlab-ce 3. 安装相关依赖 yum …

从理论到实践,实时湖仓功能架构设计与落地实战

在上篇文章中&#xff0c;我们向大家解释了为什么实时湖仓是当前企业数字化转型过程中的解决之道&#xff0c;介绍了实时计算和数据湖结合的应用场景。&#xff08;“数据驱动”时代&#xff0c;企业为什么需要实时湖仓&#xff1f;&#xff09; 在这篇文章中&#xff0c;我们…

Java模拟双向链表,增删操作

public static void main(String[] args) {ArrayList arrayList new ArrayList();Node zhangsan new Node("张三");Node lisi new Node("李四");Node wanger new Node("王二");//模拟双向链表&#xff0c;将表中元素依次连接起来zhangsan.ne…

米哈游、复旦发布,具备感知、大脑、行动的大语言模型“智能体”

ChatGPT等大语言模型展示了前所未有的创造能力&#xff0c;但距AGI&#xff08;通用人工智能&#xff09;还有很大的距离&#xff0c;缺少自主决策、记忆存储、规划等拟人化能力。 为了探索大语言模型向AGI演变&#xff0c;进化成超越人类的超级人工智能&#xff0c;米哈游与复…