借助So-vits我们可以自己训练五花八门的音色模型,然后复刻想要欣赏的任意歌曲,实现点歌自由,但有时候却又总觉得少了点什么,没错,缺少了画面,只闻其声,却不见其人,本次我们让AI川普的歌声和他伟岸的形象同时出现,基于PaddleGAN构建“靓声靓影”的“懂王”。
PaddlePaddle是百度开源的深度学习框架,其功能包罗万象,总计覆盖文本、图像、视频三大领域40个模型,可谓是在深度学习领域无所不窥。
PaddleGAN视觉效果模型中一个子模块Wav2lip是对开源库Wav2lip的二次封装和优化,它实现了人物口型与输入的歌词语音同步,说白了就是能让静态图的唇部动起来,让人物看起来仿佛正在唱歌。
除此以外,Wav2lip还可以直接将动态的视频,进行唇形替换,输出与目标语音相匹配的视频,如此一来,我们就可以通过AI直接定制属于自己的口播形象了。
要想把PaddlePaddle框架在本地跑起来,并非易事,但好在有国内深度学习领域的巨擘百度进行背书,文档资源非常丰富,只要按部就班,就不会出太大问题。
首先,在本地配置好Python3.10开发环境,参见:一网成擒全端涵盖,在不同架构(Intel x86/Apple m1 silicon)不同开发平台(Win10/Win11/Mac/Ubuntu)上安装配置Python3.10开发环境
随后,需要在本地配置好CUDA和cudnn,cudnn是基于CUDA的深度学习GPU加速库,有了它才能在GPU上完成深度学习的计算。它就相当于工作的工具,而CUDA作为计算平台,就需要cudnn的配合,这俩个在版本上必须配套。
首先点击N卡控制中心程序,查看本机N卡驱动所支持的CUDA版本:
从图上可知,笔者的显卡是RTX4060,当前驱动最大支持CUDA12.1的版本,换句话说只要是小于等于12.1的CUDA就都是支持的。
随后查看PaddlePaddle框架的官方文档,查看Python3.10所支持的框架版本:
http://www.paddlepaddle.org.cn/documentation/docs/zh/install/Tables.html#ciwhls-release
根据文档可知,对于Python3.10来说,PaddlePaddle最高的支持版本是win-cuda11.6-cudnn8.4-mkl-vs2017-avx,也就是CUDA的版本是11.6,cudnn的版本是8.4,再高就不支持了。
所以本机需要安装CUDA11.6和cudnn8.4。
注意版本一定要吻合,否则后续无法启动程序。
知晓了版本号,我们只需要去N卡的官网下载安装包即可。
CUDA11.6安装包下载地址:
http://developer.nvidia.com/cuda-toolkit-archive
cudnn8.4安装包下载地址:
http://developer.nvidia.com/rdp/cudnn-archive
首先安装CUDA11.6,安装完成后,解压cudnn8.4压缩包,将解压后的文件拷贝到CUDA11.6安装目录中即可,CUDA安装路径是:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6
随后需要将bin目录添加到系统的环境变量中:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\bin
接着在终端进入demo文件夹:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\extras\demo_suite
执行bandwidthTest.exe命令,返回:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\extras\demo_suite>bandwidthTest.exe
[CUDA Bandwidth Test] - Starting...
Running on...
Device 0: NVIDIA GeForce RTX 4060 Laptop GPU
Quick Mode
Host to Device Bandwidth, 1 Device(s)
PINNED Memory Transfers
Transfer Size (Bytes) Bandwidth(MB/s)
33554432 12477.8
Device to Host Bandwidth, 1 Device(s)
PINNED Memory Transfers
Transfer Size (Bytes) Bandwidth(MB/s)
33554432 12337.3
Device to Device Bandwidth, 1 Device(s)
PINNED Memory Transfers
Transfer Size (Bytes) Bandwidth(MB/s)
33554432 179907.9
Result = PASS
NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.
即代表安装成功,随后可通过deviceQuery.exe查询GPU设备:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\extras\demo_suite>deviceQuery.exe
deviceQuery.exe Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
Detected 1 CUDA Capable device(s)
Device 0: "NVIDIA GeForce RTX 4060 Laptop GPU"
CUDA Driver Version / Runtime Version 12.1 / 11.6
CUDA Capability Major/Minor version number: 8.9
Total amount of global memory: 8188 MBytes (8585216000 bytes)
MapSMtoCores for SM 8.9 is undefined. Default to use 128 Cores/SM
MapSMtoCores for SM 8.9 is undefined. Default to use 128 Cores/SM
(24) Multiprocessors, (128) CUDA Cores/MP: 3072 CUDA Cores
GPU Max Clock rate: 2370 MHz (2.37 GHz)
Memory Clock rate: 8001 Mhz
Memory Bus Width: 128-bit
L2 Cache Size: 33554432 bytes
Maximum Texture Dimension Size (x,y,z) 1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
Maximum Layered 1D Texture Size, (num) layers 1D=(32768), 2048 layers
Maximum Layered 2D Texture Size, (num) layers 2D=(32768, 32768), 2048 layers
Total amount of constant memory: zu bytes
Total amount of shared memory per block: zu bytes
Total number of registers available per block: 65536
Warp size: 32
Maximum number of threads per multiprocessor: 1536
Maximum number of threads per block: 1024
Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535)
Maximum memory pitch: zu bytes
Texture alignment: zu bytes
Concurrent copy and kernel execution: Yes with 1 copy engine(s)
Run time limit on kernels: Yes
Integrated GPU sharing Host Memory: No
Support host page-locked memory mapping: Yes
Alignment requirement for Surfaces: Yes
Device has ECC support: Disabled
CUDA Device Driver Mode (TCC or WDDM): WDDM (Windows Display Driver Model)
Device supports Unified Addressing (UVA): Yes
Device supports Compute Preemption: Yes
Supports Cooperative Kernel Launch: Yes
Supports MultiDevice Co-op Kernel Launch: No
Device PCI Domain ID / Bus ID / location ID: 0 / 1 / 0
Compute Mode:
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 12.1, CUDA Runtime Version = 11.6, NumDevs = 1, Device0 = NVIDIA GeForce RTX 4060 Laptop GPU
Result = PASS
至此,CUDA和cudnn就配置好了。
配置好CUDA之后,让我们来安装PaddlePaddle框架:
python -m pip install paddlepaddle-gpu==2.4.2.post116 -f http://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html
这里安装paddlepaddle的gpu版本,版本号是2.4.2.post116,2.4是最新版,其中116就代表Cuda的版本,注意版本一定不能弄错。
随后克隆PaddleGan项目:
git clone http://gitee.com/PaddlePaddle/PaddleGAN
运行命令本地编译安装PaddleGan项目:
pip install -v -e .
随后再安装其他依赖:
pip install -r requirements.txt
这里有几个坑,需要说明一下:
首先PaddleGan依赖的numpy库还是老版本,它不支持最新的1.24版本,所以如果您的numpy版本是1.24,需要先把numpy卸载了:
pip uninstall numpy
随后安装1.21版本:
pip install numpy==1.21
接着在Python终端中验证PaddleGan是否安装成功:
import paddle
paddle.utils.run_check()
如果报这个错误:
PreconditionNotMetError: The third-party dynamic library (cudnn64_7.dll) that Paddle depends on is not configured correctly. (error code is 126)
Suggestions:
1. Check if the third-party dynamic library (e.g. CUDA, CUDNN) is installed correctly and its version is matched with paddlepaddle you installed.
2. Configure third-party dynamic library environment variables as follows:
- Linux: set LD_LIBRARY_PATH by `export LD_LIBRARY_PATH=...`
- Windows: set PATH by `set PATH=XXX; (at ..\paddle\phi\backends\dynload\dynamic_loader.cc:305)
[operator < fill_constant > error]
则需要下载cudnn64_7.dll动态库,然后复制到CUDA11.6的bin目录中,动态库地址后面会贴出来。
再次运行验证程序,返回:
Python 3.10.11 (tags/v3.10.11:7d4cc5a, Apr 5 2023, 00:38:17) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import paddle
>>> paddle.utils.run_check()
Running verify PaddlePaddle program ...
W0517 20:15:34.881800 31592 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 8.9, Driver API Version: 12.1, Runtime API Version: 11.6
W0517 20:15:34.889958 31592 gpu_resources.cc:91] device: 0, cuDNN Version: 8.4.
PaddlePaddle works well on 1 GPU.
PaddlePaddle works well on 1 GPUs.
PaddlePaddle is installed successfully! Let's start deep learning with PaddlePaddle now.
说明大功告成,安装成功。
下面我们给川普的歌曲配上动态画面,首先通过Stable-Diffusion生成一张懂王的静态图片:
关于Stable-Diffusion,请移步:人工智能,丹青圣手,全平台(原生/Docker)构建Stable-Diffusion-Webui的AI绘画库教程(Python3.10/Pytorch1.13.0),囿于篇幅,这里不再赘述。
接着进入到项目的tools目录:
\PaddleGAN\applications\tools>
将川普的静态图片和歌曲文件放入tools目录中。
接着运行命令,进行本地推理:
python .\wav2lip.py --face .\Trump.jpg --audio test.wav --outfile pp_put.mp4 --face_enhancement
这里--face是目标图片,--audio则是需要匹配唇形的歌曲,--outfile参数是输出视频。
face_enhancement:参数可以添加人脸增强,不添加参数默认为不使用增强功能。
但添加了这个参数需要单独下载模型文件。
Wav2Lip实现唇形与语音精准同步突破的关键在于,它采用了唇形同步判别器,以强制生成器持续产生准确而逼真的唇部运动。此外,它通过在鉴别器中使用多个连续帧而不是单个帧,并使用视觉质量损失(而不仅仅是对比损失)来考虑时间相关性,从而改善了视觉质量。
具体效果:
有的时候,人工智能AI技术的发展真的会让人有一种恍若隔世的感觉,耳听未必为实,眼见也未必为真。最后,成品视频可在Youtube平台(B站)搜索:刘悦的技术博客,欢迎诸君品鉴,本文所有涉及的安装包和动态库请参见:
http://pan.baidu.com/s/1-6NA2uAOSRlT4O0FGEKUGA?pwd=oo0d
提取码:oo0d
死锁(DeadLock)指的是两个或两个以上的运算单元(进程、线程或协程),都在等待对方停止执行,以取得系统资源,但是没有一方提前退出,就称为死锁。 死锁示例接下来,我们先来演示一下Java中最简单的死锁,我们创建两个锁和两个线程,让线程1先拥有锁A,然后在1s后尝试获取锁B,同时我们启动线程2,让它先拥有锁B,然后在1s之后尝试获取锁A,这时就会出现相互等待对方释放锁的情况,从而造成死锁的问题,具体代码如下:publicclassDeadLockExample{ publicstaticvoidmain(String[]args){ ObjectlockA=newObject();//创建锁A ObjectlockB=newObject();//创建锁B //创建线程1 Threadt1=newThread(newRunnable(){ @Override publicvoidrun(){ //先获取锁A synchronized(lockA){ System.out.println("线程1:获取到锁A!"); try{ Thread.sleep(1000);
01)if语句if(condition){ statement1 }else{ statement2 }复制condition表示任意表达式,该表达式求值的结果不一定是布尔类型,如果不是布尔类型,ECMAScript会调用Boolean()转换函数将这个表达式结果转换为一个布尔类型,如果condition求值结果为true,执行statement1。如果求值结果为false,执行statement2if(condition){ statement1 } statement2复制 02)switch语句 switch(expression){ caseval: break; caseval2: break; default: } ==> switch(expression){ caseval:{ break; } caseval2:{ break; } default: }复制可以在switch语句中使用任何数据类型。case的值不一定是常量,也可以是变量,甚至是表达式。expression===val break复制
版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/qq_37933685/article/details/83246410个人博客:https://suveng.github.io/blog/基于netty的websocket协议的对话小程序目的:开发一个和服务端对话的小程序demo客户端:h5页面+原生js服务端:基于websocket协议的netty小程序demo流程逻辑:核心代码:代码地址:码云地址服务端代码wsserver.javapackagemy.suveng.nettyhello.module.wsserver; importio.netty.bootstrap.ServerBootstrap; importio.netty.channel.ChannelFuture; importio.netty.channel.nio.NioEventLoopGroup; importio.netty.channel.socket.nio.NioServerSocket
大佬,要喝冰阔落嘛?FreeBuf定制的那种?2018年已经逐渐接近尾声了,各种大趴、小趴都要来了,FreeBuf也为大家精心筹划了一场盛大的极客趴,冰阔落自然是少不了的。2018年12月12日——13日,由FreeBuf主办的FIT2019互联网安全创新大会将在上海盛大开幕。届时会有来自海内外的白帽精英、企业大佬以及众多黑客、极客到场,如此规模的超级大趴,我们也为各位到场的朋友准备了一份特别的纪念品——FIT2019定制冰阔落。无糖配方“冰阔落”酷黑的易拉罐装,本身就非常符合黑客与极客的身份。但,这还不够。这一次,斗象科技(FreeBuf母公司)联合无糖信息为本次FIT2019提供了一批定制可乐,800罐FIT定制“冰阔落”都是你们的!免费!免费!!免费!!!FIT2019定制“冰阔落”图示FIT2019预估参会人人数将接近5000人次,所以定制版冰阔落限量免费供应,先到先得。每一罐可乐将会印有FIT2019专属LOGO以及一句标语。那么重点来了!FreeBuf特开启FIT2019定制可乐标语征集活动,所有人均可参与进来,写下你想对你自己、对安全圈的所有伙伴甚至对FreeBuf所说的
原文链接:http://blog.csdn.net/wang379275614/article/details/13990163本次结合系统分析师—运筹方法—网络规划技术—关键路径章节,对原文链接描述不准确的地方做了修正。认识AOE网有向图中,用顶点表示活动,用有向边表示活动之间开始的先后顺序,则称这种有向图为AOV(ActivityOnVertex)网络;AOV网络可以反应任务完成的先后顺序(拓扑排序)。 在AOV网的边上加上权值表示完成该活动所需的时间,则称这样的AOV网为AOE(ActivityOnEdge)网,如下图: 图中,顶点表示事件(能被触发,两特征属性:最早发生时间Ve(j);最晚发生时间Vl(j)),边表示活动(能被开始,两特征属性:最早开始时间e(i);最晚开始时间l(i)),权表示活动持续时间,通常用AOE网来估算工程完成的时间两条原则: Ø 只有某顶点所代表的事件发生后,从该顶点出发的各活动才能开始 Ø 只有进入某顶点的各活动都结束,该顶点所代表的事件才能发生计算关键路径 首先,在AOE网中,从始点到终点具有最大路径长度(该路径上的各个活动所持续的时
最近基于深度学习的图像分割技术一般依赖于卷积神经网络CNN的训练,训练过程中需要非常大量的标记图像,即一般要求训练图像中都要有精确的分割结果。对于图像分割而言,要得到大量的完整标记过的图像非常困难,比如在ImageNet数据集上,有1400万张图有类别标记,有50万张图给出了boundingbox,但是只有4460张图像有像素级别的分割结果。对训练图像中的每个像素做标记非常耗时,特别是对医学图像而言,完成对一个三维的CT或者MRI图像中各组织的标记过程需要数小时。 如果学习算法能通过对一些初略标记过的数据集的学习就能完成好的分割结果,那么对训练数据的标记过程就很简单,这可以大大降低花在训练数据标记上的时间。这些初略标记可以是: 1.只给出一张图像里面包含哪些物体;2.给出某个物体的边界框;3.对图像中的物体区域做部分像素的标记,例如画一些线条、涂鸦等(scribbles)。 ScribbleSup:Scribble-SupervisedConvolutionalNetworksforSemanticSegmentation(CVPR2016) 中国香港中文大学的DiLin提出了一个基于
NSDate类用于保存时间值,同时提供了一些方法来处理一些基于秒级别时差(TimeInterval)运算和日期之间的早晚比较等。 1. 创建或初始化可用以下方法 用于创建NSDate实例的类方法有 +(id)date; 返回当前时间 +(id)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs; 返回以当前时间为基准,然后过了secs秒的时间 +(id)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)secs; 返回以2001/01/01GMT为基准,然后过了secs秒的时间 +(id)dateWithTimeIntervalSince1970:(NSTimeInterval)secs; 返回以1970/01/01GMT为基准,然后过了secs秒的时间 +(id)distantFuture; 返回很多年以后的未来的某一天。(比如你需要一个比现在(Now)晚(大)很长时间的时间值,则可以调用该方法。测试返回了4000/12/311
一、打开nginx机器的nginx配置文件 命令: locatenginx.conf复制 会列出所有nginx.conf文件的地址, 一般咱们要用的nginx配置文件是/usr/local/nginx/conf/nginx.conf cd/usr/local/nginx/conf vimnginx.conf复制 二、在文件中添加配置 1、添加配置 将所有域名为srv.android.xx.xx.com,路径以/update开头的请求,转发到10.160.xx.xx这台真实后端服务上: location^~/update{#匹配所有路径以/update开头的请求 access_log/search/odin/nginx/logs/diffy_access_logmain;#设置log落地文件 proxy_set_headerHostsrv.android.xx.xx.com;#设置请求域名 proxy_passhttp://10.160.xx.xx;#设置想要转发的真实后端服务 }复制 2
四则运算程序: #include<stdio.h>#include<stdlib.h>#include<time.h>#defineN30main(){inta,b,k,i,n;floatc,d; do{printf("\n请输入数字类型(1.整数2.小数)-1为退出程序:");scanf("%d",&n); switch(n){case1:{ for(i=0;i<N;i++){a=rand()%100+1;b=rand()%100+1;k=rand()%4+1;printf("%d",a);switch(k){case1:printf("+");break;case2:printf("-");break;case3:printf("*");break;case4:printf("/");break;}printf("%d=\t\t",b);}break;}break;case2:{for(i=0;i<N;i++){c=rand()*0.001+1;d=rand()*0.001+1;k=rand()%4+1;printf("%0.
转自:https://blog.csdn.net/weixin_41995541/article/details/89843330 摘要I2C通信协议简介补充空闲状态start和stop信号应答信号数据有效性规定数据传输延时I2C协议的实现源码硬件说明头文件sys.h主函数初始化I2C产生开始和停止信号等待应答信号产生或不产生应答I2C写操作I2C读操作对24C02操作24C02的时序图头文件初始化IIC接口写数据(一个字节)写数据(长度为Len)写数据(指定长度)读数据(一个字节)读数据(长度为Len)读数据(指定长度)检查AT24CXX是否正常主函数实验结果截图摘要参考资料: 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02) https://blog.csdn.net/qq_38410730/article/details/80312357 STM32下模拟I2C的C语言实现 https://blog.csdn.net/qq_38410730/article/details/80312357 I2C协议小结 https://blog.csdn.net
检测字符串对称 publicbooleanSysS(Strings)//对称 { intlens=s.length();//获取长度 intt=lens-1;//分别标注头尾 for(inth=0;h<lens/2;h++,t--) { if(s.charAt(h)!=s.charAt(t))//charAt可以返回字符串中指定索引的字符 returnfalse; } returntrue; } 复制 输出字符串子串 publicvoidSubS(Strings)//输出子串 { intlens=s.length(); for(inti=0;i<lens;i++) { if(s.charAt(i)=='') System.out.println(""); else System.out.print(s.charAt(i)); } } 复制 提取字符串中的数字 publicStringNumS(Strings)//提取数字 { intlens=s.length(); Stringns=newString("");
正则表达式 正则表达式其实没有大家说的那么神秘和困难,它是一种强大的字符串处理工具,有自己的一套书写规则。首先,看一个简答的例子来大致了解一下。 1.1举例 比如给出一个字符串 Hellomynamei1sHiangX 使用下面这个正则式子 ^Hello\s\w\w\s\w{4}\s\w\d 就可以匹配到‘Hellomynamei1'这段字符串了 在学习之前观察这个乱糟糟的表达式或许会觉得很复杂,其实不然,它有着自己的规则:/s用于匹配空白字符,/w在这里用于匹配字母,/w{4}在这里用于匹配四个字母 它的使用规则还有很多,具体见下方这个表格 python有很多强大的库,其中re库中有很多函数可以帮助我们运用正则表达式进行匹配,下面就介绍我认为常用的几个 1.2match 这个函数是从字符串的首部开始检索与正则表达式匹配的字符串,具体的用法,还是用上面的例子来介绍一下 importrecontent='Hellomynamei1sHiangX'result=re.match('
爬虫的制作主要分为三个方面 1、加载网页结构 2、解析网页结构,转变为符合需求的数据实体 3、保存数据实体(数据库,文本等) 在实际的编码过程中,找到了一个好的类库“HtmlAgilityPack”。 介绍: 官网:http://html-agility-pack.net/?z=codeplex HtmlAgilityPack源码中的类大概有28个左右,其实不算一个很复杂的类库,但它的功能确不弱,为解析DOM已经提供了足够强大的功能支持,可以跟jQuery操作DOM媲美) 使用说明: HtmlAgilityPack(XPath定位),在实际使用过程中,发现有部分内容如果通过Css进行定位会比XPath更加方便,所以通过查找找到了另外一个CSS的解析了类库ScrapySharp(Css定位) 整理: Nuget包需要引用的库 1、HtmlAgilityPack(XPath定位) 2、ScrapySharp(Css定位) 代码下载地址: https://github.com/happlyfox/FoxCrawler 复制 第一点——加载网页结构 HtmlAgilityPack封装了加载内容
MvcForum算是Asp.net中开源论坛佼佼者之一。主要使用ASP.NETMVC5&Unity&EntityFramework6,有较强的可撸性。是论坛开发者的不二之选。 预览地址:http://bbs.hfenxiao.com/ 支持多国语言 支持多种数据库,开盖即饮(因为EF支持),无需安装。 积分 等级 权限 角色 标签 Rss 表情 附件 审核 问答 投票 收藏 日志 排行榜与热点 主题,默认Bootstrap响应式 最后发表 自定义事件,hook方式 满意度 垃圾过滤 第三方登陆 消息 Web2.0(用户注册) 批量处理 官方地址:http://www.mvcforum.com/
defreadf(file): t0=time.time() data=pd.read_csv(file,low_memory=False,encoding='gbk' #,nrows=100 ) t1=time.time() print('耗时%0.3f秒钟'%(t1-t0)) returndata d1=readf(file1) t0=time.time() d1.to_pickle('d1.pkl') t1=time.time() print('耗时%0.3f秒钟'%(t1-t0)) t0=time.time() d2=pd.read_pickle('d1.pkl') t1=time.time() print('耗时%0.3f秒钟'%(t1-t0)) print(d1.shape) print(d2.shape)复制 测试读取40多万数据的速度: 耗时12.768秒钟耗时1.561秒钟耗时1.751秒钟(468372,77)(468372,77)
在php5.3中,正则函数ereg_replace已经废弃,而dedecms还继续用。有两个方案可以解决以上问题: 1、把php版本换到v5.3下。 2、继续使用v5.3,修改php.ini文件 ;extension=php_mbstring.dll 改为 extension=php_mbstring.dll ;mbstring.func_overload=0 修改为: mbstring.func_overload=7 或者使用其他的函数: define('DEDEADMIN',ereg_replace("[/\\]{1,}",'/',dirname(__FILE__)));//改为define('DEDEADMIN',preg_replace("/[\/\\\\]{1,}/",'/',dirname(__FILE__))); 注:因为preg_replace比ereg_replace的执行速度快,PHP推荐使用preg_replace.
一、unittest Unittest是Python标准库中自带的单元测试框架,Unittest也被称为PyUnit,就像JUnit是Java语言的标准单元测试框架一样,Unittest则是Python语言的标准单元测试框架。 Unittest支持自动化测试,测试用例的初始化、关闭和测试用例的聚合等功能,它有一个很重的特性:它是通过类(class)的方式,将测试用例组织在一起。 1#导入unittest模块 2importunittest 3#应用unittest框架,类必须继承unittest.TestCase 4classUnitDemo(unittest.TestCase): 5#普通函数封装 6deftest_login(self): 7print("unittestdemo!") 8self.assertEqual('123','123',msg='断言失败') 9 10if__name__=='__main__': 11#unittest执行测试用例的行为 12unittest.main()复制 二、Pytest Pytest是Python的另一个第三方单元测试库。目的
FaceBook官方出的一个构建React单页面应用的脚手架工具,可以轻松实现零配置就可以快速开发React的应用。 1、create-react-app构建react项目 //全局安装 npminstall-gcreate-react-app //构建一个my-app的项目 npxcreate-react-appmy-app cdmy-app //启动编译当前的React项目,并自动打开http://localhost:3000/ npmstart 复制 2、构建React项目其他方式: //npm方式: //npminit<initializer>isavailableinnpm6+ npminitreact-appmy-app //Yarn方式: //yarncreateisavailableinYarn0.25+ yarncreatereact-appmy-app 复制 3、项目默认目录: ├──package.json #npm依赖 ├──public#这个是webpack的配置的静态目录 │├──fav
如下这个html标签,最终根据数据返回值是,1则表示男性,2则表示女性,渲染2种不同的icon图标。 <spanclass=“genderbg-mutedfa-nanxing”></span> <spanclass=“genderbg-mutedfa-nvxing”></span>复制 有2种实现方法: 1、数组方法 <span:class='["gender","bg-muted",data.gender===1?"fa-nanxing":"fa-nvxing"]'></span>复制 提示:数组中的gender和bg-muted我这里是要加引号的,因为我这里就是字符串,如果不加引号的,代表的是data中的一项数据。 2、字符串拼接方法 <span:class="'gender'+'bg-muted'+(data.gender===1?'fa-nanxing':'fa-nvxing')"></span>复制 提示:gender和bg-muted后加一