dlg.DoModal();不响应

调试程序时,总是运行到dlg.DoModal();既不弹出响应的对话框,程序也不向下走,停在此处了。 问题: 对话框里面有个位图,加载时出错了。 解决方法: 打开XXXX.rc文件,注释掉CONTROL一行,对话框打开。XXXX.rc文件,增加"Static", SS_BITMAP, 即可。参考文章:https://blog.csdn.net/qq_36633275/article/details/103960841

基于threejs三维办公室如何显示线框化

办公区示例 - 线框 示例描述与操作指南示例效果展示实现步骤相关示例相关接口 示例描述与操作指南 以办公区类模型为例,对所选构件类进行线框化处理,本示例默认选中 IfcWallStandardCase 类型构件组。其它常用的构件类型还有 IfcDoor、IfcWindow、IfcRailing、IfcSlab、IfcFurnishingElement等。 通过接口wireFrameComponentsByKey来实现。 示例效果展示 实现步骤 通过接口wireFrameComponentsByKey来实现。 // 点击运行触发的函数 const run = () =>{ viewer3D.wireFrameComponentsByKey(defaultCk); //构件线框 } 下载完整代码 相关示例 构件线框 分类线框展示 住房类示例 - 线框 厂房类示例 - 线框 相关接口 getHighlightComponentsKey resetScene wireFrameComponentsByKey

[测试gpu可用报错]tensorflow2.1.0, Could not load dynamic library 'libcudart.so.10.1'

先上图在上文字: Could not load dynamic library 'libcudart.so.10.1'; dlerror: libcudart.so.10.1: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda-10.0/lib64:/usr/local/cuda/lib64:/usr/local/cuda-10.0/lib64:/usr/local/cuda-10.0/extras/CUPTI/lib64:/data/TensorRT-6.0.1.5/lib 2020-04-16 14:22:37.655311: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcublas.so.10'; dlerror: libcublas.so.10: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda-10.0/lib64:/usr/local/cuda/lib64:/usr/local/cuda-10.0/lib64:/usr/local/cuda-10.0/extras/CUPTI/lib64:/data/TensorRT-6.0.1.5/lib 2020-04-16 14:22:37.655363: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcufft.so.10'; dlerror: libcufft.so.10: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda-10.0/lib64:/usr/local/cuda/lib64:/usr/local/cuda-10.0/lib64:/usr/local/cuda-10.0/extras/CUPTI/lib64:/data/TensorRT-6.0.1.5/lib

Django常用命令大全

目录 1、新建一个项目2、新建app (一个项目可以有多个app,通用的app也可以在多个项目中使用)3、创建数据库表 或 更改数据库表或字段(可在SQL等数据库中创建与models.py代码对应的表)4、运行Django自带开发服务器5、清空数据库6、创建超级管理员7、导入导出数据8、django 项目环境终端9、数据库命令行10、更多命令 打开 Linux 或 MacOS 的 Terminal (终端)直接在 终端中输入 windows 快捷键 win + R,输入 cmd,直接在 cmd 上输入 1、新建一个项目 django-admin.py startproject 项目名 以下命令要先进入项目目录下才能执行:cd 项目名 2、新建app (一个项目可以有多个app,通用的app也可以在多个项目中使用) python manage.py startapp app名 或者 django-admin.py startapp app名 3、创建数据库表 或 更改数据库表或字段(可在SQL等数据库中创建与models.py代码对应的表) 创建更改的文件 pyhton manage.py makemigrations 将生成的py文件应用到数据库 python manage.py migrate 4、运行Django自带开发服务器 python manage.py runserver 在浏览器中输入127.0.0.1:8000却无法访问Django服务? Django以为是公网访问!!! 公网访问: python manage.py runserver 0.0.0.0:8000 本地访问: python manage.py runserver python manage.py runserver 8000 python manage.

c语言 输入三角形的三条边或者三个顶点的坐标求三角形面积

如果你知道三个顶点,或者三条边如何写一个程序去求这个三角型的面积 当然你可以使用高中学过的余弦定理,但这个运算比较麻烦,所以今天我 们用一个相对简单的方法求解 #include <iostream> #include<stdio.h> #include<string.h> #include<queue> #include<algorithm> #include<string> #include<math.h> #include<map> #include<set> #include <sstream> using namespace std; typedef long long ll; const ll maxn=1e2+10; const ll mod= 1000000007; int main() { double x1,y1,x2,y2,x3,y3; cin >>x1 >>y1 >>x2>>y2>>x3>>y3; double a,b,c; a=sqrt((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1)); b=sqrt((y3-y1)*(y3-y1)+(x3-x1)*(x3-x1)); c=sqrt((y2-y3)*(y2-y3)+(x2-x3)*(x2-x3)); double s; s=(a+b+c)/2;//计算半周长 double area; area= sqrt(s*(s-a)*(s-b)*(s-c));//套用海伦公式,计算面积 cout << area <<endl; }

文件权限管理——文件基本权限

文章目录 一,权限作用:二,查看权限1,文件类型(p、d、l、s、c、b和-)2,权限说明3,文件拥有者4,常见文件权限(root例外):5,更改文件的属主和属组: 三,修改权限1.使用字符设定2,使用八进制(0-7)数字表示权限法: 四,权限对文件和目录的影响 :五,补码注意:计算方法:修改umask: 一,权限作用: 通过文件设定权限达到以下三种访问限制权限: (1)只允许用户自己访问; (2)允许一个预先指定的用户组中的用户访问; (3)允许系统中任何用户访问 二,查看权限 例:-rw-r–r--.1 root root 2668 Apr 4 20:37 /etc/passwd 1,文件类型(p、d、l、s、c、b和-) p 表示命名管道文件 d 表示目录文件 l 表示符号链接文件 - 表示普通文件 s 表示socket套接口文件,比如我们启用mysql,会产生一个mysql.sock文件 c 表示符号设备文件 虚拟终端文件、虚拟控制台(tty) b 表示块设备文件 磁盘类文件(sda)、光盘类文件(cdrom) 2,权限说明 对于文件来说: r 读 w 写 x 执行 对于目录来说: r 读(看到目录里面有什么) w 在目录内建文件、删除、移动 touch mkdir rm mv cp x 进入 cd cat 3,文件拥有者 UGO 所有者–用户组–其他用户 所有者:就是创建文件的用户,这个用户拥有对它所创建的文件的一切权限,所有者可以允许其他所在的用户组可以访问所有者的文件 用户组:具有相同用户特征的逻辑集合,有时我们需要多个用户具有相同的权限,比如查看、修改某一个文件的权限,一种方法是分别对多个用户进行文件访问授权;另一种方法是建立一个组,让这个组具有查看、修改次文件的权限 其他用户:系统内其他所有者用户就是other 用户类 4,常见文件权限(root例外): -rwx --- ---:文件所有者对文件具有读取、写入和执行的权限。 -rwx r-- r--:文件所有者具有读、写与执行的权限,用户组里用户及其他用户则具有读取的权限 -rw- rw- r-x:文件所有者与同组用户对文件具有读写的权限,而其他用户仅具有读取和执行的权限。 drwx --x --x:目录所有者具有读写与进入目录的权限,其他用户仅能进入该目录,却无法读取任何数据。 drw x-- ---:除了目录所有者具有完整的权限之外,其他用户对该目录完全没有任何权限。 PS:每个用户都拥有自己的专属目录,通常放置/home下

ES文档的基本操作 - 删除与修改

这里写目录标题 删除文档修改文档 删除文档 DELETE /my_doc/_doc/1 注:文档删除不是立即删除,文档还是保存在磁盘上,索引增长越来越多,才会把那些曾经标识过删除的,进行清理,从磁盘上移出去。 修改文档 局部:POST /my_doc/_doc/1/_update { "doc": { "name": "慕课" } } 全量替换PUT /my_doc/_doc/1 { "id": 1001, "name": "imooc-1", "desc": "imooc is very good, 慕课网非常牛!", "create_date": "2019-12-24" }

ES文档的基本操作 - 添加

目录 添加文档数据 添加文档数据 POST /my_doc/_doc/1 -> {索引名}/_doc/{索引ID} (是指索引在es中的id,而不是这条记录的id,比如记录的id从数据库来是1001,并不是这个。如果不写,则自动生成一个字符串。建议和数据id保持一致> ) { "id": 1001, "name": "imooc-1", "desc": "imooc is very 非常牛!", "create_date": "2019-12-24" } { "id": 1002, "name": "imooc-2", "desc": "imooc is fashion,常时尚!", "create_date": "2019-12-25" } { "id": 1003, "name": "imooc-3", "desc": "imooc is niubility,好很强大!", "create_date": "2019-12-26" } { "id": 1004, "name": "imooc-4", "desc": "imooc is good~!", "create_date": "2019-12-27" } { "id": 1005, "name": "imooc-5", "desc": " is 强大!", "create_date": "2019-12-28" } { "

光耦主要参数和高速光耦如何选型

光耦作为一个隔离器件已经得到广泛应用,无处不在。一般大家在初次接触到光耦时往往感到无从下手,不知设计对与错,随着遇到越来越多的问题,才会慢慢有所体会。 理解光耦 光耦是隔离传输器件,原边给定信号,副边回路就会输出经过隔离的信号。对于光耦的隔离容易理解,此处不做讨论。 以一个简单的图(图.1)说明光耦的工作:原边输入信号Vin,施加到原边的发光二极管和Ri上产生光耦的输入电流If,If驱动发光二极管,使得副边的光敏三极管导通,回路VCC、RL产生Ic,Ic经过RL产生Vout,达到传递信号的目的。原边副边直接的驱动关联是CTR(电流传输比),要满足Ic≤If*CTR。 光耦主要的参数是什么? 1、反向电流IR:在被测管两端加规定反向工作电压VR时,二极管中流过的电流。 2、反向击穿电压VBR:被测管通过的反向电流IR为规定值时,在两极间所产生的电压降。 3、正向压降VF:二极管通过的正向电流为规定值时,正负极之间所产生的电压降。 4、正向电流IF:在被测管两端加一定的正向电压时二极管中流过的电流。结电容CJ:在规定偏压下,被测管两端的电容值。 5、反向击穿电压V(BR)CEO:发光二极管开路,集电极电流IC为规定值,集电极与发射集间的电压降。 6、输出饱和压降VCE(sat):发光二极管工作电流IF和集电极电流IC为规定值时,并保持IC/IF≤CTRmin时(CTRmin在被测管技术条件中规定)集电极与发射极之间的电压降。 7、反向截止电流ICEO:发光二极管开路,集电极至发射极间的电压为规定值时,流过集电极的电流为反向截止电流。 8、电流传输比CTR:输出管的工作电压为规定值时,输出电流和发光二极管正向电流之比为电流传输比CTR。 9、脉冲上升时间tr,下降时间tf:光耦合器在规定工作条件下,发光二极管输入规定电流IFP的脉冲波,输出端管则输出相应的脉冲波,从输出脉冲前沿幅度的10%到90%,所需时间为脉冲上升时间tr。从输出脉冲后沿幅度的90%到10%,所需时间为脉冲下降时间tf。 10、传输延迟时间tPHL,tPLH:从输入脉冲前沿幅度的50%到输出脉冲电平下降到1.5V时所需时间为传输延迟时间tPHL。从输入脉冲后沿幅度的50%到输出脉冲电平上升到1.5V时所需时间为传输延迟时间tPLH。 11、入出间隔离电容CIO:光耦合器件输入端和输出端之间的电容值。 12、入出间隔离电阻RIO:半导体光耦合器输入端和输出端之间的绝缘电阻值。 13、入出间隔离电压VIO:光耦合器输入端和输出端之间绝缘耐压值。 光耦一般会有两个用途:线性光耦和逻辑光耦。 工作在开关状态的光耦副边三极管饱和导通,管压降《0.4V,Vout约等于Vcc(Vcc-0.4V左右),Vout 大小只受Vcc大小影响。此时Ic《If*CTR,此工作状态用于传递逻辑开关信号。 工作在线性状态的光耦,Ic=If*CTR,副边三极管压降的大小等于Vcc-Ic*RL,Vout= Ic*RL=(Vin-1.6V)/Ri * CTR*RL,Vout 大小直接与Vin 成比例,一般用于反馈环路里面 (1.6V 是粗略估计,实际要按器件资料,后续1.6V同) 。 对于光耦开关和线性状态可以类比为普通三极管的饱和放大两个状态。 高速光耦介绍 电耦合器(简称光耦)是开关电源电路中常用的器件。光电耦合器分为两种:一种为非线性光耦,另一种为线性光耦。 常用的4N系列光耦属于非线性光耦,常用的线性光耦是PC817A—C系列。 非线性光耦的电流传输特性曲线是非线性的,这类光耦适合于弄开关信号的传输,不适合于传输模拟量。线性光耦的电流传输手特性曲线接进直线,并且小信号时性能较好,能以线性特性进行隔离控制。 开关电源中常用的光耦是线性光耦。如果使用非线性光耦,有可能使振荡波形变坏,严重时出现寄生振荡,使数千赫的振荡频率被数十到数百赫的低频振荡依次为号调制。由此产生的后果是对彩电,彩显,VCD,DCD等等,将在图像画面上产生干扰。同时电源带负载能力下降。 在彩电,显示器等开关电源维修中如果光耦损坏,一定要用线性光耦代换。常用的4脚线性光耦有PC817A----C。PC111TLP521等常用的六脚线性光耦有:TLP632TLP532PC614PC714PS2031等。常用的4N254N264N354N36是不适合用于开关电源中的,因为这4种光耦均属于非线性光耦。 高速光耦芯片型号与选型 100Kbit/S: 6N138、6N139、PS8703 1Mbit/S: 6N135、6N136、CNW135、CNW136、PS8601、PS8602、PS8701、PS9613、PS9713、CNW4502、HCPL-2503、HCPL-4502、HCPL-2530(双路)、HCPL-2531(双路) 10Mbit/S: 6N137、PS9614、PS9714、PS9611、PS9715、HCPL-2601、HCPL-2611、HCPL-2630(双路)、HCPL-2631(双路) 高速光耦与普通光耦区别 在结构当面,高速光耦与普通光耦是不一样,高速光耦的结构是光敏二极管+放大驱动电路,普通光耦的结构是光敏三极管(+放大驱动电路)。光敏二极管的响应速度(上升下降时间)是纳秒级,光敏三极管的响应速度(上升下降时间)是微秒级。不是说普通光耦工作在线性区它就能高速,它固有的响应时间就限死了它想快也快不起来。另外如果普通光耦工作在线性区,那它也会受限截至频率Fc(Cut-offFrequency)这个参数,普通光耦这个Fc基本在50KHz左右(测试条件VCC=5v、IC=5ma、RL=100R,RL加大Fc更小,RL=1K时,Fc大约在10KHz左右),像TLP521,Fc约50KHz,PC817,Fc约80KHz,CNY117,Fc约250KHz。 当然有些普通光耦在调大驱动电流(到200MA)/减小负载电阻(到500OHM)/优化驱动脉冲等情况下的确实能达到500KHz这样的速度。 高速光耦的应用 1、高速光耦应用在空调 2、高速光耦应用在驱动电源 高速光电耦合器6N137由磷砷化镓发光二极管和光敏集成检测电路组成。通过光敏二极管接收信号并经内部高增益线性放大器把信号放大后,由集电极开路门输出。6N137引脚图和内部结构图如图1和图2所示。该光电器件高、低电平传输延迟时间短,典型值仅为45ns,已接近TTL电路传输延迟时间的水平。具有10Mbps的高速性能,因而在传输速度上完全能够满足隔离总线的要求。内部噪声防护装置提供了典型10kV/μs的共模抑制功能。除此之外,6N137还具有一个控制端,通过对该端的控制,可使光耦输出端呈现高阻状态。 1:NC.;2:Anode(阳极);3:Cathode(阴极);4:N.C.;5:GND;6:Output(Opencollector开路集电极);7:Enable(使能端);8:VCC 简单的原理如图1所示,若以脚2为输入,脚3接地,则真值表如附表2所列,这相当于非门的传输,若希望在传输过程中不改变逻辑状态,则从脚3输入,脚2接高电平。 6N137原理及典型应用 6N137的内部结构原理如图3所示,信号从脚2和脚3输入,发光二极管发光,经片内光通道传到光敏二极管,反向偏置的光敏管光照后导通,经电流-电压转换后送到与门的一个输入端,与门的另一个输入为使能端,当使能端为高时与门输出高电平,经输出三极管反向后光电隔离器输出低电平。当输入信号电流小于触发阈值或使能端为低时,输出高电平,但这个逻辑高是集电极开路的,可针对接收电路加上拉电阻或电压调整电路。 隔离器6N137典型应用如图3所示,假设输入端属于模块I,输出端属于模块II。输入端有A、B两种接法,分别得到反相或同相逻辑传输,其中RF为限流电阻。发光二极管正向电流0-250μA,光敏管不导通;发光二极管正向压降1.2-1.7V(典型1.4V),正向电流6.3-15mA,光敏管导通。若以B方法连接,TTL电平输入,Vcc为5V时,RF可选500Ω左右。如果不加限流电阻或阻值很小,6N137仍能工作,但发光二极管导通电流很大对Vcc1有较大冲击,尤其是数字波形较陡时,上升、下降沿的频谱很宽,会造成相当大的尖峰脉冲噪声,而通常印刷电路板的分布电感会使地线吸收不了这种噪声,其峰-峰值可达100mV以上,足以使模拟电路产生自激。所以在可能的情况下,RF应尽量取大。 输出端由模块II供电,Vcc2=4.5~5.5V。在Vcc2(脚8)和地(脚5)之间必须接一个0.1μF高频特性良好的电容,如瓷介质或钽电容,而且应尽量放在脚5和脚8附近(不要超过1cm)。这个电容可以吸收电源线上的纹波,又可以减小光电隔离器接受端开关工作时对电源的冲击。脚7是使能端,当它在0-0.8V时强制输出为高(开路);当它在2.0V-Vcc2时允许接收端工作,见真值表2。 脚6是集电极开路输出端,通常加上拉电阻RL。虽然输出低电平时可吸收电路达13mA,但仍应当根据后级输入电路的需要选择阻值。因为电阻太小会使6N137耗电增大,加大对电源的冲击,使旁路电容无法吸收,而干扰整个模块的电源,甚至把尖峰噪声带到地线上。一般可选4.7kΩ,若后级是TTL输入电路,且只有1到2个负载,则用47kΩ或15kΩ也行。CL是输出负载的等效电容,它和RL影响器件的响应时间,当RL=350Ω,CL=15pF时,响应延迟为25-75ns。

python数组与字符串相互转换

字符串转数组 str = '1,2,3' arr = str.split(',') 数组转字符串 arr = ['a','b'] str = ','.join(arr) 或者 arr = [1,2,3] str = ','.join(str(i) for i in b)

基于直线的最小非线性SLAM相机姿态估计方法

Minimal Non-linear Camera Pose Estimation Method Using Lines for SLAM Applications 1. 介绍2. 非线性优化方法3 实验3.1 噪声模拟试验3.2 实景实验 1. 介绍 针对线映射到相机图像,提出Perspective-n-Lines(PnL) 问题,PnL解决的是六自由度位姿估计,将三维空间中的直线正确地投影到二维图像平面上;PnL问题的三种解,即 直接线性变换(DLT)、多项式解和迭代解。 直接线性变换是用奇异值分解(SVD)直接求解重投影方程,这种方法将旋转矩阵中的9个变量和平移向量中的3个变量视为自变量,忽略了变量的非线性正交约束。因此,PnL问题的多项式解将投影函数与正态性约束结合起来形成高阶方程,DLT方法和多项式方法都用至少12个变量的多解冗余表示参数化了刚体运动。 另一种是使用非线性方法迭代以最小化重投影误差,该方法将一条三维直线视为两个端点,这就增加了自由度,因为两个三维点有6个自由度,而一条三维直线有4个自由度。 论文主要创新: **1)**分析了李群切线空间中直线在6自由度运动矢量上的重投影误差偏导数(雅可比矩阵),为迭代方法更新估计奠定了基础。 **2)**提出了一种新的基于线特征的非线性姿态估计方法,该方法仅适用于3对线的对应关系,框架非常适合于摄像机姿态的连续更新。 2. 非线性优化方法 2.1 迭代法 在给定图像平面上的一组二维直线及其世界坐标系下对应的三维直线lw,找到了一个使重投影误差最小的姿态,通过迭代(高斯牛顿法)最小化距离来估计姿态,该距离是计算出的直线预测与其在真实图像中的测量li之间的残余误差:分析得到高斯牛顿更新函数,其中ε表示为六自由度向量的迭代更新,J表示为运动矢量上重投影的二维直线的偏导数矩阵: 2.2 重投影 重投影的三维直线可分为两步: 1)将世界帧中以Plücker坐标表示的3D线转换为相机帧 2)根据针孔相机的成像模型,将变换后的直线映射到图像上的二维直线上 由于投影图像线只与直线的u向量有关,采用偏导数链式法则得到最终的雅可比矩阵: 2.3 ε雅可比 类似于使用点对应的姿态估计方法中的表达式,我们将雅可比矩阵定义为: 求解ε雅可比矩阵,需使用李群中伴随矩阵:为了简化计算,z来表示摄像机坐标lc中3D线的伴随函数,即投影后线的坐标:由李代数理论得出:融合上面的方程可以得到整个系统的雅可比矩阵,重投影线在6自由度运动矢量上的偏导数:根据所给出的雅克比矩阵,其每一直线对应给出2个约束方程,则需要3条直线就可计算刚性运动。 3 实验 3.1 噪声模拟试验 采用蒙特卡罗方法在三维空间中生成随机线,生成一个随机的刚性运动,将这些线转换为摄像机坐标。最后,利用实验室工业摄像机的摄像机内参矩阵作为虚拟摄像机,将三维直线投影到图像平面上。将相机分辨率设置为VGA(640*480),相机和随机线中心之间的距离设置为2米。在每个图像噪声水平下,分别在2.1像素内的0.1像素区间内重复了100次随机测试。 测试结果: 从图中可以看出误差随着图像噪声的增加而增大。在2个像素的噪声sigma下,平均平移误差约为1cm。最大平移误差小于4cm。论文方法在亚像素图像噪声下的位置误差小于2cm,旋转误差始终小于0.4°,显示出较高的方位估计精度。 对比其他方法 在测试随机线集和刚性变换下,最新发展的LPnL、Bar-LS、DLT-plücker、DLT-combined方法和论文方法在方向和位置估计方面都有更稳健和准确的性能。Ansar和Mirzaei的方法对噪声太敏感,导致输出不稳定。Mirzaei方法是唯一一种使用3对线的方法,但是在存在噪声的情况下,它没有收敛的结果。 论文方法在旋转和平移估计方面都具有与现有方法相当的性能,而只有该论文算法能够处理3个噪声匹配线对。 3.2 实景实验 在模拟实验的基础上,利用该算法对VGG道路数据集进行姿态估计。结果如图所示,估计的姿势具有4cm的位置误差和0.04°的旋转误差,尽管有些端点不严格匹配,但估计的线恢复得非常好。并且由于未匹配的端点仍然位于同一条直线上,因此它们仍然能够很好地重建图像平面上的二维直线。 里程计 采用纯运动BA方法对姿态进行连续估计。红线是分解后的轨迹,蓝线是也测轨迹。在摄像机运动9.19m后,只得到了0.066m的位置误差,考虑到旋转误差,平均旋转误差为0.0045°左右,方向确定准确。

python pandas 如何读写excel 获取表的行数 列数

首先需要用pip 安装pandas、 xlrd、openpyxl,然后直接贴代码 import pandas as pd data_path = 'E:/pythonProject/python_pandas/test_pandas.xlsx' //此处为excel表的路径 data = pd.read_excel(data_path) data.loc[0,'ground_time'] = '888' //0代表第一行,‘ground_time’是列名 data.to_excel(data_path, index=None) print(data) 获取列数 data.shape[1] 获取行数 data.shape[0] or len(data)

VUE中this.$nextTick()怎么使用?

VUE中this.$nextTick()怎么使用? 官方文档是这样解释的: 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。 简单的理解,我认为vue.js中this.$nextTick()就是起到了一个等待数据的作用,也就是说,将一些回调延迟,等到DOM更新之后再开始执行。简单点说,相当于setTimeout()的作用 例如:你改变了dom元素数据,然后你又想输出dom,那你只能等到dom更新完成之后才会实现 2.通过事件改变data数据,然后输出dom,在方法里直接打印的话, 由于dom元素还没有更新, 因此打印出来的还是未改变之前的值,而通过this.$nextTick()获取到的值为dom更新之后的值 应用场景: 在Vue生命周期的created()钩子函数进行的DOM操作一定要放在Vue.nextTick()的回调函数中 在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将DOM操作的js代码放进Vue.nextTick()的回调函数中。与之对应的就是mounted()钩子函数,因为该钩子函数执行时所有的DOM挂载和渲染都已完成,此时在该钩子函数中进行任何DOM操作都不会有问题 。 在数据变化后要执行的某个操作,而这个操作需要使用随数据改变而改变的DOM结构的时候,这个操作都应该放进Vue.nextTick()的回调函数中。

TensorFlow2.x 学习笔记(七)Keras高层接口

Keras高层接口 这里所指的均为tf.keras Keras高层API metrics acc_meter = metrics.Accuracy() loss_meter = metrics.Mean() update_state loss_meter.update_state(loss) acc_meter.udate_state(y, pred) result().numpy() print(step, 'loss:', loss_meter.result().numpy()) print(step, 'Evaluate Acc:', total_correct/total, acc_meter.result().numpy()) reset_states if step % 100 == 0: print(step, 'loss:', loss_meter.result().numpy()) loss_meter.reset_states() if step % 500 == 0: acc_meter.reset_states() complie & fit Compile network.compile(optimizer=optimizers.Adam(lr=0.01), loss=tf.loss.CategoricalCrossentropy(from_logits=True), merics=['accuracy'] ) Fit network.fit(db, epochs=10) Evaluate network.fit(db, epochs=10, validation_data=ds_val, validation_steps=2) network.evaluate(ds_val) Predict pred = network.predict(x) pred = tf.argmax(pred, axis=1) 自定义网络 keras.Sequential 需要继承自Layer

关于数组能否用变量声明长度

第一行照例本鸽子精咕咕咕。 写这个博客的起因: 写java作业习惯性定义了new int[105][105]的数组交上去并被打回重做。 老师:不允许出现固定数组你105是什么鬼! 我内心os:????不是不允许变量声明数组长度吗(这个人没听课+C语言被强调多次记忆太深)。 先说结论:Java是可以变量声明数组长度的。 C语言: 我们学习C语言的时候,都会被强调不能定义一个变量,再利用变量声明数组。 ex: int n; scanf("%d",&n); int a[n]; 这样是不允许的。包括C++。 C语言中的数组是在程序运行之前提前向系统申请了内存空间,没有申请空间不允许读写。所以如果数组长度是变量,不能提前申请空间,所以不能用变量来设置动态数组。 但可以利用malloc函数来动态分配空间,实现数组的不定长声明。 Java: Java的数组是用new来声明,相当于c++中的new,相当于c中的malloc,是动态分配内存空间的,所以可以用来设置不定长数组。 即: import java.util.Scanner; public class T{ public static void main(String[] args){ Scanner cin = new Scanner(System.in); int n; n = cin.nextInt(); int[] a = new int[n]; } } 或许有错orz欢迎指出错误

手机怎么访问本地HTML文件(甄姬,哦不,是真机调试)

1:手机与电脑在同一局域网下 手机可开热点给笔记本,台式也要联热点/Wi-Fi?可以,去买一个Wi-Fi接收器装主机上即可; 2:找到本地HTML文件的web端页面测试地址 例如 http://123.1.2.3:1234/index.html 3:查看电脑ip地址 例如 199.166.33.77 4:替换 将3中的ip地址替换到2中 ,即:http://123.1.2.3:1234/index.html ==> http://199.166.33.77/index.html 5:甄姬测试 手机打开 http://199.166.33.77/index.html即可 巴拉巴拉: ==主页传送门== 

区块链十年一梦:有人辞官归故里,有人星夜来赶考

比特币就像是一个残酷的螺旋,不断往上攀升,只是过一个周期,盘子还在,人却换了一批。因此,与其说是入场的人群靠比特币致富,不如说比特币靠这一拨又一拨的人获得了永生。 作者:江小渔 编辑/策划:秦晋、郑迪 资料梳理:Alice、白夜 出品:碳链价值(ID:cc-value) 本文共计14215字,阅读需20分钟。未经允许,禁止转载 01 2011:神奇造梦场 对于区块链来说,2011年是一个神奇的年份。 在这一年5月,从北大毕业不到两年的吴忌寒第一次接触到了比特币。作为一个年轻的风投师,一位理想的自由主义者,他被比特币的愿景深深吸引住了。于是他做了一个疯狂的决定:向亲友募集10万元,买900个在当时无人知晓的比特币。这一年他25岁。 事后看来的「远见卓识」,其实在当年的少年身上能够找到一些隐约的迹象。当我们查看吴忌寒的人人网时,会发现当年在北大的他,就已经是一个充满自由主义倾向,喜欢针砭时弊的青年。他看南方周末的文章,他对时局的某些地方感到不满,并试图改变现状。这很北大。 又是在这一年,从中国地质大学毕业不到一年的刘志鹏搭建了中国第一个区块链论坛网站「巴比特」。那时,他的正式工作是广西国土资源规划院的一名工程员,但他更著名的身份,是科幻小说家「长铗」。 如果没有遇见比特币,刘志鹏也许会像刘慈欣那样,一边在体制内工作,一边在科幻小说的舞台上发光发热。在他构造的科幻世界中,现实与历史相互交错,豪迈、激荡却又艰涩,赛博朋克与中国古风、西方宗教在一起交织,构成了一道别样的风景。 「遭遇」比特币可能是一种宿命。 2008年,在没有了解到地区另一边发生的跨时代变革之时,刘志鹏在他的研究生期间继续着科幻小说创作,写下了一篇对他今后影响颇为深远的作品——《屠龙之技》。相比起他的其他小说,《屠龙之技》并不能算是一篇特别好看的作品,但它已经清楚地揭示出了一个颇为新颖的想法:算力即权力。 没有比比特币更能够生动体现「算力即权力」的案例了。当刘志鹏发现比特币的时候,他似乎看到技术变革指引着的新世界在眼前铺开。这时,他义无反顾地加入到了这片新世界之中。 于是,著名科幻小说家「长铗」消失了。刘志鹏本来就是在工作的业余时间创作科幻作品;在遇到比特币之后,他把所有的精力都放到了翻译比特币资料,向中国介绍比特币上。 2011年,对中国币圈影响深远的李笑来在美国的《连线》杂志上第一次知道了比特币这个词。随后,他被比特币的高波动率所吸引,开始研究这个「比美元还贵的东西」。当他研究明白之后,“上来就买了2100个币”。 在进入币圈之前,李笑来在新东方当了8年高级教师。英语老师在中国是个神奇的职业,这个职业还催生了另外一批在中国经济生活中叱咤风云的人物,比如马云、俞敏洪和徐小平。 他讲课风趣幽默,深受学生和网友喜爱,并出版了一些极为畅销的英语考试辅导书籍。8年的教师经历,让他积累了四笔宝贵财富:演讲传教、写书吸粉、朋友和入场资金。事实证明,这些经验对于早期币圈来说极度适用。 在李笑来购入 2100 个比特币后的两周内,比特币的价格上涨到了 22 美元,他的1.2 万美元变成了 4 万多美元。 也正是在这一年,从中国科技大学硕士毕业、去耶鲁大学访学读博的蒋信予,开始接触比特币。这一年,他和吴忌寒一样,也是25岁。 蒋信予是中国最早制造ASIC矿机的技术天才之一,同时也是圈内最为激进的自由主义者和无政府主义者。他读安·兰德,并评论道:“简单来说,这个女人用尽全力为生命和自由呼喊,然后把不爱生命和自由,甚至不是太爱生命和自由的傻逼们X成渣。她最终获得胜利,傻逼们被打回家,变成卢瑟,而卢瑟就是卢瑟。” 如果说吴忌寒用一个用自由主义风投师的眼光看到了比特币,长铗从「算力即权力」的技术进步角度看到了比特币,李笑来从人性的角度看到了比特币,那么蒋信予就是以一个原教旨疯子的角度看到了比特币。 他与比特币背后的理念如此契合,对此如此痴迷,信仰如此之深,这在圈内都是十分罕见的。 相比起莱特币创始人李启威一开始对比特币前途的妥协态度,蒋信予喜欢冒险,讨厌中立。他说,当一个人相信世间存在真相和真理并懂得真理永远无法对谎言妥协和宽容时,他的中立病就痊愈了。 2012年1月16日,蒋信予在 bitcointalk.org 论坛,把自己的昵称注册为「friedcat」,翻译成中文也就是「烤猫」。这个让比特币矿圈永远不能忘怀的名字,就这么诞生了。 2011年,在父亲的引导下,一位名叫Vitalik的17岁加拿大高中生认识了比特币。起初,他对此并不感兴趣;只是在发现比特币的去中心化属性后,他才被深深吸引。这年3月,他成为了比特币领域的撰稿人,得到的稿费是每篇文章5比特币(时价4美元左右)。对这个年轻人来说,比特币似乎有着非同寻常的吸引力。这本来是一件业余爱好,最终发展到每周要占据他30个小时的地步。 当然,被比特币深深吸引的不仅只有这些20岁的毛头小伙子,还有被旧秩序伤得很深的传统从业者。经过不断寻找,在2008年金融危机中损失惨重的Barry Silbert最终发现了一个理想的投资标的。在他看来,比特币“数字黄金”的概念非常有意思,去中心化的货币体系有可能改变这个世界,于是开始不断购入比特币。2011年6月8日,比特币单枚成交价达到31.9美元,创历史新高,Silbert也由此收获了在这个领域的第一桶金。2012 年,他创立了 Bitcon Opportunity Corp,进行比特币相关领域的天使投资。这对接下来十年的加密货币领域格局,都是意义深远的。 图片来源:网络 也就是在2011年的夏天,创造了比特币的中本聪,离奇地从网络世界上消失了。没人知道他去了哪里。 02 2013-2014:财富狂欢地 李笑来曾经说过这么一句话,描述他在2011年对比特币的认知:“这是一场越早参与就越划算的实验,因为它本身就是钱,时间就是比特币。" 他说对了,在2011年参与这场实验的人,在2013年基本都得到了丰厚的回报。 其中最春风得意的当属烤猫。凭借着成功研发的ASIC矿机,烤猫的算力在2013年占据全网算力的1/3以上。2013年7月,烤猫公司的矿场每月能挖出近4万个比特币。(当然,烤猫所代表的中国矿圈拥有如此大规模的算力,在社区里引发了对51%攻击的空前恐慌,进而为比特币社区接下来的发展埋下了深远的伏笔,在此按下不表。) 参与烤猫股票众筹的投资者在第一次分红中就全部回本,吴忌寒在其中赚到了人生的第一个一千万,这也为接下来比特大陆的诞生打下了基础。 2013年属于烤猫。当时,他头顶中科大少年班毕业、耶鲁博士中途辍学的光环,身披不爱露面、喜欢躲在背后宣扬无政府主义和自由主义的神秘色彩,再加上短时间内身价过亿,自然也就成为了矿圈最大的神话。 他的公司被认为是那时比特币世界里最值得投资的唯一股票。甚至李笑来也为其折服:“其他一切芯片生产商和管理者,都没有烤猫的脑瓜儿。”这里面包括ASIC矿机最早的发明者、嘉楠耘智的创始人南瓜张(张楠赓)。 那时,谁也不会想到,能活到今天的会是不善言辞、木头木脑的张楠赓。 2013年,长铗终于等到了解套。2011年,他把工作第一年10万块钱的工资全拿了出来,在35美元的价位上全仓了比特币。虽然他比吴忌寒更早知晓比特币,也更早为传播比特币而工作,但全仓的时间点不太妙,站在了当年的高位上。 在他全仓不久后,当时全球最大的比特币交易所Mt.Gox(门头沟)遭遇黑客攻击,一位名为Allinvain的用户称自己的2.5万个比特币(当时价值50多万美元)被盗。由此,比特币开启了骇人的暴跌,从每个比特币三十美元,跌到了最低2美元。 面对「归零式」的跌法,加密货币的早期信仰者究竟是怀着怎样的心态度过那段时间的,这已经无从考究了。但和后面的若干次暴跌一样,声称「比特币骗局破灭」「比特币已死」「看不到底」的声音和报道不绝于耳。到2011年11月,长铗原本值10万人民币的资产,只剩下几千块钱了。 直到这个时候,他还在知乎上回答了一个女孩儿提出的问题:「手头有6000元,这是除去学费和生活费之后的,想利用这些钱去做点投资,有什么好的理财投资建议?」当时长铗回答道:「买比特币,保存好钱包文件,然后忘记你有6000元这回事。五年后再看看。」 和比特币的其他早期玩家一样,长铗没有再看价格,而是转身埋头于比特币的介绍和宣传中。他熬过了横盘了一整年的2012年,最终迎来了币价暴涨十几倍的2013年。 由于这一年行情实在太好,加密货币圈逐渐壮大,认为「比特币代表着未来」的人越来越多。在这样一种乐观情绪下,又因为朋友们反复邀请,长铗最终在2014年辞去了广西的公务员工作,到杭州成立了巴比特。不久,巴比特就获得了光速安振的天使轮200万人民币的融资。 这时,长铗不会想到,即将迎接他的不是美好的前程,而是一瓶矿泉水也舍不得喝的辛酸。 同样是2013年,就在化腐朽为神奇的一年,吴忌寒深深地品尝到了投资烤猫带来的甜头。作为比特币市场中为数不多的专业风投,他很早就看到了比特币挖矿市场的潜力:如果说除了比特币之外还有什么是值得投资的,那就是挖取比特币的矿业本身了。 吴忌寒的布局很广。在烤猫之后,他又花几百万预订了南瓜张的「阿瓦隆矿机」。可惜这款矿机研发并不顺利,最后惨遭跳票。 吴忌寒逐渐意识到,作为这个行业的信仰者,只是以一个投资者的身份参与这个市场是不够的,最好还是投身其中。就像刘炽平和美国人网大为(David Wallerstein),前者在高盛时看中腾讯,2005年放弃高薪工作加入腾讯出任首席战略投资官;后者慧眼识金,早在2001年就发现了腾讯,并促成南非报业集团接盘IDG和李泽楷成为了腾讯最大股东(并让王功权和李泽楷日后每每谈及此事都拍断大腿),之后干脆直接加盟腾讯出任高管。 在这一年,吴忌寒遇到了中科院出身的詹克团。他们最终达成了协议:成立比特大陆,如果詹克团能够成功研发芯片,技术团队将拿到60%的股份。当时,还在大学念书、尚未毕业的葛越晟是吴忌寒手下的实习生,跟随他一起做风险投资。出于对吴忌寒的崇拜和信任,也出于对比特币前景的看好,这位20来岁、家境颇丰的年轻人和吴忌寒一起投资了比特大陆。这也改写了他接下来的命运。 2013年,李笑来在接受央视采访声称自己手中有“6位数的比特币”,而且是“1字头”(暗示他手上有十几万个比特币),是在2011年买的。 按照2013年比特币价格最高1150美金来看,当时李笑来手里的比特币就值一亿多美金了。从此,他被奉为「中国比特币首富」,成为了行业头号网红。(不过,李笑来是否真的买了那么多比特币,则成为了多年后圈内的十大未解谜题之一。) 李笑来不再是那个幽默的英语老师了,他成为了投资圈的一个神话。他的书籍《把时间当作朋友》成为了绝对的畅销书,理财的主妇中有不少是他的粉丝,跟他一起学习如何改进「思维的操作系统」。

自定义安装官方Microsoft Office 2019

前言 本文介绍自定义安装官方Microsoft Office 2019的方法。担心全套安装占用空间太大、喜欢简洁的同学可以考虑学习一下。老本这次就只安装Word、PowerPoint、Excel,总共下载文件大小1.89GB,安装完成后总大小2.63GB,占用空间1.32GB。这里占用空间比文件大小要小,这可能和文件以及文件系统有关,老本没有深究。 正文 下面开始,注意office 2019只支持Windows 10。 下载Office Deployment Tool https://www.microsoft.com/en-us/download/office.aspx 我们得到一个类似这样的文件:officedeploymenttool_12130-20272.exe。双击运行解压,指定一个目录,得到如下四个文件: 这里只需要保留setup.exe,其它的预设xml配置文件可以删掉,我们接下来要自己生成配置文件。 创建自定义配置文件 https://config.office.com/ 以下结合自己需要选择,仅给出需要注意的地方,没有特殊说明的,按照图中选择就好。 产品这项,Office Suites老本选择Standard版,你要是觉得professional高大上那也可以选择,但老本觉得没必要。Visio以下那些都不用理他,如果你好奇点开了下拉列表看,那就选无。 更新频道,选择Perpetual Enterprise,实际这里只有一项,可以自己点开下拉列表看看。部署版本选择最新。 应用,这里就是全套所在的地方了,根据需要选择。老笨只选excel、PowerPoint、word。 语言就简体中文好了,附加和校对不用理会。 从何处部署,默认CDN就好。登录-关。 自动检查更新-关。 升级选项,卸载老版本这里老笨全打开。需要注意,虽然这里安装之前卸载选项开启了,但老笨还是建议,安装office2019之前手动把旧版本卸载了,然后重启电脑,再进行新版本的安装。 自动接受EULA开启就好,反正出现条款你也只能同意同意下一步。产品密钥就选KMS客户端密钥,方便激活。 常规,留空白就好。如果你想个性化留下一些说明文字也可以。 首选项这里不用里,直接到最下面点击完成就好。 我们点击网页右边的导出,格式就选Office Open XML,名称自己定义,老笨就写configuration。 下面就是得到的configuration.xml: 下载Microsoft Office 2019 使用命令的方式调用setup.exe,根据以上所得到的配置文件configuration.xml下载所需的组件。 右键开始图标,打开power shell(管理员): cd到configuration.xml和setup.exe所在的文件夹:cd E:\temp 执行命令:.\setup.exe /download configuration.xml 按下回车之后开始下载,此过程没有任何进度提示,不要关闭power shell窗口,想查看速度的就自己打开任务管理器看咯。下载完成之后,power shell会返回到E:\temp目录,即第三行显示PS E:\temp且光标闪烁。下载的文件放在目录下的Office文件夹内,整个文件夹1.89GB左右。 安装Microsoft Office 2019 同样的,还是用命令方式,还是同样的那个setup.exe,还是在上述的temp目录下,power shell执行: .\setup.exe /configure configuration.xml 注意参数,这次是configure。 回车之后,就可以看到安装程界面,是不是很棒。 安装完成后的空间占用情况: 可能还有一些其它目录,但主要文件都在这个目录下。 结语 上述的安装方法,可以实现自定义安装,可以说是非常简洁。但是,能不能节省空间,能节省多少空间,老笨也没有测试。至少看上去能省不少空间,非常简洁,用起来也舒适。 END

在vue中实现页面滚动(停止滚动)的动画效果总结

1、运用到的技术: 监听滚动事件:window.addEventListener('scroll', function(handleScroll));动画库:animate.css 2、总结: 滚动事件触发时,记录滚动条的垂直位置:document.documentElement.scrollTop || document.body.scrollTop滚动停止触发思路:在滚动触发时,写一个新函数ScrollEnd(做延迟setTimeout),记录新的scrollTop值,然后比较这2个scrollTop值,如果相等的话,说明停止了滚动注意:每次滚动的时候,需要先清除定时器,因为滚动的时候,一直再清定时器,不会执行新函数ScrollEnd,只有当停止滚动的时候才执行该函数。动画:首先获取元素element = document.getElemenidtById('id'),然后添加元素动画效果element.classList.add('animated', 'fadeOutRight'),fadeOutRight:右淡出 删除元素动画效果:element.classList.remove('animated', 'fadeOutRight')动画官方网址:https://daneden.github.io/animate.css/ 3、接下来给出源码 1、 data() { return { scrollT: '', scrollStops: '', timer: '' } } 2、 mounted() { //滚动条监听 window.addEventListener('scroll', this.handleScroll); } 3、 methods: { handleScroll() { clearTimeout(this.timer); //清除定時器 this.timer = setTimeout(this.ScrollEnd, 500); this.scrollT = document.documentElement.scrollTop || document.body.scrollTop; //滚动中的动画 const element = document.getElementById('fixbox'); element.classList.add('animated', 'fadeOutRight') //滑动时,右淡出 }, ScrollEnd() { this.stopscroll = document.documentElement.scrollTop || document.body.scrollTop; //停止后的scrolltop if (this.stopscroll == this.

LTE学习之路(7)——LTE系统消息---转

1 系统消息包含: 主信息块(Master Information Block,MIB) 多个系统信息块(System Information Blocks,SIBs) 2 MIB 承载于BCCH——>BCH——>PBCH上 包括有限个用以读取其他小区信息的最重要、最常用的传输参数(如:系统带宽、系统帧号、PHICH配置信息) 时域:紧邻同步信道,以10ms为周期重传4次 频域:位于系统带宽中央的72个子载波(1.08MHz) 3 SIBs 除MIB外的系统信息,包括SIB1~SIB12; 除SIB1外,SIB2~SIB12均由SI(System Information)承载; SIB1是除MIB外最重要的系统信息,固定以20ms为周期重传4次,即SIB1在每两个无线帧(20ms)的子帧#5中重传(SFN mod 2=0,SFN mod 8不等于0)一次,如果满足SFN mod 8=0时,SIB1的内容可能改变,新传一次; SIB1和所有SI消息均承载在BCCH——>DL-SCH——>PDSCH上; SIB1的传输通过携带SI-RNTI(SI-RNTI每个小区都相同)的PDCCH调度完成; SIB1中的SchedulingInfoList携带所有SI的调度消息,接收SIB1以后,即可接收其他SI消息。

MyBatis通过注解方式批量添加、修改、删除

唯能极于情,故能极于剑 MyBatis通过注解方式批量添加、修改、删除! !!! 注:本文转载于:CodeCow · 程序牛 的个人博客:http://www.codecow.cn/ 一、数据库实体DO public class User implements Serializable { private Long id; //用户ID private String name; //用户姓名 private Integer age; //用户年龄 ....... } 二、数据库操作 2.1、批量插入用户 @Insert("<script>" + "insert into user(id, name, age) VALUES " + "<foreach collection='list' item='item' index='index' separator=','> " + "(#{item.id},#{item.name},#{item.age}) " + "</foreach>" + "</script>") void batchInsert(@Param("list")List<User> list); //批量添加用户 2.2、批量修改用户 @Update({"<script>" + "<foreach collection='list' item='item' index='index' open='(' separator=',' close=')'> " + "

C#string字符串比较

最简单的比较方式: string str1="Test"; string str2 = "Test"; if (str1==str2) //第一种判断方式 { //第二种判断方式 int result1 = str1.CompareTo(str2); Console.WriteLine(result1); //输出result1=0 //第三种判断方式 int result2=String.Compare(str1, str2); Console.WriteLine(result2); //输出result2=0 //后面两种方式需要注意str1和str2是不是为null的情况 //第四种判断方式 bool result3=str1.Equals(str2); Console.WriteLine(result3); //输出result3=true //第五种判断方式 bool result4 = String.Equals(str1,str2); Console.WriteLine(result4); //输出result4=true }

Redis系列(五):Redis的过期键删除策略

本篇博客是Redis系列的第5篇,主要讲解下Redis的过期键删除策略。 本系列的前4篇可以点击以下链接查看: Redis系列(一):Redis简介及环境安装 Redis系列(二):Redis的5种数据结构及其常用命令 Redis系列(三):Redis的持久化机制(RDB、AOF) Redis系列(四):Redis的复制机制(主从复制) 划重点:Redis的过期键删除策略也是面试中经常会被问的,我最近面试,被问到了好几次。 对于Redis服务器来说,内存资源非常宝贵,如果一些过期键一直不被删除,就会造成资源浪费, 因此我们需要考虑一个问题:如果一个键过期了,它什么时候会被删除呢? 1. 常见的删除策略 常见的删除策略有以下3种: 定时删除 在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。 惰性删除 放任过期键不管,每次从键空间中获取键时,检查该键是否过期,如果过期,就删除该键,如果没有过期,就返回该键。 定期删除 每隔一段时间,程序对数据库进行一次检查,删除里面的过期键,至于要删除哪些数据库的哪些过期键,则由算法决定。 其中定时删除和定期删除为主动删除策略,惰性删除为被动删除策略。 接下来我们一一讲解。 1.1 定时删除策略 定时删除策略通过使用定时器,定时删除策略可以保证过期键尽可能快地被删除,并释放过期键占用的内存。 因此,定时删除策略的优缺点如下所示: 优点:对内存非常友好缺点:对CPU时间非常不友好 举个例子,如果有大量的命令请求等待服务器处理,并且服务器当前不缺少内存,如果服务器将大量的CPU时间用来删除过期键,那么服务器的响应时间和吞吐量就会受到影响。 也就是说,如果服务器创建大量的定时器,服务器处理命令请求的性能就会降低, 因此Redis目前并没有使用定时删除策略。 1.2 惰性删除策略 惰性删除策略只会在获取键时才对键进行过期检查,不会在删除其它无关的过期键花费过多的CPU时间。 因此,惰性删除策略的优缺点如下所示: 优点:对CPU时间非常友好缺点:对内存非常不友好 举个例子,如果数据库有很多的过期键,而这些过期键又恰好一直没有被访问到,那这些过期键就会一直占用着宝贵的内存资源,造成资源浪费。 1.3 定期删除策略 定期删除策略是定时删除策略和惰性删除策略的一种整合折中方案。 定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响,同时,通过定期删除过期键,也有效地减少了因为过期键而带来的内存浪费。 2. Redis使用的过期键删除策略 Redis服务器使用的是惰性删除策略和定期删除策略。 2.1 惰性删除策略的实现 过期键的惰性删除策略由expireIfNeeded函数实现,所有读写数据库的Redis命令在执行之前都会调用expireIfNeeded函数对输入键进行检查: 如果输入键已经过期,那么将输入键从数据库中删除如果输入键未过期,那么不做任何处理 以上描述可以使用如下流程图表示: 2.2 定期删除策略的实现 过期键的定期删除策略由activeExpireCycle函数实现,每当Redis服务器的周期性操作serverCron函数执行时,activeExpireCycle函数就会被调用,它在规定的时间内,分多次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键。 activeExpireCycle函数的大体流程为: 函数每次运行时,都从一定数量的数据库中随机取出一定数量的键进行检查,并删除其中的过期键,比如先从0号数据库开始检查,下次函数运行时,可能就是从1号数据库开始检查,直到15号数据库检查完毕,又重新从0号数据库开始检查,这样可以保证每个数据库都被检查到。 划重点: 关于定期删除的大体流程,最近面试时有被问道,我就是按上述描述回答的。可能有的面试官还会问,每次随机删除哪些key呢?可以提下LRU算法(Least Recently Used 最近最少使用),一般不会再细问,不过有兴趣的同学可以深入研究下。 3. RDB对过期键的处理 3.1 生成RDB文件 在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时,程序会对数据库中的键进行检查,已过期的键不会被保存到新创建的RDB文件中。 举个例子,如果数据库中包含3个键k1、k2、k3,并且k2已经过期,那么创建新的RDB文件时,程序只会将k1和k3保存到RDB文件中,k2则会被忽略。 3.2 载入RDB文件 在启动Redis服务器时,如果服务器只开启了RDB持久化,那么服务器将会载入RDB文件: 如果服务器以主服务器模式运行,在载入RDB文件时,程序会对文件中保存的键进行检查,未过期的键会被载入到数据库中,过期键会被忽略。 如果服务器以从服务器模式运行,在载入RDB文件时,文件中保存的所有键,不论是否过期,都会被载入到数据库中。 因为主从服务器在进行数据同步(完整重同步)的时候,从服务器的数据库会被清空,所以一般情况下,过期键对载入RDB文件的从服务器不会造成影响。 4. AOF对过期键的处理 4.

H5移动端常见问题

h5 常见问题 1. H5 页面窗口自动调整到设备宽度,并禁止用户缩放页面 一、HTML 页面结构 // width 设置 viewport 宽度,为一个正整数,或字符串 'device-width' // height 设置 viewport 高度,一般设置了宽度,会自动解析出高度,可以不用设置 // initial-scale 默认缩放比例,为一个数字,可以带小数 // minimum-scale 允许用户最小缩放比例,为一个数字,可以带小数 // maximum-scale 允许用户最大缩放比例,为一个数字,可以带小数 // user-scalable 是否允许手动缩放 <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" /> 二、JS 动态判断 var phoneWidth = parseInt(window.screen.width); var phoneScale = phoneWidth/640; var ua = navigator.userAgent; if (/Android (\d+\.\d+)/.test(ua)){ var version = parseFloat(RegExp.$1); if(version>2.3){ document.write('<meta name="viewport" content="width=640, minimum-scale = '+phoneScale+', maximum-scale = '+phoneScale+', target-densitydpi=device-dpi">'); }else{ document.write('<meta name="viewport" content="

开始启动Altium Designer20时界面卡在Explorer Starting EDMS Interface时处理办法。

开始启动Altium Designer20时界面卡在Explorer Starting EDMS Interface时处理办法 首先解释下,AD20卡在这里是因为在连接AD的服务器,而使用破解版的话就有可能会卡在这个界面(也有人用破解版不会卡在这里) 因为这是软件在启动时连接服务器导致的,所以咱们只需要把他连接网络这个功能关了就好了。下面会用两种方法去解除这个问题。 第一种方法就是关闭网络 ,最简单的做法就是在每次启动AD时先把WiFi或者网络断掉。这是最简单的办法。 第二种方法就是禁用AD使用网络 这里说明一下,我一开始把用两种方法禁用AD使用网络(是在有网络连接的情况下测试的),AD启动时不再卡,但是我再单独试验具体是哪什么方法让他无法连接服务器的,我试了一下之后发现每个禁用方法 在关闭之后他都不卡了,然后我把两种方法都关闭了,结果AD20也不卡了,这就就很让人无语。在我着急使用的时候他卡的打不开,在不着急使用的时候他又不卡了。 下面我会详细配图讲述两种禁用网络的方法。为了配合有些同学用的中文版,有的用的英文版,我会分别配有两种语言的截图。 2.1. 首先第一种禁用网络的方法,在AD软件里面禁用 第一步,首先点击AD右上角的设置,然后选择system—>Installation—>Automatic checking—>check frequency(中文里写的检查频率),把选项改成never. 中文版的截图如下。 第二步,选择system—>Account Management—>Altium Connection,改成选项NO。 中文版的截图如下。 好了,第一种禁用网络方法就是改变这两个设置。 2.2. 第二种禁用网络的方法,是用防火墙禁止网络(win10系统) 首先声明这种方式是我在网上看到方法,以下是那篇文章的链接。https://blog.csdn.net/qq_23957035/article/details/82492093 第一步:进入控制面板—>系统和安全—>Windows defender防火墙—>高级设置。 点击入站规则,再点击右侧的新建规则。 在弹出来的窗口“规则类型”里面,选择程序。 第二步:在程序里面选择“此程序路径”,点击“浏览”,在这里可以选择你的AD20软件快捷键也可以选择你的AD20启动程序,也就是X2.EXE,然后点击下一步。 第三步:点击“阻止连接”,然后点击下一步。 第四步:可以自己选择。 第五步:给你新建的规则起个名称,例如:AltiumDesigner20禁止连接网络。 然后点击完成。入站规则建好了,然后就是新建出站规则,这里就不再做过多赘述了,以下是截图。 以上就是禁用网络的第二种方法。当然如果可以的话,我个人推荐两种方法都采用,这样使用起来应该就不会再卡了。 希望我写的这些可以给一些有同样困惑的朋友些许帮助。 最后再提一句,我个人认为AD20使用起来要比前面的几个版本好用,而且AD让人诟病的弹出的窗口因为笔记本电脑分辨率的问题而上显示不下的这个缺点,在AD20也不存在了(我没安装过AD18.19,所以也不知道是不是在AD18.19就已经改过来了)。 以下是AD15的窗口和AD20的窗口截图。 这只是AD20其中一个小小的优点,AD20还有很多值得去说的优点,这里就不再多说了。 如果是学生的话可以去AD官网免费申请学生版,以下是链接。https://www.altium.com.cn/solutions/academic-programs/student-licenses

windows10安装mysql-workbench报错VS C++ 2015依赖没有安装

workbench下载地址: https://dev.mysql.com/downloads/workbench/ 点击下载之后的安装包,开始安装之后,提示如下错误 MySQL Workbench requires the Visual C++ 2015 Redistributable Package to be installed. Click the Download-Button on the next page to open a web page containing further instrctions. 如果安装workbench,出现这种问题,是因为mysql-workbench的安装需要依赖vc++的环境, 点击ok出现此页面 这时点击download prerequisites, 会跳转到安装的网页,先将下面圈起来的依赖的环境安装好 然后再安装workbench一直点击next就可以了

常见的单端阻抗计算模式(参考网上的部分文章)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/metersun/article/details/38532291 一.图片说明和术语: Offset:非对称 stripling:带状 Microstrip: 微带 Coated:镀膜;涂上;包覆;涂层的覆盖的 二.常见的单端(线)阻抗模型 1. Surface Micro strip 1B 适用范围: 无阻焊微带线,适用于PCB上下两个表层的线路层阻抗计算, 这个模型比下面的包含阻焊的模型更常用。 另外由于在外层,其线路层铜厚则为基板铜厚+电镀铜厚(使用Core时) ; 或当表层使用单独铜箔时,则为成品铜箔厚度。 这一点要注意。 参数说明: H1:外层到参考层VCC/GND间的介质厚度 W2:阻抗线上线宽 W1:阻抗线下线宽 Er1:介质层介电常数 T1:阻抗线铜厚,包括基板厚度(基板出厂铜皮)+电镀铜厚(后加工) 2. Coated Microstrip 1B 适用范围: 含阻焊微带线。 另外由于在外层,其线路层铜厚则为基板铜厚+电镀铜厚; 或当表层使用单独铜箔时,则为成品铜箔厚度。 这一点要注意。 参数说明: H1:外层到参考层VCC/GND间的介质厚度 W2:阻抗线上线宽 W1:阻抗线下线宽 Er1:介质层介电常数 T1:阻抗线铜厚,包括基板厚度+电镀铜厚 CEr1:阻焊介电常数 C1:基材阻焊厚度 C2:线面阻焊厚度(后加工) 3.Embedded Microstrip 1B1A 适用范围: 与外层相邻的第二个线路层阻抗计算,例如一个6层板,L1、L2 均为线路层,L3为参考层(GND/VCC),那么L2层的阻抗计算 使用此方式。 另外由于在内层,其线路层铜厚则为基板铜厚(Core),而非表 层微带线的基板铜厚+电镀铜厚,这一点要注意。 参数说明: H1:外层到参考层VCC/GND间的介质厚度 H2:外层到第二个线路层的介质厚度+第二个线路层铜厚 W2:阻抗线上线宽 W1:阻抗线下线宽 T1: 阻抗线铜厚=基板铜厚 Er1:介质层介电常数(线路层到相邻参考层间介质常数) Er2:介质层介电常数(外层到第二个线路层间介质常数) 4.Offset stripling 1B1A 适用范围: Offset stripling--非对称带状线 1B1A 。 夹在两个GND(或VCC)之间的线路层的阻抗计算,即一个线路层, 它的上下两层均为参考层,那么这个线路层的阻抗计算适用此 模型。注意这个为带状线。 另外由于在内层,其线路层铜厚则为基板铜厚(Core),而非表 层微带线的基板铜厚+电镀铜厚,这一点要注意。 参数说明: H1:线路层到较近参考层VCC/GND间距离(注意不同于上面的介质厚度) H2:线路层到较远参考层VCC/GND间间距(注意不同于上面的介质厚度) W2:阻抗线上线宽 W1:阻抗线下线宽 T1: 阻抗线铜厚=基板铜厚 Er1:介质层介电常数(线路层到较近参考层间介质常数) Er2:介质层介电常数(线路层到较远参考层间介质常数) 5.

将嵌套json数据转换为对象

一、json数据格式 (1)(deviceStatusList为嵌套的格式) 需要两个实体对象存储数据,User存储code和deviceStatusList, Data存储 deviceStatusList内部三个属性。 { “code”: 0, “deviceStatusList”: [{ " datasetId" : “temperature”, “value” : “31”, “timestamp”: 1535697526464 }, { " datasetId" : “batteryLevel”, “value” : “90”, “timestamp”: 1535697526464 }] } 二、嵌套解析实体 定义实体类:注意要有构造方法 1.user public class User { private Integer code; private List<Data> deviceStatusList; public User() { } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public List<Data> getDeviceStatusList() { return deviceStatusList; } public void setDeviceStatusList(List<Data> deviceStatusList) { this.

aurora接口channel_up,gt_common问题记录

1.环境 软件:vivado 2016.4 硬件:kc705开发板 2.问题记录 2.1 vivado route时,报告gt_common错误 2.1.1 错误提示 2.1.2 工程框图 起初想法是,aurora_0用GTXQ0,aurora_1用GTXQ1,作为ip的参考时钟,且aurora0/1 单独例化各自的gt_common模块。 2.1.3 解决办法 将两路aurora接口公用一个gt_common模块 2.1.4 参考资料 ug476中有7series tranceiver gtx介绍如下,bank118只有一组gt_common. 2.2 aurora_simplex_tx 上电channel_up为1 2.2.1 现象 上面的工程,将bit文件烧入fpga后,发现simplex_tx 接口的 channel_up就为1(光纤未链接状态)。 2.2.2 解释 pg074上说明如下: 官方文档sp011上aurora initial 流程如下: 说明aurora simplex_tx上电 channel up是正常现象。

VUE + Springboot 前后端分离线上 登陆后接口请求报302

最近开发项目过程中遇到一个困扰几天的问题,本地测试所有接口都正常,线上请求后端没设置登陆拦截的接口,能正常返回数据;但请求需要登陆访问接口,则出现302,直接重定向到/login接口,十分诡异。 与后端一起探讨解决发现,多方查询尝试才发现在axios配置中设置:withCredentials: true,允许跨域请求携带cookie才行。在同域的情况下,我们发送请求会默认携带当前域下的 cookie,但是在跨域的情况下,由于浏览器的限制,默认是不会携带请求域下的 cookie ,而我们通常请求中是需要携带cookie的,这就需要在XMLHttpRequest对象上配置withCredentials属性,将其设置为true。 需注意:在withCredentials的情况下,后端要设置Access-Control-Allow-Origin为你的源地址,例如http://localhost:8080,不能是*,而且还要设置header(‘Access-Control-Allow-Credentials: true’); axios中文文档配置拷贝过来: { // `url` 是用于请求的服务器 URL url: '/user', // `method` 是创建请求时使用的方法 method: 'get', // 默认是 get // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。 // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL baseURL: 'https://some-domain.com/api/', // `transformRequest` 允许在向服务器发送前,修改请求数据 // 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法 // 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream transformRequest: [function (data) { // 对 data 进行任意转换处理 return data; }], // `transformResponse` 在传递给 then/catch 前,允许修改响应数据 transformResponse: [function (data) { // 对 data 进行任意转换处理 return data; }], // `headers` 是即将被发送的自定义请求头 headers: {'X-Requested-With': 'XMLHttpRequest'}, // `params` 是即将与请求一起发送的 URL 参数 // 必须是一个无格式对象(plain object)或 URLSearchParams 对象 params: { ID: 12345 }, // `paramsSerializer` 是一个负责 `params` 序列化的函数 // (e.

数据治理——主数据项目实施

文章目录 一.主数据定义1.数据的层次模型(根据数据的特征、作用以及管理需求的不同)2.主数据涵盖了元数据、引用数据、企业结构数据、业务结构数据 二.传统的软件项目实施三.主数据项目四.主数据项目详细规划第一阶段(体系规划阶段)第二阶段:平台实施阶段 五.核心步骤1.主数据的准备2.系统集成架构 一.主数据定义 1.数据的层次模型(根据数据的特征、作用以及管理需求的不同) 分为6个层次:元数据、引用数据、企业结构数据、业务结构数据、业务活动数据、业务审计数据。 元数据( 系统中最基础的数据):元数据描述数据定义、数据约束、数据关系等。在物理模型中,元数据定义了表和属性字段的性质。 引用数据(属性值域):引用数据定义了元数据的可能的取值范围(月份的引用数据为1-12月)(电商项目中订单状态可划分为待付款、待发货、待收货、已发货、已撤销等,引用数据是对数据分类的重要标准,不同状态的订单将会进入相应的业务流程,死信处理正在付款和未付款) 企业/单位结构数据:描述企业数据之间的关系,是多条主数据的集合(组织结构由组织机构、人员、岗位等主数据组成)。 业务结构数据:描述业务的直接参与者(典型的业务结构数据包含产品、客户数据)。 通常由唯一的数据编码以及大量的属性信息构成。 业务活动数据:记录运营活动中产生的业务数据,其实质是主数据之间活动产生的数据(客户购买产品的业务记录、工厂生产产品的生产记录)。 业务审计数据:记录数据的活动(对客户信息进行修改、对业务进行删除)。 2.主数据涵盖了元数据、引用数据、企业结构数据、业务结构数据 业务数据(业务活动数据、业务审计数据)以主数据为基石,衍生出分析数据。主数据项目是一个复杂的项目,表面上仅仅是一个物理载体,实质是管理流程、管理手段的一次变革。信息系统的实施的过程实际是组织、人员、流程及系统融合的过程。 二.传统的软件项目实施 传统的软件项目是一个闭环系统,它会不断检验实施是否能达到最初的项目工作范围和业务目标。 项目启动阶段通过进一步明确项目的工作范围与业务目标,奠定项目成功的基础。 系统设计与开发阶段达到用户的需求。 系统上线启用阶段包括了所有与用户培训、系统初始配置、软件功能验证,以及对设计、开发、应用的使用情况评估分析相关等工作。 三.主数据项目 主数据项目的实施方法分为两个阶段 第一阶段(体系规划阶段):主要工作任务为构建主数据体系规划、主数据管理平台规划,搭建主数据标准体系、管理体系,形成主数据管理方案。 第二阶段(平台实施阶段):主要工作任务为搭建主数据管理平台,将主数据标准体系在主数据管理平台中实现。 四.主数据项目详细规划 第一阶段(体系规划阶段) 1.项目启动、需求调研及评估 根据成熟度模型 (初始级p0,可重复级p1,已定义级p2,已管理级p3,优化级p4,创新级p5)判断企业或单位所处的级别,对主数据应用现状和管理目标进行精炼,定位主数据应用及管理中存在的问题。了解现行标准体系与编码管理的应用现状,对编码体系进行评估。建立平台技术环境,通过对主数据管理平台的系统原型进行需求差异化分析 2.体系规划和架构设计 主数据体系实施规划:对系统实施任务进行分解,明确每期系统建设的阶段目标、功能、内容、范围 主数据管理体系设计:明确上级和下属单位之间的主数据管理模式;进行主数据管理流程设计 主数据集成架构设计:明确主数据系统与企业或单位系统的横向数据交换方式,明确主数据系统与二级单位系统的纵向数据交换方式 主数据安全架构设计:明确主数据安全体系中的安全策略、安全组织、安全技术、安全建设和运行。 3.数据标准制定 建立主数据分类体系,对于企业,划分客户主数据、供应商主数据、通用基础主数据等;建立符合各类标准的描述模板。 提供通用主数据编码库、分类模型、描述模型:在项目实施过程中为主数据的分类及编码库的建立提供相应的设计方案。 4.主数据管理平台设计 明确主数据管理平台在与业务系统进行数据交换时的功能与方式,如Web Service(Web service 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API);可查看主数据接收或分发日志,对不能正常处理的主数据进行主动预警,并按照预先设定规则处理。 对数据清洗功能进行详细规划:数据清洗模型的建立,实现清洗过程中主数据的唯一性、完整性、一致性、合理性。 第二阶段:平台实施阶段 1.客户化设计、开发、测试阶段 2.数据清洗阶段 依据数据标准进行系统内各类主数据标准模型建设,提供清洗工具,依据历史数据分析,制定由历史数据向标准化转化的清洗工作方案 3.培训、上线准备、系统上线运行阶段 4.系统上线运行支持 五.核心步骤 1.主数据的准备 主数据管理系统实施阶段的重中之重,主要内容包括数据采集、数据清洗和数据导入。 数据采集: 在数据采集前,项目组为了提高准备数据的质量,应说明关键字段的含义、系统使用原理 以及和原系统数据的对应关系 在数据采集的工具方面,一种方法是利用业务系统的数据导出工具,通过人工的方式整理为标准的数据采集格式;另一种是由项目组开发一套数据采集软件 数据清洗: 数据清洗的目的是检测数据中存在的错误和不一致,剔除或者改正它们,将剩余部分转换成数据标准所接受的格式,提高数据质量。 (1)清洗原则(保证主数据的唯一性、完整性、一致性、合理性) 清洗已使用的主数据编码,对于未使用的主数据编码采用停用等方式。 对企业统建系统的基础编码数据,可保留原编码规则,不进行编码的改动,仅完善维护相关属性值。 属性值不完整的编码数据,按照其主数据规范标准进行补充完善,使其完全符合数据标准化的要求。 清理要覆盖全部的数据,保证数据清理的完整性。 (2)清理方法 1)初步标记 将获取的主数据进行初步清理、标记工作。 2)分类清理

uniapp使用高德获得详细地址

准备工作 本文主要针对uniapp做的。 1.登陆高德地图官网并添加应用获得key 。[高德官网](https://lbs.amap.com/) 如图: 2.下载amap-wx.js。获得文件如下。网站链接: 下载地址 3.把你的HBuilder X打开,并把amap-wx.js导入static文件下。如图: 进入主题 1.初始化 <script> var amapFile = require('../../../static/js/amap-wx.js'),//引入刚刚下载的文件 //设置初始化 markersData = { latitude: '',//纬度 longitude: '',//经度 key: "xxxxxxxxxxxxxxxxxxxxxxxx"//申请的高德地图key } <script> 2.授权、获得经纬度、经纬度转地址 async getLocation() { this.getSetting(); this.doGetLocation(); }, /* 获得经纬度 */ doGetLocation() { uni.getLocation({ type: 'wgs84', success: (res) => { this.loadCity(res.latitude,res.longitude); }, fail: (err) => { uni.showToast({ title: "获取失败" }) } }) }, /* 是否授权,没有授权则授权*/ getSetting: function() { return new Promise((resolve, reject) => { uni.

SR锁存器

【 1. 或非门锁存器 】 工作原理 高电平有效。SR由11→00,Q*不定,所以正常工作下,应遵循SR=0的约束条件。① SR=11时,Q和Q’均为不定0( 即此时若S、R同时由1变为0,Q和Q’会出现不定 )。 ② SR从11->00后,Q和Q’均为不定。(即Q、Q’会从0变成1,再变成0反复循环,状态不定,产生振荡) 功能描述 时序图 【 2. 与非门锁存器 】 工作原理 S’为置1输入端 R’为置0输入端 低电平有效S’ R’ 由00→11后,Q、Q’不定,所以正常工作下,应遵循SR=0的约束条件。① S’R’=00时,Q和Q’均为不定1( 即此时若S’、R’同时由0变为1,Q和Q’会出’现不定 )。 ② S’R’从11->00后,Q和Q’均为不定。(即Q、Q’会从0变成1,再变成0反复循环,状态不定,产生振荡) 功能描述 时序图 【 3. 应用:开关消抖 】 现象: 原因: 抖动产生因为机械固有的物理特性,在瞬间接触的时候会有力学的回弹,造成2-8毫秒内信号不稳定。 这种抖动对人来说是感觉不到的,但对电路来说,则是完全可以感应到的: 当按钮被按下时,你所期待的效果应该是:111111111000000000…, 而事与愿违,单片机读到的信号可能会是:111110110110000000…, 这中间连续的1和0过渡处,短暂的几个随机交错出现的01就是我们不期望产生的抖动解决办法: 利用基本RS触发器的记忆功能消除机械开关振动引起的干扰脉冲 令开关一端接地,当开关S拨向A(一旦有接触时),Q=1,Q’=0,无论A怎么抖动,Q’=0又作为Q输入端,令Q一直保持1的状态。

c#获取字符串长度、字节长度、utf-8字节长度

string str = "测试123+-"; int test1 = str.Length;//长度为7 字符长度:不管中文、英文、符号都是一个字符 int test2 = System.Text.Encoding.Default.GetByteCount(str);//长度为9 字节长度:中文占两个字节,其他占一个字节 int test3 = System.Text.Encoding.UTF8.GetByteCount(str);//长度为11 utf-8字节长度:中文占三个字节,其他占一个字节

pip 安装依赖包 报错 No matching distribution found for pandas

在pycharm中的terminal中使用pip安装依赖包时,出现No matching distribution found for pandas的错误提示 这里是在虚拟环境中,安装依赖包 结果抛出了以下异常提示 解决方案,使用 命令:python -m pip install pandas 这样就安装成功了

未能加载文件或程序集“System.Windows.Interactivity问题的解决

在WPF项目调试过程中,出现“发现“System.Windows.Interactivity”的不同版本间存在无法解决的冲突。”报错,程序无法运行,我试图卸载和重新安装该控件,但仍无法解决。 终查看App.config中,见下图,发现多出红框部分代码,删除后程序正常运行。

TensorFlow2.x 学习笔记(六)随机梯度下降以及数据可视化

文章目录 梯度下降简介梯度利用梯度优化 AutoGrad with TensorflowGradientTapePersistent GradientTape 2 n d − o r d e r 2^{nd}-order 2nd−order 激活函数及其梯度Sigmoid/LogisticTanhReLU Loss及其梯度MSESoftmax[Crossentropy gradient](https://blog.csdn.net/IDrandom/article/details/104601051#Cross_Entropy_Loss_198) [Chain Rule](https://zh.wikipedia.org/wiki/%E9%93%BE%E5%BC%8F%E6%B3%95%E5%88%99) 可视化tensorboardcreate_file_writer()imagescalar 梯度下降 简介 梯度 梯度是一个向量,表示某一函数在该点处的方向导数沿着该方向取得最大值。 g r a d f ( x , y ) = ∇ f ( x , y ) = ( ∂ f ∂ x , ∂ f ∂ y ) = ∂ f ∂ x i + ∂ f ∂ x j gradf(x,y) = \nabla{f(x,y)} = (\frac{\partial f}{\partial x},\frac{\partial f}{\partial y}) = \frac{\partial f}{\partial x}i + \frac{\partial f}{\partial x}j gradf(x,y)=∇f(x,y)=(∂x∂f​,∂y∂f​)=∂x∂f​i+∂x∂f​j

VS Code | 如何快速重启VS Code?

如何快速重启VS Code? 安装完插件后,有些时候需要重启才会生效,但是每次都关闭再打开就有点不舒服了。 快捷键:CTRL + SHITF + P,打开:“命令面板”,输入即可: > Reload Window

用大白话讲清 -> Pycharm的编码配置问题(超级详细!)

一、Pycharm的编码配置 pycharm的编码配置有三种,名称和作用分别是 Global Encoding:不知道有什么用,就选择默认的UTF8就行了Project Encoding:打开文件时使用的编码Properties Files:配置文件所使用的编码编码设置的路径:File -> Settings(打开Settings的默认快捷键是CTRL+ALT+S) -> Editor -> File Encodings 二、编码的注意事项 py文件如果在开头指定了编码,即# coding=编码。即无视Pycharm的配置设置,直接使用指定的编码。且只要设置过coding,哪怕之后删除了coding,也会以最后一次的coding的编码保存文件。 读取文件,且文件没有指定编码时,使用pycharm默认的Project Encoding所指定的编码。 WINDOWS10默认的编码并不是GBK,而是ANSI。打开ANSI文件并以GBK解码时并不会出错,但是再转换成其他的编码,如UTF8时,有可能会出错,且无法修改回来了,要注意。建议将3种编码都设置为UTF8,且新建py文件时使用模板(如何配置模板就请百度了,这个很方便),自动设置好utf8,以绝后患。如果接手了非UTF8编码的文件,现在外部修改好编码后再使用Pycharm打开,否则十分容易出错。

CSS3 简单3D旋转画册

CSS3 简单3D旋转画册 上次我们简单介绍了c3的一些基础知识,我们今天来做一个小练习; 这个简单的案例是3D的一个旋转画册,那么上面是我们的一个效果图,因为不能够传视屏所以就暂时只能够截图来看一下具体结构。 正如大家所看见的,该相册由两个正方体组成,由大的正方体包裹着小的正方体,实现方式其实是用了margin或者使用定位position来实现。 其实这个画册的做法很简单,这边就不一步一步的解释了,下面我将代码粘贴出来,大家自行测试。 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>3D旋转画册</title> <link rel="stylesheet" type="text/css" href="css/reset.css" /> </head> <style> #album-inner{ height: 100px; width: 100px; position: absolute; top: 45%; left: 45%; transform-style: preserve-3d; /* transform: rotateX(-30deg) rotateY(-45deg); */ /* perspective: 800px; */ animation: move 16s linear infinite; } //选择器创建move运动规则 @keyframes move{ from{ transform: rotateX(0deg) rotateY(0deg); } to{ transform: rotateX(-360deg) rotateY(-360deg); } } ul li{ height: 100%; width: 100%; position: absolute; } ul li img{ height: 100%; width: 100%; } /* 六张图片分别设置位置 */ #album-inner li:nth-of-type(1){ transform: translateZ(50px); } #album-inner li:nth-of-type(2){ transform: translateX(50px) rotateY(90deg); } #album-inner li:nth-of-type(3){ transform: translateZ(-50px); } #album-inner li:nth-of-type(4){ transform: translateX(-50px) rotateY(90deg); } #album-inner li:nth-of-type(5){ transform: translateY(-50px) rotateX(90deg); } #album-inner li:nth-of-type(6){ transform: translateY(50px) rotateX(90deg); } /* 外面的旋转 */ #album-outer{ /* transition: transfrom 3s linear !

python之pysvn的那些坑

使用详见官方文档,后面记录几个用到的方法 先安装 windows 安装 环境:win10,python3.7 http://pysvn.tigris.org/servlets/ProjectDocumentList?folderID=1768 下载对应版本,直接运行安装 centos 安装 环境:centos7,python3.7,pysvn1.8.0 centos下yum安装默认安装python2环境的 python3环境的安装参考这个 #python2 安装 yum install pysvn -y 踩坑记录:从我安装情况来看,pysvn似乎时不兼容python3.7,因为一直没装上,下面的报错2一直搞不定,网上搜索的教程就算装上了也特别麻烦,果断换环境 # python3.6 安装 #下载 wget http://pysvn.barrys-emacs.org/source_kits/pysvn-1.8.0.tar.gz #安装依赖 ,若不安装依赖会有报错,见下面 yum install subversion-devel apr-devel apr-util-devel -y #开始编译安装pysvn tar xzf pysvn-1.8.0.tar.gz cd pysvn-1.8.0/Source/ python3 setup.py configure make cd pysvn/ #查找python包的位置 find / -name site-packages #创建pysvn文件夹 mkdir /usr/local/lib/python3.6/site-packages/pysvn #把文件拷过去完成 cp __init__.py /usr/local/lib/python3.6/site-packages/pysvn cp _pysvn_3_6.so /usr/local/lib/python3.6/site-packages/pysvn 报错1:运行python3 setup.py configure报错 错误:('Error:', 'Cannot find SVN include svn_client.h - use --svn-inc-dir') 解决:yum -y install subversion-devel 报错2:运行make报错,具体报错找不到了,反正就这个文件有错,网上也找不到什么解决办法

k-means聚类算法原理简析

k-means聚类算法原理简介 概要算法思想算法流程图解代码实现算法优化代价函数(Distortion function)如何选取k值聚类中心的初始化 概要 K-means算法是最普及的聚类算法,也是一个比较简单的聚类算法,所以刚接触的同学不要感到害怕。算法接受一个未标记的数据集,然后将数据聚类成不同的组,同时,k-means算法也是一种无监督学习。 算法思想 k-means算法的思想比较简单,假设我们要把数据分成K个类,大概可以分为以下几个步骤: 随机选取k个点,作为聚类中心;计算每个点分别到k个聚类中心的聚类,然后将该点分到最近的聚类中心,这样就行成了k个簇;再重新计算每个簇的质心(均值);重复以上2~4步,直到质心的位置不再发生变化或者达到设定的迭代次数。 算法流程图解 下面我们通过一个具体的例子来理解这个算法(我这里用到了Andrew Ng的机器学习教程中的图): 假设我们首先拿到了这样一个数据,要把它分成两类: 我们人眼当然可以很快的分辨出来,可以在两个聚类间找到一条合理的分界线,那么用k-means算法来解决这个问题会是怎样的呢? 首先我们随机选取两个点作为聚类中心(因为已经明确是分为两类): 接下来就可以开始计算每个点到红点和蓝点的距离了,离红点近就标记为红色,离蓝点近就标记为蓝色。结果为下图: 很明显,这样完全不是我们想要的结果,接下来我们进行第三步,重新计算聚类中心的位置。 红X和蓝X都向中间靠拢了一点。我们可以看到,聚类中心发生改变后,其他点离两个聚类中心的距离也跟随着发生了变化。然后我们重复第二步,根据每个点到两个聚类中心的距离远近来进行重新分类,离红X近的归为红类,离蓝X近的归为蓝类。 之前站错了队伍的一些点重新进行了调整,现在的分类离我们的目标越来越近了,但还没有达到最佳的分类效果。接下来继续重复上面的步骤,重新计算聚类中心的位置,再重新分类,不断迭代,直至聚类中心的位置不再变化(变化范围达到设定值)或达到迭代次数为止。 这样我们就利用k-means算法把这个数据很好的分为两类啦。 我们可以看到,在整个过程中,我们都没有去监督算法,告诉他具体是分错了还是对了,只是在开始的时候告诉他要把这个数据分成多少类,然后后面的操作都是由他自己完成,完全没有人为的让他进行分类的学习,也没有帮助他纠正错误,所以k-means算法也是一种无监督学习方法。 相信看到这里你对k-means算法的原理也有了一个大概的了解啦。下面我们再来看看这个算法的代码实现吧。 代码实现 下面就放一个Andrew Ng 机器学习教程的习题答案吧,把k-means算法的具体流程大概实现了一下: function [centroids, idx] = runkMeans(X, initial_centroids, ... max_iters, plot_progress) %RUNKMEANS runs the K-Means algorithm on data matrix X, where each row of X %is a single example % [centroids, idx] = RUNKMEANS(X, initial_centroids, max_iters, ... % plot_progress) runs the K-Means algorithm on data matrix X, where each % row of X is a single example.

springboot 支付宝支付(条码支付)

springboot 支付宝支付(条码支付) 应用:线下场景中,商家使用扫码枪扫描客户出示的支付宝条码或者二维码进行付款 官方文档:https://opendocs.alipay.com/open/194/105072 ***************************** 引入 jar 包 <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.9.100.ALL</version> </dependency> ***************************** 示例 ***************** 配置文件 alipay: appid: 2016092500591327 gatewayUrl: https://openapi.alipaydev.com/gateway.do format: JSON charset: utf-8 signType: RSA2 returnUrl: http://sk5xjs.natappfree.cc/return notifyUrl: http://sk5xjs.natappfree.cc/notify app-private-key: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCcF+Oc3uJEFt59LXB30LkP/Ocn6cMtxTeeqiM99tzGi3nyMao33jPYjwKvQk+djDb7i4bgJNVjx5QtEuJruMsiOMUO34QzYqnSZLLdA8Oltbf5LG/+qJMnF+K1dw9DWvw5dF6rbXvvqMpzruBJ99ntbWBK5hE/ayYODPhmcQ8rLV0nedYCb4nIhQueF3l6pFDG5e/eRyTj3Vb6faSf30DTKhMk4Yvj3Mx3f8h4eGGjFvvbSKdO8oI8HQYkEQh8k8pqkkQs3FSawp5KNAH13CNzGEnLewsOaHiEEwT1qSTc7ppewp7oyP2KtXw9TQySlkNFyLorqUHjF71hgCFmDEIxAgMBAAECggEACT5c60hDq/aSvGT5eQ7yNqEqazGrrkU0kv/OUHgTAOr3kMEiLGbLOTLW3NwXbOQFyYWsug9UV7FU9ApfQDPUS7WC7euMn6JjHiN6eB4l8uU8/NOF2lXPSQxgD5D6ZWm48AoVJR+5rCqZupoLjDXSQP4uKqFPOis1OLXJ6/8b/9l7L0jf2eW70Ht6HrNxfXTAn07FoJAEHnjePCgyYHuor9oD/0bi/0KRJkeQtqMZHX3oYhhYmQzIMTXIi9hMd+U6lmaknDFV8AMOfemX0Dq6KNYPwWP86YWelZ230xHXgE3Jk493unFZetliGG6vVyq4Whd5OTcXmE64+8GRKxO5QQKBgQDOwRR4KhyqbA7LXjyNhYXr86pOEt4wpeZGFsbcryRsxf0HSZpVWwUMVsOFkHRBZ3InbkfRCdHMBcqiA5dDwYOyo4l0R7sWdc9rteXvLdw57tBDbkiLK2HW+iUP0mXXghiD7ynyaAyLdvu5upUdDj1G1OI40Ye1ThOK60WseXyC6QKBgQDBRb2dg4YDKh0HtTsl8e/A1rPzob7KyRSi7bY31WtEOETeY6FMsC9jMm6fxJtT+Xtp5XfrWhQptn0E1fLJ7c7TAM1hFs2YBzOLKzinVxo0nFfRGkMrBotoAQmh+SKME1BjyW8qGeVIC8DSSazvVDDpp3Z6+WjNESL7e8yAn3VoCQKBgDVxGwVkfTxf6gMPPL+n/9HZje/YWK5ic38ya/ynGNc05g54K/hcKpXh53AiwqoVPyCKFO4nh58g8BuoqfTNlGkcdG8mC2nm0dKZlfGY/Q/MdvC3FPFEKWoUBnhsff6SlhukOkd6NaPnAXIklF6KS7R/WmotXtKyd8K0xbGrRU/hAoGAX4diHp3oul2xdaLddnbsA0vcLFrRHBhhq9qFC3ngiBqr56QlEOuwsH438Z5TDCGvH3t9V4Xxm2CI0MATPj3d0at+2DNWMYO1tV8KpKPH3yM7wK4TbwvQEfsZUMb8jXHqdTgWSx/7lS3CA+7InI7nkkXkqQnoBBwpR1Y8kYK/nEkCgYBmVBBabnYfaUkooDBPOZu7xCQH1xf+yPV0jH8T8FMYFn6biCXVnHhjZ5Mm8h8Y7gctRpZtqnG30TD71HLsRohxfQkxRyp9NvhiJpingBL860lM89JA3C/pNDf8FV3hq4RFIPDkBA3v7QbytDTNl4bQ7oYiFegWndLVBboNIntNFg== alipay-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1ynoaKrpzpipzhsivNwIRBrEPMeFYLWkWSMU9E3KAdBBpSGHN9x3OVWYe/F3yxRgLtbOdqN1DBYiKLUBvUu2NAqH1KV6nkt3Rx/gc7MKMwL+TWBmXKX5L1eK17TOPKMXoqVN5grFrCH0hx/U6lZnr2M/7A93yPlSKLgJwVYj560wzElBL+fvjR0V0OA+FWJryKluBtJYUKXBadFKuyVwNnyGqmHFxvtSHuErhOrg0YiYIfhV3f7zE5q1mIz7ecwH0W7nB7gtFjLt1k4WSpwyeEI8Xpl7SLMvHdwEXUwTU0h/V7TumYWgUe0ft70NTps+zPwJlmcEluHg0VSs7UrDVQIDAQAB ***************** config 层 AlipayProperties @Data @Component @ConfigurationProperties("alipay") public class AlipayProperties { private String appId; private String gatewayUrl; private String format; private String charset; private String signType; private String appPrivateKey; private String alipayPublicKey; private String returnUrl; private String notifyUrl; } AlipayConfig:创建AlipayClient

7-16 列出叶结点 (25分)/(C语言实现)

7-16 列出叶结点 (25分)/(C语言实现) 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 “-”。编号间以 1 个空格分隔。 输出格式: 在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。 输入样例: |8 |1 - |- - |0 - |2 7 |- - |- - |5 - |4 6 输出样例: 4 1 5 C语言实现 #include<stdio.h> #include<stdlib.h> typedef struct Node *node; struct Node {//储存输入数据,并找到父节点 int on; int left; int right; }; typedef struct Snode *Tree; struct Snode{//树 int data; Tree Left; Tree Right; }; int flag=1;//判断输出时第一个字母不带空格 Tree buidTree(int rot,node nod[]); void myprint(Tree t); int main(){ int n,j=0,num[14]={0}; node tr[14]; char ch; scanf("

利用esp8266接入小爱同学,实现智能台灯的改造物联网初识

硬件准备 1.继电器WIFI智能插座模块 2.USB转ESP8266WIFI模块 3.ESP8266模块 软件环境搭建 1.小爱同学app,或者米家app,点灯 Blinker app 2.ArdunioIDE编译器 第一步:首先下载Arduino IDE地址:https://www.arduino.cc/en/Main/Software?setlang=en 第二步:导入ESP8266开发板,在软件,首选项里 在附加开发版管理器网址里输入:http://arduino.esp8266.com/stable/package_esp8266com_index.json 第三步:打开工具=》开发板=》开发板管理器中搜索ESP8266安装即可,此过程有点慢 第四步:打开工具选择开发版本,工具=》开发板=》选择NodeMcu 1.0(ESP-12E Module) 第五步:下载代码所需要的库地址:https//github.com/blinker-iot/blinker-library/archive/master.zip 把下载的库复制到此目录下。 上传代码 上传代码时需要短接 #define BLINKER_MIOT_LIGHT #define BLINKER_WIFI #include <Blinker.h> char auth[] = "d64a851784dc";//在BLINKER中设备的密钥 char ssid[] = "TP-LINK_6B29";//局域网的名字 char pswd[] = "wg15385778716..";//局域网密码 int GPIO=0;//定义GPIO口用于控制继电器 #define BUTTON_1 "ButtonKey" BlinkerButton Button1("key");//这里需要根据自己在BLINKER里面设置的名字进行更改 //按下按键后就会进行此函数 void button1_callback(const String & state) { BLINKER_LOG("get button state: ", state); digitalWrite(GPIO,!digitalRead(GPIO)); Blinker.vibrate(); } //接入小爱同学的代码,此部分代码根据BLINKER官网进行修改得到 void miotPowerState(const String & state) { BLINKER_LOG("need set power state: "

Storm的strom list的此节点报错Could not find leader nimbus from seed hosts ["1} DiDid you specify a valid li

ava.lang.RuntimeException: java.lang.RuntimeException: org.apache.storm.thrift.transport.TTransportException: java.net.UnknownHostException: host-10-1-234-26 at org.apache.storm.security.auth.ThriftClient.reconnect(ThriftClient.java:108) ~[storm-core-1.1.1.jar:1.1.1] Caused by: java.lang.RuntimeException: org.apache.storm.thrift.transport.TTransportException: java.net.ConnectException: Connection refused (Connection refused) 。。。。。。。 。。。。。 Exception in thread “main” org.apache.storm.utils.NimbusLeaderNotFoundException: Could not find leader nimbus from seed hosts [“10.1.234.26” “10.1.234.27”]. Did you specify a valid list of nimbus hosts for config nimbus.seeds? 查找发现这个主机 cat /etc/hosts 这个主机没有配置域名,其他主机都配置了 vi /etc/hosts root权限添加主机域名 再试试storm list就好了

用全站 CDN 部署 Discourse 论坛

Discourse 介绍 Discourse 是一款由 Stack Overflow 的联合创始人——Jeff Atwood,基于 Ruby on Rails 开发的开源论坛。相较于传统论坛,Discourse 从他全面开放的开源态度、简介明了的页面风格到其特有的内容运作体系都在证明自己是一款为下一个 10 年的互联网而设计的产品。现在,诸如 Car Talk 等国外知名产品都采用 Discourse 为论坛方案。 作为一个开源的论坛项目,Discourse 相对其他的论坛有以下亮点: 高度可定制:从发帖等级要求权限到论坛帖子标题最少字数要求,Discourse 在论坛设置里罗列了 25 设置大项,300+ 个论坛小项,即使大家都使用 Discourse 搭建论坛但是每个用 Discourse 搭建的论坛都有自己的风格。插件:Discourse 官方及 Discourse 开源社区用户开发了丰富的插件可供使用,比如:个性化导航、自定义论坛封面。集成:可接入第三方产品,Google Analytics、 Slack、Wordpress 都在支持之列。免费:虽然 Discourse 有 $100/Month 的托管服务,但是你可以完全自行部署免费使用 Discourse 服务。其他:Discourse 还有其他许多的好处,举个例子,它提供了一个机器人 Discobot 是一个可自定义的 bot,交互式地教新用户使用平台的许多功能,例如为主题添加书签,单框链接(嵌入的预览),添加 emoji表情,非常简单的格式设置,添加图片回复,标记帖子以及如何使用搜索功能。 丰富的插件、可自定义论坛设置便是 Nebula Graph 选择 Discourse 最大的原因,而本文不在于介绍如何搭建 Discourse(搭建 Discourse 是一个简单的活,可自行搜索教程),本文旨在介绍图数据库 Nebula graph 如何利用 CDN 来部署 Discourse。 部署 Discourse 自托管的原因 尽管 Discourse 官方的托管服务,但由于国内的访问质量不稳定、不能自由的修改插件和自定义网络设置,因此我们决定自行托管这项服务。基于自托管服务,我们对网络、插件系统做了一些自定义修改,使得目前 Nebula Graph社区有着更好的访问速度和功能。