游戏获胜的概率

public class EmperorAndSlave { public static void main(String[] args) { int slaveWinCount, emperorWinCount; slaveWinCount = emperorWinCount = 0; int[] slave = new int[5]; int[] emperor = new int[5]; for(int i = 1;i <= 10000;i++) { shuffle(slave,emperor); if(isSalveWin(slave, emperor)) slaveWinCount++; else emperorWinCount++; } System.out.println("slave totally wins:" + slaveWinCount); System.out.println("emperor totally wins:" + emperorWinCount); } public static void shuffle(int[] S,int[] E){ for(int i = 0;i < S.length;i++) { S[i] = 1; E[i] = 1; } S[(int)(Math.

Flutter在windows系统配置及运行

第一步 下载安装配置jdk 下载jdk 下载链接 根据自己的操作系统选择安装 安装jdk 双击下载的jdk傻瓜式下一步,建议不要修改安装目录,让它安装到c盘目录下 配置jdk的系统变量 变量名为JAVA_HOME,值为jdk安装目录 再系统变量找到 Path 在 Path 里面增加如下代码 ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin 注意 ’ ; ’ 一定是英文的 验证jdk环境变量是否配置成功 打开cmd命令提示符,输入java 或者javac ,如果出现一堆东西说明配置成功了 第二步 下载安装Android Studio 下载 Android Studio 下载链接 下载的安装包也是傻瓜式的下一步完成 安装完成之后会有弹窗提示,直接点击ok 前面还有一部忘记截图了也是选择第二个选项,选择Cancel 点击Next 默认选择标准配置,然后Next 前面根据个人喜好选择UI界面,点击finish,会进行一些下载和安装一些配置,等十几分钟就会安装好了! 第三步 下载解压配置Flutter SDK 下载Flutter SDK 下载地址 推荐下载最新的版本 下载完成后随便解压到指定目录下,注意文件夹名字不要是中文 找到flutter解压的bin目录配置到系统变量,追加到path后面,前面以‘;’隔开 输入cmd命令提示符flutter -v,查看是否配置成功 第四步 电脑上配置Flutter国内镜像 搭建环境过程中要下载很多资源文件,当一些资源下载不了的时候,可能会报各种错误。在 国内访问 Flutter 的时候有可能会受到限制。Flutter 官方为我们提供了国内的镜像 系统环境配置Flutter官网提供的国内镜像 文档地址 ’ : '为分割 前面是变量名,后面为变量值,两个都是在系统变量里新建 FLUTTER_STORAGE_BASE_URL: https://storage.flutter-io.cn PUB_HOSTED_URL: https://pub.flutter-io.cn 第五步 运行 flutter doctor 命令检测环境是否配置成功 命令提示符输入flutter doctor看是否配置成功,第一次配置会出现这种情况,只要把红色框住的flutter doctor --android-licenses在终端运行,会让你选择(y/N),全部都选y。

STM32 CubeIDE快速创建工程(图文详解)

使用STM32CubeIDE快速创建STM32的HAL库工程。 文章目录 1 STM32CubeIDE Home2 生成工程3 程序下载 1 STM32CubeIDE Home 进入到官网的下载界面,选择符合对应的操作系统和对应的版本,下载安装,下载界面如下图所示; 安装完成之后,打开STM32CubeIDE会直接进入主页,这里开始创建STM32工程或者导入工程,如下图所示; Read STM32CubeIDE Documentation有大量的官方文档;可以快速入门,包括; 安装教程;用户手册; 2 生成工程 设置工程名称和路径之后就基本完成工程的创建了,具体如下图所示; 在此期间可能会联机下载库文件和相应MCU的外设文件,这里要保持网络畅通,并耐心等待; 成功创建工程之后,如下图所示; 可以看到左边是HAL库,右边是CubeMAX的配置界面,至此已经完成了工程的生成了,那么下一步进行进行编译和下载。 另外在文件列表中可以看到TEST.ioc文件,这是CubeMAX的配置文件,相当于一些软件的ini文件,CubeMAX主要通过读写该文件将设备的配置保存和加载的软件中,直接用文本编辑器打开可以看到具体的信息如下所示; #MicroXplorer Configuration settings - do not modify FREERTOS.IPParameters=Tasks01 FREERTOS.Tasks01=defaultTask,0,128,StartDefaultTask,Default,NULL File.Version=6 KeepUserPlacement=false Mcu.Family=STM32F1 Mcu.IP0=FREERTOS Mcu.IP1=NVIC Mcu.IP2=RCC Mcu.IP3=SYS Mcu.IPNb=4 Mcu.Name=STM32F103Z(C-D-E)Tx Mcu.Package=LQFP144 Mcu.Pin0=VP_FREERTOS_VS_CMSIS_V1 Mcu.Pin1=VP_SYS_VS_ND Mcu.Pin2=VP_SYS_VS_Systick Mcu.PinsNb=3 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F103ZETx MxCube.Version=5.3.0 MxDb.Version=DB.5.0.30 NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:true\:false\:true NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false PCC.Checker=false PCC.Line=STM32F103 PCC.MCU=STM32F103Z(C-D-E)Tx PCC.PartNumber=STM32F103ZETx PCC.Seq0=0 PCC.Series=STM32F1 PCC.Temperature=25 PCC.Vdd=3.3 PinOutPanel.

with check option的使用

在with check option的选项下,可以总结为 1. update,要保证数据update之后能被视图查询出来,也就是要符合where的条件 2. insert,保证insert的数据能被视图查询出来 3. delete,有无 with check option都一样 4. 对于没有where字句的视图,使用with check option是多余的

整数数据类型mediumint

文章目录 1.1 mediumint说明1.2 测试环境说明1.3 加unsigned属性1.3.1 SQL模式开启严格模式1.3.2 SQL模式未开启严格模式 1.4 加zerofill属性1.4.1 SQL模式开启严格模式1.4.2 SQL模式未开启严格模式 1.5 不加unsigned和zerofill属性1.5.1 SQL模式开启严格模式1.5.2 SQL模式未开启严格模式 1.1 mediumint说明 数据类型显示长度占用字节有符号无符号mediumint加上unsigned/zerofill:8 不加unsigned/zerofill:93(24bit)-8388608至83886070至16777215 ## 格式 id mediumint(M) [unsigned] [zerofill] 字段名 数据类型(显示长度,建表时不指定) 无符号 无符号且前导零填充 ## 关于mediumint最大数值是怎样得来的 mediumint占用3字节,3字节占用24位,经过换算(2的24次方减1)就是16777215 ## 关于加上unsigned后的说明 加上unsigned后就是无符号(范围是0~16777215的整数,因为是整数,不会有符号"-",就是无符号) ## 关于加上zerofill后的说明 zerofill会把unsigned属性也给带上,这样就是无符号(范围是0~16777215,显示长度就是8),同时还会 进行前导零填充(没有达到显示长度的数值,例如:你插入1,显示的是00000001)。 ## 不加unsigned和zerofill的说明 字段后面不加上这两个属性中的任何一个,就表示是有符号(范围是-8388608~8388607,因为有符号"-",所有是有符号)。 1.2 测试环境说明 ## 数据库版本和默认的存储引擎 mysql> select @@version,@@default_storage_engine; +------------+--------------------------+ | @@version | @@default_storage_engine | +------------+--------------------------+ | 5.7.28-log | InnoDB | +------------+--------------------------+ 1 row in set (0.00 sec) ## 创建chenliang库 mysql> create database if not exists chenliang; Query OK, 1 row affected (0.

UNICODE和UTF-8的相互转换(C++)

最近工作需要在xml node的节点中加入一些Unicode编码的某些国家的字符,比如“Alte Poststraße”,最后把xml node变成字符串传送给HMI。 为了图方便(想象中的方便),心想这样一个字符串用项目中所用的TinyXML生成node然后转为string的方案较为合理。然检查TinyXML的API发现,构造函数如TiXmlText的参数是char*,所以不能将Unicode格式的字符串传给它,需要先将宽字符转成多字节后传递。 上述的“Alte Poststraße”有个“ß”无法用ascii表示,只能用Unicode或UTF-8。看看调用项目内Unicode转UTF-8函数是怎么个情形: static int UnicodeToUtf8(wchar_t wchar, char utf8[], const int nLen) { ... if (wchar < 0x80)//128,和ascii相同,1byte unicode,1byte utf8 { // //length = 1; utf8[len++] = (char)wchar;//直接赋值 } else if(wchar < 0x800)//小于12位,1000 0000 0000,2byte unicode,2byte utf8 { //length = 2; if (len + 1 >= nLen) return -1; utf8[len++] = 0xc0 | ( wchar >> 6 );//7~11位 | 110xxxxx utf8[len++] = 0x80 | ( wchar & 0x3f );//1~6位 | 10xxxxxx } else if(wchar < 0x10000 )//小于17位,1 0000 0000 0000 0000,2byte unicode,3byte utf8 { //length = 3; if (len + 2 >= nLen) return -1; utf8[len++] = 0xe0 | ( wchar >> 12 );//13~16位 | 1110xxxx utf8[len++] = 0x80 | ( (wchar >> 6) & 0x3f );//7~11位 | 10xxxxxx utf8[len++] = 0x80 | ( wchar & 0x3f );//1~6位 | 10xxxxxx } else if( wchar < 0x200000 )//小于22位,10 0000 0000 0000 0000 0000‬,3byte unicode,4byte utf8 { //length = 4; if (len + 3 >= nLen) return -1; utf8[len++] = 0xf0 | ( (int)wchar >> 18 );//17~21位 | 11110xxx utf8[len++] = 0x80 | ( (wchar >> 12) & 0x3f );//13~16位 | 1110xxxx utf8[len++] = 0x80 | ( (wchar >> 6) & 0x3f );//1~6位 | 10xxxxxx utf8[len++] = 0x80 | ( wchar & 0x3f );//1~6位 | 10xxxxxx } return len; } 首先要了解下Unicode和UTF-8关系:

高并发下防止库存超卖的解决方案

最近在看秒杀相关的项目,针对防止库存超卖的问题,查阅了很多资料,其解决方案可以分为悲观锁、乐观锁、分布式锁、Redis原子操作、队列串行化等等,这里进行浅显的记录总结。 首先我们来看下库存超卖问题是怎样产生的: 1 2 3 4 5 6 //1.查询出商品库存信息 select stock from t_goods where id=1; //2.根据商品信息生成订单 insert into t_orders (id,goods_id) values (null,1); //3.修改商品库存 update t_goods set stock=stock-1 where id=1; 在高并发场景下,如果同时有两个线程a和b,同时查询到商品库存为1,他们都认为存库充足,于是开始下单减库存。如果线程a先完成减库存操作,库存为0,接着线程b也是减库存,于是库存就变成了-1,商品被超卖了。 下面让我们来看看针对库存超卖问题的解决方案; 解决方案一:悲观锁 所谓悲观锁,即悲观的认为自己在操作数据库时,会大几率出现并发,于是在操作前会先进行加锁,操作完成后再释放锁。如果加锁失败说明该记录正在被修改,那么当前操作可以等待后尝试。 以我们常用的MySQL为例,行锁、表锁、排他锁等都是悲观锁,为避免冲突,会在操作时先加锁,其他线程必须等待它的完成。 这里我们通过使用select...for update语句,在查询商品表库存时将该条记录加锁,待下单减库存完成后,再释放锁。 1 2 3 4 5 6 7 8 9 10 //0.开始事务 begin;/begin work;/start transaction; (三者选一就可以) //1.查询出商品信息 select stock from t_goods where id=1 for update; //2.根据商品信息生成订单 insert into t_orders (id,goods_id) values (null,1); //3.修改商品stock减一 update t_goods set stock=stock-1 where id=1;

Kubernetes:3步排查K8S Deployment故障

目录 Kubernetes中部署一个应用程序 3步排查K8S Deployment故障 1、 故障排查Pod 常见的Pod错误 启动错误包括: 运行时错误包括: ImagePullBackOff CrashLoopBackOff RunContainerError Pod处于Pending状态 Pod不处于Ready状态 2、 排查Service故障 3、 排查Ingress故障 调试Ingress Nginx 总 结 Kubernetes中部署一个应用程序 Deployment故障排查思路 Deployment故障排查思路 1. pod是pending状态 cluster full ? ResourceQuota? PVC pending? pod 是否调度到Node?Scheduler? Kubelet? 2. pod不是running状态 kubectl logs 分析?还可以判断是否container quickly died?ImagePullBackOff? - image name\tag\registry是否正确?CrashLoopBackOff?-crashing app? Dockerfile-CMD?liveness prode? 3. pod不是ready状态 Readiness probe? 4. 不能访问app 端口?endpoints? Service targetPort 是否可以和 containerPort匹配?Igress-serviceName和servicePort是否和Service匹配? 在Kubernetes中部署一个应用程序,你通常需要定义三个组件: Deployment——这是创建名为Pods的应用程序副本的方法Serivce——内部负载均衡器,将流量路由到PodsIngress——可以描述流量如何从集群外部流向Service 现在,我们来快速回顾一下什么端口和标签需要匹配: Service selector应该匹配Pod的标签ServicetargerPort应该匹配在Pod内容器的containerPortService 端口可以是任意数字。多个Service可以使用同个端口,因为它们已经分配了不同的IP地址Ingress的servicePort应该匹配在Service中的portService的名称应该匹配在Ingress中的serviceName的字段 了解如何构造YAML只是开始。那么,出了问题时会有什么表现?Pod可能无法启动,或者直接崩溃。 3步排查K8S Deployment故障 在我们深入研究有故障的deployment之前,必须有一个明确定义的模型,以了解Kubernetes的工作方式。

你还在纠结cookies和session的区别嘛?

1、数据存放位置不同: cookie数据存放在客户的浏览器上,session数据放在服务器上。 2、安全程度不同: cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。 3、性能使用程度不同: session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。 4、数据存储大小不同: 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session则存储与服务端,浏览器对其没有限制。 5、会话机制不同 session会话机制:session会话机制是一种服务器端机制,它使用类似于哈希表(可能还有哈希表)的结构来保存信息。 cookies会话机制:cookie是服务器存储在本地计算机上的小块文本,并随每个请求发送到同一服务器。 Web服务器使用HTTP标头将cookie发送到客户端。在客户端终端,浏览器解析cookie并将其保存为本地文件,该文件自动将来自同一服务器的任何请求绑定到这些cookie。

IDEA 导入模块

目录 1. 导入 IDEA 模块2. 导入 Eclipse 模块 1. 导入 IDEA 模块 File > New > Module from Existing Sources… 选择 .iml 导入(这是最稳定的导入方法); 2. 导入 Eclipse 模块 详细:IDEA 与 Eclipse;

python数据分析之清洗数据:缺失值处理

在使用python进行数据分析时,如果数据集中出现缺失值、空值、异常值,那么数据清洗就是尤为重要的一步,本文将重点讲解如何利用python处理缺失值 创建数据 为了方便理解,我们先创建一组带有缺失值的简单数据用于讲解 检查缺失值 对于现在的数据量,我们完全可以直接查看整个数据来检查是否存在缺失值看到有两列含有缺失值。当然如果数据集比较大的话,就需要使用data.isnull().sum()来检查缺失值 或者使用data.info()来检查所有数据 可以看到一共有7行,但是有两列的非空值都不到7行 缺失值处理 一种常见的办法是用单词或符号填充缺少的值。例如,将丢失的数据替换为'*'。我们可以使用.fillna('*') 将所有缺失值替换为* 当然也可以针对某一列的缺失值进行填充,比如选择score列进行填充 还有一种办法是将其替换为平均值。如果是数字,则可以包括均值;如果是字符串,则可以选择众数。比如可以将score列的缺失值填充为该列的均值 当然也可以使用插值函数来填写数字的缺失值。比如取数据框中缺失值上下的数字平均值。 或者data.fillna(axis=1,method='ffill')来横向/纵向用缺失值前面的值替换缺失值 除了对缺失值进行填充,另一种更省事的办法是直接删除缺失值所在行 上面是删除所有缺失值所在行,当然也可以指定删除某列的缺失值比如将score列的缺失值所在行删除 处理非标准缺失值 有时候缺失值会以其他形式出现,比如在录入数据的时候由于失误将数据输错等,那么这种类型的数据也可以作为缺失值去处理。我们来看看 可以看到,score列本应该是数字,但是却出现两个并不是数字也不是nan的异常值,当我们使用data.isnull()函数时,可以看到只有一个空值。 所以我们可以通过使用replace函数先将其转换为NaN来处理此问题,然后根据需要,使用上面的方法处理缺失值。 真实数据实战 上面我们用自己创建的数据进行示例,那么在这一节我们看在真实的数据分析案例数据来进行缺失值处理。使用的数据为之前文章使用过的NBA数据(可以查看早起python历史文章获取数据与更多分析),我们先导入数据并检查缺失值 可以看到其他列的数据都很完美,只有notes列仅有5424行非空,意味着我们的数据集中超过120,000行在此列中具有空值。我们先考虑删除缺失值。 可以看到只剩下5424条数据,但是这种形式的数据清洗对数据集没有意义的,因为notes只是记录了一些比赛的说明,缺少注释对分析NBA来说不会有太大影响。并且如果我们的数据集包含一百万条有效记录,而一百条缺少相关数据,那么删除不完整的记录可能是一个合理的解决方案。 这样,生成的DataFrame包含所有126,314场比赛记录,但不包括有缺失值的notes列。

vue 自定义事件传参

先来简单看个例子: TodoList.vue : <template> <ul> <li> <todo-item v-for="item in list" :key="item.id" :status="doneList.includes(item.id)" :info="item" @click="changeStatus0" ></todo-item> </li> <li> <todo-item v-for="item in list" :key="item.id" :status="doneList.includes(item.id)" :info="item" @click="changeStatus1()" ></todo-item> </li> <li> <todo-item v-for="item in list" :key="item.id" :status="doneList.includes(item.id)" :info="item" @click="changeStatus2(item)" ></todo-item> </li> <li> <todo-item v-for="item in list" :key="item.id" :status="doneList.includes(item.id)" :info="item" @click="changeStatus3(arguments, item)" ></todo-item> </li> </ul> </template> <script> import TodoItem from './TodoItem' export default { name: 'TodoList', components: { TodoItem }, data () { return { list: [ { id: 0, name: 'zero', desc: 'zerozerozero' }, { id: 1, name: 'one', desc: 'oneoneone' }, { id: 2, name: 'two', desc: 'twotwotwo' } ], doneList: [1] } }, methods: { changeStatus0 (val, obj) { console.

BootStrap table的各种样式效果

Bootstrap 表格类样式 ☑ .table:基础表格,为任意 <table> 添加基本样式 (只有横向分隔线) ☑ .table-striped:斑马线表格 ☑ .table-bordered:带边框的表格 ☑ .table-hover:鼠标悬停高亮的表格 ☑ .table-condensed:紧凑型表格 ☑ .table-responsive:响应式表格 1、“.table”主要有三个作用: ☑ 给表格设置了单元内距及底部边距margin-bottom:20px ☑ 在thead底部设置了一个2px的浅灰实线 ☑ 每个单元格顶部设置了一个1px的浅灰实线 下面就以上表格类样式,作简要介绍: 一、基础表格 实现代码: <table class="table"> <caption>基础表格</caption> <thead> <tr> <th>省份</th> <th>城市</th> </tr> </thead> <tbody> <tr> <td>广东</td> <td>深圳</td> </tr> <tr> <td>广西</td> <td>桂林</td> </tr> <tr> <td>海南</td> <td>三亚</td> </tr> </tbody> </table> 效果图如下: 二、条纹表格 关键代码: <table class="table table-striped"> 效果图: 三、边框表格 关键代码: <table class="table table-bordered"> 效果图: 四、悬停表格 通过给表格class添加 .table-hover样式,当指针悬停在行上时会出现浅灰色背景 实现代码: <table class="

idea中导入maven项目并运行

1、第一步:导入maven项目 (1)选中File-New-Project From Existing Sources (2)找到项目所在位置,并选中pom.xml文件,点击“ok” (3)勾选下图标红部分,点击“next” (4)select profiles,一般默认初始化勾选,选择开发环境配置,点击“next” 一般我们在做一个正式的项目的时候会分为开发、测试和生产三种环境,在不同环境中项目相关的技术参数和访问地址等等都是不同的,就需要在开发过程中根据不同的环境来配置不同的业务参数。 在maven项目中,profile是根据不同的构件环境,对构建(build)过程进行动态配置的手段 (5)select maven projects to import (6)项目名称,finish 2、第二步:下载maven依赖,点击“downloads sources and doucmentation” 3、第三步:配置tomcat (1)点击右上角的“Add Configurafion” (2)Tomcat Server---Local (3)配置“deployment” 点击右上角的“+”号,选中artifacts 选中第二个exploded (4)配置“server” (5)点击左上角的“+”号,将刚才配置的tomcat添加到项目

gitlabCI持续集成的总结(gitlab+gitlabCI)

**重点提醒:踩了太多的坑,建议直接在centOS7.x版本上安装运行 1.首先安装一下gitlab,有详细亲测有效的教程:https://www.cnblogs.com/zhangycun/p/10963094.html 2.安装gitlab Runner,有详细亲测有效的教程:https://blog.csdn.net/qq_27520051/article/details/80552220 3.个人总结: 1.持续集成相关概念 1.1 什么是持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。 自动化的构建、测试和部署流程可以解决软件开发项目中的许多麻烦和问题。通过可靠的方法频繁整合代码更改,可以尽早发现错误。毕竟没有人希望在demo day出现由于几个月前编写一直没有适当的机会进行合理测试而出现的任何差池。 1.2 持续集成的流程 持续集成的流程根据持续集成的设计,代码从提交到生产,整个过程如下:  开发者向仓库提交代码  检测到代码提交后,进行构建(build)。构建的目的是将源码转换为可以运行的实际代码,比如安装依赖,配置各种资源(样式表、JS脚本、图片)等等。  只要检测到有提交代码或者合并,自动跑模块单元测试。  构建完成,就要进行第二轮测试。第二轮是全面测试,单元测试和集成测试都会跑,所有测试以自动化为主,少数无法自动化的测试用例,就要人工跑。  通过了第二轮测试,形成测试通过的版本,部署到生产服务器 1.3 持续集成的好处 首先,降低集成风险。多数情况下,一个项目会有多个人单独处理任务或者一部分代码,人员越多,整合的风险越大,而调试、解决问题本身会是非常痛苦的,我们很可能需要大量修 改代码。频繁的集成将极大减少此类问题。 第二,保障代码质量。我们可以把精力放在业务代码和功能上,从而获得更高质量的软件。 第三,有效的版本控制。如果有人提交的代码有问题,团队会即时收到通知,在有任何人拉取之前解决问题。 第四,减少团队间摩擦。明确而公正的制度流程可以减少团队之间的争吵。 第五,改善测试团队生活质量通过不同版本和构建隔离并追踪错误可以有效减轻测试团队负担。 第六,部署更快。自动化可以让原本繁琐耗时的部署工作变得轻松高效。 第七,增强团队信心和士气。团队成员不必再为潜在错误可能会造成的不良后果而忧心忡忡,可以轻装上阵去创造更好的软件。 1.4 持续集成的要求 全面的自动化测试。这是实践持续集成&持续部署的基础,同时,选择合适的自动化测试工具也极其重要; 灵活的基础设施。容器,虚拟机的存在让开发人员和 QA 人员不必再大费周折; 版本控制工具。如 Git,CVS,SVN 等; 自动化的构建和软件发布流程的工具,如 Jenkins,gitLab.ci; 反馈机制。如构建/测试的失败,可以快速地反馈到相关负责人 1.5 持续集成服务器 持续集成服务器(也称为构建服务器,又称CI服务器)是一种软件工具,它包含所有持续集成操作,并为我们构建项目提供可靠和稳定的环境。一般持续集成服务器具备高度可配置性和可调整性,能够为不同平台构建各种项目。 使用持续集成服务器最好能够安装在干净的机器上,保证其在中立的环境中不受不必要的工具、环境变量和其他配置影响。如果实在没有物理机,可以考虑构建一个虚拟环境。 持续集成服务器通常使用版本控制系统(如Subversion或Git或任何其他版本)来提取项目文件。该系统监控项目仓库,在代码成功提交时,会拉去更改并按照我们的定义来执行。完成任务后,持续集成服务器会向相关成员发送构建细节信息。检查项目的最新版本、运行构建脚本、运行测试以及发送通知是持续集成服务器的最基本功能。 除此之外,代码分析、代码覆盖率、代码质量报告、agent pooling、pipeline、构建比较、IDE集成、第三方工具支持等功能,会让持续集成服务器更加灵活好用。 1.6 对于团队的要求 相比硬件、软件或者工具,人的因素对于持续集成成功与否更为关键,这要求团队里的每个成员都能养成良好的“持续集成”习惯,例如频繁提交代码、立即修复失败构建、编写单元测试等等。 2.持续集成,该从何入手 2.1持续集成系统的选择 最重要的一环是选择合适的持续集成系统。是搭建私有部署还是选择托管型持续集成系统,关键在于团队运行的基础设施,团队对持续集成系统的资源投入力度。另外,在选择合适的持续集成服务时,还需要考量系统的灵活度以适应公司不同阶段的开发测试需求。 通过持续集成,及时发现和解决代码故障,提高代码质量,减少故障处理成本等等。当下持续集成工具不胜枚举,开源的或商业的,可本地安装的或Sass的,如: 当前最最流行的,一骑绝尘的Jenkins 1.与Github紧密集成的Travis CI 2.有着持续集成DNA的ThoughtWorks GO 3.Atlassian工具链之一的Bamboo 4.与Gitlab紧密集成的Gitlab CI 2.2Jenkins和Gitlab CI的相比较

参数估计:点估计和区间估计

参数估计就是根据样本统计量的数值对总体参数进行估计的过程。根据参数估计的性质不同,可以分成两种类型:点估计和区间估计。 点估计 点估计就是用样本统计量的某一具体数值直接推断未知的总体参数。例如,在进行有关小学生身高的研究中,随机抽取1000名小学生并计算出他们的平均身高为1.46米。如果直接用这个1.46米代表所有小学生的平均身高,那么这种估计方法就是点估计。 对总体参数进行点估计常用的方法有两种:矩估计与最大似然估计,其中最大似然估计就是我们实际中使用非常广泛的一种方法。 按这两种方法对总体参数进行点估计,能够得到相对准确的结果。如用样本均值X估计总体均值,或者用样本标准差S估计总体标准差σ。 点估计有一个不足之处,即这种估计方法不能提供估计参数的估计误差大小。对于一个总体来说,它的总体参数是一个常数值,而它的样本统计量却是随机变量。当用随机变量去估计常数值时,误差是不可避免的,只用一个样本数值去估计总体参数是要冒很大风险的。因为这种误差风险的存在,并且风险的大小还未知,所以,点估计主要为许多定性研究提供一定的参考数据,或在对总体参数要求不精确时使用,而在需要用精确总体参数的数据进行决策时则很少使用。 区间估计 区间估计就是在推断总体参数时,还要根据统计量的抽样分布特征,估计出总体参数的一个区间,而不是一个数值,并同时给出总体参数落在这一区间的可能性大小,概率的保证。还是举小学生身高的例子,如果用区间估计的方法推断小学生身高,则会给出以下的表达:根据样本数据,估计小学生的平均身高在1.4~1.5米之间,置信程度为95%,这种估计就属于区间估计。

方法的参数和返回值都是引用数据类型

1,类名作为形参和返回值 方法要什么,我们就得给什么。 方法返回什么,我们就得拿什么去接收。 总结: 当方法的形参是一个类名时。 可以传递这个类的对象 还可以传递这个类所有的子类对象。 当方法的返回值是一个类时。 咱们就必须使用这个类的类型变量去接收。 案例: public static void main(String[] args) { Ye y = new Ye(); //0x0011 Fu f = new Fu(); //0x0022 Zi z = new Zi(); //0x0033 method(f);//要什么类型就给什么类型。 //相当于是把f记录的地址值0x0022作为实际参数给方法传递 //实际参数传递给方法的时候,就被形参给接收了。 //相当于:Fu fu = 0x0022 //而0x0022又是Fu的对象 //代码相当于 Fu fu = new Fu(); method(z);// //相当于把z记录的地址值作为实际参数给方法传递 //实际参数传递给方法的时候,就被形参给接收了。 //相当于 Fu fu = 0x0033 //代码相当于: Fu fu = new Zi(); //多态 method(y); //相当于把y记录的地址值作为实际参数给方法传递 //实际参数传递给方法的时候,就被形参给接收了。 //相当于 Fu fu = 0x0011

第六章第十一题(金融应用:计算酬金)(Financial application: compute commissions)

6.11(金融应用:计算酬金)编写一个方法,利用编程练习题5.39中的方案计算酬金。方法头如下所示: public static double computeCommission(double salesAmount) 编写一个测试程序,显示下面表格: 销售总额 酬金 ---------------------------------------- 10000 900.0 15000 1500.0 ...... 95000 11100.0 100000 11700.0 6.11(Financial application: compute commissions)Write a method that computes the commission, using the scheme in Programming Exercise 5.39. The header of the method is as follows: public static double computeCommission(double salesAmount) Write a test program that displays the following table: Sales Amount Commission ---------------------------------------- 10000 900.0 15000 1500.0 ...... 95000 11100.0 100000 11700.

第六章第八题(摄氏度和华氏度之间的转换)(Conversions between celsius and fahrenheit)

6.8(摄氏度和华氏度之间的转换)编写一个类,包含下面两个方法: public static double celsiusToFahrenheit(double celsius) public static double fahrenheitToCelsius(double fahrenheit) 转换公式如下: 华氏度 = (9.0 / 5)* 摄氏度 + 32 摄氏度 = (5.0 / 9)* (华氏度 - 32) 编写一个测试程序,调用这个两个方法来显示如下表格: 摄氏度 华氏度 华氏度 摄氏度 ----------------------------------------------------------------------- 40.0 104.0 120.0 48.89 39.0 102.2 110.0 43.33 ...... 32.0 89.6 40.0 4.44 31.0 87.8 30.0 -1.11 6.8(Conversions between celsius and fahrenheit)Write a class that contains the following two methods: public static double celsiusToFahrenheit(double celsius) public static double fahrenheitToCelsius(double fahrenheit) The formula for the conversion is: fahrenheit = (9.

笔试 - 组队竞赛

组队竞赛 牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。 例如: 一个队伍三个队员的水平值分别是3,3,3.那么队伍的水平值是3 一个队伍三个队员的水平值分别是3,2,3.那么队伍的水平值是3 一个队伍三个队员的水平值分别是1,5,2.那么队伍的水平值是2 为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。 如样例所示: 如果牛牛把6个队员划分到两个队伍 如果方案为: team1:{1,2,5}, team2:{5,5,8}, 这时候水平值总和为7. 而如果方案为: team1:{2,5,8}, team2:{1,5,5}, 这时候水平值总和为10. 没有比总和为10更大的方案,所以输出10. 输入描述: 输入的第一行为一个正整数n(1 ≤ n ≤ 10^5) 第二行包括3*n个整数a_i(1 ≤ a_i ≤ 10^9),表示每个参赛选手的水平值. 输出描述: 输出一个整数表示所有队伍的水平值总和最大值. 输入: 2 5 2 8 5 1 5 输出: 10 思路:先排序,假设三组为 1 2 3 4 5 6 7 8 9则 1 8 9 2 6 7 3 4 5 队伍的水平值等于该队伍队员中第二高水平值 10^5 * 10^9 用int 溢出,long ans = 0;

STM32 外部中断详解(原理+配置代码)

本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断 文章目录 1 前言2 STM32的外部中断3 中断服务函数的映射关系4 外部中断的配置5 寄存器的操作5.1 硬件中断选择5.2 硬件事件选择5.3 软件中断/事件的选择 6 总结 1 前言 打算写一下中断,又忍不住想说一下中断的概念,去书上翻一翻,或者自己在搜索引擎上搜一下,都可以找到一大堆,包括本文写的这个外部中断也不例外。如果要写光是中断就可以单独写一篇了,所以本文直入主题,对于STM32的外部中断进行详细的剖析。 2 STM32的外部中断 下图来自《STM32参考手册》,从整个架构图可以知道,外部中断的功能可以配置六个寄存器; 中断屏蔽寄存器(EXTI_IMR)事件屏蔽寄存器(EXTI_EMR)上升沿触发选择寄存器(EXTI_RTSR)下降沿触发选择寄存器(EXTI_FTSR)软件中断事件寄存器(EXTI_SWIER)挂起寄存器(EXTI_PR) EXTI支持配置20个中断和事件屏蔽位;GPIO端口以下图的方式连接到16个外部中断/事件线上;EXTI_Line0 — EXTI_Line15;EXTI_Line16 连接到PVD输出 ;EXTI_Line17连接到RTC闹钟事件;EXTI_Line18连接到USB唤醒事件;EXTI_Line19连接到以太网唤醒事件(只适用于互联型产品); GPIO的映射关系图如下所示; 3 中断服务函数的映射关系 GPIOIRQnIRQHandlerGPIO_Pin0EXTI0_IRQnEXTI0_IRQHandlerGPIO_Pin1EXTI1_IRQnEXTI1_IRQHandlerGPIO_Pin2EXTI2_IRQnEXTI2_IRQHandlerGPIO_Pin3EXTI3_IRQnEXTI3_IRQHandlerGPIO_Pin4EXTI4_IRQnEXTI4_IRQHandlerGPIO_Pin5 — GPIO_Pin9EXTI9_5_IRQnEXTI9_5_IRQHandlerGPIO_Pin10 — GPIO_Pin15EXTI15_10_IRQnEXTI15_10_IRQHandler 4 外部中断的配置 宏定义,抽象一下接口,方便后面修改; #define Z_GPIO_PIN GPIO_Pin_5 #define Z_GPIO_PORT GPIOE #define Z_PortSource GPIO_PortSourceGPIOE #define Z_PinSource GPIO_PinSource5 #define Z_Line EXTI_Line5 #define Z_IRQ EXTI9_5_IRQn GPIO的配置;这里GPIO的输入模式可以配置为浮空输入(GPIO_Mode_IN_FLOATING),上拉输入(GPIO_Mode_IPU)或者下拉输入(GPIO_Mode_IPD),具体如下图所示; GPIO的配置代码如下; GPIO_InitTypeDef GPIO_InitStructure; GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = Z_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(Z_GPIO_PORT, &GPIO_InitStructure); 不要忘记外设总线时钟的配置;

【算法】【题解】- POJ - 1321 棋盘问题(DFS入门例题)

DFS入门例题 棋盘问题 问题描述: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。 Input: 输入含有多组测试数据。 每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n 当为-1 -1时表示输入结束。 随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。 Output: 对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。 Sample Input: 2 1 # . . # 4 4 . . . # . . # . . # . . # . . . -1 -1 Sample Output: 2 1 思路 典型的DFS入门例题,类似于八皇后问题,递归的时候不同的层可以代表不同的行,题目中要求不同行不同列,所以每放一个棋子,就记录这个棋子的这一列已经放上棋子了,因为递归时已经是不用行了,所以不用记录行的情况,一定是不同行。 AC代码 #include <iostream> #include <cstring> #include <cstdio> using namespace std; int n, k;//n是要输入一个n*n规格的棋盘 char arr[10][10];//存储这个棋盘 bool book[10];//记录不同列的棋子 int sum, num;//sum是方案的个数,num是放的棋子数 void dfs(int r) { if(num == k){//此时有一个方案符合情况,已经放完了所有的棋子 sum ++;//方案数+1 return;//结束这一层的递归 } if(r >= n) return; //如果在r这一行中有位置可以放棋子则符合判断条件进入for循环 for(int i = 0; i < n; i ++){ if(book[i] == 0 && arr[r][i] == '#'){ book[i] = 1; num ++; dfs(r + 1); book[i] = 0;//回溯的时候再将之前标记过的book数组重新标记为0,为了在下一次寻找放棋子的方案时,考虑到所有的情况,防止因为标记为0,跳过了这一个符合条件的放棋子的位置 num --;//回溯时放的棋子数也随之减少 } } //如果在r这一行中没有可以放棋子的地方,则进入下一行 dfs(r + 1); } int main(void) { while(~scanf("

IDEA 快速生成 get/set 方法体

目录 IDEA 快速生成 get/set 方法体方法1. alt + enter方法2. 右键 Generate / alt + insert IDEA 快速生成 get/set 方法体 方法1. alt + enter 自动在下方创建,更方便快捷,但是需要先移动光标到指定变量;方法2. 右键 Generate / alt + insert 不用先指定变量,但是需要确认输出变量且输出方法体在声明变量的上方; 方法1. alt + enter 光标移动到指定变量名称上,按 alt + enter; 2. 选择要输出的方法体,这里选择了 Create getter and setter for ‘name’,生成对应的 set/get 方法体在变量声明的下方; 方法2. 右键 Generate / alt + insert 右键选择 Generate,或按 alt + insert; 2. 选择要输出的方法体,这里选了 Getter and Setter; 3. 选择要输出的变量; 4. 生成的方法体在声明变量的上方;

Django 使用login函数登陆和注销

一、登陆 1、写一个简单的登陆页面,如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录</title> </head> <body> <form action="" method="POST"> <input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}"> <table> <tbody> <tr> <td>用户名:</td> <td><input type="text" name="username"></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="password"></td> </tr> <tr> <td> <label for=""> <input type="checkbox" name="remember" value="1">记住我 </label> </td> <td></td> </tr> <tr> <td></td> <td><input type="submit" value="登录"></td> </tr> </tbody> </table> </form> </body> </html> 2、定义一个登陆的视图函数 from django.contrib.auth import login,logout from django.contrib.auth.decorators import login_required,permission_required # 切记:这里一定不要定义login视图函数,可以其他的名字 def my_login(request): #如果是GET请求则直接返回页面 if request.

quartz使用(二)任务的删除,停止,暂停,启动

在上一篇文章中,介绍了quartz简单的使用方法,没有看过的可以查看https://editor.csdn.net/md/?articleId=102677404 这一篇介绍关于任务的启动停止这些操作,废话不多说。 任务启动停止 启动任务 void start() throws SchedulerException; // 启动任务 停止任务 void shutdown() throws SchedulerException; //直接关闭Scheduler void shutdown(boolean waitForJobsToComplete)throws SchedulerException; //shutdown(true)表示等待所有正在执行的任务执行完毕后关闭Scheduler //shutdown(false),即shutdown()表示直接关闭Scheduler 任务的启动这里就不再测试了,参照上一篇的文章写即可 先写一个实现类 public class QuartzJob1 implements Job { public static int times = 0; @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("QuartzJob1--" + new Date() + "---实现业务逻辑----" + times++ + "------"); } } 以下是测试停止的方法: public class QuartzJobUtil { //使用默认的配置 private static SchedulerFactory schedulerFactory = new StdSchedulerFactory(); public static void addJob(String jobName, String jobGroupName, int time, Class <?

数据脱敏小探——不错的脱敏工具Apache ShardingSphere

转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/81032427 本文出自【我是干勾鱼的博客】 Apache ShardingSphere官网是这样介绍Apache ShardingSphere: Apache ShardingSphere(Incubator) 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(规划中)这3款相互独立,却又能够混合部署配合使用的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、云原生等各种多样化的应用场景。 Sharding-JDBC Sharding-Proxy Sharding-Sidecar 这3部分各自可以成独立的体系,而数据脱敏的功能是在Sharding-JDBC中体现出来的。 参考 Apache ShardingSphere Apache ShardingSphere数据脱敏全解决方案详解

Allegro 16.6 画pcb的时候最后一个未连接的网络找不到怎么办.

找最后一个未连接的网络找了半天,没找到,各种蛋疼。 看着板子死活找不出来没连的地方。 鬼看得出啊!👇 解决办法👇 closest endpoint是从走线的端点开始显示, pin to pin 是按没连接的两个引脚显示,可以很清楚地看到每一根没连接的线,而closest endpoint的话没连接的地方距离很近,而且走在底层的话根本找不出来。 然后选了pin to pin之后👇 可以很清楚地看到没连的网络。

【Gephi】初学者教程(一)「一步一步教你怎么画图」「值得放进收藏夹吃灰系列」

前言 由于最近博主日常接任务帮人画图,而最近的状况大家也知道…远程画着画着觉得双方在图的结构、调色等等诸多方面会有很多歧义,博主理解的往往与客户所言有些许偏差…当然这其中也是包括有客户并未接触过gephi而导致的一些原因吧emmmm 总而言之,今天突发奇想在这个时候出教程就是为了让大噶少走点弯路(虽然博主才是真的菜) 然后呢,想说的比较多,所以就多拆了几个章节咳咳… 朋友们如果急切需要什么的可以直接评论联系博主催一下更什么的…(毕竟我是个缘更博主) 数据集准备 关于这一方面的话,相信看我之前那篇简要说明的博文的朋友们应该已经知道了。 gephi需要两个文件,一个边集一个点集,点集一般是两个标签列,id和Label,顾名思义就是序号和标签。当然多加标签列也不妨事,比如你多加个Modularity Class就相当于出图的时候多了个社团(其实就是方便调色而已,当然也不排除有外需) 然后边集的话也很好理解,Source、Target、Weight、Type分别代表着源节点、目标节点、权重以及是否有向。 导入数据集 open你的gephi,新建工作区(一般初始就会有新建好了的工作区,不过最好留个备份啥的) 选择数据资料,输入电子表格,然后分别选择点集和边集输入 记得一定要在⬆️选好边or点表格!! 然后就成了⬇️这个样子(因为是客户的数据资料,所以糊掉了,下回我自己整理数据集再po) 到这里为止就导入完毕了! 初步美化 然后点击你的概览,就可以看见雏形了(很丑很丑) 再之后,方别按照左上角👇 这里的要求一点点调动 从左到右分别是颜色、大小、字色、字号(不过字色字号我一般都是直接在预览里头调) 这些…懒得讲了,摸索一下就应该会了(摊手) 时间不早了,今天就到这里吧emmmmm下回再细讲初调,然后再顺带便聊聊布局(如果我废话篇幅不长的话,咳咳)

人生第一篇CSDN文章

人生的第一篇CSDN文章(第一个C程序) 作为程序员人生写的第一个C程序: #include<stdio.h> //编译预处理命令 int main() //定义函数的类型:整型(int) { //函数开始的标志 printf("Hello world!\n"); //输出内容 ,'\n'换行符 } //函数结束的标志 执行结果 1这是我在CSDN上写的第一篇文章,心里别提有多高兴了!!! 2因为,从2019年12月23日第一次接触CSDN到今天,在CSDN中读了关于许多优秀程序员学习的心得和经验,还有一些和我一样初入程序员行列的小白。在他们的心中一直都拥有对梦想和目标的向往,他们在不断地去学习新知识、去改正旧错误、巩固旧知识和总结新经验…… 3非常感谢CSDN这个平台和共同学习和分享的程序员…… 4最后,我会在以后的日子里努力学习C语言,并把我学到的知识好好总结下来,和大家一起学习和交流,共同进步。💪🐵🐒🧐

前端开发,ul中的li元素之间有的间距(间隔)如何消除?

在开发过程中ul和li元素是经常使用的元素,但是有个问题随之而来,当所有li元素都横向排列时,li元素左右两边默认有间距,这种间距不是margin,也不是padding造成,而是在编译器编写代码时,习惯性的会将li元素每个写一行,但是换行的同时,浏览器会将空格渲染成间距。 解决办法: 看自己是不是用的display: inline-block;进行横向排列,如果是更换成float:left;即可以消除间距; 可以将li的父元素ul设置一个font-size:0; 备注:设置后请注意设置li元素中的文字大小(font-size); 可以将编辑器中的li放在一行编写,不要跨行;

NPM关于dependencies 和 devDependencies配置详解,弄懂npm -S与-D的区别

使用任何框架之前,都要经历环境搭建的过程,而在前端框架的环境搭建中(比如React、Vue等),NPM是必不可少的依赖包管理工具。我们在使用NPM命令安装依赖包时,经常会用到 -S 或者是 -D 这些指令,例如,我们安装webpack时会执行以下命令: npm install -D webpack 对于前端初学者来说,可能还不太理解什么时候使用 -D ,什么时候使用 -S ,以及二者之间的区别。这就和我们这篇文章要讲的主题有关系了,NPM中的 dependencies 和 devDependencies 配置。 1. 什么是NPM 简单来说,NPM(Node Package Manager)是包含在Node.js里面的一个包管理工具,NPM会随着Node.js一起安装。NPM为开发者提供了一个代码模块共享的大平台,当我们项目中需要使用某个模块(JavaScript包)时,可以直接使用NPM包管理工具来下载对应的包并安装,我们也可以把自己用Node.js写的代码发布到平台上供他人使用。 2. package.json文件 搭建一个前端项目之前,通常会在项目的根目录下生成一个名为package.json的文件作为NPM包的描述文件,使用该文件来定义项目信息、配置包依赖关系。package.json文件可以自己手动创建,也可以使用命令来创建: npm init 文件中包含了NPM包的基本信息(项目名称、版本号、项目描述、作者)和依赖管理,例如: { "name": "demo", "version": "1.0.0", "devDependencies": { "webpack": "^4.29.6" } } 在package.json文件中,所有的依赖包都会在 dependencies 和 devDependencies 的配置项中进行管理,它们的意思是: dependencies: 表示生产环境下的依赖管理;devDependencies: 表示开发环境下的依赖管理; 3. 开发环境和生产环境 很多同学不太理解什么是开发环境和生产环境,简单来说,就是在项目的开发阶段就是开发环境;项目上线了,开始正式提供对外服务,上线后的阶段就是生产环境。在生产环境下,一般会关掉错误报告,打开错误日志等操作。 devDependencies配置的是开发环境,安装项目开发时所依赖的模块。比如像webpack工具,只是用来构建项目和打包,这些都是在开发阶段才使用的,等项目上线后就用不到webpack工具了,那么我们就可以把webpack安装到开发环境中,使用 --save-dev命令安装到devdependencies下,命令语法: npm install --save-dev packageName # 简写 npm i -D packageName dependencies配置的是生产环境,安装项目运行时所依赖的模块。比如jQuery库,等项目上线以后依然是要继续使用的,我们就要安装在生产环境中,如果没有把需要的依赖安装到生产环境中,项目上线运行时就有可能会报错。使用 --save 命令安装到 dependencies 下,命令语法: npm install --save packageName # 简写 npm i -S packageName 注:上面的 -S ,是大写的S

基于卷积神经网络(CNN)模型的垃圾分类设计与实现

本篇博客主要内容如下: 目录 项目背景 数据集介绍 模型构建与训练 结果分析 结果对比分析 项目背景 如何通过垃圾分类管理,最大限度地实现垃圾资源利用,减少垃圾处置量,改善生存环境质量,是当前世界各国共同关注的迫切问题之一。根据国家制定的统一标准,现在生活垃圾被广泛分为四类,分别是可回收物、餐厨垃圾、有害垃圾和其他垃圾。可回收物表示适宜回收和资源利用的垃圾,主要包括废纸、塑料、玻璃、金属和布料五大类,用蓝色垃圾容器收集,通过综合处理回收利用。餐厨垃圾包括剩菜剩饭、骨头、菜根菜叶、果皮等食品类废物,用绿色垃圾容器收集等等。但是随着深度学习技术的发展,为了简单高效地对生活垃圾进行识别分类,本篇文章将实现一种基于卷积神经网络的垃圾分类识别方法。该方法只需要对图像进行简单的预处理,CNN模型便能够自动提取图像特征且池化过程能够减少参数数量,降低计算的复杂度,实验结果表明卷积神经网络,能克服传统图像分类算法的诸多缺点,当然更为复杂的模型等待大家去实验研究,讨论研究Q525894654。但是目前认为采用VGG或者global 池化方式可能效果更好一点。 数据集介绍 数据描述: 数据集一共包括四大类垃圾,分别为:其他垃圾,厨余垃圾、可回收垃圾及有害垃圾,并对其四大类进行了细致分类。具体描述如下: "0": "其他垃圾/一次性快餐盒", "1": "其他垃圾/污损塑料", "2": "其他垃圾/烟蒂", "3": "其他垃圾/牙签", "4": "其他垃圾/破碎花盆及碟碗", "5": "其他垃圾/竹筷", "6": "厨余垃圾/剩饭剩菜", "7": "厨余垃圾/大骨头", "8": "厨余垃圾/水果果皮", "9": "厨余垃圾/水果果肉", "10": "厨余垃圾/茶叶渣", "11": "厨余垃圾/菜叶菜根", "12": "厨余垃圾/蛋壳", "13": "厨余垃圾/鱼骨", "14": "可回收物/充电宝", "15": "可回收物/包", "16": "可回收物/化妆品瓶", "17": "可回收物/塑料玩具", "18": "可回收物/塑料碗盆", "19": "可回收物/塑料衣架", "20": "可回收物/快递纸袋", "21": "可回收物/插头电线", "22": "可回收物/旧衣服", "23": "可回收物/易拉罐", "24": "可回收物/枕头", "25": "可回收物/毛绒玩具", "26": "可回收物/洗发水瓶", "27": "可回收物/玻璃杯", "

Nginx实战案例--并发限制与带宽限制

我们经常会遇到这种情况,服务器流量异常,负载过大等等。对于大流量恶意的攻击访问,会带来带宽的浪费,服务器压力,影响业务,往往考虑对同一个ip的连接数,并发数进行限制。 一、限制并发 1.修改配置文件 [root@server1 conf]# vim nginx.conf 33 #gzip on; 34 limit_conn_zone $binary_remote_addr zone=addr:10m; 35 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #注意:必须写在server上面 36 server { ...... 54 location /download { 55 limit_conn addr 1; #只能一个并发,多了会报错 56 57 #limit_rate 50k; #限制带宽,每秒最多50k 58 } 其中: limit_conn_zone $binary_remote_addr zone=addr:10m; 表示大小是10m内存 10m的内存来对IP传输开销 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; 1s不超过一个请求 limit_conn_zone 用来限制同一时间连接数,即并发限制 limit_req_zone 用来限制单位时间的请求数,即速率限制,采用漏桶算法 $binary_remote_addr 是限制同一客户端ip地址 zone=addr:10m 表示生成一个大小为10m,名字为one的内存区域,用来存储访问的频次信息 重新加载nginx: [root@server1 conf]# nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.

Win 10 常用快捷键

目录 1. 常用快捷键2. Windows 键3. 任务栏4. 文件资源管理器5. 命令提示符6. 对话框7. 虚拟桌面8. 设置9. 浏览器10. 参考 1. 常用快捷键 快捷键说明Ctrl + X剪切Ctrl + C复制Ctrl + V粘贴Ctrl + Z撤消Alt + Tab在打开的应用之间切换Alt + F4关闭活动项,或退出活动应用Ctrl + W关闭当前程序Windows + L锁定Windows + D显示,或隐藏桌面F2重命名F3在文件资源管理器中搜索文件或文件夹F4在文件资源管理器中显示地址栏列表F5刷新活动窗口F6循环浏览窗口中或桌面上的屏幕元素F10激活活动应用中的菜单栏Alt + F8在登录屏幕上显示你的密码Alt + Esc按项目打开顺序循环浏览Alt + 带下划线的字母执行该字母相关的命令Alt + Enter显示所选项目的属性Alt + 空格键打开活动窗口的快捷菜单Alt + 向左键返回Alt + 向右键前进Alt + Page Up向上移动一个屏幕Alt + Page Down向下移动一个屏幕Ctrl + F4关闭活动文档(在可全屏显示并允许你同时打开多个文档的应用中)Ctrl + A选择文档或窗口中的所有项目Ctrl + Delete删除选定项,将其移至回收站Ctrl + R(或 F5)刷新活动窗口Ctrl + Y恢复操作Ctrl + 向左键将光标移动到上一个字词的起始处Ctrl + 向右键将光标移动到下一个字词的起始处Ctrl + 向上键将光标移动到上一段落的起始处Ctrl + 向下键将光标移动到下一段落的起始处Ctrl + Alt + Tab使用箭头键在所有打开的应用之间进行切换Alt + Shift + 箭头键当组或磁贴的焦点放在 开始 菜单上时,可将其朝指定方向移动Ctrl + Shift + 箭头键当磁贴的焦点放在 开始 菜单上时,将其移到另一个磁贴即可创建一个文件夹Ctrl + 箭头键打开 开始 菜单后调整其大小Ctrl + 箭头键(移至某个项目)+ 空格键选择窗口中或桌面上的多个单独项目Ctrl + Shift(及箭头键)选择文本块Ctrl + Esc打开 开始 菜单Ctrl + Shift + Esc打开任务管理器Ctrl + Shift如果多种键盘布局可用,则可切换键盘布局Ctrl + Shift + s另存为Ctrl + 空格键打开或关闭中文输入法编辑器 (IME)Shift + F10显示选定项的快捷菜单Shift + 任何箭头键在窗口中或桌面上选择多个项目,或在文档中选择文本Shift + Delete删除选定项,无需先移动到回收站向右键打开右侧的下一个菜单,或打开子菜单向左键打开左侧的下一个菜单,或关闭子菜单Esc停止或离开当前任务PrtScn捕获整个屏幕的屏幕截图并将其复制到剪贴板;你可以更改此快捷方式,以便它还可以打开屏幕截取,这允许你编辑屏幕截图:依次选择 开始 > 设置 > 轻松访问 > 键盘 > 使用 PrtScn 键打开屏幕截取; 2.

深度学习--面试题目

● BatchNormalization的作用 参考回答: 神经网络在训练的时候随着网络层数的加深,激活函数的输入值的整体分布逐渐往激活函数的取值区间上下限靠近,从而导致在反向传播时低层的神经网络的梯度消失。而BatchNormalization的作用是通过规范化的手段,将越来越偏的分布拉回到标准化的分布,使得激活函数的输入值落在激活函数对输入比较敏感的区域,从而使梯度变大,加快学习收敛速度,避免梯度消失的问题。 ● 梯度消失 参考回答: 在神经网络中,当前面隐藏层的学习速率低于后面隐藏层的学习速率,即随着隐藏层数目的增加,分类准确率反而下降了。这种现象叫做消失的梯度问题。 ● 循环神经网络,为什么好? 参考回答: 循环神经网络模型(RNN)是一种节点定向连接成环的人工神经网络,是一种反馈神经网络,RNN利用内部的记忆来处理任意时序的输入序列,并且在其处理单元之间既有内部的反馈连接又有前馈连接,这使得RNN可以更加容易处理不分段的文本等。 ● 什么是Group Convolution 参考回答: 若卷积神将网络的上一层有N个卷积核,则对应的通道数也为N。设群数目为M,在进行卷积操作的时候,将通道分成M份,每个group对应N/M个通道,然后每个group卷积完成后输出叠在一起,作为当前层的输出通道。 ● 什么是RNN 参考回答: 一个序列当前的输出与前面的输出也有关,在RNN网络结构中中,隐藏层的输入不仅包括输入层的输出还包含上一时刻隐藏层的输出,网络会对之前的信息进行记忆并应用于当前的输入计算中。 ● 训练过程中,若一个模型不收敛,那么是否说明这个模型无效?导致模型不收敛的原因有哪些? 参考回答: 并不能说明这个模型无效,导致模型不收敛的原因可能有数据分类的标注不准确,样本的信息量太大导致模型不足以fit整个样本空间。学习率设置的太大容易产生震荡,太小会导致不收敛。可能复杂的分类任务用了简单的模型。数据没有进行归一化的操作。 ● 图像处理中锐化和平滑的操作 参考回答: 锐化就是通过增强高频分量来减少图像中的模糊,在增强图像边缘的同时也增加了图像的噪声。 平滑与锐化相反,过滤掉高频分量,减少图像的噪声是图片变得模糊。 ● VGG使用33卷积核的优势是什么? 参考回答: 2个33的卷积核串联和55的卷积核有相同的感知野,前者拥有更少的参数。多个33的卷积核比一个较大尺寸的卷积核有更多层的非线性函数,增加了非线性表达,使判决函数更具有判决性。 ● Relu比Sigmoid的效果好在哪里? 参考回答: Sigmoid的导数只有在0的附近时有较好的激活性,而在正负饱和区域的梯度趋向于0,从而产生梯度弥散的现象,而relu在大于0的部分梯度为常数,所以不会有梯度弥散现象。Relu的导数计算的更快。Relu在负半区的导数为0,所以神经元激活值为负时,梯度为0,此神经元不参与训练,具有稀疏性。 ● 问题:神经网络中权重共享的是? 参考回答: 卷积神经网络、循环神经网络 解析:通过网络结构直接解释 ● 问题:神经网络激活函数? 参考回答: sigmod、tanh、relu 解析:需要掌握函数图像,特点,互相比较,优缺点以及改进方法 ● 问题:在深度学习中,通常会finetuning已有的成熟模型,再基于新数据,修改最后几层神经网络权值,为什么? 参考回答: 实践中的数据集质量参差不齐,可以使用训练好的网络来进行提取特征。把训练好的网络当做特征提取器。 ● 问题:画GRU结构图 参考回答: GRU有两个门:更新门,输出门 解析:如果不会画GRU,可以画LSTM或者RNN。再或者可以讲解GRU与其他两个网络的联系和区别。不要直接就说不会。 ● Attention机制的作用 参考回答: 减少处理高维输入数据的计算负担,结构化的选取输入的子集,从而降低数据的维度。让系统更加容易的找到输入的数据中与当前输出信息相关的有用信息,从而提高输出的质量。帮助类似于decoder这样的模型框架更好的学到多种内容模态之间的相互关系。 ● Lstm和Gru的原理 参考回答: Lstm由输入门,遗忘门,输出门和一个cell组成。第一步是决定从cell状态中丢弃什么信息,然后在决定有多少新的信息进入到cell状态中,最终基于目前的cell状态决定输出什么样的信息。 Gru由重置门和跟新门组成,其输入为前一时刻隐藏层的输出和当前的输入,输出为下一时刻隐藏层的信息。重置门用来计算候选隐藏层的输出,其作用是控制保留多少前一时刻的隐藏层。跟新门的作用是控制加入多少候选隐藏层的输出信息,从而得到当前隐藏层的输出。 ● 什么是dropout 参考回答:

2019 CS224N Assignment 2: word2vec

文章目录 Written: Understanding word2vecCoding: Implementing word2vec Written: Understanding word2vec 注:下面的答案中,各向量和矩阵的形式按照题目中所说。 U 和 V U和V U和V 都是词向量矩阵,列向量为单词对应的词向量,同样 v c 、 u o 、 u w v_c、u_o、u_w vc​、uo​、uw​ 等都是列向量。 y y y 为 one-hot的行向量, y ^ \hat y y^​ 表示softmax之后的结果,也为行向量, y 、 y ^ y、 \hat y y、y^​ 长度都为词表大小。 (a) 因为 y \boldsymbol{y} y 是一个 one-hot 向量, 只有词 o o o 的概率为 1, 即只有 y i = 1 y_i = 1 yi​=1 ,i=o 时。因此证明如下

Ubuntu anaconda 换源

官方:https://mirror.tuna.tsinghua.edu.cn/help/anaconda/ vim使用命令 i 插入模式 :wq 保存并推出 anaconda 换源 vim ~/.condarc channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

Jackson-Long精度丢失问题

文章目录 说明而我的问题是 处理 说明 由于Javascript中证书的精度最大值是有限的,通过控制台获取最大值Number.MAX_SAFE_INTEGER会发现是9007199254740991,任何大于 9007199254740991 的就可能会丢失精度 而我的问题是 由于我们的ID 是分布式ID 数据类型是Long类型的远远大于了最大值,所以在返给前端的时候,处理掉就好了 处理 通过定制jackson2ObjectMapperBuilderCustomizer解决 /** * 修复ID 精度丢失问题 */ @Configuration public class JacksonConfig { @Bean("jackson2ObjectMapperBuilderCustomizer") public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { Jackson2ObjectMapperBuilderCustomizer customizer = new Jackson2ObjectMapperBuilderCustomizer() { @Override public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) { jacksonObjectMapperBuilder.serializerByType(Long.class,new CustomLongSerialize()); jacksonObjectMapperBuilder.serializerByType(Long.TYPE, new CustomLongSerialize()); } }; return customizer; } } 自定义Long序列化 public class CustomLongSerialize extends JsonSerializer<Long> { /** * Method that can be called to ask implementation to serialize * values of type this serializer handles.

第六章第二题(求一个整数各位数字之和)(Sum the digits in an integer)

*6.2(求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和。使用下面的方法头: public static int sumDigits(long n) 例如:sumDigits(234)返回9(2+3+4)。 提示:使用求余操作符%提取数字,用除号/去掉提取出来的数字。例如:使用234%10(=4)提取4。然后使用234/10(=23)从234中去掉4。使用一个循环来反复提取和去掉每位数字,直到所有的位数都提取完为止。 编写程序提示用户输入一个整数,然后显示这个整数所有数字的和。 *6.2(Sum the digits in an integer) Write a method that computes the sum of the digits in an integer. Use the following method header: public static int sumDigits(long n) For example, sumDigits(234) returns 9 (= 2 + 3 + 4). (Hint: Use the % operator to extract digits and the / operator to remove the extracted digit. For instance, to extract 4 from 234, use 234 % 10 (= 4 ).

栈和队列简介

栈和队列简介 栈和队列是两种常用的数据结构,它们的数据是按线性结构存储的,因此,栈和队列也属于线性表。 栈和队列的数据可以存储在一个顺序表里,也可以存储在一个链表里,只要满足线性存储结构就行。只对数据的线性结构有要求,对存储数据的具体结构并不做要求。 栈和队列最关键的特征是存取数据有严格的顺序。栈遵循“后进先出”(LIFO, Last In First Out)的原则,队列遵循“先进先出”(FIFO, First In First Out)的原则。 接下来就简单介绍一下栈和队列。 一、栈简介 栈(stack),又称为堆栈,是一种数据结构,一种存储数据的容器。 作为一种线性的数据结构,栈的一端是封闭的,称为栈底,另一端是开口的,称为栈顶。 将数据存到栈中,称为入栈(或进栈、压栈),将数据从栈中取出,称为出栈(或弹栈)。 从栈中存取数据,都只能从开口的一端操作,先入栈的数据会被后入栈的数据“压”住,只有将后入栈的数据取出后,才取得到先入栈的数据,所以,栈的数据是“后进先出”的。 栈的常见应用如:大部分软件都有的“回退”功能Ctrl+Z,浏览器的“后退”功能等。 栈的数据存储结构可以使用顺序表,也可以使用链表。使用顺序表存储数据的栈称为顺序栈,使用链表存储数据的栈称为链栈。 根据顺序表和链表的区别,顺序表物理有序,链表逻辑有序,顺序栈和链栈的区别为,数据在实际物理空间上存放的相对位置不同,顺序栈的数据按物理有序存储,链栈的数据按逻辑有序存储。 二、队列简介 队列(queue),是另一种有存取顺序要求的数据结构。 队列的两端都是打开的,两端都是“单行”的,一端只进不出,称为队尾,另一端只出不进,称为队头。 将数据从队尾存到队列中,称为入队,将数据从队列中取出,称为出队。 队列的一端只能存入数据,另一端只能取出数据,从队列中取数据时,先入队的数据“挡”住了后入队的数据,只有将先入队的数据取出来,才取得到后入队的数据,所以,队列的数据是“先进先出”的。 队列的常见应用如:春运抢票功能,网购预约功能等。 与栈相同,队列的数据存储结构也可以使用顺序表或者链表。使用顺序表存储数据的队列称为顺序队列,使用链表存储数据的队列称为链队列。 顺序队列和链队列的区别为,数据在实际物理空间上存放的相对位置不同,顺序队列的数据按物理有序存储,链队列的数据按逻辑有序存储。 三、双端队列简介 双端队列(deque,全名double-ended queue),是一种特殊的线性数据结构。 与队列不同,双端队列的两端都可以入队和出队。也就是说,双端队列没有严格意义上的“队头”和“队尾”,只是为了描述方便,分别称为“前端”和“后端”,两端能进行的操作一样,都可以插入和删除数据。 双端队列同时具有栈和队列的性质。单独从其中一端存取数据时,数据是“后进先出”的,具有栈的性质。从其中一端存数据再从另一端取出,数据是“先进先出”的,具有队列的性质。 双端队列就是一种可以(也只能)从两端插入和删除数据的线性数据结构,使用起来比栈和队列更加灵活。

百度富文本编辑器 ueditor插入视频有误,微信小程序无法解析embed标签问题解决

一、插入视频问题 /dialogs/video/video.js是控制该部分代码的文件 ①处的代码是报错的关键,url传进来后只有空地址的判断和部分网站视频地址的转换,然后无论任何地址都会抛出错误。(希望懂得朋友告诉本菜此处代码的用意是什么)②处的代码存在时只能预览flash视频,需要去掉才能正常预览除其他格式(如MP4)的视频 实际效果如图: 二、微信小程序无法播放编辑器插入的视频 原因:插入的视频源代码是embed标签,微信小程序无法解析此标签 解决办法:将embed标签修改为video标签 找到并打开ueditor.all.js文件将embed后执行代码注释,目的是使embed标签的代码在编辑框内变成video标签 效果展示: umeditor错误请点击此链接 如果有疑问,欢迎评论~ 如果成功解决了你的问题,点个赞再走吖~

vue 网络请求demo

异步等待demo: axios-demo: 本地数据显示: <!-- 本地数据显示 --> <ul v-show="isShowNativeResult"> <li v-for="(data,index) in datas"> <span> {{data.name}} </span> <span style="margin-left:10px;"> {{data.address}} </span> </li> </ul> <!-- gankio数据 --> <ul v-show="isShowGankIoResult"> <li v-for="(item,index) in gankIoDatas" class="listItem"> <img :src="item.url" alt="" style="width:200px"> <span>整理者:{{item.who}}</span> </li> </ul> 模拟json 请求: // 本地请求 json 模拟 getData() { var that = this this.$axios.get('../static/mydata.json') .then(response =>{ console.log(response.data) if(response.data.status == '0001'){ that.datas = response.data.datas that.isShowNativeResult = true that.isShowGankIoResult = false } }) .catch(error =>{ console.

企业微信脚手架(第三方)

开发文档地址:https://work.weixin.qq.com/api/doc/90001/90142/90594 企业微信服务商后台:https://open.work.weixin.qq.com/wwopen/developer/#/index 一、前言 1.企业微信于2016年4月上线,是腾讯微信团队打造的以办公沟通工具为主打定位的移动办公平台,它的slogan:让每个企业都有自己的微信。 2.企业微信提供了通讯录管理、应用管理、消息推送、身份验证、移动端SDK、素材、OA数据接口、企业支付、电子发票等API,管理员可以使用这些API,为企业接入更多个性化的办公应用。 3.企业微信也是一个平台,是一个统一的办公入口,可以集成公司内部的系统(OA系统、HR系统、ERP系统、CRM系统等),直接在企业微信手机端就可以接收内部系统的消息和通知。 4.企业微信与微信企业号区别:其实两个产品最大的其别就是微信企业号是基于微信,而企业微信是一个独立app。企业微信,倾向于将工作和生活完全分开,以独立app的形式去使用,更有着丰富的办公应用,如预设打卡、审批、日报、公告等OA应用,如果你对这些应用不满足,还可以通过API接入和第三方应用满足更多个性需求。有一种说法: 微信企业号要合并到企业微信,然后慢慢淡化微信企业号的概念。 第三方应用接口旨在方便企业微信管理员通过简单的操作来使用第三方服务商的云应用。实现该目标的核心的机制是:服务商预先在第三方管理端注册登记应用信息。企业选择使用第三方应用时,通过授权流程来一键安装应用。 脚手架源码下载:下载 二、脚手架预览 2.1 项目结构 2.2 服务商后台自建应用 SuiteID Secret Token EncodingAESKey 可信域名配置 业务设置URL 数据回调UR(应用中发送消息,会回调该url) 指令回调URL(各种事件) 安装完后,在应用管理第三方应用里面就会多出该应用 2.2 消息自动回复 2.4 添加好友自动回复 2.5 名片配置小程序 2.6 拆分链接,用户授权 2.7 js-sdk测试demo 三、关键的模块 3.1 回调配置 在集成企业微信与内部系统时,我们往往需要搭建一个回调服务。回调服务,可以实现: 1.自定义丰富的服务行为。比如,用户向应用发消息时,识别消息关键词,回复不同的消息内容;用户点击应用菜单时,转化为指令,执行自动化任务。 2.可以及时获取到状态变化。比如,通讯录发生变化时,不需要定时去拉取通讯录对比,而是实时地获取到变化的通讯录结点,进行同步。 ‘ ’ 回调服务需要作出正确的响应才能通过URL验证,具体操作如下: 1.对收到的请求,解析上述的各个参数值(参数值需要做Urldecode处理) 根据已有的token,结合第1步获取的参数timestamp, 2.nonce, echostr重新计算签名,然后与参数msg_signature检查是否一致,确认调用者的合法性。计算方法参考:消息体签名检验 3.解密echostr参数得到消息内容(即msg字段) 4.在1秒内响应GET请求,响应内容为上一步得到的明文消息内容(不能加引号,不能带bom头,不能带换行符) 3.2 应用授权 企业微信的系统管理员可以授权安装第三方应用,安装后企业微信后台会将授权凭证、授权信息等推送给服务商后台。然后我们获取到授权信息,将授权信息保存起来。授权可以有两种发起方式: 1.从服务商网站发起 2.从企业微信应用市场发起 从服务商网站发起 从企业微信应用市场发起 3.3 推送suite_ticket处理 在发生授权、通讯录变更、ticket变化等事件时,企业微信服务器会向应用的“指令回调URL”推送相应的事件消息。消息结构体将使用创建应用时的EncodingAESKey进行加密。服务商在收到推送后都必须直接返回字符串 “success”,若返回值不是 “success”,企业微信会把返回内容当作错误信息。 企业微信服务器会定时(每十分钟)推送ticket。ticket会实时变更,并用于后续接口的调用。 <xml> <SuiteId><![CDATA[ww4asffe99e54c0fxxxx]]></SuiteId> <InfoType> <![CDATA[suite_ticket]]></InfoType> <TimeStamp>1403610513</TimeStamp> <SuiteTicket><![CDATA[asdfasfdasdfasdf]]></SuiteTicket> </xml> 3.

lotus 矿工初始化时指定存储目录

lotus 矿工初始化时指定存储目录 1,lotus 矿工初始化时指定存储目录 1,lotus 矿工初始化时指定存储目录 --storagerepo lotus-storage-miner --storagerepo=/lotusstorage init --actor=t --owner=t3 lotus-storage-miner --storagerepo=/lotusstorage info

旋转向量与欧拉角 罗德里格斯公式(Rodrigues's Formula)

旋转向量 旋转矩阵表达方式 旋转矩阵描述旋转,变换矩阵描述一个6自由度的三维刚体运动。但存在如下缺点: SO(3)的旋转矩阵有9个量,但一次旋转只有3个自由度。因此这种表达方式是冗余的。同理,变换矩阵16个量表达了6个自由度的变换,也不够紧凑。旋转矩阵自身带有约束:它必须是个正交矩阵,且行列式为1。变换矩阵也是如此。当想要估计或优化一个旋转矩阵/变换矩阵时,这些约束会使得求解变得困难。 外积与旋转的关系 外积表达了两个向量的旋转关系。对于坐标系的旋转,任意旋转可以用一个旋转轴和一个旋转角来刻画。可以使用一个向量,器方向与旋转轴一致,而长度等于旋转角。这种向量称为旋转向量(或轴角,Axis-Angle)。这种表示法只需要一个三维向量即可描述旋转。同样,对于变换矩阵,我们使用一个旋转向量和一个平移向量即可表达一次变换。这时的位数正好是六维度。 旋转矩阵和旋转向量之间的转换 旋转轴n,角度为 θ \theta θ,对应的旋转向量 θ \theta θn。从旋转矩阵到旋转向量的转换过程由罗德里格斯公式(Rodrigues’s Formula)表明。 罗德里格斯公式推导 v ∣ ∣ _{||} ∣∣​与旋转向量v与旋转轴k(k为当我向量)相互垂直。对于与旋转轴呈任意角度的向量v,可以通过正交分解,把被旋转向量转化为与旋转轴平行的分量v ∣ ∣ _{||} ∣∣​和与旋转轴垂直的分量 v ⊥ _{\bot} ⊥​,其中与旋转轴平行的分量v ∣ ∣ _{||} ∣∣​在旋转中是不变的,而与旋转轴垂直的分量 v ⊥ _{\bot} ⊥​则恰好旋转了角度 θ \theta θ,把与旋转轴平行的分量与旋转以后的与旋转轴垂直的分量加在一起,即可得到旋转以后的分量。 对向量 v做正交分解: v= v ∣ ∣ _{||} ∣∣​+ v ⊥ _{\bot} ⊥​ 利用向量投影公式,可以得到 v ∣ ∣ _{||} ∣∣​的表达式: v ∣ ∣ _{||} ∣∣​= (v ⋅ \cdot ⋅k)k 通过减法,得到 v ⊥ _{\bot} ⊥​=v-v ∣ ∣ _{||} ∣∣​=v-(v ⋅ \cdot ⋅k)k

geojson、shp文件互转

geojson数据展示工具(默认84坐标系):http://geojson.io/ 文件格式转换工具:https://mapshaper.org/ 选择一个.json文件

Windows下pip切换国内源(清华源)

开发环境: win10 x64 cuda10.0 anaconda4.0.0 anaconda常见问题解决办法汇总 目录 1. pip报错:Cannot open D:\Anaconda3\Scripts\pip-script.py 2. pip切换国内源 3. 解决Scipy报错:ImportError: cannot import name 'show_config' from 'numpy' (unknown location) 4. 解决安装第三方包出现的 ERROR: Command errored out with exit status 1 5. 解决安装scikit-learn后可以导入,但运行报错:ImportError: DLL load failed: 找不到指定的程序 ---------------------------------------------------------------------------------------------------------------------------------------------------------------- 直奔主题 打开 C:\Users\你的用户名 目录下,新建pip文件夹,进到文件夹中创建pip.ini文件,然后打开它,将下面代码粘贴进去-->保存 [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple [install] trusted-host = https://pypi.tuna.tsinghua.edu.cn 重新打开dos窗口,使用pip加速下载安装包,至此大功告成!!! 欢迎访问我的个人博客:机器学习之路

java工具之解析yaml文件

工具使用背景 很多配置项都是使用yaml的格式进行配置的, 按一定的格式进行缩进, 一眼看上去,清晰明了. 如Springboot工程下图所示: 如:k8s的Deploy文件: 本次写这个yaml工具解析是想解析k8s的config文件,然后封装一个k8s客户端. 因为无论阿里云还是华为云,要查看多个容器的日志. 都不是方便. 基础依赖 这个工具是在已有的工具上进行封装的 gradle: compile group: 'org.yaml', name: 'snakeyaml', version: '1.25' maven: <dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> <version>1.25</version> </dependency> 封装的代码 // 首先声明一个Map存解析之后的内容: Map<String, Object> properties; // 空的构造函数 public YamlTools() { } // 以文件路径为条件的构造函数 public YamlTools(String filePath) { InputStream inputStream = null; try { inputStream = new FileInputStream(filePath); } catch (FileNotFoundException e) { e.printStackTrace(); } // 调基础工具类的方法 Yaml yaml = new Yaml(); properties = yaml.

pip install xgboost安装失败解决方案

1.pip install xgboost失败 2.pip install xgboost-0.90-cp37-cp37m-win_amd64.whl成功 先进入网址https://www.lfd.uci.edu/~gohlke/pythonlibs/#xgboost 找到xgboost 在pip中找到自己python版本: 3.7版本对应cp37,64位电脑对应amd64,32位电脑对应win32 点击 下载到和pip同一个目录下保存 然后重新 pip install xgboost-0.90-cp37-cp37m-win_amd64.whl 安装成功