1 CE SMPS
1.1 术语
DSCG:Discharge,VBUS下拉放电电阻
flyback:反激
forward:正激
LISN:Line Impedance Stabilization Network
SMPS:Switching Mode Power Supplies,开关电源的变压器在整流桥之后,其它电源的变压器是在整流桥之前。220V交流电全桥整流输出的是脉动直流电,电压是0.9倍输入电压也就是200V左右,如果输出加上大电容滤波蓄能,输出电压是1.41倍输入电压,差不多就是310V。整流之后送到开关电源的PWM调整管,再通过变压器变压
Y电容:安规电容,成对出现,连接Line-GND和NULL-GND端
电子镇流器:镇住日光灯的电流;电感镇流器是依靠“电感中的电流不能突变”的特性,“镇”住灯管中气体击穿时的大电流,使电流稳定在规定值
1.2 普通稳压电源和开关电源的区别
普通稳压电源 - 利用变压器降压再整流的串联型稳压,由采样电路去控制电源调整管的导通电流来改变电源内阻,从而使输出电压稳定。串联型稳压电源的效率小于50%。
开关电源 - 直接整流,获得高压直流,由高频震荡器控制开关管的通断的时间比例来调整输出电压。开关型电源电路有串联型和并联型两种,开关型稳压电源的优点是效率高,因为开关状态下的晶体管自身消耗的功率很小,可以达到70-80%甚至更高的效率,而且不用降压变压器,其输出变压器由于是工作在高频,其体积远小于50赫的工频变压器。所以开关型电源的电路小巧轻便。开关型电源可以在较大的电压范围正常工作。
开关电源工作流程:
整流桥 - 开关管(次级侧USB PD芯片控制初级侧PWM芯片,初级侧PWM芯片输出PWM脉冲控制开关管)- 脉冲变压器 - 同步整流管 - DC输出
1.3 整流桥用二极管
1N4007是一种常用的整流二极管,常用于桥式整流电路。因为二极管是一个PN结组成,所以开头是1N也就是一个PN结,1N开头的都是二极管,2N开头的就是三极管。4007就是管子的型号。
参数如下:
较强的正向浪涌承受能力:30A
最大正向平均整流电流:1.0A
极限参数为VRM ≥ 50V
最高反向耐压:1000V
1.4 变压器初次级线圈匝数比和开关管占空比计算
1.5 电荷泵
电荷泵是一种无电感式DC-DC转换器,利用电容作为储能元件来进行电压电流的变换。半压电荷泵(2:1 charge pump)可以使输出电压减半、输出电流加倍,转换效率可以达到97%以上。
1.6 USB PD大功率输出电源
LLC控制器输出固定电压 + 二次降压实现多口PD快充
2 动力电池
2.1 GB38031—2020
由许多电动汽车车企参与制定的GB38031—2020电池标准,规定电池热失控后5分钟以内给出报警信号。
2.2 磷酸铁锂电池
磷酸铁锂天生的SOC不准,必须充到100%去校准。
所有的锂电池满放都极伤害,满充也伤,但没满放那么严重。
2.3 MCU
Thread 1.生命周期2.构造方法3.创建线程的方式4.常用的方法 一个线程就是一个执行流程. 每个线程都可以按照顺序执行自己的代码, 而多个线程可以同时执行多份代码 1.生命周期 Thread有六个生命周期
新建(NEW)
当一个Thread对象被创建时,它处于新建状态。在这个阶段,线程还没有启动。 public static void main(String[] args) throws Exception{ System.out.println("Thread State is:"+new Thread().getState()); } 就绪(Runnable)
当调用线程对象的start()方法后,线程进入就绪状态。在就绪状态下,线程已经准备好运行,但还没有得到 CPU 时间片。 public static void main(String[] args) { new Thread(() -> { System.out.println("Thread State is:"+Thread.currentThread().getState()); }).start(); } 运行(Running)
线程获得CPU时间片后,进入运行状态。在运行状态下,线程执行具体的任务代码。阻塞(Blocked)
线程在某些情况下会由于某些原因放弃CPU时间片,进入阻塞状态。例如,线程等待某个资源的释放,或者调用了sleep()方法。 public class ThreadTest { public static void main(String[] args) throws InterruptedException { Object lock = new Object();//锁 BlockThread t1 = new BlockThread(lock,"T1"); BlockThread t2 = new BlockThread(lock,"
文章目录 🍔Bean的获取🎄注入IOC容器对象⭐代码实现🛸根据bean的名称获取🛸根据bean的类型获取🛸根据bean的名称和类型获取 🎄Bean的作用域⭐代码实现🎈注意 🎄第三方Bean⭐代码实现🌺在启动类上进行配置(不建议)🌺使用配置类进行配置 🍔总结 代码脚手架我上传到网盘里面了,有需要的同学请自取
我用夸克网盘分享了「springboot-web-config2.zip」,点击链接即可保存。 链接:https://pan.quark.cn/s/f3872e6654cf
🍔Bean的获取 在Spring框架中,Bean是指由Spring容器管理的对象。Spring容器可以通过不同的方式获取Bean,常用的方法有以下几种:
通过名称获取Bean:可以使用getBean方法通过Bean名称获取Bean。例如:MyBean myBean = (MyBean) context.getBean(“myBean”);通过类型获取Bean:可以使用getBean方法通过Bean类型获取Bean。例如:MyBean myBean = context.getBean(MyBean.class);通过名称和类型同时获取Bean:如果存在多个符合条件的Bean,可以使用带有名称和类型参数的getBean方法来获取Bean。例如:MyBean myBean = context.getBean(“myBean”, MyBean.class); 需要注意的是,Bean只有在Spring容器初始化时才会被创建,因此在获取Bean之前,必须确保Spring容器已经初始化完成。通常,在Web应用程序中,可以在Servlet容器启动时初始化Spring容器,以便在应用程序中随时获取Bean。
🎄注入IOC容器对象 在Spring框架中,Bean是由IOC容器来管理和创建的。因此,在获取Bean对象之前,需要先创建IOC容器对象,确保容器已经初始化完成,并且Bean已经被创建并添加到容器中。
具体来说,IOC容器是Spring框架的核心组件之一,它负责维护Bean的生命周期、依赖注入、AOP等功能。Spring框架提供了多种类型的IOC容器,包括BeanFactory、ApplicationContext等,每种容器都有不同的特点和使用方式。
通过创建IOC容器对象,可以让Spring框架自动扫描指定的配置文件或注解,并根据配置信息创建Bean对象。这些Bean对象可以通过IOC容器来管理,包括获取Bean实例、销毁Bean实例、依赖注入等。因此,在获取Bean对象之前,需要先创建IOC容器对象,确保容器已经初始化完成,并且Bean已经被创建并添加到容器中。
另外,通过IOC容器来获取Bean对象的好处在于,可以将Bean的创建和管理交给Spring框架来处理,减少了程序员的工作量,并提高了程序的可维护性和可扩展性。同时,IOC容器还能够管理Bean之间的依赖关系,实现松耦合的编程模式,提高了程序的灵活性和可测试性。
⭐代码实现 🛸根据bean的名称获取 DeptController bean1 = (DeptController) applicationContext.getBean("deptController"); System.out.println(bean1); 🛸根据bean的类型获取 DeptController bean2 = applicationContext.getBean(DeptController.class); System.out.println(bean2); 🛸根据bean的名称和类型获取 DeptController bean3 = applicationContext.getBean("deptController", DeptController.class); System.out.println(bean3); @SpringBootTest class SpringbootWebConfig2ApplicationTests { @Autowired private ApplicationContext applicationContext; //获取bean对象 @Test public void testGetBean() { //根据bean的名称获取 DeptController bean1 = (DeptController) applicationContext.getBean("deptController"); System.
组件内容: 组件包含内容有:MODBUS主从机管理(支持RTU和ASCII),内存管理(小内存管理算法),串口管理,消息队列,环形缓冲区,类线程间同步方法(信号量、互斥锁、事件集),软件定时器,命令交互客户端(类命令行),软件非阻塞延时,数据转换方法,IO输入输出操作等。
组件描述: 各个组件均可独立使用,提供用户接口对接底层,并配有详细注释、手册和使用例程,供学习使用。
组件源码: mcu_reuse_development_module: 单片机可通用、可复用开发组件,内含:MODBUS主从机管理(支持RTU和ASCII),内存管理(小内存管理算法),串口管理,消息队列,环形缓冲区,类线程间同步方法(信号量、互斥锁、事件集),软件定时器,命令交互客户端(类命令行),软件非阻塞延时,数据转换,IO输入输出操作等。
各组件说明: ./documents/存放组件使用文档./drivers/存放所有组件源程序./examples/存放所有组件的使用举例(使用必看) drivers/common all_include.h: 所有组件头文件集合 common_include.h: 通用头文件(所有组件都需包含此文件) drivers/modbus modbus_common.c/.h: modbus通用文件 modbus_host.c/.h: modbus主机程序(RTU ASCII) modbus_slave.c/.h: modbus从机程序(RTU ASCII) drivers/modules command_line.c/.h: 命令行交互 data_check.c/.h: 数据校验方法集合 data_convert.c/.h: 数据转换方法集合 delay_no_block.c/.h: 非阻塞延时 input_output.c/.h: IO输入输出操作 memory.c/.h: 内存管理-小内存管理算法 message_queue.c/.h: 消息队列 ring_buffer.c/.h: 环形缓冲区 sync_method.c/.h: 伪线程同步方法(信号量,互斥锁,事件集) timer_software.c/.h: 软件定时器 uart_handler.c/.h: 串口管理 drivers/segger_rtt SEGGER_RTT官方文件,SEGGER_RTT.c:89行有固定输出地址方法
文章目录 1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装 3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 科技日益发展的今天,移动电子设备似乎成了我们生活的主角,智能手机、平板电脑几乎从不离身。但智能手机和平板电脑也有缺憾,就是自身的存储容量实在太少,能随时调取资料的大容量存储设备就显得十分必要。今天,笔者就为大家介绍,如何在电脑上,使用Serv-U+Cpolar内网穿透,构建一个ftp协议服务器,方便我们随时读取调阅文件资料。
2. 本地FTP搭建 FTP协议作为TCP/IP协议的组成部分,其主要作用就是向Web服务器传输网页资料和文件;同时由于FTP的传输效率极高,因此也常被用来传输较大的电子资料。通常FTP协议有两个组成部分,一个是FTP服务器(用于资料存储),另一个则是FTP客户端(访问指定服务器),今天介绍的Serv-U,就能让我们很轻松的搭建起一个FTP服务器。
2.1 Serv-U下载和安装 Serv-U的功能十分强大,运行稳定且设置简单,因此很受用户的欢迎。想要搭建自己的Serv-U服务器,要先到Serv-U官网(http://www.serv-u.com.cn/)下载Serv-U。
笔者使用的电脑安装了Windows操作系统,因此选择Windows版本下载。至于其他操作系统,则可根据需求自行选择。
下载完成后,将下载的压缩包解压,双击解压后的.exe文件,即可进行安装
进入安装程序后,只要一路点击下一步,很快就能安装完成。在安装完成首次运行Serv-U时,会显示“当前已定义的域,要先在定义新域吗”,直接选择是。
进入自定义域的设置页面后,左侧的列表就是我们需要设置的内容,如果没有特殊需求,只要输入几项简单内容,接着点击下一步即可完成设置。
首先Serv-U会要求我们对自定义域的名称进行设置,这里填入我们喜欢的名字即可
第三步Serv-U会要求我们填入domain URL(域名网址),这里我们根据其范例填入本地地址即可(127.0.0.1);第二行是file sharing repository(共享文件存储库),笔者选择整个E盘均进行共享。如果需要设置为共享某个文件夹的,则可以点击栏位右侧的“文件夹”图标进行选择
第四步是对Serv-U的输出端口进行设置。同样的,如果没有特殊需求、或系统默认的80端口没有被占用,则可以不用修改设置。但笔者Windows系统的80端口已经被占用,因此需要将80端口修改,这个例子中改为83。
需要注意的是,这一步中修改的端口号需要记住,以便我们之后进行FTP传输网页的访问测试,Cpolar进行内网穿透时,也会用到这个端口号。
接下来的第五步没有需要修改的内容,直接下一步即可。
第六步(最后一步)是关于回复密码的,如果有需要的看官可以自行设置。
完成以上步骤后,我们就完成了Serv-U的共享区域设置,接下来就是添加域用户步骤。这里我们只要跟着软件提示进行操作即可。需要注意的是,在域用户设置的最后一步,会涉及该用户访问共享文件的权限,如果不想该用户修改共享文件,则要选择“只读访问”,反之则选择“完全访问”。
在设置好访问用户后,即可点击完成,保留访问用户的设置。
完成以上设置后,我们就可以尝试在本地电脑上访问Serv-U的共享网页。
2.2 Serv-U共享网页测试 由于我们之前设置的Serv-U地址为本地地址(127.0.0.1),因此这里我们需要在浏览器中输入本地电脑的IP地址加端口号,具体格式为http://192.168.X.X:之前设置的端口号。在这个例子中,Serv-U访问地址为(http://192.168.157.1:83)。
只要输入的地址无误且之前的Serv-U软件设置没有问题,就会显示出Serv-U的登录界面,也就说明我们使用Serv-U搭建的FTP服务器成功上线,能够接受访客的访问。但此时Serv-U网页只能在局域网范围内访问,想要让这个网页能在任何地方都访问到,我们还需要使用Cpolar,创建一条内网穿透数据隧道。
2.3 Cpolar下载和安装 在本地的Serv-U服务端搭建完成后,我们就可以安装Cpolar内网穿透,为我们的FTP服务器上线做好准备。与Serv-U一样,我们可以直接访问Cpolar官网(https://www.cpolar.com/),选择合适自己电脑操作系统的版本进行下载。
笔者使用的是Windows操作系统,因此选择Windows版本进行下载。
Cpolar下载完成后,将下载的文件解压,双击解压后的.msi文件,即可自动执行安装程序。接着只要一路Next就能完成安装。
由于cpolar会为每个用户创建独立的数据隧道,并辅以用户密码和token码保证数据安全,因此我们在使用cpolar之前,需要进行用户注册。注册过程也非常简单,只要在cpolar主页右上角点击用户注册,在注册页面填入必要信息,就能完成注册。
3. 本地FTP发布 完成本地Serv-U服务器的部署和Cpolar内网穿透的安装注册后,我们就可以着手为Serv-U共享网页创建一个公共互联网地址,即内网穿透数据隧道,让我们能在公共互联网条件下,也能访问到家里的FTP服务器。
由于笔者不想每天都对Serv-U的网页地址进行设置(cpolar每隔24小时会对免费用户的数据隧道地址进行重置),因此将cpolar升级到vip级别,以此获得建立长期稳定数据隧道的特权。
3.1 Cpolar云端设置 要达到内网穿透的目的,需要先登录cpolar的官网,并在用户主页面左侧找到预留按钮,并点击进入cpolar的数据隧道预留页面。在这里生成一个公共互联网地址(也可以看做数据隧道的入口),由于此时这个地址没有连接本地的软件输出端口,因此也可以看做是一条空白的数据隧道。
在预留页面,可以看到很多种可保留的数据隧道,这里我们选择保留二级子域名栏位。
在“保留二级子域名”栏位,需要进行几项信息的简单设置,
地区:服务器所在区域,就近选择即可二级域名:会最终出现在生成的公共互联网地址中,作为网络地址的标识之一描述:可以看做这条数据隧道的描述,能够与其他隧道区分开即可) 完成这几项设置后,就可以点击右侧的保留按钮,将这条数据隧道保留下来。
当然,如果这条数据隧道不打算再使用,还可以点击右侧的x将其轻松删除,节约宝贵的隧道名额。
3.2 Cpolar本地设置 完成cpolar云端的设置,并保留了空白数据隧道后,我们回到本地的cpolar客户端,将云端生成的空白数据隧道与本地Serv-U网页端口连接起来,正式打通Serv-U的内网穿透数据隧道。与登录Cpolar云端一样,我们在本地打开并登录cpolar客户端(可以在浏览器中输入localhost:9200直接访问,也可以在开始菜单中点击cpolar客户端的快捷方式)
点击客户端主界面左侧隧道管理——创建隧道按钮,进入本地隧道创建页面(如果要创建没24小时重置地址的临时数据隧道,可直接在此进行设置,不必再cpolar官网设置空白数据隧道)。
在这个页面,同样需要进行几项信息设置,这些信息设置包括:
1. 隧道名称 – 可以看做cpolar本地的隧道信息注释,只要方便我们分辨即可;
文章目录 🍔简述同步队列🌹代码实现🛸代码讲解 🍔简述同步队列 同步队列(Synchronous Queue)是一种特殊的队列数据结构,它具有以下特点:
队列容量为0:同步队列的容量为0,即不能存储任何元素。它主要用于线程间的数据传输,而不是作为一个临时数据存储的结构。阻塞操作:同步队列的插入和删除操作都是阻塞的。当一个线程试图插入元素到同步队列时,如果队列已满,线程将被阻塞直到有其他线程从队列中删除元素;当一个线程试图从同步队列中删除元素时,如果队列为空,线程将被阻塞直到有其他线程向队列中插入元素。线程间的同步:同步队列提供了一种简单而有效的线程间通信方式。它可以用于线程之间传递数据、进行任务调度等场景。 同步队列的实现可以基于不同的同步原语,例如互斥锁、条件变量等。Java并发包中的SynchronousQueue就是一种常见的同步队列实现。
使用同步队列可以有效地实现线程间的同步和协作,避免了显式的锁和条件变量的使用,简化了代码的编写和维护。但需要注意合理使用同步队列,避免出现死锁和线程饥饿等问题。
总结起来,同步队列是一种阻塞的、容量为0的队列数据结构,用于实现线程间的同步和协作。
🌹代码实现 package org.Test6; import java.util.concurrent.BlockingQueue; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.TimeUnit; public class SynchronousQueueDemo { public static void main(String[] args) { BlockingQueue<String> blockingQueue = new SynchronousQueue<>(); //同步队列 new Thread(()->{ try { System.out.println(Thread.currentThread().getName()+" put 1"); blockingQueue.put("1"); System.out.println(Thread.currentThread().getName()+" put 2"); blockingQueue.put("2"); System.out.println(Thread.currentThread().getName()+" put 3"); blockingQueue.put("3"); } catch (InterruptedException e) { e.printStackTrace(); } },"T1").start(); new Thread(()->{ try { TimeUnit.SECONDS.sleep(3); System.out.println(Thread.currentThread().getName()+"=>"+blockingQueue.take()); TimeUnit.SECONDS.sleep(3); System.out.println(Thread.currentThread().getName()+"=>"+blockingQueue.take()); TimeUnit.SECONDS.sleep(3); System.out.println(Thread.currentThread().getName()+"=>"+blockingQueue.take()); } catch (InterruptedException e) { e.
文章目录 🍔情景引入🌹报错了,解决方案 🍔情景引入 我们运行下面的代码
package org.example.unsafe; import java.util.HashMap; import java.util.Map; import java.util.UUID; public class MapTest { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); for(int i=0;i<30;i++){ new Thread(()->{ map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,5)); System.out.println(map); }).start(); } } } 报错了
我们看报错信息
是并发修改异常
🌹报错了,解决方案 我们使用 ConcurrentHashMap 来创建一个线程安全的 Map 集合。ConcurrentHashMap 是 Java 并发包中提供的一种线程安全的哈希表实现,具有以下好处:
线程安全:ConcurrentHashMap 是线程安全的集合类,可以在多线程环境中安全地进行读取和写入操作,而无需额外的同步措施。它使用了锁分段技术,将整个哈希表划分为多个小的段,每个段都有自己的锁。这样不同的线程可以同时访问不同的段,从而提高并发性能。高并发性能:ConcurrentHashMap 在并发读写操作时能够提供较好的性能。由于采用了锁分段技术,不同的线程可以同时对不同的段进行操作,从而减少了锁竞争的范围,提高了并发性能。适用于大规模数据:ConcurrentHashMap 对于大规模的数据集合也具有较好的性能。由于采用了锁分段的方式,不同的段可以独立操作,因此在处理大量数据时,可以降低锁竞争的频率,提高整体性能。支持高效迭代:ConcurrentHashMap 在迭代操作时具有较好的性能。与传统的线程安全集合相比,ConcurrentHashMap 在进行迭代操作时不需要额外的同步措施,因为它内部使用了一种快照机制来保证迭代器的一致性,从而避免了并发修改导致的问题。 总之,ConcurrentHashMap 提供了一种高效的线程安全哈希表实现,适用于多线程环境下的并发读写操作。它能够提供较好的并发性能和可伸缩性,适用于大规模数据集合的处理。
package org.Test6; import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; public class MapTest { public static void main(String[] args) { Map<String, String> map = new ConcurrentHashMap<>(); for(int i=0;i<30;i++){ new Thread(()->{ map.
1、提前准备源Gauss300、目标 ADB PG数据库连接信息。
psql -hx.x.x.x -p25308 -Utest1 -ddb_name xxxxxx psql -hx.x.x.x -p3432 -Utest1 -ddb_name xxxxxx 2、编写迁移脚本,并执行迁移。 #!/bin/bash file_name=1.json today_data=`date "+%Y-%m-%d 00:00:00"` yesterday_data=`date -d "1 days ago" "+%Y-%m-%d 00:00:00"` cat > $file_name << EOF { "job": { "setting": { "speed": { "channel": 2 }, "errorLimit": { "record": 0, "percentage": 0.02 } }, "content": [ { "reader": { "name": "gaussdbreader", "parameter": { "username": "xxxxxx", "password": "xxxxxx", "column": [ '*' ], "connection": [ { "
一、背景 前文采集的日志是来源于虚拟机,在云原生下的容器化部署时,需要采集Pod里的jvm日志。
二、术语 1、临时存储emptyDir emptyDir在Pod被分配到Node时创建的,它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为kubernetes会自动分配一个目录,当Pod销毁时,EmptyDir中的数据也会被永久删除,所以也被称为临时存储。
2、ConfigMap filebeat.yml保存在配置存储ConfigMap里,filebeat进程加载该文件。
filebeat -c /etc/filebeat.yml 三、整体设计 在同一个pod里,使用sidecar模式再部署一个filebeat容器,由它读取jvm容器输出的日志文件。
filebeat本身启动的时候,配置文件filebeat.yml挂载到configMap,供我们方便修改。
filebeat要读取jvm容器的日志文件,通过emptyDir共享日志文件;前者负责读取,后者负责写入。
四、deployment.yaml 1、增加filebeat容器 containers: - name: filebeat-container env: - name: APPNAME value: {{ .Values.appName }} image: docker.elastic.co/beats/filebeat:8.0.1 args: - -c - /etc/filebeat.yml volumeMounts: - name: storage-logs mountPath: /opt/{{ .Values.appName }}/logs - name: filebeat-volume mountPath: /etc/filebeat.yml readOnly: true subPath: filebeat.yml 创建一个名称为storage-logs的临时存储emptyDir volumes: - name: storage-logs emptyDir: {} jvm容器把日志文件挂载到storage-logs volumeMounts: - mountPath: /opt/{{ .Values.appName }}/logs name: storage-logs 2、ConfigMap配置存储 新增一个名称为filebeat-volume的ConfigMap
关注公众号,发现CV技术之美
本篇分享论文A Recipe for Scaling up Text-to-Video Generation with Text-free Videos,提出无文本标注视频的多用途生成方案,助力视频生成技术实现规模化突破。
详细信息如下:
论文地址:https://arxiv.org/abs/2312.15770
项目主页:https://tf-t2v.github.io/
即将开源代码地址:https://github.com/ali-vilab/i2vgen-xl (VGen项目)
近年来,基于扩散模型的视频生成技术取得了显著进展,并开源了一系列优秀的视频生成工作,如VideoComposer、VideoCrafter、AnimateDiff、I2VGen-XL等。这些工作为视频生成社区的发展提供了良好的基准。虽然在过去一年里,文生视频任务取得了令人印象深刻的进展,但仍然落后于文生图像任务。例如,文生图模型Stable Diffusion和DALL-E 2等方法已经能够生成非常逼真的图片,而视频生成的结果仍存在生成质量差、时序连续性弱的问题。
其中一个重要原因是视频-文本(Video-text pairs)数据的标注困难,导致数据量相比图片文本(Image-text pairs)数据集如LAION-5B差了几个数量级(典型的文本视频对数据集WebVId10M只有大约10M数据规模)。为此,来自华中科技大学、阿里巴巴、浙江大学和蚂蚁集团的研究团队提出了TF-T2V方法,一个多用途视频生成框架。
TF-T2V方法的基本思路是利用大规模未标注的视频(Tiktok和YouTube平台包含大量数据源)进行数据扩充,有效丰富视频的动态多样性,使模型能够学习更丰富的运动信息,从而生成连续稳定且高质量的视频。为了显式约束生成的视频更具有时序连续性,研究团队还提出了一个时序一致性损失函数。
具体地,网络模型结构上图所示,整个模型分为两个分支,一个motion分支利用Text-free videos来学习运动动态,一个content分支利用大规模地image-text pairs来学习表观信息。
训练时,两个分支联合训练,motion分支可以专注于3D-UNet中运动模块的学习,而content分支则可以学习表观信息,提升视频生成质量。
在测试过程中,则可以直接利用文本作为引导,生成平滑高质量的视频,这是因为image-text中包含丰富的运动意图,这些运动意图信息通过3D-UNet模块中的时序模块注入运动动态后,就可以实现视频生成了。此外启发于视频帧间差通常包含运动信息,一个时序一致性损失也被提出,用于生成时序连续的视频。
特别地,TF-T2V还支持半监督设定:即其中包含一部分标注的视频数据和无标注的视频数据一起进行联合训练,可以提升模型对于运动文本输入的生成感知能力。
TF-T2V模型的特点:
相比于之前的文生视频模型,如ModelScopeT2V、VideoLDM。TF-T2V模型可以额外利用大量无标注视频数据,这些数据包含丰富运动动态,使得模型可以学习更多运动模式,生成的视频也更稳定。
相比于Make-A-Video这类两阶段模型,其包括text-to-image prior模型(约1B参数)和image-to-video模型。TF-T2V模型可以只需要一个统一的模型就可以进行视频生成,不需要复杂的两阶段模型。而且两阶段模型会带来额外的开销和误差累积。
TF-T2V模型具有通用性,TF-T2V模型既可以用于文生视频任务(text-to-video generation)又可以用于组合式视频生成任务(Compositional video generation)。
更广泛的运用场景。现有的视频-文本数据集WebVid10M是大约360P的有水印数据集,如果想生成高质量且高清(如720P)的视频,则需要额外收集大量高质量视频-文本对数据。而在TF-T2V中,只需要利用高清的无标注视频就可以实现高清视频生成。
实验结果1:利用无标注视频进行文生视频和组合式视频生成任务,生成的视频可以参考项目主页。
实验结果2:在半监督设定下,与其他一些开源方法的对比,TF-T2V可以保持对文本的精准控制,如“人从右往左跑”,生成的视频可以参考项目主页。
实验结果3:TF-T2V生成的视频在质量和连续性上由于现有的方法,生成的视频可以参考项目主页。
实验结果4:高分辨率生成视频,生成的视频可以参考项目主页。
TF-T2V方法为视频生成领域带来了全新的技术突破和研究思路,能够解决视频生成中的数据标注问题,为视频生成技术的发展提供有力的解决方案。未来,TF-T2V方法有望推动视频生成技术的规模化突破,使生成的视频更加逼真、连续且高质量。
通过TF-T2V方法,我们可以期待在无需依赖大量文本标注的情况下,实现更高效、更精准的视频生成。这将为电影制作、广告、娱乐、教育等领域提供更丰富多样的视频内容,同时也将为视频生成领域的研究者们带来更多的思路和突破口。让我们共同期待TF-T2V方法为视频生成技术带来的新起点和无限可能!
等等!还没有结束!
在TF-T2V基础上,作者团队还训练了VideoLCM模型(VideoLCM: Video Latent Consistency Model):
论文地址:https://arxiv.org/abs/2312.09109
项目主页:https://tf-t2v.github.io/
即将开源代码地址:https://github.com/ali-vilab/i2vgen-xl (VGen项目)
VideoLCM是一种基于视频潜在一致性模型的高效视频合成方法,该方法借鉴了图像生成领域中的一致性模型,旨在提高视频生成的效率和质量。VideoLCM框架基于现有的潜在视频扩散模型,并采用一致性蒸馏技术训练视频潜在一致性模型。
实验结果表明,VideoLCM在计算效率、保真度和时间一致性方面具有显著优势。特别地,VideoLCM仅需大约4个采样步骤即可实现高保真度、流畅的视频合成,展示出实时合成的潜力。此外,VideoLCM还可应用于文本到视频生成和组合视频合成任务。为后续研究提供了一个简化且有效的基准,有助于推动快速视频合成领域的发展。
在实验中,VideoLCM可以只需要大约4步去噪就可以生成效果稳定的视频,显著提升了视频生成效率(之前的视频生成方法通常需要50步DDIM去噪)。特别地,在组合式视频生成,如组合式草图到视频生成,VideoLCM需要的步数更少,可能1步就可以有不错的效果。
END
欢迎加入「视频生成」交流群👇备注:生成
作者:Vitalik Buterin 以太坊联合创始人
编译:秦晋 碳链价值
特别感谢Paul Dylan-Ennis的反馈与评论。
十年前,我最喜欢的回忆之一是去柏林一个被称为比特币基兹(Bitcoin Kiez)的地方朝圣:在克罗伊茨贝格(Kreuzberg)的一个地区,几百米范围内有十几家商店都接受比特币支付。这个社区的核心是约尔格-普拉茨(Joerg Platzer)经营的餐厅和酒吧「77号房间」(Room 77)。除了单纯接受比特币之外,它还是一个社区中心,各种开源开发者、不同派别的政治活动家和其他人物都会经常光顾。
77号房间,2013年。资料来源:我2013 年在比特币杂志上发表的文章。
两个月前的一个类似回忆是PorcFest(porc是porcupine的porc,don't tread on me的porc),这是一个在新罕布什尔州北部森林中举行的自由主义者聚会,在那里,获得食物的主要途径是那些名字叫「Revolution Coffee」和「Seditious Soups, Salads and Smoothies」的小餐馆,当然,这些餐馆也接受比特币。在这里,讨论比特币更深层次的政治含义和在日常生活中使用比特币也是并行不悖的。
我之所以提起这些回忆,是因为它们让我想起了加密货币的一个更深层次的愿景:我们在这里不是为了创造孤立的工具和游戏,而是为了建立一个更自由、更开放的社会和经济,让技术、社会和经济等不同部分相互融合。
Web3的早期愿景也是这种类型的愿景,其方向同样理想化,但略有不同。Web3一词最初是由以太坊联合创始人加文-伍德(Gavin Wood)提出的,它指的是以一种不同的方式来思考以太坊是什么:加文并不像我最初那样将其视为「比特币加智能合约」,而是更广泛地将其视为一系列技术中的一种,这些技术可以共同构成一个更加开放的互联网堆栈的基础层。
加文-伍德在他早期的许多演讲中使用过的图表。
当免费开源软件运动于上世纪八九十年代开始时,软件很简单:在电脑上运行,读写停留在电脑上的文件。但如今,我们的大部分重要工作都是协作性的,而且往往是大规模的。因此,即使应用程序的底层代码是开放和自由的,你的数据也会通过一个由公司运营的中央服务器来传输,而公司可以随时任意读取你的数据、改变对你的规则或取消你的平台。因此,如果我们想将开源软件的精神推广到当今世界,我们就需要程序能够访问共享硬盘,以存储多人需要修改和访问的内容。那么,以太坊以及点对点消息传输(当时是Whisper,现在是Waku)和去中心化文件存储(当时只是Swarm,现在是IPFS)等姊妹技术又是什么呢?公共去中心化共享硬盘。这就是「Web3」一词诞生的最初愿景。
遗憾的是,自2017年左右以来,这些愿景已逐渐淡出人们的视野。很少有人谈论消费者加密支付,唯一真正在链上大规模使用的非金融应用是ENS,而且存在着巨大的意识形态分歧,非区块链去中心化社区的大部分人认为加密世界是一种干扰,而不是一种志同道合的精神和强大的盟友。在许多国家,人们确实使用加密货币来汇款和存钱,但他们通常是通过中心化的方式来实现的:要么通过中心化交易所账户进行内部转账,要么在Tron上交易USDT。
Tron创始人、去中心化先驱孙宇晨勇敢的领导了全球最酷、最去中心化的加密生态系统。
经历过那个时代后,我认为造成这种转变的罪魁祸首是交易费用的上涨。当写入链上的成本是0.001美元,甚至是0.1美元时,你可以想象人们会以各种方式(包括非金融方式)制作各种使用区块链的应用程序。但是,当交易费涨到100美元以上时,就像牛市高峰期那样,恰恰有一种人仍然愿意参与游戏--事实上,由于币价上涨,他们变得越来越富有,因此变得更愿意参与游戏:Degen赌徒。在适度情况下,「Degen赌徒」是可以接受的,我曾在一些活动中与很多人交谈过,他们加入加密货币的动机是为了钱,但留下来是为了理想。但是,当他们成为大规模使用该链的最大群体时,这就会调整公众的看法和加密空间的内部文化,并导致我们在过去几年中看到的许多其他负面影响。
现在,快进到2023 年。无论是在规模化这一核心挑战上,还是在对构建一个真正可行的密码朋克未来至关重要的各种「支线任务」上,我们实际上有很多积极的消息可以展示:
Rollup项目开始真正存在。
在Tornado Cash受到监管部门打击后,出现暂时停滞,但第二代隐私解决方案(如Railway和Nocturne)正在迎来曙光。
账户抽象开始兴起。
被遗忘已久的轻客户端开始真正出现。
零知识证明,一项我们认为几十年后才会出现的技术,现在已经出现,而且对开发者越来越友好,并且正处于可用于消费者应用程序的风口浪尖上。
这两件事:人们越来越意识到,「加密货币的本质」不可能是无节制的中心化和过度金融化,而上述关键技术也最终要实现了。也就是说,至少要让以太坊生态系统的一部分真正成为无许可、去中心化、抗审查、开源的生态系统,这才是我们最初要建立的愿景。
其中有哪些价值观?
其中许多价值观不仅为以太坊社区的许多人所共享,也为其他区块链社区,甚至非区块链去中心化社区所共享,尽管每个社区都有自己独特的价值观组合以及对每种价值观的重视程度。
全球开放式参与:世界上任何人都应能够作为用户、观察员或开发者,在最大程度上平等参与。参与应是无许可的。
去中心化:尽量减少应用程序对任何单一行为者的依赖。特别是,即使核心开发人员永远消失,应用程序也应继续运行。
抵抗审查:中心化的参与者不应有权干涉任何用户或应用程序的运行能力。应在堆栈的更高层次解决与不良行为者有关的问题。
可审计性:任何人都应能够验证应用程序的逻辑及其持续运行(例如,通过运行一个完整的节点),以确保其按照开发人员声称的规则运行。
可信的中立性:基础层基础设施应该是中立的,即使任何人不信任开发者,也能看出它是中立的。
构建工具,而不是帝国。帝国试图俘获用户,把他们困在一个有围墙的花园里;而工具只能完成自己的任务,除此之外,还要与更广泛的开放生态系统进行互操作。
合作心态:即使在竞争的同时,生态系统内的项目也会在共享软件库、研究、安全、社区建设和对它们来说有共同价值的领域开展合作。项目试图在彼此之间以及与更广阔的世界之间努力实现正和。
在加密生态系统中,有可能出现不遵循这些价值观的情况。我们可以建立一个被称为「Layer 2」的系统,但它实际上是一个高度集中的系统,由多重身签名(multisig)提供安全保护,而且没有计划切换到更安全的系统。人们可以建立一个账户抽象系统,试图比ERC-4337 更「简单」,但代价是引入信任假设,最终消除了公共内存池的可能性,并使新的构建者更难加入。我们可以建立一个NFT生态系统,在这个系统中,NFT的内容不必要地存储在中心化网站上,从而使其比存储在IPFS上的内容更加脆弱。我们可以建立一个质押界面,不必要地将用户引向已经最大的质押池。
抵制这些压力很难,但如果我们不这样做,那么我们就有可能失去加密生态系统的独特价值,并以额外的低效和额外的步骤重新创建一个克隆版的现有Web2生态系统。
制造忍者神龟需要下水道
加密货币领域在很多方面都是一个无情的环境。丹-罗宾逊(Dan Robinson)和乔治欧斯-康斯坦丁奥普洛斯(Georgios Konstantiopoulos)在 2021 年发表的一篇文章在MEV的背景下生动地表达了这一点,文章认为以太坊是一片黑暗森林,链上交易者经常容易被前台运行的机器人利用,这些机器人本身也容易被其他机器人反利用等。在其他方面也是如此:智能合约经常被黑客攻击,用户的钱包经常被黑客攻击,中心化交易所的失败更加惊人等等。
这对该领域的用户来说是一个巨大挑战,但同时也带来了机遇:这意味着我们有一个领域,可以对各种安全技术进行实际实验、孵化并获得快速的实时反馈,以应对这些挑战。我们已经看到在各种情况下成功应对挑战的案例:
每个人都希望互联网是安全的。有些人试图通过推行一些方法来确保互联网安全,这些方法迫使人们依赖于一个单一的特定行为者,无论是公司还是政府,它们都可以充当安全和真理的中心化锚。但这些方法牺牲了开放性和自由,造成「分裂网络」日益增长的悲剧。加密货币领域的人们高度重视开放性和自由性。这意味着加密领域不能忽视安全,但各种意识形态和结构性原因确保了加密领域无法采用中心化式方法来实现安全。与此同时,加密货币领域正处于零知识证明、形式验证、基于硬件的密钥安全和链上社交图谱等强大技术的前沿。这些事实共同意味着,对于加密技术来说,提高安全性的开放方式是唯一的途径。
所有这一切都说明,加密世界是一个完美的试验平台环境,可以将其开放和去中心化的安全方法实际应用于现实的高风险环境中,并使其成熟到可以在更广阔的世界中应用的程度。这就是我的愿景之一,即加密世界的理想主义部分和加密世界的混乱部分,以及整个加密世界和更广泛的主流世界,如何将它们之间的差异转化为共生关系,而不是持续不断的紧张关系。
以太坊是更广泛技术愿景的一部分
2014年,加文-伍德(Gavin Wood)介绍说,以太坊是可以构建的一整套工具之一,另外两个是Whisper(去中心化消息传递)和Swarm(去中心化存储)。前者备受重视,但遗憾的是,随着2017年前后金融化转向,后者受到的喜爱和关注要少得多。尽管如此,Whisper仍以Waku的形式继续存在,并被去中心化信使Status等项目积极使用。Swarm还在继续开发,现在我们也有了IPFS,它被用来托管和服务本博客。
最近几年,随着去中心化社交媒体(Lens、Farcaster等)的兴起,我们有机会重新审视其中一些工具。此外,我们还有另一个非常强大的新工具加入到三部曲中:零知识证明。这些技术作为提高以太坊可扩展性的方法被广泛采用,如ZK Rollups,但它们在隐私保护方面也非常有用。特别是,零知识证明的可编程性意味着我们可以摆脱「匿名但有风险」与「KYC因此安全」的错误二元对立关系,同时获得隐私和多种身份验证。
2023 年的一个例子是Zupass。Zupass是Zuzalu公司孵化的一个基于零知识验证的系统,既可用于活动的现场认证,也可用于投票系统Zupoll、Twitter外观类似的Zucast等的在线认证。Zupass 的主要特点是:您可以证明自己是Zuzalu的居民,而无需透露自己是Zuzalu的哪位成员。此外,每个Zuzalu居民只能为他们登录的每个应用程序实例(如投票)拥有一个随机生成的加密身份。Zupass取得了巨大成功,并在今年晚些时候应用于Devconnect售票服务。
关于 Knife4j 官方文档:https://doc.xiaominfo.com/
Knife4j是一个基于Swagger的API文档生成工具,它提供了一种方便的方式来为Spring Boot项目生成在线API文档。Knife4j的特点包括:
自动化生成:通过Swagger注解,Knife4j可以自动解析API接口并生成对应的文档页面,无需手动编写文档。在线编辑和展示:Knife4j提供了在线编辑API文档的功能,可以方便地查看和测试API接口。可定制性:可以根据项目需求定制文档的展示样式和内容,满足不同项目的需求。方便集成:通过Spring Boot Starter的方式,可以方便地集成到Spring Boot项目中,无需额外的配置。 总之,Knife4j是一个方便、灵活且功能丰富的API文档生成工具,可以帮助开发团队快速生成和维护API文档。
整合 Knife4j 添加 Knife4j 依赖 <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi2-spring-boot-starter</artifactId> <version>4.0.0</version> </dependency> 配置 Knife4j 文档 第一种方式:Java 配置类
@Configuration @EnableSwagger2WebMvc public class Knife4jConfiguration { private ApiInfo commonApiInfo() { return new ApiInfoBuilder() .title("knife4j 接口文档测试") .description("Knife4j是一款基于Swagger的API文档在线编辑工具,它为Java开发人员提供了一种简单而强大的方式来创建、编辑和管理API文档。Knife4j可以帮助开发人员快速生成和展示API文档,提供了友好的界面和丰富的功能,包括接口测试、在线调试、文档管理等。它还支持对Swagger注解的解析,能够自动生成API文档,并提供了一些扩展功能,如接口权限设置、数据模型展示等。Knife4j可以帮助开发团队更好地管理和维护API文档,提高开发效率和协作能力。") .contact("hwike@foxmail.com") .version("1.0") .build(); } @Bean(value = "dockerBeanAdmin") public Docket dockerBeanAdmin() { //指定使用Swagger2规范 Docket docket=new Docket(DocumentationType.SWAGGER_2) .apiInfo(commonApiInfo()) //分组名称 .groupName("后台接口分组") .select() //这里指定Controller扫描包路径 .apis(RequestHandlerSelectors.basePackage("com.itwenke.springbootdemo.knife4j.admin")) .paths(PathSelectors.any()) .build(); return docket; } @Bean(value = "
概述 好久不见了,近期一直在忙项目的事,才有时间写博客,近期频繁出现sql问题,今天正好不忙咱们看看千万级别的表到底该如何优化sql。
案例 近期有个小伙伴生产环境收到了告警,有个6千万的日志表,查询耗时大概120秒,之前都好好的,条件也很简单(操作人和被操作人),我们查看sql的执行计划,发现它走的主键索引,operatorName和userName建立了联合索引按说应该走这个索引的呀。
sql 如下,条件很简单。
SELECT * from recover_log where operatorName="" and userName="" ORDER BY id LIMIT 10 我们看下他的执行计划:
mysql> EXPLAIN SELECT * from recover_log where operatorName="" and userName="" ORDER BY id LIMIT 10; +----+-------------+-------------+------------+-------+---------------+---------+---------+------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------------+------------+-------+---------------+---------+---------+------+------+----------+-------------+ | 1 | SIMPLE | recover_log | NULL | index | NULL | PRIMARY | 8 | NULL | 10 | 1 | Using where | +----+-------------+-------------+------------+-------+---------------+---------+---------+------+------+----------+-------------+ 1 row in set 上面的执行计划中,直接采用的主键索引,那为什么这么慢呢?按说应该用到联合索引的呀,我们通过force index强制走联合索引后sql耗时20ms。
算法: 有很多分割结果,按照for循环去做肯定做不来
这个时候就要想到回溯!那就要画树!
画树 分割的画树过程其实和组合很像。
例如对于字符串aab:
组合问题:选取一个a之后,在ab中再去选取第二个,选取a之后b中再选取第三个.....。切割问题:切割一个a之后,在ab中再去切割第二段,切割a之后在b再切割第三段.....。 回溯三部曲: 1.确定返回值和参数 返回值:void
参数:
string s 题目自带的
int startindex 确定每次递归从哪个字符开始切割
2.确定终止条件 切割到字符串最后,就是终止
startindex就是切割线:
startindex >= s.length()
并且要收集结果
3.单层递归逻辑: 子串怎么表示的?
答:[startindex, i]
i是这样定义的:
for (int i = startIndex; i < s.length(); i++)
收集结果:
若子串是回文(要定义一个新的函数,判断子串是否为回文),
将子串add入path,收集
若不是回文,continue,跳出该递归
递归:
注意切割过的位置,不能重复切割,所以,backtracking(s, i + 1); 传入下一层的起始位置为i + 1
backtracking (s, i+1)
回溯:
弹出本次已经添加的子串
path.removeLast()
判断回文子串 最后我们看一下回文子串要如何判断了,判断一个字符串是否是回文。
可以使用双指针法,一个指针从前向后,一个指针从后向前,如果前后指针所指向的元素是相等的,就是回文字符串了。
调试过程: 第一次调试: class Solution { //全局变量path和result List<List<String>> result = new LinkedList<>(); List<String> path = new LinkedList<>(); public List<List<String>> partition(String s) { backtracking (s, 0); return result; } void backtracking (String s, int startindex){ //终止条件,收集结果 if (startindex >= s.
什么是分库 分库:是将一个数据库分成多个数据库,但是总表数不变,部署到不同机器,这样可以分担数据库的读写压力,提高系统的吞吐能力。
什么是分表 分表:就是一个表分成多个表,但是总体的库不变,这样可以减少单个表的数据量,提高查询性能。
分库+分表 分库+分表是指库和表都切分,数量都发生变化,这种情况说明数据量已经达到一定程度,无论进行哪种单独的切分都会产生性能瓶颈。 如下图所示原数据库DB中有张user表,将表切成4份然后平分到2个数据库上。
为什么要分库分表 可以解决海量数据运维管理
可以在海量数据里高效查询
可以解决高并发下性能瓶颈
提高系统的可伸缩性和可扩展性
什么时候需要分库分表 单实例性能到达瓶颈
单库容量超过2T
单表数据超过800W
年增量千万级
分片算法/工具 案例分享一 运营商登录服务: 手机号表按照省份分表(31个表),即便这样对于广东省仍然有9千万的数据量,然后再水平分片(18个分片),按照单表不超800w的原则进行划分。 整体分库+分表如下图:
案例分享二
分库分表后这些坑你踩过么 分布式事务、 广播sql 跨分片的join查询、 主键生成问题 、 扩容问题、 热点库表问题 、 数据严重倾斜 、 聚合、复杂性查询、报表等问题 、 多IDC数据同步问题等等
如何解决、躲避这些问题 总结
概述:tasks.jason launch.json settings.json一定要有,没有就别想跑。还有就是c 和c++配置有区别,切记,下文有说
1.安装扩展插件。
2.安装编译器,gcc.我用的是x86_64-8.1.0-release-win32-seh-rt_v6-rev0.7z ,直接解压缩到你喜欢的目录,然后在环境变量里面添加即可。
3.找个目录,创建一个c或者c++文件。
4.将目录打开,可以选择在c/c++文件目录下右键,vscode打开即可。然后可以在目录下看到.vscode文件夹,下面就是一些脚本,可以改。
5.c和c++不太一样。在tasks.json 里面(如果没有,自己创建,一共三个文件,在第7点里面)。
6.碰到的问题点。如果细致一点,按下操作,如果不想麻烦,直接在第7点,文章末尾三个文件直接创建和我一样的就行了。
然后拷贝我的tasks目录进去就好了。
7.我的三个目录的代码是
tasks.json
{ "version": "2.0.0", "tasks": [ { "type": "shell", "label": "compile", "command": "gcc", "args": [ "-g", "${file}", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe" ], "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true } } ] } settings.json
{ "C_Cpp_Runner.cCompilerPath": "gcc", "C_Cpp_Runner.cppCompilerPath": "g++", "C_Cpp_Runner.debuggerPath": "gdb", "C_Cpp_Runner.cStandard": "", "C_Cpp_Runner.cppStandard": "", "C_Cpp_Runner.msvcBatchPath": "", "C_Cpp_Runner.useMsvc": false, "C_Cpp_Runner.warnings": [ "-Wall", "-Wextra", "-Wpedantic", "
本文内容已收录至我的面试网站:www.javacn.site
MySQL 主从复制(Master-Slave Replication)是一种数据复制技术,用于在多个数据库服务器之间的数据同步。在主从复制架构中,一个服务器被设置为主服务器(Master),充当数据源,其他服务器被设置为从服务器(Slave),用来复制主服务器的数据。
1.主从复制优点 主从复制的主要优点有以下几个:
高可用性:通过将主数据库的数据复制到一个或多个从数据库,可以在主数据库故障时快速切换到从数据库,以实现系统的高可用性和容错能力,从而保证系统的持续可用性。
提高整体性能和吞吐量:通过将读请求分散到多个从服务器上进行处理,从而减轻了主服务器的负载压力,提高数据库系统的整体性能和吞吐量。主服务器主要负责写操作,而从服务器主要负责读操作,从而分担了主服务器的压力。
数据备份和恢复:通过主从同步,可以将主服务器上的数据异步复制到从服务器上,从而实现数据备份和灾难恢复的需求。在应对意外数据丢失、灾难恢复或误操作时,可以使用从服务器作为数据的备份源来进行数据恢复。
2.如何实现主从复制? ① 配置并重启主服务器 在主服务器的配置文件(my.cnf)中添加以下参数:
“ [mysqld] server-id = 1 # 设置服务器 ID,每个主服务器和从服务器都必须有唯一的 ID log_bin = /var/log/mysql/mysql-bin.log # 开启二进制日志,记录数据修改操作
” 以上配置完成之后,重启 MySQL 服务器,因为重启了 MySQL 服务才能让配置生效。
② 创建用于主从复制的用户 登录到主服务器上,执行以下命令:
CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; -- 替换为实际的用户名和密码 GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; ③ 查看主服务器状态 在 MySQL 主服务器中,执行以下命令,记录下 File 和 Position 的值,后续用于配置从服务器:
SHOW MASTER STATUS; ④ 配置并重启从服务器 在从服务器的配置文件(my.cnf)中添加以下参数:
“ [mysqld] server-id = 2 # 设置服务器 ID,每个主服务器和从服务器都必须有唯一的 ID
jenkins 配置git 提示“无法连接仓库 无法连接仓库:Command “git ls-remote -h – git@codeup.aliyun.com:xxxxxxxxxxxxxxx/xxxxxx.git HEAD” returned status code 128:
stdout:
stderr: Load key “/tmp/jenkins-gitclient-ssh14549883685367104196.key”: error in libcrypto
git@codeup.aliyun.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
![(https://img-blog.csdnimg.cn/direct/a6d0f353eef34591b673d3dfd9dd5c14.png)
1.先切换到jenkins用户下(此时在jenkins安装目录下) 注意:这里我的jenkins启动用户是jenkins,如果是root则在root用户下生成密钥。那个用户启动用哪个用户生成!
sudo su -s /bin/bash jenkins cd ~ 2.生成新的ssh秘钥(生成PEM格式的私钥与公钥) ssh-keygen -m PEM -t rsa -f id_rsa # ssh-keygen -t rsa(这个不行) 3.复制生成的公钥到gitlab cat .
一、并查集 1.原理 简单的讲并查集,就是查询两个个元素,是否在一个集合当中,这里的集合用树的形式进行表示。并查集的本质就是森林, 即多棵树。 我们再来简单的举个例子:
假设此时的你是大一新生,刚进入大学,肯定是先找到宿舍在哪里,然后跟寝室里面的舍友互相认识一下,先形成一个小团体。假设,宿舍总共6个人,也就是6个人的集合。几乎所有的大学生都是这样先跟周围的人进行联系起来的。然后辅导员召集班会,这时的你欣然前往,并在讲台上自信的介绍自己,然后吸引或者主动又认识了一群人。这时你或许又跟其它的人进行了关联,或成为了好友,或成为了恋人…… 下面我们用如上例子进行展开讨论:
宿舍六人,即六个人,如何判断两个人在同一个集合? 如何进行实现? 先来解决第一个问题,六个人,选出一个宿舍长,只要两个人的宿舍长是一样的,即可判断两个人在一个集合。再来解决第二个问题,既然宿舍长有了,我们都与这个宿舍长产生关联即可,即用树的形式进行表示,至于如何表示,我们可以用双亲表示法进行表示,即每个人记住其宿舍长的名字即可。更为形象的我们可以用下图进行表示:
更进一步,如何用计算机存储这种结构呢?我们只需对每个人名生成一个下标连续,用计算机进行存储即可。用下图进行直观的理解:
对这张图我们再说明一点,除0下标以外的其他位置存放的是指向代表孙八的下标,这个0处下标存的是集合的所有元素的个数,且存放的是负数形式,这样存有一个好处,我们可以由这个并查集中有多少负数,从而判断这个并查集中有多少个集合。 两个人产生关联,本质上是两个宿舍(集合)之间产生了关联,那两个宿舍如何进行关联起来呢? 下面我们以图的形式更为清晰的进行表述:
也就是说因为宿舍的成员是以宿舍长联系起来的,那宿舍与宿舍之间,产生关联(合并),就宿舍长之间认识一下,两个集合就间接的关联起来了。下图是具体的存储方式:
2.基本实现 根据上面的描述,我们可以作出大致总结:
数组进行存储表示树形结构。数组的下标对应着具体的信息(人名,编号等)。我们可以通过一个元素的下标的值不断往上查找,直到找到找到小于0的,即为根节点所在的位置。数组中负数的个数代表着集合的个数。判断两个元素是否在同一个集合,只需找到根的下标判断是否相等即可。将两个不同集合进行合并,其实就是找到根,然后进行更改一个根的指向与改变另一个根的元素个数即可。 由以上信息我们先可以搭建出实现并查集的大致框架:
2.1.基本框架 #include<iostream> #include<vector> #include<map> using namespace std; template<class T> class UnionFindSet { public: UnionFindSet(const T* arr, size_t size);//构造函数 int GetValueIndex(const T& val);//获取val所代表的下标。 void GetRoot(const T& val); //获取根节点的下标 void Union(const T& x1, const T& x2); //将两个元素的集合进行合并。 bool IsSameSet(const T& x1, const T& x2); //判断两个元素是否在同一个集合中 int GetSetSize(); //获取集合的元素 private: map<T, int> _indexHash; //map或者unordered_map都可以。用于快速将T转换为对应的下标。 vector<T> _createIndex; //用此数组对T类型元素生成下标。 vetor<int> _aggregate; //用于存放集合元素,即森林。 }; 2.
1.使用 pcntl 扩展 // 创建子进程 $childPids = []; for ($i = 0; $i < $numProcesses; $i++) { $pid = pcntl_fork(); if ($pid == -1) { die('Fork failed'); } elseif ($pid == 0) { // 子进程执行的逻辑 // 处理任务 exit(0); } else { $childPids[] = $pid; } } // 等待子进程结束 foreach ($childPids as $pid) { pcntl_waitpid($pid, $status); } 2.使用进程池 // 创建进程池 $poolSize = 5; $pool = []; for ($i = 0; $i < $poolSize; $i++) { $pid = pcntl_fork(); if ($pid == -1) { die('Fork failed'); } elseif ($pid == 0) { // 子进程执行的逻辑 while (true) { // 接收任务并处理 // 如果没有任务,则等待 } exit(0); } else { $pool[$pid] = true; } } // 分配任务给子进程 foreach ($tasks as $task) { while (true) { $pid = pcntl_waitpid(-1, $status, WNOHANG); if ($pid > 0) { $pool[$pid] = true; } foreach ($pool as $pid => $busy) { if (!
文章目录 前言为什么要使用文件?什么是文件?文件名二进制文件和文本文件文件的打开和关闭流和标准流文件指针常见的文件打开模式 文件的顺序读写文件的随机读写文件读取结束的判定文件缓冲区 总结 前言 提示:这里可以添加本文要记录的大概内容:
文件操作是C语言中一个至关重要的主题,它允许我们在程序中进行数据的读取、写入和处理。通过文件操作,我们能够实现数据的永久存储和跨程序传递。在这篇博客中,我们将深入探讨C语言中的文件操作,包括文件的打开、读写、关闭等基本操作,以及如何有效地处理文件以满足程序的需求。文件操作不仅是学习C语言的基础,也是构建实用程序和系统的关键一环。
提示:以下是本篇文章正文内容,下面案例可供参考
为什么要使用文件? 在计算机编程和数据处理中,使用文件具有多方面的优势,使其成为不可或缺的工具。
永久性存储: 文件提供了一种在计算机关机或程序结束后仍能保留数据的方式。通过将数据存储在文件中,可以实现永久性的数据保存,使得数据在不同程序执行周期中保持不变。
数据共享: 文件是不同程序之间进行数据交换的通用方式。通过读写文件,不同的程序可以共享信息,实现数据的传递和共享。
备份和恢复: 文件为数据提供了备份和恢复的途径。通过定期创建文件备份,可以在数据丢失或损坏时进行恢复,确保数据的安全性和完整性。
数据持久性: 将数据存储在文件中使得程序可以在不同运行时点之间传递信息。这对于需要保留状态或历史数据的应用程序非常重要。
跨平台数据交互: 文件是在不同操作系统之间进行数据交互的通用方式。通过使用文件,可以实现数据在不同平台之间的无缝传递。
大规模数据存储: 对于大规模的数据,文件提供了一种高效管理和组织数据的方式。数据库系统等基于文件的数据存储结构,为大型数据集的管理提供了灵活性和性能优势。
总的来说,使用文件使得数据能够被持久化、共享、备份,并能够在不同环境中进行传递,为程序的可靠性和灵活性提供了关键支持。
什么是文件? 文件的定义:
在计算机科学中,文件是存储在计算机上用于保存数据的一种资源。它是一系列有序的字节,用于存储信息、文本、图像、程序代码等。文件是计算机中数据的物理载体,通过文件,我们可以持久地存储和组织数据。
文件通常分为文本文件和二进制文件两种主要类型:
文本文件: 由字符组成,可以被文本编辑器直接阅读和编辑。文本文件包含可打印的字符,如字母、数字和符号,并且通常采用特定的字符编码(如UTF-8或ASCII)。
二进制文件: 以字节为基本单位,可以包含任意的数据,包括文本、图像、音频、视频等。与文本文件不同,二进制文件不能被文本编辑器直接解读,需要特定的程序进行处理。
文件可以存在于不同的存储介质中,例如硬盘、固态硬盘、光盘、网络存储等。每个文件都有一个唯一的标识符,通常是文件名,用于在文件系统中定位和访问该文件。
在C语言中,文件是通过文件指针(FILE指针)来表示和操作的。通过文件指针,可以打开文件、读写文件内容,并在使用完毕后关闭文件,释放系统资源。文件的概念贯穿于计算机科学的方方面面,是数据管理和交换的核心。
文件名 ⼀个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀
例如: c:\code\test.txt
通常,文件标识常被称为文件名。
二进制文件和文本文件 二进制文件和文本文件的详细说明:
1. 二进制文件:
二进制文件是以字节(byte)为基本单位存储数据的文件类型。在二进制文件中,数据以二进制形式表示,可以包含任意类型的信息,包括文本、图像、音频、视频等。以下是二进制文件的一些特征:
数据表示: 数据以原始的二进制形式存储,不进行字符编码。每个字节可以表示0到255之间的一个值。
可包含任意数据类型: 二进制文件没有规定数据类型,可以包含任何形式的数据。这使得它适用于存储复杂的结构化数据。
不可读: 由于数据以原始形式存储,二进制文件通常不可读。使用文本编辑器打开二进制文件会显示乱码。
通常较小: 相比文本文件,二进制文件通常较小,因为它们不包含可打印字符或换行符。
例子: 图像文件(如JPEG、PNG)、音频文件(如MP3)、可执行文件(如.exe)等都是二进制文件的示例。
2. 文本文件:
文本文件是以文本形式存储的文件类型,其中的数据通常是可打印字符,如字母、数字和符号。以下是文本文件的一些特征:
字符编码: 文本文件使用字符编码(如UTF-8、ASCII)来表示字符。每个字符通常占用一个字节或更多。
只包含可打印字符: 文本文件通常只包含可打印字符和特殊字符(如换行符、制表符),不包含二进制数据。
可读性强: 由于使用字符编码,文本文件通常是可读的。使用文本编辑器可以轻松查看和编辑文本文件。
通常较大: 由于包含了可打印字符和字符编码,文本文件通常较大。
例子: 纯文本文件(如.txt、.csv)、源代码文件(如.c、.java)、HTML文件等都是文本文件的示例。
总的来说,二进制文件和文本文件在存储数据时采用不同的表示方式,具有不同的特性和用途。选择使用哪种文件类型取决于所需的数据结构和处理方式。
文件的打开和关闭 流和标准流 流(Stream)和标准流(Standard Streams)的详细说明:
AttributeError: 'FigureCanvasTkAgg' object has no attribute 'set_window_title' 问题描述解决方案 问题描述 AttributeError: ‘FigureCanvasTkAgg’ object has no attribute ‘set_window_title’
解决方案 应该是matplotlib包的版本更新了
解决办法:在canvas和set之间增加一个.manager
fig.canvas.manager.set_window_title('AP ' + class_name) 成功解决问题
参考文章
沃通CA助力中小微企业数字化安全发展,推出“中小微企业SSL优惠专场”,深受中小微企业青睐的超快SSL系列证书特惠来袭,降幅达35%!实现HTTPS加密、维护企业数据传输安全,满足法律法规对数据安全保护的基本要求,降低中小微企业数字化安全建设成本。2024新年来临之际,沃通CA与中小微企业客户温暖同行、相伴成长,帮助企业开年加速、新年新气象!
HTTPS加密保障网络与通信安全 我国先后出台《网络安全法》、《密码法》、《数据安全法》、《个人信息保护法》等多部法律法规,结合等保2.0以及密评等落地实施办法,对不同等级的网络信息系统采用密码技术对数据进行加密保护提出了具体要求,其中,维护数据完整性、保密性、可用性,保护网络通信传输安全是保护数据安全的基本要求。
SSL/TLS通过对网络通信进行加密,确保数据在传输过程中不会被窃取或篡改,只有接收方具备正确的解密密钥才能获取数据的原始内容。SSL证书的主要作用就是激活SSL/TLS协议,实现HTTPS加密、保护数据传输安全,以及验证服务器真实身份认证。实现HTTPS加密,可以避免数据明文传输造成的数据泄露、数据篡改、流量劫持等安全威胁;验证服务器身份真实性,可以防范钓鱼网站、钓鱼攻击等安全风险。
DV SSL证书是基础款的SSL证书产品类型,可用于实现HTTPS加密,实现数据传输加密保护,满足网络与通信安全层面的安全性要求。
热销SSL证书产品:DV SSL证书低成本、签发快! 沃通超快SSL系列证书是基础级DV SSL证书产品,由全球信任根证书签发,具备广泛兼容性,支持所有浏览器和移动终端,支持Java和老设备,因仅验证域名所有权、快速签发、低成本等产品特点,备受中小微企业青睐。
沃通超快SSL单域型支持保护1个域名或公网IP,支持额外付费添加多个域名。沃通超快SSL通配型证书支持保护同一主域名下所有次级子域名,证书有效期内可随时扩展增加子域名,无需重新颁发,具备很好的扩展性、灵活性。沃通超快SSL系列证书都支持签发RSA算法或ECC算法。RSA算法SSL证书具备更广泛的兼容性,而ECC算法SSL证书具有更好的抗攻击性,以应对量子计算等新技术的冲击,提升长效安全性。
沃通CA是依法设立的第三方电子认证服务机构,获得国密局颁发《电子认证使用密码许可证》、工信部颁发《电子认证服务许可证》,获批电子政务电子认证服务资质,专注数字证书行业二十余年,综合经营实力强,具备合规资质、专业服务能力及长期履约交付能力,能够为中小微企业客户提供更完善的服务支持和售后保障,确保多年期证书可靠交付。目前已累计服务几十万家政企单位,涵盖电子政务、金融银行、医疗、教育等各行业领域,助力各行业构建安全可信的数字化应用及数字化安全生态。
官方 https://www.rancher.com/https://github.com/rancher/rancherhttps://docs.rke2.io/ rancher kubernetesl yaml deploy rancher serverHelm Deploy Online Rancher DemoHelm & Kubernetes Offline Deploy Rancher v2.7.5 Demohelm upgrade rancher server from v2.7.5 to v2.7.8 in kubernetesrancher harvester deploy demo rke2 rke2 在线部署 kubernetes
RKE2 config containerd private registry
文章目录 引言访问者模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用电脑示例代码地址 引言 设想你是一个艺术馆的管理员,艺术馆里有各种各样的艺术品。每当有游客来访时,根据他们的兴趣,他们可能只想看画、雕塑或特定的展览。在这里,每位游客都有不同的“访问”行为,而艺术馆提供了他们所能“访问”的物品。在软件开发中,我们经常遇到需要对一个复杂的对象结构(如一个元素集合)执行不同操作的情况,而不希望修改对象的类。访问者模式提供了一种将操作逻辑与对象结构分离的方法,使得我们可以在不修改已有程序结构的情况下,向程序添加新的操作。
访问者模式简介 定义与用途 访问者模式(Visitor Pattern)是一种行为型设计模式,它允许你在不改变各元素类的前提下,定义作用于这些元素的新操作。它使用一种访问者类,改变元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者变化而变化。
实现方式 实现访问者模式通常涉及以下几个关键组件:
访问者(Visitor)接口: 定义了对每一种元素(Element)类访问的操作。具体访问者(Concrete Visitor): 实现了访问者接口的类,定义了对每一种元素的具体访问行为。元素(Element)接口: 定义了一个接受访问者(accept)的方法。具体元素(Concrete Element): 实现了元素接口,其方法 accept 通常将自己作为参数传递给访问者的访问方法。 使用场景 访问者模式适用于以下场景:
当一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象执行一些依赖于其具体类的操作。当需要对一个复杂的对象结构执行很多不相关的操作,而你不想在这些操作污染这些对象的类时。访问者可以将相关的操作组织在一个类中。当多个对象间存在一种“双重分派”关系时。即想根据两个对象的实际类型决定执行的操作。 例如:
文档解析器: 文档结构中包含多种类型的元素,如文本、图片和表格。访问者模式可以用来实现文档的渲染、格式校验或者内容提取等操作。保险评估工具: 对不同类型的保险单执行风险评估和报价。每种保险单都有不同的风险评估算法,而所有算法都可以通过访问者模式来实现。公园管理系统: 一个公园包含多种类型的景点,如游乐场、植物园和博物馆。访问者模式可以用来实现不同访客对不同景点的不同访问行为,例如儿童、成人和园艺师。 优势与劣势 优势 增加新的操作很容易,只需添加一个新的访问者即可。将相关的操作集中到一个访问者中,而不是分散在多个元素类中。 劣势 增加新的元素类变得困难,每增加一个新的元素类,每一个访问者都可能需要修改。具体元素对访问者公开细节,违反了封装原则。 在Spring框架中的应用 在Spring框架中,BeanDefinitionVisitor 是访问者模式的一个实际应用例子,它用于访问和修改 BeanDefinition 对象。BeanDefinition 对象包含了Spring容器中bean的配置信息,如类名、属性值和构造函数参数。 作用与用途: BeanDefinitionVisitor 主要用于在Spring容器启动过程中修改已经加载的 BeanDefinition。它通过访问者模式允许开发者编写自定义逻辑来检查和修改 BeanDefinition,而不需要修改 BeanDefinition 的源代码。 如何工作: 访问Bean定义: BeanDefinitionVisitor 遍历Bean定义中的属性值和构造函数参数等信息。 修改Bean定义: 它可以根据需要修改这些信息,例如解析占位符、应用属性编辑器或者更改属性值。 扩展性和灵活性: 开发者可以扩展 BeanDefinitionVisitor 类并覆盖相应的方法来实现自定义访问和修改逻辑。 使用场景: 属性占位符替换: PropertyPlaceholderConfigurer 是Spring中一个常见的使用 BeanDefinitionVisitor 的例子。它在容器启动时解析并替换属性文件中的占位符。 属性编辑器应用: 自定义 BeanDefinitionVisitor 可以用于在bean属性赋值之前应用自定义属性编辑器,进行类型转换或者其他预处理操作。 条件配置: 通过检查 BeanDefinition 的详细信息,BeanDefinitionVisitor 可以实现条件配置,根据不同的环境或条件选择性地修改或激活bean。 实现自定义BeanDefinitionVisitor: 要实现自定义的 BeanDefinitionVisitor,可以继承 BeanDefinitionVisitor 类,并重写 visitXXX 方法来实现特定的访问和修改逻辑。然后在容器启动过程中,或者作为 BeanFactoryPostProcessor 的一部分应用这个访问者到需要的 BeanDefinition 上。 电脑示例 步骤 1:定义代表元素的接口
通用计时器框图 1.时钟源 1)内部时钟(CK_INT)
2)外部时钟模式 1:外部输入引脚(TIx),x=1,2(即只能来自于通道 1 或者通道 2)
3)外部时钟模式 2:外部触发输入(ETR)
4)内部触发输入(ITRx):使用一个定时器作为另一定时器的预分频器
1.1.外部时钟模式 1(TI1、TI2) 外部时钟源进入定时器的流程以通道2为例:
1)外部时钟源信号→IO→TIMx_CH1(或者 TIMx_CH2),其中,外部时钟模式 1 下,时钟源信号只能从 CH1 或者 CH2 输入到定时器,CH3 和 CH4 都是不可以的。
2)TI2 首先经过一个滤波器,由 ICF[3:0]位来设置滤波方式,也可以设置不使用滤波器。
3)接着经过边沿检测器,由 CC2P 位来设置检测的边沿,可以上升沿或者下降沿检测。
4)然后经过触发输入选择器,由 TS[4:0]位来选择 TRGI(触发输入信号)的来源。 TI1F_ED、TI1FP1 和 TI2FP2 三个触发输入信号(TRGI),
5)最后经过模式选择器,由 ECE 位和 SMS[2:0]位来选择定时器的时钟源。外部时钟模式 1,ECE 位置 0,SMS[2:0] = 111。
6)CK_PSC 需要经过定时器的预分频器分频后,最终就能到达计数器进行计数了。
1.2.外部时钟模式 2(ETR) 1)外部时钟源信号→IO→TIMx_ETR,需配置 IO 的复用功能,才能使IO 和定时器相连通
2)经过外部触发极性选择器,由 ETP 位来设置上升沿有效还是下降沿有效,选择下降沿有效的话,信号会经过反相器。
3)然后经过外部触发预分频器,由 ETPS[1:0]位来设置预分频系数,系数范围:1、2、4、8。
4)紧接着经过滤波器器,由 ETF[3:0]位来设置滤波方式,也可以设置不使用滤波器。fDTS 由TIMx_CR1 寄存器的 CKD 位设置。
5)从模式选择器,由 ECE 位置 0和 SMS[2:0]位来选择定时器的时钟源
写在前面:由于matlab和qt的环境配置复杂,请大家一定先根据自己电脑的路径来替换本文中的路径
本文使用环境:
MATLAB 2022b
qt 6.6
编译环境:MSVC2019 64位
matlab的环境还需要配置在环境变量中
此电脑(右键)—>属性—>高级系统设置—>环境变量—>环境变量—>path,加入下面:
这里要填自己matlab的路径哦!应用完之后,需要重启电脑使其生效
检查matlab的环境
mbuild -setup
正常会输出以下结果,请大家选择红圈内的选项
在matlab下新建一个文件,我们写一个绘制三角函数的代码,写入以下代码:
function y = mysin( ) % 定义 x 的范围 x = -2*pi:0.01:2*pi; % 计算 sin(x) y = sin(x); % 添加标题和标签 title('sin(x) 函数'); xlabel('x'); ylabel('sin(x)'); % 绘制 sin(x) 函数 plot(x, y); end 注意,需要写成函数形式
运行一下
在matlab的命令行下输入下面的代码
mcc -W lib:mysindll -T link:lib mysin.m -C 我们主要用的是下面的四个文件:
然后我们来创建qt项目
之后的选项默认,然后我们来到选择构建套件这一步
我们选择MSVC 2019 64 创建项目后,我们需要先运行一下、
我们需要把下面三个文件,放到项目目录下
然后把下面这个文件,放到debug目录下
然后右击头文件,添加现有文件, 选中.h文件
然后我们来修改.pro文件,在其中添加以下内容:
开源协议是一种法律文件,规定了使用、修改和分享开源软件的规则和条件。以下是一些常见的开源协议及其相同点和区别:
GPL(GNU General Public License):GPL 是一种比较严格的开源协议,要求使用者如果对开源软件进行修改并重新发布,必须将修改后的代码也以 GPL 协议进行开源。这意味着,如果你使用 GPL 协议下的开源软件,并对其进行修改,你必须将修改后的代码公开,以便其他人可以受益于你的修改。GPL 协议的主要目的是促进自由软件的发展和共享。
MIT 协议:MIT 协议是一种比较宽松的开源协议。它允许使用者自由使用、修改和分享开源软件,而无需承担太多法律责任。这意味着你可以将 MIT 协议下的开源软件用于商业目的,并且可以对其进行修改和重新发布,而无需公开你的修改内容。MIT 协议的主要目的是鼓励软件的自由使用和创新。
BSD(Berkeley Software Distribution)协议:BSD 协议也是一种比较宽松的开源协议,允许使用者将开源软件用于商业目的,并且可以对其进行修改和重新发布,而无需公开修改内容。与 MIT 协议不同的是,BSD 协议要求使用者在使用开源软件时,必须在软件的源代码中包含原始的 BSD 协议声明。
Apache License:Apache License 是一种相对宽松的开源协议,允许使用者将开源软件用于商业目的,并且可以对其进行修改和重新发布,而无需公开修改内容。与 MIT 和 BSD 协议不同的是,Apache License 要求使用者在使用开源软件时,必须在软件的源代码中包含原始的 Apache License 声明。
相同点:
都允许使用者自由使用、修改和分享开源软件。
都要求使用者在使用开源软件时,必须在软件的源代码中包含原始的开源协议声明。
区别:
GPL 协议比较严格,要求使用者如果对开源软件进行修改并重新发布,必须将修改后的代码也以 GPL 协议进行开源。
MIT、BSD 和 Apache License 协议比较宽松,允许使用者将开源软件用于商业目的,并且可以对其进行修改和重新发布,而无需公开修改内容。
现在主流的开源产品及其所基于的协议:
Linux 操作系统:基于 GPL 协议,是一款免费、开源的操作系统,广泛应用于服务器、移动设备、嵌入式系统等领域。
MySQL 数据库:基于 GPL 协议,是一款开源的关系型数据库管理系统,广泛应用于 Web 应用、企业应用等领域。
Apache HTTP Server:基于 Apache License 协议,是一款开源的 Web 服务器软件,广泛应用于 Web 应用、企业应用等领域。
超图iClient3DforCesium地形、影像、模型、在线影像交互示例 描述示例代码 描述 数据源:基于iserver发布的三维场景(地形、影像、BIM模型) + 在线arcgis影像
应用:目录树展示源数据列表、目录树控制源数据可视化结果显隐、BIM模型点选查询关联属性
示例代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"> <title>模型交互示例</title> <link href="../../Build/Cesium/Widgets/widgets.css" rel="stylesheet"> <link href="./css/pretty.css" rel="stylesheet"> <script src="./js/jquery.min.js"></script> <script src="./js/config.js"></script> <script src="./js/bootstrap.min.js"></script> <script src="./js/bootstrap-select.min.js"></script> <script src="./js/bootstrap-treeview.js"></script> <script src="./js/spectrum.js"></script> <script type="text/javascript" src="../../Build/Cesium/Cesium.js"></script> </head> <body> <div id="cesiumContainer"></div> <div id='tool-menu' class='tool-menu'> <a data-toggle='dropdown' id='layerMangerBtn' title='图层管理' class='tool-menu-btn tool-menu-btn-inverse'> <span class='smicon-layerlist tool-menu-btn-icon'></span> <div class="dropDown-container treeview-dropDown-container" id="treeContainer"> <div id='layerTree'></div> </div> </a> </div> <div id="
在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 在凹凸贴图中,每个像素点都包含了一个法线向量,表示该点表面的方向。这些法线向量通常以纹理的形式存储在一个称为凹凸贴图的二维图像中。渲染过程中,根据法线向量的信息,调整每个像素的光照计算结果,使得光线在表面上的反射看起来产生微小的凹凸效果。
凹凸贴图可以用于增加物体的细节和真实感,例如在石头、皮肤、织物等表面上模拟出凹陷和凸起的纹理效果。这种技术可以通过在三维建模软件中创建凹凸贴图,或者通过在渲染过程中动态生成凹凸贴图来实现。
需要注意的是,凹凸贴图只是一种视觉上的效果,不改变实际的物体几何形状。它是一种节约计算资源的技术,能够在不增加多边形数量的情况下,为平滑的表面增添细节。
本文将讲解如何使用GLTF 编辑器 -NSDT 在线材质编辑工具为游戏角色3D模型设置纹理贴图,在开始之前我们先了解下纹理里纹理贴图的一些基本概念。
1、材质纹理贴图 1:没有纹理的 3D 模型2:带纹理的相同模型
纹理贴图是应用于(映射)到形状或多边形表面的图像。这可以是位图图像或程序纹理。它们可以以常见的图像文件格式存储,由 3D 模型格式或材料定义引用,并组装成资源包。
它们可能有 1-3 个维度,尽管 2 个维度对于可见表面最常见。为了与现代硬件一起使用,纹理贴图数据可以以旋转或平铺顺序存储,以提高缓存一致性。渲染 API 通常将纹理贴图资源(可能位于设备内存中)作为缓冲区或表面进行管理,并且可能允许“渲染到纹理”以获得其他效果,例如后期处理或环境映射。
它们通常包含 RGB 颜色数据(存储为直接颜色、压缩格式或索引颜色),有时还包含用于 alpha 混合 (RGBA) 的附加通道,尤其是对于广告牌和贴花叠加纹理。可以将 alpha 通道(以硬件解析的格式存储可能很方便)用于其他用途,例如镜面反射。
2、纹理贴图的作用 纹理贴图在创建视觉上令人惊叹且逼真的 3D 模型中发挥着至关重要的作用。3D 建模中使用了多种类型的纹理贴图,每种类型都有其独特的用途。例如,漫反射贴图用于定义 3D 模型的表面颜色,而镜面贴图则定义表面的光泽度和反射率。法线贴图用于向模型表面添加深度和结构,而位移贴图用于修改表面几何形状本身。
使用这些不同类型的纹理贴图的重要性在于它们能够共同为观看者创造更加身临其境和引人入胜的体验。通过使用这些贴图,3D 艺术家可以创建复杂的细节,使模型显得更加逼真和可信,最终提高最终产品的整体质量和影响力。
3、设置3D模型纹理贴图的工具和方法 在选择合适的纹理工具时,请考虑项目的复杂性和您对软件的熟悉程度。初学者倾向于 GLTF 编辑器 -NSDT,GLTF 编辑器是一款专门用于3D模型纹理贴图的工具,它支持3D模型各种材质纹理贴图的编辑修改,包括:颜色、粗糙度、金属度、贴图、顶点颜色、自发光贴图、透明贴图、凹凸贴图、法线贴图、位移贴图、粗糙贴图、金属贴图、光照贴图、透明度等。
4、GLTF如何设置纹理贴图? 使用专业的建模软件来设置模型的纹理贴图确实是个不错的选择,但是对于新手小白来说却是不那么友好了,软件的安装、使用都比较麻烦,而GLTF 编辑器 -NSDT 作为一款在线材质纹理编辑工具,基于Three.js 开发,可以在任意支持webGL的浏览器运行,不需要安装下载额外的插件或者以来,打开浏览器就能使用。
以下是如何使用 GLTF 编辑器 -NSDT 设置纹理贴图的方法和步骤:
HDMI2.0 to HDMI2.0 and VGA Converter with Audio
1. 描述 LT8612UX是一个HDMI到HDMI和vga转换器,它将HDMI2.0数据流转换为HDMI2.0信号和模拟RGB信号。 它还输出8通道I2S和SPDIF信号,使高质量的7.1通道音频。 LT8612UX支持符合HDMI2.0/ 1.4规范的DDC/SCDC。 此包为QFN76 9mmx9mm。 工作温度范围为−40°C至+85°C。 2. 特性 •HDMI2.0接收机 •HDMI2.0发射机 •三通道视频DAC •数字音频输出 •杂项 3. 应用程序 •数字标识 •PC,笔记本电脑主板 •HDMI到VGA加密狗 •车载娱乐系统 Description
The LT8612UX is an HDMI to HDMI&VGA converter, which converts HDMI2.0 data streams to HDMI2.0 signals and analog RGB signals. It also outputs 8 channel I2S and SPDIF signals which enable high quality 7.1 channel audio.
LT8612UX support DDC/SCDC compliant with HDMI2.
我们先远端连接服务器 然后服务器终端输入
mkdir 目录路径 建出一个新的文件路径
回到我们自己的电脑
然后 在要缓存到服务器的文件目录下打开终端
输入
scp -r ./xidis.hdr 用户名 如果没设置用户名就是root@服务器公网IP:/root/xhdr 例如
scp -r ./xidis.hdr root@1.113.266.557:/root/xhdr 执行这个名录 会提示你输入服务器密码
这样 就可以将xidis.hdr送到 服务器的 root目录下的 xhdr目录中
来到服务器
然后 我们执行
ls /root/xhdr 查看root目录下的xhdr目录
文件 是已经在下面了的
然后 我们将vue项目中使用文件的路径 改成 服务器的路径 root目录下的 xhdr目录下的 xidis.hdr 然后打包项目
这里注意 你在本地运行 /root/xhdr/xidis.hdr 肯定是拿不到的 将项目上到服务器上去
然后运行 资源就是获取的服务器上的了
作者:聚水潭数据研发负责人 溪竹
聚水潭是中国领先的 SaaS 软件服务商,核心产品是电商 ERP,协同350余家电商平台,为商家提供综合的信息化、数字化解决方案。公司是偏线下商家侧的 toB 服务商,员工人数超过3500,线下网点超过100个,每天要承载大概2亿包裹量的 ERP 发货流程,产生的数据量超过10TP。
公司数据智能产品的定位是将数据融入到服务流程中,在 ERP 这个大的体系里,帮助商家进行数据提效。从整体分层来说,包括智能报表、智能经营、智能分析,其中智能分析包括实时大屏、渠道分析等。
今年3月,聚水潭将 StarRocks 引入到数仓架构中,针对数据智能产品中的多个服务进行了升级。在 StarRocks Summit 2023 上,公司数据研发负责人溪竹结合应用场景分享了在 StarRocks 使用过程中的许多经验和感受。
我们将溪竹的精彩演讲整理出来,希望对你有所帮助。
数仓架构演进
聚水潭数仓经历了大约 10 年的发展,早期跟很多公司一样采用的是 SQL Server 集群,在数据规模较小的情况下 SQL Server 的在线服务和 OLAP 能力都能满足业务需求。随着业务发展,SQL Server 在复杂查询场景下,无法提供丰富的多维统计指标计算能力。所以从 2018 年开始自建 GreenPlum 作为 AP 分析集群,至 2021 年集群数量已经超过 70 个集群。另外在线的 SQL Server 集群也在不断增加,现在已经超过了 1000 套。从 2020 年开始,我们接入了实时链路,从偏数据库的场景转向了偏计算和存储能力的场景。
至此我们只是在不断的扩展集群规模,增加服务数量,导致了数据是隔离的,服务是分散的。为此我们希望有一款产品具有更强的在线化服务能力和实时数据处理能力,能够帮我们整合数据存储,统一数据服务。经过充分的调研和验证,今年 3 月,我们将 StarRocks 引入进来,逐步形成了现在的统一在线服务架构。目前我们的 StarRocks 集群规模约 10 个,整体 CPU 约 1000 个。
StarRocks 大规模集群的构建及验证
其他系列文章导航 Java基础合集
数据结构与算法合集
设计模式合集
多线程合集
分布式合集
ES合集
文章目录 其他系列文章导航
文章目录
前言
一、题目描述
二、题解
2.1 哈希类算法题注意事项
2.2 方法一:判断长度
2.3 方法二: set 判断
2.4 方法三:使用数组
三、代码
2.2 方法一:判断长度
2.3 方法二: set 判断
2.4 方法三:使用数组
四、复杂度分析
2.2 方法一:判断长度
2.3 方法二: set 判断
2.4 方法三:使用数组
前言 这是力扣的 1207 题,难度为简单,解题方案有很多种,本文讲解我认为最奇妙的一种。
一、题目描述 给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。
如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。
示例 1:
输入:arr = [1,2,2,1,1,3] 输出:true 解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现次数相同。 示例 2:
获取input dom赋值并促发事件 const iptDom = document.querySelector('input') iptDom.value = 'hello world!'; iptDom.dispatchEvent(new Event('input', { bubbles: true }));
背景 从java8直接升级到jdk21后,使用zgc的过程中有几个优化点,这里记录下来
zgc优化过程 第一版上线时除了执行-xmx外,没有指定其它的jvm参数,此时观察到两个现象:
1.偶尔有超过500ms的超时的gc,这里是通过采集日志zgc过程中stw的日志发现的,初始标记:日志中Pause Mark Start,再标记:日志中Pause Mark End, 初始转移:日志中Pause Relocate Start
2.偶尔有一次超过10s的进入safepoint的时长,这个时候的现象如下: cpu使用率很高并且容器cpu会被限流
第一点现象我们发现是由于"Alloaction Stall"导致的,也就是使用自适应的zgc回收器回收的速度不够快,不能适应流量突发的情况,我们新增了ZInterval=5秒的参数,除了自适应的zgc触发外,新增了固定间隔5s触发一次,上线后问题解决,不在有"Alloaction Stall"日志,并且偶尔超过500ms的超时的现象不再出现
第二点进入safepoint的时长超过10s的原因确定是由于cpu限流导致的停顿,然而cpu限流的原因不是因为zgc本身的问题,而是因为swap的使用导致cpu使用暴涨,进而被限流,进而导致进入safepoint的时长超过10s,这一步的解决我们是通过调整容器的规格,增加容器内存的方式解决了
文章目录 安装kubesphere插件服务暴露NodePort方式LoadBalancer方式安装 OpenELB部署eip资源配置网关启动网关创建路由测试网关路由ingress高级功能在服务中配置LoadBalancer 基础设施部署服务部署建议helm仓库添加helm仓库 运维相关部署gitlab部署nexus3部署harbor 研发相关 安装kubesphere插件 官网参考:概述
资源定义->搜索clusterconfiguration 点击进入编辑ks-installer 编辑内容如下 若是担心内容存在出入可使用内容对比工具在线文本比对工具 | 菜鸟工具
替换内容确定后会自动安装相关插件
apiVersion: installer.kubesphere.io/v1alpha1 kind: ClusterConfiguration metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: > {"apiVersion":"installer.kubesphere.io/v1alpha1","kind":"ClusterConfiguration","metadata":{"annotations":{},"labels":{"version":"v3.3.2"},"name":"ks-installer","namespace":"kubesphere-system"},"spec":{"alerting":{"enabled":false},"auditing":{"enabled":false},"authentication":{"jwtSecret":""},"common":{"core":{"console":{"enableMultiLogin":true,"port":30880,"type":"NodePort"}},"es":{"basicAuth":{"enabled":false,"password":"","username":""},"elkPrefix":"logstash","externalElasticsearchHost":"","externalElasticsearchPort":"","logMaxAge":7},"gpu":{"kinds":[{"default":true,"resourceName":"nvidia.com/gpu","resourceType":"GPU"}]},"minio":{"volumeSize":"20Gi"},"monitoring":{"GPUMonitoring":{"enabled":false},"endpoint":"http://prometheus-operated.kubesphere-monitoring-system.svc:9090"},"openldap":{"enabled":false,"volumeSize":"2Gi"},"redis":{"enabled":false,"volumeSize":"2Gi"}},"devops":{"enabled":false,"jenkinsMemoryLim":"8Gi","jenkinsMemoryReq":"4Gi","jenkinsVolumeSize":"8Gi"},"edgeruntime":{"enabled":false,"kubeedge":{"cloudCore":{"cloudHub":{"advertiseAddress":[""]},"service":{"cloudhubHttpsNodePort":"30002","cloudhubNodePort":"30000","cloudhubQuicNodePort":"30001","cloudstreamNodePort":"30003","tunnelNodePort":"30004"}},"enabled":false,"iptables-manager":{"enabled":true,"mode":"external"}}},"etcd":{"endpointIps":"192.168.31.21,192.168.31.22,192.168.31.23","monitoring":false,"port":2379,"tlsEnable":true},"events":{"enabled":false},"logging":{"enabled":false,"logsidecar":{"enabled":true,"replicas":2}},"metrics_server":{"enabled":false},"monitoring":{"gpu":{"nvidia_dcgm_exporter":{"enabled":false}},"node_exporter":{"port":9100},"storageClass":""},"multicluster":{"clusterRole":"none"},"network":{"ippool":{"type":"none"},"networkpolicy":{"enabled":false},"topology":{"type":"none"}},"openpitrix":{"store":{"enabled":false}},"persistence":{"storageClass":""},"servicemesh":{"enabled":false,"istio":{"components":{"cni":{"enabled":false},"ingressGateways":[{"enabled":false,"name":"istio-ingressgateway"}]}}},"terminal":{"timeout":600},"zone":"cn"}} labels: version: v3.3.2 name: ks-installer namespace: kubesphere-system spec: alerting: enabled: true auditing: enabled: true authentication: jwtSecret: '' common: core: console: enableMultiLogin: true port: 30880 type: NodePort es: basicAuth: enabled: false password: '' username: '' elkPrefix: logstash externalElasticsearchHost: '' externalElasticsearchPort: '' logMaxAge: 7 gpu: kinds: - default: true resourceName: nvidia.
【检索稳定|火爆征稿中】2024年生物医药与医学影像国际会议(IACBMI 2024)
2024 International Conference on Biomedical and Medical Imaging
2024年生物医学和医学成像国际会议(IACBMI2024)将在中国北京举行。欢迎您参加以“生物医学与医学影像学”为主题的国际会议。这是介绍生物医学和成像新的基本进展的主要国际会议之一。这也有助于促进研究人员之间的交流。
大会主题:(主题包括但不限于这些,更多详细主题请咨询苏老师)
主题一:生物医药
生物信息学中的算法、模型、软件和工具
生物信息学问题的任何新方法
应用于诊断、预后、治疗、监测和康复
生物设备/生物传感器和分子诊断
计算蛋白质组学
DNA和RNA结构、功能和序列分析
模型验证的实验方法
基因工程和蛋白质工程
基因调控、表达、鉴定和网络
基因组学和蛋白质组学
用于模型生成和识别的成像、仪器和传感器
免疫和化学信息学
多尺度建模和综合研究
二代测序
制药应用
生物工程中的概率和优化方法
蛋白质相互作用、对接和功能
蛋白质结构、功能和序列分析
序列分析
结构生物信息学
结构、功能和比较基因组学
结构预测
合成生物学
主题二: 医学影像
医学成像与分析
计算机辅助诊断
图像引导程序、机器人干预和建模
图像感知、观察者表现和技术评估
分子、结构和功能成像的生物医学应用
用于医疗保健、研究和应用的图像信息学
超声波成像
3D成像
核医学
医学中的机器视觉
医学图像可视化
生物医学成像
医学影像学和放射肿瘤学
医学成像与辐射科学
分子成像与生物学
神经影像学
核医学与分子成像
射线照相术
实时成像
热成像
光声成像
内窥镜
计算机断层扫描
磁共振成像
心脏血管造影术
正电子发射断层扫描
医学超音波检查
荧光透视
牙科射线照相术
其他相关主题
投稿邮箱:meets_conf@163.com
背景 我们现在的服务一般都是以容器的维度来部署的,不同服务的容器可能在同一台物理机上,为了保证两个服务的容器之间不互相影响,比如某个服务容器不会使用完整台物理机的cpu,我们一般都会对容器进行cpu限流
cpu限流 cpu限流理解上是很简单的,但是对应到专业术语上的表达是每个cpu周期内可以使用的cpu个数,比如物理机有10核cpu,我们配置容器的限流为2个cpu单位,假设容器有100个线程,这样配置的含义是这100个线程一个cpu周期内使用的cpu总时间不超过两个时钟周期,如果已经用完了,就会被限流,下个cpu周期才能继续使用cpu资源,如下图所示:
参考地址:https://nanmu.me/zh-cn/posts/2021/myth-of-k8s-cpu-limit-and-throttle/
问题现象 最近在spring boot项目中引入了 spring-boot-starter-actuator 后,测试环境开始出现服务假死的现象,
且这个问题十分怪异,只在多个微服务中的简称A的这个服务中出现,其他服务都没有出现这个问题,
之所以说他是假死,是因为只是http请求无法访问进去了,但是该服务的定时任务却可以定时执行。
问题排查 通过查看jvm的线程信息发现,假死的A服务中,存在很多目前正在waiting状态的http nio线程,
进一步跟踪这些线程的堆栈信息,发现他们都在Alibaba Druid连接池的获取Connection方法中等待获取到最新的Connection,
第一反应是不是连接泄露了,存在慢sql、阻塞住的sql,或者手动获取connection但是没有归还的现象,
于是通过在定时任务代码中打印连接池的状态,发现也没有这种情况,而且连接池的最大连接数设置的也挺大的。
初步定位 通过观察该连接池的链接对象,发现是一个sql server数据库,但是我们的项目配置连接的其实是mysql,
在代码中搜索发现了有一个手动创建连接池的地方,而这里是为了与一个客户的sql server数据库做同步使用的,但是在给其他的客户部署时,并不需要这个操作,代码如下:
这里的操作有一个最大的问题,就是当不设置Druid连接池的等待连接时间时,该时间是-1,即默认永远等待,永不超时
最终定位 有了上面的代码,则需要确认为什么获取不到connection?造成永远等待?
这很正常,因为其他的客户环境并没有sql server,完全无法连接上啊,这时候Druid连接池中的可用connection压根没有,
然后spring boot admin,又不停的通过http轮询检查服务健康状态,最终它的每次http请求都会陷入阻塞等待connection,加之http又没有设置连接超时时间,
最终健康检查http连接占满了服务的http连接,导致其他的请求无法进入。
解决与避免 这里存在几个问题
该代码应当在指定客户环境运行,其余客户不应当创建该连接池连接池配置应当通过yml文件配置,这样可以尽快的发现系统中存在的相关io组件,并发现其配置的不正确性,spring boot支持多数据源配置。
[react]脚手架create-react-app/vite与reac项目 环境问题描述create-react-app 脚手架根据脚手架修改项目结构安装脚手架注入配置文件-config文件夹package.json文件变更删除 serviceWorker.js新增reportWebVitals.js文件更新index.js文件 脚手架creat-react-app 缺点 vite 脚手架初始化脚手架 & 项目初始化项目包迁移 本人是在react项目升级的过程迁移的脚手架,原项目使用的creat-react-app,脚手架升级变更对项目的基本结构修复后,项目已经可以正式启动了,记录一下
环境 node -v.18.15.0react - 16.9.0 问题描述 随着本地node版本的提升,运行以前的项目遇到了以下问题:
Error: error:0308010C:digital envelope routines::unsupported
网上描述都是因为 node 版本升级导致的,运行的项目比较早会报错,而网上提供的方案大多都是降低 node 版本,实际上我觉的应该是从其它方面修复而不是降低版本???!!!因为我们以后开发的版本都是越来越高的,不可能每次遇到早期的版本都降级node!!!
然后运行命令查看最新的包的情况:
npm outdated 同时发现react也是老版本, react最新版本已经升级到 18.2.0 版本,但是使用的却还是16.9.0 ,那么既然都是升级,也可以顺便升级一下 react 的代码
考虑到react都升级了,当初创建项目的脚手架应该也升级了,所以项目的基本结构可能发生变化,因此先升级脚手架看一下结构是否变化
create-react-app 脚手架 根据脚手架修改项目结构 考虑到基础框架的内容可能也存在变更,并且之前使用的create-react-app脚手架,那么先升级了全局的create-react-app脚手架
安装脚手架 npm i create-react-app -g create-react-app -V 发现输出版本是5.0.1是最新版本
然后使用脚手架创建新的项目
create-react-app <react-project-name> 此时比对项目的基本结构,因为demo只是最基础的东西,所以需要查看的仅仅包括 package.json 的变化,一些基础文件的变化,基本不包括业务相关代码
注入配置文件-config文件夹 npm run eject 考虑到之前config文件夹就是自动注入的,并且没有其它额外的配置,所以将项目中老版本的config文件夹也删除,如果之后需要的话,再生成,也就是可以暂时忽略配置文件,因为没有使用到配置文件的修改
package.json文件变更 根据 package.json 的比对发现运行的脚本发生了变化
首先将运行的脚本:
"scripts": { "start": "
[LitCTF 2023]Http pro max plus wp 页面内容:只允许本地访问
考查 HTTP ,抓包:
添加 XFF 头: 注意这里抓包之后还有两行回车换行,不要破坏掉了,不然收不到响应。
X-Forwarded-For: 127.0.0.1 不能用 XFF ,那就换一个。
添加 Client-Ip 头 Client-Ip: 127.0.0.1 这里提示:You are not from pornhub.com !
添加 Referer 头 Referer: pornhub.com 提示用 Chrome 浏览器。
修改 User-Agent 头 User-Agent: Chrome 提示代理服务器地址 Clash.win 。
添加 Via 头 Via 报头一般由代理加入,正向和反向代理,并且可以在请求头和响应标头出现。它用于跟踪消息转发,避免请求循环,并识别请求/响应链中发送者的协议功能。
Via: Clash.win 提示给出了一个文件:wtfwtfwtfwtf.php 。
访问 wtfwtfwtfwtf.php 文件 提示中给出了一个文件:sejishikong.php
访问 sejishikong.php 文件 拿到 flag 。
总结 最后总结一下学到的新东西:
Client-Ip 请求头可以代替 X-Forwarded-For 请求头伪造 IP 。
qt6版本的编译器,采取在线下载的方式,所以本身的安装包并不大
附上安装包:
天翼云盘链接:https://cloud.189.cn/t/zIvuqquUBfQr (访问码:loc4)
首先需要注册一个邮箱
勾选下面两个选项
下一步
选第二个,下一步 这一步,可以自定义安装目录,然后选择安装的项目,这里选择第一个
这里选择安装的组件,这和我们要构建项目时的Kits有关我这里选择的组件如下
QT6下的
QT5.15.2下的
如果有需要的话,把最下面的展开里面还有个openssl,可以下载
后面一直点击下一步就行了
安装好后,我们的套件应该有如下的配置
如果没有大家想要的套件,我们可以去到qt的安装目录下找这个文件:
打开,可以添加套件
来源:blog.csdn.net/qq_43372633/article/details/130846879
一. 索引介绍
二. 索引分类
三. 性能分析
四. 查询优化
一. 索引介绍 1.1 什么是Mysql索引 MySQL官方对于索引的定义:索引是帮助MySQL高效获取数据的数据结构。
MySQL在存储数据之外,数据库系统中还维护着满足特定查找算法的数据结构,这些数据结构以某种引用(指向)表中的数据,这样我们就可以通过数据结构上实现的高级查找算法来快速找到我们想要的数据。而这种数据结构就是索引。
简单理解为“排好序的可以快速查找数据的数据结构”。
1.2 索引数据结构 下图是二叉树的索引方式:
图片 二叉树数据结构的弊端:当极端情况下,数据递增插入时,会一直向右插入,形成链表,查询效率会降低。
MySQL中常用的的索引数据结构有BTree索引(Myisam普通索引),B+Tree索引(Innodb普通索引),Hash索引(memory存储引擎)等等。
1.3 索引优势 提高数据检索的效率,降低数据库的IO成本。
通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗。
1.4 索引劣势 索引实际上也是一张表,保存了主键和索引的字段,并且指向实体表的记录,所以索引也是需要占用空间的。
在索引大大提高查询速度的同时,却会降低表的更新速度,在对表进行数据增删改的同时,MySQL不仅要更新数据,还需要保存一下索引文件。
每次更新添加了的索引列的字段,都会去调整因为更新带来的减值变化后的索引的信息。
1.5 索引使用场景 哪些情况需要创建索引:
主键自动建立唯一索引
频繁作为查询条件的字段应该创建索引(where 后面的语句)
查询中与其它表关联的字段,外键关系建立索引
多字段查询下倾向创建组合索引
查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
查询中统计或者分组字段
哪些情况不推荐建立索引:
表记录太少
经常增删改的表
Where条件里用不到的字段不建立索引
二. 索引分类 2.1 主键索引 表中的列设定为主键后,数据库会自动建立主键索引。
单独创建和删除主键索引语法:
创建主键索引语法:alter table 表名 add primary key (字段);
删除主键索引语法:alter table 表名 drop primary key;
2.2 唯一索引 表中的列创建了唯一约束时,数据库会自动建立唯一索引。
单独创建和删除唯一索引语法:
创建唯一索引语法:alter table 表名 add unique 索引名(字段);
[鹤城杯 2021]EasyP wp 参考博客: basename()绕过小结
request导致的安全性问题分析
源码分析 首先进入题目,看到代码:
<?php include 'utils.php'; if (isset($_POST['guess'])) { $guess = (string) $_POST['guess']; if ($guess === $secret) { $message = 'Congratulations! The flag is: ' . $flag; } else { $message = 'Wrong. Try Again'; } } if (preg_match('/utils\.php\/*$/i', $_SERVER['PHP_SELF'])) { exit("hacker :)"); } if (preg_match('/show_source/', $_SERVER['REQUEST_URI'])){ exit("hacker :)"); } if (isset($_GET['show_source'])) { highlight_file(basename($_SERVER['PHP_SELF'])); exit(); }else{ show_source(__FILE__); } ?> 其中第一段代码是让我们传入一个 GET 参数 guess 。这个参数值先会经过转义然后跟 $secret 强比较。我没有办法绕过,也猜不到 $secret 的值是多少,所以这段代码的作用相当于没有。
一、专业技能提升
Spring Boot 深入学习与实践:
学习并理解Spring Boot的核心原理和特性,如自动配置、starter、Actuator等。实践开发复杂的后端API,包括RESTful API设计、异常处理、安全控制等。熟练使用Spring Boot与Mariadb的集成,进行数据库操作和事务管理。 Mariadb 数据库优化:
深入理解SQL语句和数据库优化技巧,提高查询效率。学习并掌握数据库设计原则和范式,提升数据库结构设计能力。研究并实践Mariadb的备份恢复、性能监控和故障排查方法。 Elasticsearch 应用与扩展:
系统学习Elasticsearch的索引、搜索、聚合等功能,提升数据检索和分析能力。掌握Elasticsearch在Spring Boot中的集成和使用,实现高效的数据存储和查询。探索Elasticsearch的高级特性,如分片和副本、监控和调优等。 二、项目实战与经验积累
参与或主导一项基于Spring Boot、Mariadb和Elasticsearch的实际项目开发,将所学知识应用到实践中。在项目中注重代码质量和团队协作,遵守编码规范,编写清晰、可维护的代码。对项目进行持续优化和改进,不断提升系统性能和用户体验。 三、理论知识拓展
学习和研究相关的计算机科学理论,如算法、数据结构、操作系统、网络等,为技术实践打下坚实基础。关注软件工程领域的最新动态和趋势,了解新的开发工具、框架和技术,保持技术敏感度。 四、个人综合素质提升
提高英语阅读和沟通能力,跟踪国际前沿技术和资讯。培养良好的时间管理和自我学习能力,合理安排学习和生活,保持高效的学习状态。参加技术分享和交流活动,扩大人脉圈,提升自己的行业影响力。
web前端作为一门广泛应用的编程语言,在现代软件开发领域中有着重要的地位。对于想要学习web前端的人来说,参加专业的web前端培训班是一个不错的选择。下面将介绍在web前端培训班学习的步骤,帮助学员更好地掌握这门编程语言。
1.学习心态
首先,学员在web前端培训班学习需要调整好学习的心态。学习web前端需要持之以恒的学习态度,要有足够的耐心和毅力。在学习过程中会遇到各种各样的问题和困难,要有足够的心理准备,保持乐观的心态,不断克服困难,才能取得更好的学习效果。
2.学习计划的制定
其次,学员需要制定合理的学习计划。在web前端培训班学习期间,要根据课程安排和个人实际情况,制定详细的学习计划,包括每天的学习时间安排、学习内容安排等。合理的学习计划可以帮助学员更好地安排学习时间,提高学习效率。
3.基础知识的积累
在web前端培训班学习过程中,学员需要先从基础知识开始学习。包括web前端语言的基本语法、面向对象的思想、常用类库等内容。这些基础知识是学习web前端的基础,学员需要认真对待,扎实掌握。
4.项目实战案例的练习与经验积累
除了理论知识外,学员还需要通过实际的项目实战案例进行练习,积累实际操作经验。在web前端培训班中,通常会安排一些实际项目案例供学员练习,学员需要积极参与,动手实践,不断积累实际经验。
5.多交流
学员在web前端培训班学习过程中,还需要多和老师、同学进行交流。可以通过提问、讨论等方式,加深对知识点的理解,发现问题并及时解决。交流还可以帮助学员结识更多的朋友,建立学习小组,共同进步。
6.培养自主学习能力的必要性
最后,学员需要培养自主学习能力。在web前端培训班学习期间,老师会给出一定的学习任务,但是学员也需要有自主学习的能力,能够主动查阅资料,解决问题。只有具备了自主学习的能力,才能在今后的学习和工作中更好地成长。
总之,在web前端培训班学习web前端,需要学员调整好学习心态,制定合理的学习计划,扎实掌握基础知识,积累实际经验,多交流,培养自主学习能力。只有这样,才能更好地掌握这门编程语言,为将来的发展打下坚实的基础。
本文为官方文档直译版本。原文链接
Spring Boot Data中文文档 引言SQL 数据库配置数据源嵌入式数据库支持连接到生产数据库数据源配置支持的连接池连接到 JNDI 数据源 使用 JdbcTemplate使用 JdbcClientJPA 和 Spring Data JPA实体类Spring Data JPA RepositoriesSpring Data Envers Repositories创建和删除 JPA 数据库在视图中打开 EntityManager Spring Data JDBC使用 H2 的 Web 控制台更改 H2 控制台路径在安全应用程序中访问 H2 控制台 使用 jOOQ代码生成使用 DSLContextjOOQ SQL 语言自定义 jOOQ 使用 R2DBC嵌入式数据库支持使用 DatabaseClientSpring Data R2DBC Repositories 使用 NoSQL 技术Redis连接到 Redis MongoDB连接到 MongoDB 数据库MongoTemplateSpring Data MongoDB Repositories Neo4j连接到 Neo4j 数据库Spring Data Neo4j Repositories Elasticsearch使用 REST 客户端连接 Elasticsearch使用 RestClient 连接 Elasticsearch使用 ElasticsearchClient 连接到 Elasticsearch使用 ReactiveElasticsearchClient 连接到 Elasticsearch 使用 Spring Data 连接 ElasticsearchSpring Data Elasticsearch Repositories Cassandra连接到 CassandraSpring Data Cassandra Repositories Couchbase连接到 CouchbaseSpring Data Couchbase Repositories LDAP连接到 LDAP 服务器Spring Data LDAP Repositories嵌入式内存 LDAP 服务器 InfluxDB连接到 InfluxDB 引言 Spring Boot 集成了许多数据技术,包括 SQL 和 NoSQL。
简介 本篇将驱动无源蜂鸣器进行5KHz的响动。 电路原理图 蜂鸣器电路原理图
主芯片驱动引脚原理图
其他知识 蜂鸣器类型 蜂鸣器分为 有源蜂鸣器 :触发就会响。
无源蜂鸣器 : 需要给源, 输出一定频率的音频信号, 震动发声;
占空比 为什么占空比总是50%呢?
当蜂鸣器的信号占空比较低时,即高电平时间较短,低电平时间较长。这时蜂鸣器的发声强度会较低,声音持续时间也较短。
当蜂鸣器的信号占空比较高时,即高电平时间较长,低电平时间较短。这时蜂鸣器的发声强度也会较高,但声音持续时间相对较短。因为蜂鸣器在高电平时间过长的情况下,虽然能够充分振动产生较大的声音,但声音传播时间变短,导致发声时间较短。这种情况下,蜂鸣器的声音更加尖锐和紧凑。- 来自 蜂鸣器发声强度与信号占空比的关系是怎么样的?
虽然查到的资料并没有说明占空比50%是绝对的, 除非你仔细测试研究了适合你蜂鸣器的占空比, 否则50%就是比较合适的, 本次实验也是在50%占空比的情况下进行测试的;
us延时 参考 普中STM32-PZ6806L开发板(HAL库函数实现-TIM2实现us延时),
本次使用us延时, 而不是PWM实现对应音阶频率, 需要用到us延时, 而系统提供的延时是ms级别的, 所以需要实现一个us的延时方式。
半周期 因为占空比是50%, 高低电平各一半, 半周期指的就是时间的一半
实现振动 如何实现振动, 浅意来说就需要实现波, 令蜂鸣片振动,从而发声, 无源蜂鸣器发声频率范围是在1.5KHz-5KHz, 所以实现这个范围的延时, T(时间s) = 1/f(Hz频率), 例如我要产生5KHz的音频信号, 时间是200us, 那半周期就是100us, 就是在
实现步骤 创建项目 参考 普中STM32-PZ6806L开发板(STM32CubeMX创建项目并点亮LED灯)
TIM2初始化 TIM2用来实现us级别的延时
初始化 参考 普中STM32-PZ6806L开发板(HAL库函数实现-TIM2实现us延时)
初始化蜂鸣器引脚 PB5 引脚设置为输出
添加用户代码 main.c
/* * time : 执行次数 */ void BEEP_5KHzAction(uint16_t time) { while (time--) { HAL_GPIO_TogglePin(BEEP_PORT, BEEP_PIN); delay_us(100); // 半周期100us } } int main() { .
近场通信(Near Field Communication,NFC)又称近距离无线通信,是一种短距离的高频无线通信技术,允许电子设备之间进行非接触式点对点数据传输交换数据。这个技术由免接触式射频识别(RFID)发展而来,并兼容 RFID,主要用于手机等手持设备中。由于近场通信具有天然的安全性,因此,NFC物联网技术在手机支付等领域具有很大的应用前景。
NFC 将非接触读卡器、非接触卡和点对点 ( Peer-to-Peer) 功能整合进一块单芯片,为消费者的生活方式开创了不计其数的全新机遇。这是一个开放接口平台,可以对无线网络进行快速、主动设置,也是虚拟连接器,服务于现有蜂窝状网络、蓝牙和无线 802.11 设备。
1 NFC 与其他无线连接技术的比较 与 RFID 一样,NFC 信息也是通过频谱中无线频率部分的电磁感应合方式传递的,但两者之间还是存在很大的区别。
首先,NFC 是一种提供轻松、安全、迅速的通信的无线连接技术,其传输范围比 RFID小。RFID 的传输范围可以达到几米、甚至几十米,NFC 采取了独特的信号衰减技术,相对于 RFID 来说,NFC 具有距离近、带宽高、能耗低等特点。
其次,NFC与现有非接触智能卡技术兼容,目前已经成为得到越来越多主要厂商支持的正式标准。
再次,NFC 还是一种近距离连接协议,提供各种设备间轻松、安全、迅速而自动的通信。与无线世界中的其他连接方式相比,NFC 是一种近距离的私密通信方式。
最后,RFID 更多地被应用在生产、物流、跟踪、资产管理上,而 NFC 则在门禁、公交、手机支付等领域内发挥着巨大的作用。
同时,NFC 还优于红外和蓝牙传输方式。作为一种面向消费者的交易机制, NFC 比红外更快、更可靠而且简单得多,不用向红外那样必须严格的对齐才能传输数据。与蓝牙相比,NFC 面向近距离交易,适用于交换财务信息或敏感的个人信息等重要数据;蓝牙能够弥补NFC 通信距离不足的缺点,适用于较长距离数据通信。因此, NFC 和蓝牙为补充,共同存在。事实上,快捷轻型的 NFC 协议可以用于引导两台设备之间的蓝牙配对过程,促进了蓝牙的使用。
2 NFC 技术在校园的应用 NFC 技术支持多种应用,包括移动支付与交易、对等式通信及移动中信息访问等。通过NFC 手机,人们可以在任何地点、任何时间,通过任何设备,与他们希望得到的娱乐服务与交易联系在一起,从而完成付款,获取海报信息等。 NFC 设备可以用作非接触式智能卡、智能卡的读写器终端以及设备对设备的数据传输链路。其应用主要可分为以下四个基本类型:用于付款和购票、用于电子票证、用于智能媒体以及用于交换、传输数据。那么针对校园来讲,NFC 技术可以有较为合理的几种应用方案。
2.1 校园应用方案一
学生作为这个时代最具活力的群体,对新鲜事物的接受能力极高。尤其是对科技感十足、引领未来趋势的产品,更是趋之若鹜。“手机校园一卡通”正迎合年轻人的消费心理,让学生朋友轻松随性地享受着科技给生活带来的便利。
“手机校园一卡通”与传统校园一卡通相比具有明显的优势。IC 卡校园一卡通设计千篇律,让学生感到死板陈旧,并且容易损坏及丢失,而“手机校园一卡通”就能有效地避免这些情况的发生。手机是现在的年轻人最贴身、最常用的工县,同学们一般都将手机随身携带。只需将具有 NFC 功能的薄膜芯片卡与手机 SIM 卡相贴合,就可让手机具备传统校园一卡通功能。不论是在图书馆、食堂或是校园便利店,使用时拿出手机就能感应交易,还可在手机上查询卡片余额和交易纪录。即使手机处于关机状态,感应功能依然可以使用。
2.2 校园应用方案二
随着更安全、更易于管理的门禁卡问世,许多机械钥匙的应用已逐渐被淘汰,经过多年发展,门禁卡的功能越来越齐全、越来越智能化。现在,门禁技术取得更巨大的突破,虚拟身份凭证卡可以安全地进行配置并可靠地嵌入到智能手机与其他移动设备中,并正迎来全新的发展时代。
NFC 是一项适用于门禁系统的技术,这种近距离无线通信标准能够在几厘米的距离内实现设备问的数据交换。NFC 还完全符合管理非接触式智能卡的 ISO 标准,这是其成为理想平台的一大显著特点。通过使用配备 NEC 技术的手机携带便携式身份凭证卡,然后以无线方式由读卡器读取,学生只需在读卡器前出示手机即可开门。此类门禁卡不仅能安全地寄存学生的身份信息,还可通过存储访问规则决定某个特定人员是否可以打开门,在读卡器和中央控制面板(或服务器)之间决定是允许还是拒绝访问。