用大白话讲清 -> SQL事务

1、何为事务? 概念:事务执行是一个整体,所有的SQL语句都必须执行成功。如果其中有1条SQL语句出现异常,则所有的SQL语句都要回滚,整个业务执行失败。 解释:实际开发过程中,很多时候都是要多次访问数据库才能完成的。比如转账,张三有1000块,李四也有1000块。老王转账500元给小王。在实际的操作数据库过程中,就分为两次。第一次是张三账户扣500,第二次是李四账户加500。如果在执行的过程中,张三扣了500,但是李四加500的时候出错了。那么第一条语句执行成功,第二条语句失败,那么500块就凭空消失了。事务就是保证业务没有全部执行成功的时候,能够归滚到最初的状态的一种保证机制。 2、基本操作 关键词 开启事务–>START TRANSACTION;回滚–>ROLLBACK;提交–>COMMIT; (新手小TIPS:SQL语句的关键字尽量使用大写,方便阅读) 实操 掌握基础的SQL增删改查操作即可。根据如下,代码一步一步操作(注意看注释): -- 未开启事务,正常执行 -- 创建数据表 CREATE TABLE account ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), balance DOUBLE ); -- 添加数据 INSERT INTO account (NAME, balance) VALUES ('张三', 1000), ('李四', 1000); -- 张三账号-500 UPDATE account SET balance = balance - 500 WHERE name='张三'; -- 李四账号+500 UPDATE account SET balance = balance + 500 WHERE name='李四'; -- 这样的步骤,正常执行无差错,就是转账成功 -- 未开启事务,异常执行 -- 恢复到各1000元 UPDATE account SET balance = 1000; -- 张三账号-500 UPDATE account SET balance = balance - 500 WHERE name='张三'; -- 李四账号+500 哈哈哈哈UPDATE account SET balance = balance + 500 WHERE name='李四'; -- 没有事务的情况下,转账失败,但是张三少了500元 -- 手动开启事务,异常执行 -- 恢复到各1000元 UPDATE account SET balance = 1000; --手动开启事务 START TRANSACTION; -- 张三账号-500 UPDATE account SET balance = balance - 500 WHERE name='张三'; -- 李四账号+500 哈哈哈哈UPDATE account SET balance = balance + 500 WHERE name='李四'; -- 回滚 ROLLBACK; -- 转账失败,但是回滚到最初状态,双方资金保护的很好 -- 手动开启事务,正常执行 -- 恢复到各1000元 UPDATE account SET balance = 1000; --手动开启事务 START TRANSACTION; -- 张三账号-500 UPDATE account SET balance = balance - 500 WHERE name='张三'; -- 李四账号+500 UPDATE account SET balance = balance + 500 WHERE name='李四'; -- 提交 COMMIT; -- 执行完毕 (新手小TIPS:MySQL默认每一条DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执行完毕自动提交事务,MySQL默认开始自动提交事务;Oracle默认不开始自动提交)

金蝶容器运维指南

金蝶容器介绍 ​ 在进行28所项目的时候,由于项目国产化的需要,因此AI服务器在开发的过程中必须使用Tomcat、Jetty、Undertow等容器的国产化替代产品,因为国家的政策法规已经将信息安全问题上升到国家的高度,在项目开发过程中使用的产品必须是自主可控、而且源代码安全的。 ​ 金蝶Apusic应用服务器 AAS是应用系统的运行平台,为应用系统提供便捷开发、灵活部署、可靠运行、高效管理及快速集成等关键支撑。支持Java企业级规范和主流应用框架,广泛应用于电子政务和企业核心关键应用。 ​ 28所项目、AI服务器、以及未来的大船项目中,均会采用相同的国产化形态软件,AAS+国产化数据库的应用结构来进行开发,因此结合28所项目、所里AI服务器项目的金蝶容器使用实践,总结以往的经验,温故而知新。把相关金蝶容器的使用经验记录如下。 AAS架构 技术白皮书 金蝶容器技术白皮书 应用场景 ​ 电子政务系统、电子商务系统、企业CRM系统等JavaEE应用都需要使用JavaEE应用服务器。 安装包目录结构 目录结构 较为重要的由两个文件夹,一个是根目录下的文件夹,只要能够较为熟悉的了解两层目录中文件夹和文件的基本含义,即可对容器有初步的理解并且使用。 Apusic应用目录结构 ​ 在Apusic应用目录结构中较为重要的文件夹为domains文件夹,该文件中包含用户通过bin/config创建的自定义域。我们可以把自己制作的war包或者文件见部署在domains**self-defined-domain**中。 应用程序部署在APUSIC_HOME\domains\self-defined-domain\applications\目录下,如果不创建自定义域则放置在APUSIC_HOME\domains\mydomain\applications\ 应用目录结构中的具体作用如下表所示 目录内容adminconsoleApusic管理控制台运行所需文件,如果使用的安装包包含adminconsole,则安装完后adminconsole在此目录中bin一些命令行脚本,通常,您需要修改其中setenv.cmd(setenv)文件,将其中JAVA_HOME设置为正确的JVM所在目录classes服务器运行时,会将此目录置为系统CLASSPATH最前端,默认情况下,此目录为空common服务器运行时,会将此目录中的jar包(含zip)置于系统CLASSPATH中,位于sp目录中的jar包之后,lib目录中的jar包之前lib服务器运行时,会将此目录中的jar包(含zip)置于系统CLASSPATH中,位于common目录中的jar包之后sp补丁程序所在位置,服务器运行时,会将此目录中的jar包(含zip)置于系统CLASSPATH中,位于classes目录之后,common目录中的jar包之前; 默认情况下,此目录为空domainsApusic应用服务器的域,见[下表](file:///C:/Users/宋姗姗/Desktop/宋姗姗/AAS-V9.0_2019-1-7/readme.html#table2)。src一些第三方jar包的源码包templates创建domain时所用到的模板tools包含管控api文档,以及工具脚本和readme.txt说明文档 注意:在tools文件中包含了许多的非交互式脚本,用来简化AAS容器的全局配置。 tools非交互式脚本介绍 域目录结构 ​ Apusic应用服务器的域信息保存在APUSIC_HOME/domains目录下,每个域的信息保存在同名的子目录中,安装服务器后domains目录下包含预定义的mydomain域。mydomain中的子目录及子目录描述如下表: 目录内容applications凡放到此文件夹中的ear、war、rar等符合J2EE规范的文件或文件夹,都会被自动部署到Apusic应用服务器上bin一些命令行脚本,通常,您需要运行其中startapusic.cmd(startapusic)脚本来启动Apusic应用服务器config服务器中的数据库连接池、web服务器、JMS服务、日志服务等相关配置文件、负载均衡示例配置文件等deploy服务器从未运行过时,此目录不存在,当服务器启动以后,会自动创建此文件夹。此文件夹中放置了应用系统运行时所产生的一些中间过程文件,譬如,由jsp文件生成的servlet等lib允许用户在这里放置一些公用的jar包(譬如数据库JDBC Driver等),此文件夹中的jar包(含zip)会自动置于系统CLASSPATH的尾部logs服务器日志文件store系统用户存储文件,JMS消息存储文件等 ​ APUSIC_HOME/domains目录下还包含预定义的samples域,samples域预部署了若干个示例应用,用以演示JavaEE5的最新技术。samples域的目录结构与mydomain基本一致,但多了一个src目录,存放示例应用的源代码及构建脚本。 证书 ​ 由于AAS的运行是付费的,因此必须从金蝶获取符合时间的证书,当前可用的证书如下: <?xml version="1.0" encoding="UTF-8"?> <license /> 把该证书置于根目录下即可 \AAS-V9.0_2019-1-7 若证书时间过期,则在运行时会弹出如下的问题: Linux管理 ​ 金蝶容器与Tomcat容器一样,zip安装包支持Windos和Linux环境下运行。在启动运行程序时,在mydomains\applications文件夹中 在上述的行文以及下述的行文中,并不创建自定义域,而仅仅使用预先安装的mydomain域来演示程序。 使用如下的脚本来控制应用程序的启停。 由于Windows和Linux端应用程序的管理别无二致,Linux端金蝶的使用是日后工作的重点,因此如下使用Linux端来演示应用程序的启停管理 配置应用端口 我们可以采用如下的方式创建一个新的域,较为重要步骤是要确定域监听的的端口和SSL端口。 创建域使用config脚本,该脚本位于APUSIC_HOME\config,其他以默认方式执行即可。该行命令执行完毕,则可以在APUSIC_HOME\domains目录下看见自定义的域。 windos环境创建域 C:\Users\AAS-V9.0_2019-1-7\bin>config.cmd Using APUSIC_ENDORSED_DIRS: C:\Users\AAS-V9.0_2019-1-7\lib\endorsed ----------------------------------------------------------- | 欢迎进入Apusic域配置向导 | | 版本 :Apusic Application Server 9.0 | | | | 深圳市金蝶中间件有限公司 | | 版权所有 | ----------------------------------------------------------- 选择任务 .

antdesign vue 清空日期框(a-range-picker,a-date-picker)

<template> <div> <a-date-picker @change="onChange" v-model="timeValue" /> <button @click="quxiao">quxiao</button> </div> </template> <script> v-model 绑定一个值 在data中定义 data(){ return { timeValue: undefined, } }, 在清空事件中 quxiao(){ this.timeValue=undefined; } v-model 搭配一个undefined的值 大部分antdesign 都可清空选中的值,经过多次实验有的 值绑定为空的话有的可以清空有的不行,推荐undefined 代码:

elementUI的el-table表格自定义表头slot-scope=“scope“+eslint报错

网上看了不少人的回答,都让我无语,把eslint取消也算一个办法?? 还有人说删掉slot-scope="scope",您会前端吗,删掉之后eslint是不报错了,你看看你那自定义表头还好使吗?? 上代码,在这行之前增加一句注释,目的是取消下一行的eslint规范检索。 <!-- eslint-disable-next-line --> <el-table-column align="center" prop="name" :show-overflow-tooltip="true" width="300" > <!-- eslint-disable-next-line --> <template slot="header" slot-scope="scope"> <el-input v-model="search" size="mini" placeholder="输入关键字搜索" /> </template> </el-table-column> 这回皆大欢喜了。 2020.9月补充 如果是js中需要取消下一行的eslint检索,就换js的注释格式 // 再加上那行字就好了 大家要举一反三学会变通哦

百度云盘无法安装,点击一闪而过,双击无反应

重新换电脑后,下载百度网盘安装,发现安装没有反应,查看应用程序,在后台运行, 找原因发现他只是把它压缩成一个压缩软件,直接解压就可以了。 把百度网盘的EXE程序解压到一个新建的文件夹,鼠标右键BaiduNetdisk.exe 把它发送到桌面快捷方式,双击快捷方式就可以使用了。

latex:解决txt生成bib文件

**写前注:**这是我写的第一个博客,希望能帮到需要的人。作为一个新手,以前很少用这个bib生成参考文献,忽然有个期刊要求。开始以为很简单,结果摸索了大半宿,问题就不陈述了,主要说解决的方案。人生真理:任何事不要以为简单,做了才知辛酸。 bib 文件是latex插入参考文献的重要工具,建立bib文件的步骤如下: 第一步:建立txt文件,并将BIBTex文件可以copy到里面,不过最好是先将bib格式的记事本文件建立了之后才copy文献,在Google中可以copy 第二步:打开WinEdt,然后open—找到建立的txt文件----在另存为(save as)----格式选择BIBTEX—这样保存的文件就是bib格式的文件。在这个记事本文件下,鼠标右键—属性—就可以查看文件的格式(后缀名),从之前的.txt变成了.bib。这样就ok了。网上有些说,如百度经验说在记事本文件下右键—打开方式—选择WinEdt打开。但在我电脑上就怎么也找不到WinEdt打开方式,最后用上述方法成功了。 第三步:建立文件filename.bib后,把文件名放在WinEdt中,注意在文件必须包含下面代码: \bibliographystyle{ACM-Reference-Format} \bibliography{filename} 把这两行代码放在参考文献的位置,一般是appendix前。前一行代码是说参考文献的格式,每个期刊的格式不一样,上面的格式是ACM的。如果没有特殊格式规定,一般是plain。后一行代码是说引用的参考文献的文件-filename。特别注意,这个文件名最好不要有空格以及不要在filename中加后缀,即filename.bib。这样都有可能报错。 第四步:运行。要运行四次,LaTeX—B(BIBTEX,在WinEdt中是B字母,就在L(LaTeX)健旁边)—LaTeX—LaTeX。运行顺序不要错了。

Celery基本介绍

文章目录 Celery架构及介绍Celery的优点版本支持情况使用场景 Celery架构及介绍 项目开发中经常碰到需要使用异步任务的场景,比如一个WEB请求中有运行时间很长的业务运算,如果不采用异步任务,会阻塞当前的web请求,影响用户体验 Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker) 和 任务执行结果存储(task result store) 组成 消息中间件 Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, Redis等等 任务执行单元 Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。 任务结果存储 Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP, redis等 Celery的优点 1、简单:一单熟悉了celery的工作流程后,配置和使用还是比较简单的 2、高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务 3、快速:一个单进程的celery每分钟可处理上百万个任务 4、灵活: 几乎celery的各个组件都可以被扩展及自定制 版本支持情况 Celery version 4.0 runs on Python ❨2.7, 3.4, 3.5❩ PyPy ❨5.4, 5.5❩ This is the last version to support Python 2.7, and from the next version (Celery 5.x) Python 3.5 or newer is required. If you’re running an older version of Python, you need to be running an older version of Celery: Python 2.

git log常用命令

使用git log命令可以查看提交历史,代码如下: $ git log git log指令不加其他参数,可以列出所有历史提交,分析如下: 按照提交的时间(从上到下)顺序排列,最上面为最新提交的。commit后面是经过SHA-1加密算法对此次提交计算的结果,可以唯一标识此次提交(重复的可能性可以忽略不计)。Author后面分别是提交的用户名和电子邮件地址,它们之间用空格分隔。Date后面是提交的时间日期。Date垂直的下方中间以空格分隔的是提交信息说明。 1、查看最近的n此提交: $ git log -n 2、 查看指定文件名的提交历史记录: 查看readme.txt文件的历史提交记录,如果多个文件,以空格分隔。 $ git log readme.txt 3、查看指定目录下文件提交历史记录: $ git log dir/ 4、查看指定分支或者标签历史提交记录: 查看标签标签v2.0之后的历史提交记录(不包含v2.0): $ git log v2.0.. 查看master分支历史提交记录,但是不包含ant分支历史记录: $ git log ant..master 查看ant分支历史提交记录,但是不包含master分支历史记录: $ git log master..ant 查看master分支或者ant分支的历史提交记录: $ git log master...ant 5、查询commit提交历史提交记录: 查看commit之前的历史提交记录(包含commit自身)。 $ git log commit 查看commit1与commit2之间的历史提交记录(包括两者)。 $ git log commit1 commit2 查看commit1与commit2之间的历史提交记录(不包括commit1)。 $ git log commit1..commit2 6、按照日期查看提交历史记录: (1)--after=xxx 显示2020-3-3之后的commit(包含3月3号)。日期还可以是相对日期,比如"1 week ago"和”yesterday"。与--since功能相同。 $ git log --after="

YARN 配置文件 capacity-scheduler.xml 参数解读

capacity-scheduler.xml 文件中配置了yarn资源调度器运行中的各项参数,位于hadoop安装目录/hadoop-2.7.2/etc/hadoop目录下。 打开后可以看到默认配置。所有的配置有注有英文注释,考虑到可能对部分朋友不太友好,所以笔者结合自己的理解对这些注释进行了翻译,如有错误,恳请指正: <configuration> # 最多可以运行的应用数,默认10000 <property> <name>yarn.scheduler.capacity.maximum-applications</name> <value>10000</value> <description> Maximum number of applications that can be pending and running. </description> </property> # application master最多能够占用的内存数,可以从另一个维度上控制并行运行的job数量,默认0.1 <property> <name>yarn.scheduler.capacity.maximum-am-resource-percent</name> <value>0.1</value> <description> Maximum percent of resources in the cluster which can be used to run application masters i.e. controls number of concurrent running applications. </description> </property> # 资源计算方式,默认已占用内存量作为度量,除此之外还能使用多维度计算方式,例如内存、CPU <property> <name>yarn.scheduler.capacity.resource-calculator</name> <value>org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator</value> <description> The ResourceCalculator implementation to be used to compare Resources in the scheduler.

PHP安装ldap扩展

适用于 Linux服务器配置。两种方案 一、使用在线安装 [只有一套PHP环境时] 1、检测PHP的版本 # php -v 2、搜索匹配版本的ldap扩展 # yum search ldap 3、安装对应的扩展 (我的版本是 7.0 ,找到自己对应的安装) # yum install php70w-ldap.x86-64 [中途会让输入一次 ,选 y ] 4、查看ldap扩展是否安装好 # php -m | grep ldap 5、如果没有该扩展,则修改配置文件,重启php-fpm生效 # find / -name php.ini [如果不知道php.ini位置,则进行搜索] # vim php.ini [加入 extension=ldap.so] # ps -aux | grep php-fpm [找到 php-fpm的进程id] # kill xx [杀掉 php-fpm,这里不用使用 -9参数] # php-fpm -c php-fpm.conf [后台重新启动 php-fpm] # php -m | grep ldap [再次查看扩展是否安装好] 二、编译安装 [服务器有多个PHP版本时]

kali 2019 修改时区、同步时间

首先保证系统联网,再执行下面的代码,可以更改时区和当前时间,并且重启系统后不会失效。 代码 #!/bin/bash echo "change timezone to Asia/Shanghai (UTC)" sudo timedatectl set-timezone "Asia/Shanghai" #修改时区为上海 sudo timedatectl set-timezone UTC #使用和设置协调世界时间 sudo timedatectl set-local-rtc 0 #将硬件时钟设置为协调世界时(UTC) echo "restart ntp for update localtime,please wait 10s" sudo service ntp restart #重启ntp时间同步服务,等待时间更新,一般需要3~6秒 sleep 10s echo "change Hardware clock" sudo hwclock -w #将系统时间写入到硬件时钟,防止重启系统后更改失效 sudo timedatectl status echo "Everything is OK! Please Restart system" 使用方法 将代码保存为.sh文件,使用root用户给执行权限,运行截图。 网上介绍的修改方式忽略了写入到硬件时钟,所以导致系统重启后修改失效。 有时候导入的kali机器时间不对,右键删除时间组件,重新添加到“任务栏”即可

ant-design-vue,表格树形数据父子关联选择完善

在线效果 组件使用 <a-table :columns="columns" :data-source="tabData" :row-selection="{selectedRowKeys: selectedRowKeys, onSelectAll: onSelectAll, onSelect: onSelect}" /> 混合封装 const mixinTableTreeSelect = { data() { return { tabData: [], selectedRowKeys: [] }; }, methods: { onSelectAll(selected) { if (selected) { const tabData = this.tabData; const arr = []; setVal(tabData, arr); this.selectedRowKeys = arr; } else { this.selectedRowKeys = []; } function setVal(list, arr) { list.forEach(v => { arr.push(v.key); if (v.children) { setVal(v.children, arr); } }); } }, onSelect(record, selected) { const set = new Set(this.

setlocale(LC_ALL,"") 中的 LC_* 是什么意思,以及 LANGUAGE/LANG 都是些啥?

这些都是个啥? 上面提到的种种,实际上都是 区域 设置相关的东西,因此今天我们所提到的东西都和区域有关。 首先 setlocale(...) 是啥? setLocale(...) 是C库中的一个设置地域化信息的C函数。 函数原型为: char *setlocale(int category, const char *locale) 参数解释: category – 这是一个已命名的常量,指定了受区域设置影响的函数类别,可以设置为以下值。 LC_ALL // 包括下面的所有选项。 LC_COLLATE // 字符串比较。参见 strcoll()。 LC_CTYPE // 字符分类和转换。例如 strtoupper()。 LC_MONETARY // 货币格式,针对 localeconv()。 LC_NUMERIC // 小数点分隔符,针对 localeconv()。 LC_TIME // 日期和时间格式,针对 strftime()。 LC_MESSAGES // 系统响应。 locale – 如果 locale是 NULL 或空字符串 "",则区域名称将根据环境变量值来设置,其名称与上述的类别名称相同。 一般程序遇到编码方面的问题,百度都会告诉你设置setlocale(LC_ALL,"")来解决,下面我们就了解一下这句代码做了什么. LC_ALL,LE_* 又是个啥? 实际上 LC_ALL,LE_* 是 区域 相关的环境变量。简而言之,LC_COLLATE,LC_TYPE等等都是环境变量。 很多程序的运行行为在全球不同的地域、语言环境中是不一样的,例如Linux 中的 date命令的行为就受LC_TIME的影响: $ LC_TIME=en_US.UTF-8 date Fri Oct 31 19:51:16 CST 2014 $ LC_TIME=fi_FI.

python处理excel合并

python处理excel合并 前言源码 前言 本篇博客是记录自己处理班级早起打卡,日常学习情况(数据来源与腾讯文档收集) 源码 import xlrd import xlwt import os """ xlrd操作: 1、常用单元格中的数据类型 ♦ 0. empty(空的),1 string(text), 2 number, 3 date, 4 boolean, 5 error, 6 blank(空白表格) 2、打开Excel文件读取数据 data = xlrd.open_workbook(filename)#文件名以及路径,如果路径或者文件名有中文给前面加一个r原生字符。 3、获取book中一个工作表 table = data.sheets()[0] #通过索引顺序获取 table = data.sheet_by_index(sheet_indx)) #通过索引顺序获取 table = data.sheet_by_name(sheet_name)#通过名称获取 以上三个函数都会返回一个xlrd.sheet.Sheet()对象 names = data.sheet_names() #返回book中所有工作表的名字 data.sheet_loaded(sheet_name or indx) # 检查某个sheet是否导入完毕 4、行的操作 nrows = table.nrows #获取该sheet中的有效行数 table.row(rowx) #返回由该行中所有的单元格对象组成的列表 table.row_slice(rowx) #返回由该列中所有的单元格对象组成的列表 table.row_types(rowx, start_colx=0, end_colx=None) #返回由该行中所有单元格的数据类型组成的列表 table.row_values(rowx, start_colx=0, end_colx=None) #返回由该行中所有单元格的数据组成的列表 table.

3D操作按钮(button)

3D操作 示例HTMLCSSJS 更多有趣示例 尽在 知屋安砖社区 示例 HTML <div class="threejs-help-overlay hidden"> <div class="threejs-help-overlay-close">x</div> <p><b>Rotate</b><br />Use the rotate buttons or left-click and drag.</p> <p><b>Move</b><br />Use the arrow buttons or right-click and drag.</p> <p><b>Zoom</b><br />Use the + and - buttons or pinch&#8209;to&#8209;zoom.</p> </div> <div class="threejs-btn-wrapper"> <button id="threejs-help" class="threejs-btn"><b>?</b></button> <button id="threejs-reset" class="threejs-btn">Reset</button> <div class="threejs-btn-group"> <button id="threejs-zoom-in" class="threejs-btn disabled">+</button> <button id="threejs-zoom-out" class="threejs-btn">-</button> </div> <div class="threejs-btn-group"> <button id="threejs-rotate-x" class="threejs-btn"> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="

离线更新glibc

更新glibc glibc是gnu发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎是其它任何运行库的基础。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能实现。最妥当的办法是更新系统,自带的glibc会随之更新,但提供的环境是固定并且离线的,只能离线更新。 极不推荐编译方式,因为还需对应Binutils、GMP、Gettext等等、,甚至还要更新GCC,虚拟机测试的时候没有能顺利成功。不要在运行中的系统上安装 glibc,尤其是生产服务器上,否则将会导致系统崩溃,至少应当将新 glibc 安装到其他的单独目录,以保证不覆盖当前正在使用的 glibc。 解决办法比较推荐的是离线安装包升级。CentOS 6系统中官方支持的最高glibc,因为没有官方支持,最后从fedora系统的搞到相关的rpm包。 提示glic 2.15缺失,只需要更新到最新的或者大于等于这个版本即可,更高的版本会包含之前的版本。el6 对应的CentOS 6,下面是搜索到的下载地址: http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-2.17-55.el6.x86_64.rpm http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-common-2.17-55.el6.x86_64.rpm http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-devel-2.17-55.el6.x86_64.rpm http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-headers-2.17-55.el6.x86_64.rpm 然后上传到服务器,进行安装。 rpm -Uvh glibc-2.14.1-6.x86_64.rpm glibc-common-2.14.1-6.x86_64.rpm glibc-headers-2.14.1-6.x86_64.rpm glibc-devel-2.14.1-6.x86_64.rpm 如果直接安装不行,需要进行强制安装。命令结尾加上参数--force --nodeps再进行安装。 RPM更新包 更新包 rpm -Uvh glibc-2.17-55.el6.x86_64.rpm glibc-common-2.17-55.el6.x86_64.rpm glibc-devel-2.17-55.el6.x86_64.rpm glibc-headers-2.17-55.el6.x86_64.rpm force --force --nodeps 安装一个包 rpm -ivh xx.rpm 升级一个包 rpm -Uvh xx.rpm 移走一个包 rpm -e xx.rpm 安装参数 –force 即使覆盖属于其它包文件也强制安装。 –nodeps 如果该RPM包的安装依赖其它包,即使其它包没装,也强制安装。 查询一个包是否被安装 rpm -q xx.rpm 包的信息 rpm -qi xx.rpm 列出包中有哪些文件 rpm -ql xx.rpm

c语言 关键字之typedef 详解

在C语言中有一个typedef关键字,其用来定义用户自定义类型。当然,并不是真的创造了一种数据类型,而是给已有的或者符合型的以及复杂的数据类型取一个我们自己更容易理解的别名。总之,可以使用typedef关键字定义一个我们自己的类型名称。 那么,究竟如何定义,又有哪些情况下可已使用呢?接下来我们就对它的几种用法进行说明: (1)基本数据类型定义 有些时候,我们会使用typedef关键字对一些基本数据类型进行重新定义。例如我们使用标准整数的数据类型uint8_t和uint16_t等时,其实他们的定义如下: typedef unsigned char uint8_t; //无符号8位数 typedef signed char int8_t; //有符号8位数 typedef unsigned int uint16_t; //无符号16位数 typedef signed int int16_t; //有符号16位数 typedef unsigned long uint32_t; //无符号32位数 typedef signed long int32_t; //有符号32位数 很显然就是使用了typedef关键字给既有数据类型分配了一个别名。当我们使用uint8_t时,就和使用unsigned char是一样的。如我们声明uint8_t var时,和使用unsigned char var是一回事。 (2)指针数据类型定义 有些时候我们也会使用typedef关键字定义指针数据类型,用以简化我们所使用的指针变量的声明。 例如:typedef int *pointer; 这样我们就定义了一个指针类型,当我们使用pointer p声明一个指针变量,就和使用int *p的含义是一样的。 上面是一个指针变量类型,可以演化出很多用法,如定义数组对象可以更明确。有时候,我们也定义指向二位数组行的指针,使用typedef关键字就可以使得操作更符合我们的常规认知。 例如: typedef int (*pointer)[N]; 这里pointer等价于 int (*)[N],当我们声明pointer p就相当于声明int (*a)[N]。同样的,如果我们对二维数组采用类似的定义。 例如:typedef int array[M][N]; 那它的含义与指针是类似的,如我们定义array a就是声明了一个M行N列的数组,此时使用p=a是可以的。 我们考虑到数组很多时候可以使用指针表示,所以将其放在一起讨论,而其它一些对象指针我们单独讨论。其实,不光是上述数组和指针可以使用typedef关键字定义别名,其它如:一维和多位数组,指针数组等都可以这样使用。 (3)用户对象类型定义 首先说明,这里说所的用户对象是指结构体、联合体以及枚举等用户定义的数据类型。我们可以使用typedef关键字给结构体等类型定义一个别名,这样我们客气在多个地方更方便的使用它。当然很多人对此有不同看法,这里不讨论,我们只是说有这种用法。 使用typedef关键字为结构体类型定义一个别名。 例如:typedef struct{ float setpoint; /*设定值*/

css3的transform属性详解

transform变形属性(主要讨论2D) css 3的transform属性可以修改css中可视化模型的坐标空间,元素通过transform属性进行移动(translate)、旋转(rotate)、缩放(scale)以及倾斜(skew) 注意:规范中有规定——如果元素的transform值不为none,则该元素会生成包含块的创建和层叠上下文 包含块的创建和层叠上下文会影响子元素的一些属性(这里我只是简单阐述一下概念,后期会更新一篇关于层叠上下文的文章): 举个例子——当一个元素所包含的子元素设置了 position:fixed;,而该元素的transform的值不为none时,那么该元素的子元素position:fixed;不再基于视口(viewport)进行定位,而是基于该元素进行定位,这就是涉及到层叠上下文了。 下面一起来看一下transform属性及其属性值: 首先语法:transform: < transform-function > [ < transform-function > ]* |none;属性值为none(默认)或者至少一个transform-function函数. 位移translate: 1、transform: translate(a,b);元素向x轴方向位移a的距离,向y轴的方向位移了 b的距离 transform:translate(10px,20px); 当transform: translate(a);里只有一个值时,它是向x轴位移a的距离, transform: translate(20px); 2、transform: translateX(a); | transform: translateY(a); 单独在x和y轴上进行位移a距离 transform: translateX(30%); transform: translateY(4em); 缩放scale 1、transform:scale(a,b);元素在x轴上缩放a倍,在y轴上缩放b倍(数值小于1为缩小,大于1为放大) transform: scale(0.5,2); 当transform: scale( );里的两个数值相同时,可以简写成一个,即transform: scale(a,a);写成transform: scale(a); transform: scale(0.5); 2、transform: scaleX(a); | transform: scaleY(a);元素单独在x轴和y轴上缩放 a倍。 transform:scaleX(0.7); transform: scaleY(1.3); 旋转rotatetransform: rotate(a)元素旋转的度数,一般单位为deg(角度),还有css 3中为我们新增加的角度属性: grad梯度(100grad=90deg) rad 弧度(一个圆有2π弧度,1.5707963rad=90deg) turn 圈(一个圆就是一圈,0.25turn=90deg) transform: rotate(60deg); 倾斜skew 1、transform: skew(a,b);元素在x轴倾斜a的角度,在y轴上倾斜b的角度,单位为deg

Office 2019快速安装

1. 下载office 部署工具ODT https://www.microsoft.com/download/details.aspx?id=49117 2. 解压这个ODT工具获得 setup和配置文件; configuration-Office2019Enterprise 3. 修改文件中 的路径 如果有自己的安装文件包或者授权序列号,修改xml配置文件就可以。 <Add SourcePath="\\Server\Share" OfficeClientEdition="64" Channel="PerpetualVL2019"> <Product ID="ProPlus2019Volume" PIDKEY="#####-#####-#####-#####-#####" > <Language ID="en-us" /> </Product> <Product ID="ProofingTools"> <Language ID="de-de" /> <Language ID="ja-jp" /> </Product> </Add> 4. 如果没有安装文件加,那就下载office2019文件,使用CMD 进入到 ODT解压路径,运行如下命令,因为安装文件有点大,所以需要等待。 setup /download configuration-Office2019Enterprise.xml 成功后,文件会下载到一个data目录 5. 开始安装office2019 setup /configure configuration-Office2019Enterprise.xml

javac -cp java-cp 看这篇就够了!

一、背景: 平时我们用javac 或者 java执行程序可能比较少,入门时候用到的也是简单的类,没有package或者没有依赖关系或者没有用其他.jar包的,所以执行起来没啥问题。在Algorithems Froth Edition中,经常要用命令行模式来Test 算法性能。 二、问题 在排序算法-初级排序算法这一章,执行java SortCompare Insertion Selection 1000 100就遇到问题:找不到外部.jar包或者找不到引用的类。网上答案大体表达清楚了意思,但是不够简洁,思路不够清晰。这里就用这个例子梳理一下。 先看下我的SortCompare包结构: └── com └── chm ├── algorithms │ ├── Example.java │ ├── Insertion.java │ ├── Selection.java │ └── SortCompare.java 我们目的是,流畅的执行以下命令 - javac SortCompare.java - java SotrCompare Insertion Selection 1000 100 - 介绍下类之间依赖关系,SortCompare是关键。 SortCompare.java的头部信息是这样的 package com.chm.algorithms; import edu.princeton.cs.algs4.StdOut; import edu.princeton.cs.algs4.StdRandom; import edu.princeton.cs.algs4.Stopwatch; 这表明SortCompare这个类用到了外部jar包(算法提供的基础包algs4.jar);同时该类直接调用了Insertion.sort()、Selection.sort()方法,Insertion.sort()和Selection.sort()调用了Example中封装好的方法。 一言以蔽之,他们都在com.chm.algorithms这个package下(最核心部分) 最终结果: 3288 0.9993866420331129 0.9998753497357498 For 1000 random Doubles Insertion is 1.0 times faster than Selection 如果你对javac cp 或者 java -cp 理解不透,那么过程自然不顺利,这里我们先结论先行:

PTA|《C语言程序设计实验与习题指导(第3版)》实验7-1-2 求最大值及其下标 (20分)

题目 本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。 输入格式: 输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。 输出格式: 在一行中输出最大值及最大值的最小下标,中间用一个空格分开。 输入样例: 6 2 8 10 1 9 10 输出样例: 10 2 AC代码 初始化index的值为0,输入值一样时,返回0; #include<stdio.h> int main(){ int n,max,num,index=0; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&num); if(i==0)max=num; if(num>max){ max=num; index=i; } } printf("%d %d",max,index); return 0; }

更优雅的HTTP请求方式

四个文件一篇文,一个工具一框架 工具:axios 框架:vue为例 四个文件 └─src ├─services // 目录 ├─ api.js // api管理 ├─ axios.js // axios请求 ├─ fetch.js // 二次封装 ├─ request.js // 请求方式管理 api.js 存放所有的接口请求axios.js 请求拦截处理fetch.js 对axios请求的二次封装request.js管理请求方式get post put delete… axios.js import axios from 'axios' import { getToken } from '@/utils/token' // axios baseURL axios.defaults.baseURL = process.env.VUE_APP_BASE_API const instance = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // 实例 baseURL timeout: 6000 }) instance.interceptors.request.use(config => { const token = getToken() token && (config.

IntelliJ IDEA 如何修改tomcat服务器的发布路径

在没有设置的情况下,IDEA并不会把项目发布到Tomcat的webapps目录下,也不会自动部署到webapps目录,我们要修改这个路径。 配图说明:创建的是maven的web项目 1. 首先关闭tomcat服务器,进行配置 2. 3.找到tomcat安装目录下的webapps的路径,选择webapps目录之后,最后推荐在其目录下创建子目录,取名为项目名 -- maven_web 4. 5. 重新启动服务器,所有的资源文件都部署到该文件目录下了。 完成~ QQ:2248745948 微信:HHgood

Kali修改时间

前提 要以root身份运行命令。如何切换root身份在https://blog.csdn.net/helloworlddm/article/details/104547808有讲解。 使用的命令 # echo "export TZ='Asia/Shanghai'" >> /etc/profile # cat /etc/profile |grep TZ # source /etc/profile # date -R # date 图示

Python-求字典中的最值

已知一个包含一些同学成绩的字典,现在需要计算所有成绩的最高分、最低分、平均分,并查找所有最高分的同学。 例如 scores={“zhang San”:45,“Wang Wu”:40,“Zhou liu”:96,“Zhao Qi”:65,“Sun Ba”:90……} 代码: scores={“zhang San”:45,“Wang Wu”:40,“Zhou liu”:96,“Zhao Qi”:65,“Sun Ba”:90} a = max(scores,key = lambda x:scores[x]) a1 = max(scores.values()) b = min(scores,key = lambda x:scores[x]) b1 = min(scores.values()) c = scores.values() sum = 0 for num in c: sum = sum + num print(‘平均值为:’,sum/len©) print(‘成绩最高分为:’,a1,‘获得最高分同学为:’,a) print(‘成绩最低分为:’,b1,‘获得最低分同学为:’,b) 运行结果:

C++ 20 Concept 语法

requires expression 一种表达式,它很像一个lambda表达式,一个未命名元函数。例如: requires(int a,int b){ a+b;} 其中:()部分是参数列表,{ }部分是需求列表。这个表达式是在编译期求值的,表达式的结果是true或者false。它的工作机制是:对于{ }内的若干条语句检查可行性,如果都能通过,则本条requires expression的值为true。在本例中,a+b;是提出了需求,即:有关两个int要求能相加。显然是满足的。则本例的表达式值为true。 int main(){ static_assert( requires(int a,int b){ a+b;} ); } 这个静态断言,证明了此种表示式是编译期求值的特性。 int main(){ static_assert( requires{ false; } ); //断言仍正确 } 上述语句,可以看出()部分是可选的,因此可省略。{ }部分中false;这个表达式是可行的,记住我们不关心被检查的表达式的结果,只关心它是否可行。{ }中是列举需求的,我们有四种需求描述方法:1)简单需求 2)类型需求 3)复杂需求 4)嵌套需求。 前文的a+b就是个简单需求。另外一个简单需求例子: int main(){ static_assert( requires{ new int; } ); //OK } 而当我们不但要检查表达式是否可行,还要检查表达式是否抛例外,需要用到复杂需求形式。可以像这样写: int main(){ static_assert( requires{ (new int) noexcept; ); //ERROR } 显然,new int是抛例外的,我们却需求不跑例外,需求不满足,requires表达式求值为false,则静态断言失败。 当我们需要表达式的值的类型符合某种要求时,这样写: #include <type_traits> int main(){ static_assert( requires{ {new int} -> std::same_as<int*>; } ); } 下一个是类型需求(Type Requirement)的例子

高速数字信号线上添加33欧电阻的作用

高速数字信号线上添加33欧电阻的作用 一,作用 用来做阻抗匹配,防止信号反射的。一般PCB走线控制为50欧姆,在这样接收端高阻的情况时,可以通过源端串联50欧姆来做匹配, 将终端反射回来的信号吸收,防止在源端再次发生发射。这边33欧,和信号驱动的内阻(大约20欧)串联成50欧,与PCB走线匹配。 所以这个电阻在PCB上的位置要和信号驱动端靠近。 二,如何使用 要不要做匹配就取决于信号的速度和走线长度,规则一般是走线长度大于信号波长的1/10就要匹配了,50M的时钟最好是接一下了, 不然会看到明显的过冲。 NOTE: 此电阻需要与信号驱动端靠近布线 三,实例理论演算 假设波长为 b , C = (3 x 10 ^8)米/秒,则有公式fb = C , f 为频率。 例如RGMII 时钟信号为50MHz,则根据上面的公式可以推导出波长b b = c / (50M) = 30 / 5 米= 6米 所以超过 6米x 0.1 = 60cm 时需要添加反射电阻 由此可见,理论上应该只要不是板特别大,或者信号频率特别高,应该就不需要什么反射电阻,低频的信号基本可以不考虑。

傅里叶分析第二辑(一维声音信号和二维图像信号)

信号可定义为一个传载信息的函数。根据信号的特点,可表示为一个或几个独立变量的函数,例如图像信号就是空间位置(二维变量)的亮度函数,一维信号的变量可以是时间,也可以是频率、空间或其他物理量,但习惯上看成是时间。信号的幅度和时间可以取连续值,也可以取离散值,于是信号可分为以下几种: 1、连续的时间信号:在连续时间范围内定义的信号。信号的幅值可以是连续的,也可以是离散的。在幅值连续的特定情况下又常称为模拟信号,实际上,连续时间信号与模拟信号常常通用,用来说明同一信号。 2、离散时间信号:时间为离散变量,而幅值是连续变化的信号。 3、数字信号:时间和幅值都离散化的信号。

Halcon Opencv 数据的不同

1、基本数据类型 halcon 只具备 两种数据类型 HTuple (tuple) 、HObject (object)。 对于基本数据的处理应用 HTuple 类型存储与计算。数组、字符串、数字、均可使用。 对于图形数据,多通道图、单通道图、二值化图均需使用 HObject 的类型。字母 H 是 halcon 在 c++ 中的嵌入类型前缀。 opencv 具备多种类型,Point,Mat, Point2f, Vec4i, Vec3b等等。但均是基本数据的多种组合体现。 图像数据就是像素点的集合,常用Mat类型存储。数据分为头部、数据部。进行数据拷贝时,请考虑头部信息、数据信息的拷贝,即为深拷贝、浅拷贝。 2、操作形式 在这里操作形式,只说明图像数据的操作。 halcon 对于 图像的处理的基本数据 应称作 region。而opencv的图形处理基本数据 是 Point。 region 应该怎么理解。 借用 opencv 来理解会更好的理解。region 可以理解为点的集合形成的连通域。 图解如下 以函数用法解释,对于两区域相交,求相交面积中心点 对于halcon而言, Intersection(region1,region2,result); AreaCenter(result,area,row,col); 只具备点这个概念,但不具备点这个形式。 对于opencv而言, Mat c = mata.mul(matb); connectedComponentsWithStats(img, labels, stats, centroids); //亦可以通过轮廓来确定。 不仅具备点这个概念,同样具备点这个形式,并且基础的数据形式为点。 region是不可以直接访问像素点数据的,所以region就已经是一个基本数据了。 Mat 是可以再往下访问的,是可以直接访问像素点数据的。可以通过直接像素点数据,进行数据的修改的。但 region 是不允许直接修改的,需要先拆分出数据地址,然后根据地址找到数据。 所以在操作时,请注意操作基础。主要区别是数据的操作基础,对于问题的解决方法上并没有不同,都是一种图形处理工具,主要看怎么用。 3、数据存储 对于数据存储,是具备共通性的。Mat 具备头部与数据部分,也就是图像配置信息与数据信息,同样在Object中存在。 数据的存储方式,基本都是 地址加长度 。unsigned char _char; _char 申请数据内存地址,unsigned char 提供数据占用长度。对于指针,也就是在内存中不是直接存储的数据,而是存储的指向直接保存数据的地址,根据这个地址跳转到数据存储地址。对于强类型语言均适用。

C语言再学习24——__attribute__ (at())地址定位

前言: 为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。 1. __ attribute __((at)) 绝对定位 __ attribute __( at(绝对地址) )的作用: (1)绝对定位到 Flash; (2)绝对定位到 RAM。 __ attribute __ :用来指定变量或结构位域的特殊属性,关键字后的双括弧中的内容是属性说明; at:用来设置变量的绝对地址,指定某个变量处于内存或 FLASH 里面的某个给定的地址。 1.1 定位到 FLASH 定位到 flash 中,常用于固化信息,例如:设备的出厂信息,FLASH 标记等; const uint8_t usFlashInitVal[] __attribute__((at(0x00030000))) = {0x11,0x22,0x33,0x44,0x55,0x66};//定位在flash中,0x00030000开始的6个字节信息固定 1.2 定位到 RAM 常用于数据量较大的缓存,如:串口接收数据。也用于某个位置的特定变量。 uint8_t ucUsartRecvBuffer[USART_RECV_LEN] __attribute__ ((at(0x00025000))); //接收缓冲,最大USART_RECV_LEN个字节,起始地址为 0x00025000 注: 绝对定位不能在函数中定义,局部变量是定义在栈区,栈区是自动分配、释放,不能定义为绝对地址,只能于函数外定义; 定义的长度不能超过栈或 Flash 的大小,否则导致栈、Flash 溢出。 1.3 测试 比如:在 0x08010000 的 flash 地址上固定写入数据,如下图: 如果不加 const 修饰,则定位到了 RAM 。 编译出来各部分文件大小: 打开编译出来二进制文件,如下图: 最后,我们来看一下加与不加 const uint8_t ucaSysFlashVal[] attribute((at(0x08010000))) =

VS Code 使用 rubocop 进行 ruby-rails 代码检查

前段时间有个日本项目使用 Ruby on rails,因为习惯我 IDE 用的 VS Code,代码检查插件自然是要选择 ruby-rubocop 了。 可是该插件的 about 写得比较笼统,在网上看了一圈没找到这个插件是怎么使用的。摸索了一番,记之以文。 写在前面 ruby-rubocop 是使用 rubocop(ruby 的代码风格检查器)输出的消息,转换到你在 VS Code 中编辑的每行代码上。 其官方介绍原话是“This extension provides interfaces to rubocop for vscode”(这个扩展程序为 rubocop 提供了 VS Code 的接口) 所以,我们要做的第一件事是让你的代码可以使用 rubocop 进行检查,这需要安装 ruby 环境。然后要将 rubocop 与 ruby-rubocop 关联起来。 前提 - 软件安装 安装 VS Code 插件 Rubyruby-rubocop Windows 安装 ruby 运行环境 ruby 运行环境,windows 安装 Ruby 教程。安装时 cmd 选择 3 rubocop 及其依赖安装 cmd 命令行执行 gem install rubocopgem install rubocop-railsgem install rubocop-performancegem install rubocop-thread_safety 安装好 rubocop 后,你就可以在命令行定位到项目目录下,输入 rubocop 来运行 rubocop 进行代码检查了。

LeetCode:300 最长上升子序列 (最优方法是:动态规划 + 二分法)

第一种简单粗暴地解法: 递归求解 状态转移方程,属于Up-Down方法,因为子问题的重复求解,导致时间复杂度O(2^n) 一个语法点:想用全局变量,可以直接设置类的成员变量,不应该像 java 那样用 static 静态变量!这一点很容易被忽视! class Solution { private: int max; int f(vector<int>& nums, int n) { if(n < 1) return n; int temp = 0, maxCurEnd = 1; for(int i = 1; i < n; i++) { temp = f(nums, i); if(nums[i-1] < nums[n-1] && temp+1 > maxCurEnd) { maxCurEnd = temp + 1; } } if(max < maxCurEnd) { max = maxCurEnd; } return maxCurEnd; } public: int lengthOfLIS(vector<int>& nums) { if(nums.

淘宝双11大数据分析(Hive 分析篇-下)

文章目录 前言当前环境创建一个临时表将 user_log 表中的数据插入到 inner_user_log使用 Sqoop 迁移数据MySQL 中的准备导入数据 MySQL 中查看数据是否已经导入 前言 本篇主要是数据迁移,使用 Sqoop 把 Hive 中的数据迁移到 MySQL 中。 阅读此篇文章,需要先阅读前篇: 淘宝双11大数据分析(环境篇)淘宝双11大数据分析(数据准备篇)淘宝双11大数据分析(Hive 分析篇-上) 当前环境 安装好了 Hive 、MySQL 和 Sqoop 。启动 Hive 使用 jps 命令查看当前服务: [root@centos2020 dataset]# jps 12707 RunJar 7876 NameNode 8183 ResourceManager 7930 DataNode 8477 NodeManager 17086 Jps 创建一个临时表 hive> create table dbtaobao.inner_user_log(user_id INT,item_id INT,cat_id INT,merchant_id INT,brand_id INT,month STRING,day STRING,action INT,age_range INT,gender INT,province STRING) COMMENT 'Welcome to XMU dblab! Now create inner table inner_user_log ' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE; OK Time taken: 0.

淘宝双11大数据分析(Hive 分析篇-上)

文章目录 前言当前环境用聚合函数 count() 计算出表内有多少条数据查出 user_id 不重复的数据的条数查询不重复的数据有多少条(为了排除客户刷单的情况)关键字条件查询分析查询双11那天有多少人购买了商品求当天购买的此品牌商品的数量 根据用户行为分析查询一件商品在某天的购买比例或浏览比例查询双11那天,男女买家购买商品的比例给定购买商品的数量范围,查询某一天在该网站的购买该数量商品的用户id 用户实时查询分析 前言 阅读此篇文章,需要先阅读前篇: 淘宝双11大数据分析(环境篇)淘宝双11大数据分析(数据准备篇) 当前环境 使用 jps 查看当前启动的服务:(其中 Master 和 Worker是 Spark 的服务,不本篇无关) [root@centos2020 dataset]# jps 11408 Master 12707 RunJar 7876 NameNode 8183 ResourceManager 7930 DataNode 8477 NodeManager 11550 Worker 12990 Jps 另外,本篇需要先启动 mysql ,hive服务(启动步骤请参考:淘宝双11大数据分析(数据准备篇))。 用聚合函数 count() 计算出表内有多少条数据 hive> select count(*) from user_log; 执行过程和结果(文章篇幅原因,后边的运行只展示结果,不展示过程): WARNING: Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.

bond接口参数配置

Bond接口最简化的创建命令如下,任何参数都使用默认: ip link add bond1 type bond 或者: ip link add type bond 由内核决定接口名称,格式为:bond%d。 以上命令,创建的bond1设备,默认参数可使用如下命令查看。 $ ip -d link show dev bond1 5: bond1: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 8e:cf:e6:a3:de:82 brd ff:ff:ff:ff:ff:ff promiscuity 0 bond mode balance-rr miimon 0 updelay 0 downdelay 0 use_carrier 1 arp_interval 0 arp_validate none arp_all_targets any primary_reselect always fail_over_mac none xmit_hash_policy layer2 resend_igmp 1 num_grat_arp 1 all_slaves_active 0 min_links 0 lp_interval 1 packets_per_slave 1 lacp_rate slow ad_select stable tlb_dynamic_lb 1 addrgenmode eui64 numtxqueues 16 numrxqueues 16 gso_max_size 65536 gso_max_segs 65535 参数mode 由内核中函数bond_check_params可知,如果不指定模式mode参数,默认情况下为BOND_MODE_ROUNDROBIN,即以上显示的balance-rr。

【VScode】C语言环境配置填坑 | 报错:no iconv implementation | unrecognized command line option “-std=c++11

网上同志们的流程 1.安装MinGw 2.配置环境变量 3.csvode中下载cpp插件 4.按f5配置launch.json { "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "preLaunchTask": "Build", "type": "cppdbg", "request": "launch", "targetArchitecture": "x86_64", "program": "${fileDirname}/${fileBasenameNoExtension}.exe", "miDebuggerPath": "c:\\MinGW\\bin\\gdb.exe",(同志!这里改你的路径,不能用我的路径) "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ] } ] } 5.配置tasks.json { "version": "2.0.0", "tasks": [ { "label": "build", "type": "shell", "group": { "kind": "

STM32进入Standby模式并唤醒

项目背景 设备具备电池、电源适配器两种供电方式,实现出厂(和电池一并密封装盒)时最低功耗(即进入待机模式),到用户开始使用时需要手动磁棒唤醒,开始复位运行。在检测到设备是交流供电时,设备全速运行;检测到是电池供电时,定时采集数据,采集完毕进入停止模式,定时器唤醒等待下次数据采集。(stm32f103ret6) 备注:本节只记录待机模式的进入和唤醒,停止模式的实现方式见STM32进入STOP模式并唤醒实验总结 用待机模式的理由及与停止模式的区别 选用待机模式 设备出厂,电池装在电路板上,封闭在模具当中,在到用户开始使用之前,必须保持最低功耗。停止模式下CPU电流消耗在20uA左右,而待机模式的电流消耗只有2uA。 和停止模式的区别 因为SRAM和寄存器的内容会保存,即PC指针能记录程序当前运行的位置,从停止模式唤醒时,能继续沿着当时进入停止模式处继续往下运行。(故运行时,设备检测到是电池供电时,选用停止模式:采集完数据进入停止模式,2小时后(根据需求自定义)定时唤醒采集,依此循环) SRAM和寄存器内容不会保存,即待机模式唤醒相当于系统复位,从头运行(设备测试完成,整机入库时,通过外部按键等方式触发进入待机模式) 待机模式实现 进入待机模式三个步骤说明: 1.将系统控制寄存器第二位置1,当进入深度睡眠时,允许停止系统时钟(系统控制寄存器参考《Cortex-M3权威指南》) 2.使能PWR_CR的PDDS位,使得深度休眠时进入待机模式 3.清除WUF唤醒标志(WUF标志由硬件置位,当系统是WKUP唤醒复位而不是上电等复位时会置位。应用中可以用来读取PWR_CSR的WUF位是否为1来判断系统复位是不是待机唤醒) 4. 以上三个步骤由库函数PWR_EnterSTANDBYMode()实现 进入待机模式 void Standby_Entering(void) { RCC_APB2PeriphResetCmd(0x01fc, DISABLE); //准备进入待机模式,复位所有IO,降低功耗(参照手册,根据需要复位对应IO) RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//需要配置电源控制寄存器,所以使能时钟,否则不能正常使用命令进入待机状态和唤醒 PWR_WakeUpPinCmd(ENABLE); //使能WKUP引脚唤醒功能,否则WKUP引脚上升沿不能唤醒 PWR_EnterSTANDBYMode(); //进入待机模式 } void Standby_Configure(void) { GPIO_InitTypeDef GPIO_InitStructure; //EXTI_InitTypeDef EXTI_InitStructure; //NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(WAKEUP_PORT, &GPIO_InitStructure); /*如果PA0只是用于唤醒,这部分可以不要,唤醒不是中断,中断控制器已经停止工作,如果正常模式下需要用到,可根据需要添加,这时候是中断事件 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; NVIC_InitStructure.

面试吹牛用:Mybatis 中用到的 9 种设计模式!

点击上方蓝色字体,选择“标星公众号” 优质文章,第一时间送达 上一篇:这300G的Java资料是我师傅当年给我的,免费分享给大家(已修复) 下一篇:昨天分享资料不小心把百度网盘深处的秘密泄露了(已修复) 作者:叶修之秋 来源:juejin.im/post/5d01f0e4f265da1bc23f726a 虽然我们都知道有23个设计模式,但是大多停留在概念层面,真实开发中很少遇到。Mybatis源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应用,能够更深入的理解设计模式。 Mybatis至少遇到了以下的设计模式的使用: 1、Builder模式,例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder; 2、工厂模式,例如SqlSessionFactory、ObjectFactory、MapperProxyFactory; 3、单例模式,例如ErrorContext和LogFactory; 4、代理模式,Mybatis实现的核心,比如MapperProxy、ConnectionLogger,用的jdk的动态代理;还有executor.loader包使用了cglib或者javassist达到延迟加载的效果; 5、组合模式,例如SqlNode和各个子类ChooseSqlNode等; 6、模板方法模式,例如BaseExecutor和SimpleExecutor,还有BaseTypeHandler和所有的子类例如IntegerTypeHandler; 7、适配器模式,例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现; 8、装饰者模式,例如Cache包中的cache.decorators子包中等各个装饰者的实现; 9、迭代器模式,例如迭代器模式PropertyTokenizer; 接下来挨个模式进行解读,先介绍模式自身的知识,然后解读在Mybatis中怎样应用了该模式。 1、Builder模式 Builder模式的定义是“将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。”,它属于创建类模式。 一般来说,如果一个对象的构建比较复杂,超出了构造函数所能包含的范围,就可以使用工厂模式和Builder模式。 相对于工厂模式会产出一个完整的产品,Builder应用于更加复杂的对象的构建,甚至只会构建产品的一个部分。 在Mybatis环境的初始化过程中,SqlSessionFactoryBuilder会调用XMLConfigBuilder读取所有的MybatisMapConfig.xml和所有的*Mapper.xml文件,构建Mybatis运行的核心对象Configuration对象,然后将该Configuration对象作为参数构建一个SqlSessionFactory对象。 其中XMLConfigBuilder在构建Configuration对象时,也会调用XMLMapperBuilder用于读取*Mapper文件,而XMLMapperBuilder会使用XMLStatementBuilder来读取和build所有的SQL语句。 在这个过程中,有一个相似的特点,就是这些Builder会读取文件或者配置,然后做大量的XpathParser解析、配置或语法的解析、反射生成对象、存入结果缓存等步骤,这么多的工作都不是一个构造函数所能包括的,因此大量采用了Builder模式来解决。 对于builder的具体类,方法都大都用build*开头,比如SqlSessionFactoryBuilder为例,它包含以下方法: 即根据不同的输入参数来构建SqlSessionFactory这个工厂对象。 2、工厂模式 在Mybatis中比如SqlSessionFactory使用的是工厂模式,该工厂没有那么复杂的逻辑,是一个简单工厂模式。 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。 在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。 SqlSession可以认为是一个Mybatis工作的核心的接口,通过这个接口可以执行执行SQL语句、获取Mappers、管理事务。类似于连接MySQL的Connection对象。 可以看到,该Factory的openSession方法重载了很多个,分别支持autoCommit、Executor、Transaction等参数的输入,来构建核心的SqlSession对象。 在DefaultSqlSessionFactory的默认工厂实现里,有一个方法可以看出工厂怎么产出一个产品: 这是一个openSession调用的底层方法,该方法先从configuration读取对应的环境配置,然后初始化TransactionFactory获得一个Transaction对象 然后通过Transaction获取一个Executor对象,最后通过configuration、Executor、是否autoCommit三个参数构建了SqlSession。 在这里其实也可以看到端倪,SqlSession的执行,其实是委托给对应的Executor来进行的。 而对于LogFactory,它的实现代码: 这里有个特别的地方,Log变量的的类型是Constructorextends Log> 也就是说该工厂生产的不只是一个产品,而是具有Log公共接口的一系列产品,比如Log4jImpl、Slf4jImpl等很多具体的Log。 3、单例模式 单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。 单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。 单例模式是一种对象创建型模式,单例模式又名单件模式或单态模式。 在Mybatis中有两个地方用到单例模式,ErrorContext和LogFactory,其中ErrorContext是用在每个线程范围内的单例,用于记录该线程的执行环境错误信息 而LogFactory则是提供给整个Mybatis使用的日志工厂,用于获得针对项目配置好的日志对象。 ErrorContext的单例实现代码: 构造函数是private修饰,具有一个static的局部instance变量和一个获取instance变量的方法,在获取实例的方法中,先判断是否为空如果是的话就先创建,然后返回构造好的对象。 只是这里有个有趣的地方是,LOCAL的静态实例变量使用了ThreadLocal修饰,也就是说它属于每个线程各自的数据,而在instance()方法中,先获取本线程的该实例,如果没有就创建该线程独有的ErrorContext。 4、代理模式 代理模式可以认为是Mybatis的核心使用的模式,正是由于这个模式,我们只需要编写Mapper.java接口,不需要实现,由Mybatis后台帮我们完成具体SQL的执行。 代理模式(Proxy Pattern) :给某一个对象提供一个代 理,并由代理对象控制对原对象的引用。代理模式的英 文叫做Proxy或Surrogate,它是一种对象结构型模式。 代理模式包含如下角色: Subject: 抽象主题角色 Proxy: 代理主题角色 RealSubject: 真实主题角色

逻辑电路中的三态门

什么是三态门 三态门即有三种可能的输出:0 1 z z是指输出为高阻态 z意味着输出与输入之间是断开的 三态们的输入与输出想一个开关断开一样 请看下图可仔细了解 还可以有其他类型的三态门 如下图是一个低电平使能的三态门和上面的真值表取值刚好相反 高电平使能输出反向的三态门如下:

js数组与字符串的相互转换方法

1、数组转字符串 需要将数组元素用某个字符连接成字符串,示例代码如下: var arr = new Array(1,2,3,4); var str = arr.join(","); //str = "1,2,3,4" 2、字符串转数组 将字符串按某个字符切割成若干个字符串,并以数组形式返回,示例代码如下: var str = "a,b,c"; var arr = str.split(",");// 在每个逗号(,)处进行分解 ["a", "b", "c"] 另 var str = "hello"; var arr = str.split(''); //得到["h", "e", "l", "l", "o"]

webdriver.Chrome参数解释

通过源码看解释 最直接最不讲道理的方式就是看源码,使用之前一定要学会看说明书。 打算使用jupyter演示的,但是jupyter不支持看源码,所以使用Pycharm吧。 from selenium import webdriver Broswer = webdriver.Chrome(executable_path="chromedriver", port=0, options=None, service_args=None, desired_capabilities=None, service_log_path=None, chrome_options=None, keep_alive=True) print(webdriver.Chrome.__doc__) """ Controls the ChromeDriver and allows you to drive the browser. You will need to download the ChromeDriver executable from http://chromedriver.storage.googleapis.com/index.html """ print(webdriver.Chrome.__init__.__doc__) """ Creates a new instance of the chrome driver. Starts the service and then creates new instance of chrome driver. :Args: - executable_path - path to the executable. If the default is used it assumes the executable is in the $PATH - port - port you would like the service to run, if left as 0, a free port will be found.

CSS元素居中的方式有哪些?

简介:让元素居中的方法有很多,接下来我为大家介绍在css当中基础的3种方法 第一种方法(针对于文字的): a、先用display-block把子元素转换成块元素。 b、再给子元素加上text-align: center;让它在水平方向居中。 c、最后调整“内容”的行高line-height和父元素的高度一致。让它垂直方向居中。 第二种方法针对于元素在浏览器的居中,一般用在banner图上面(要用到定位) a、给父元素添加position: relative;让它线成为参照物 b、给子元素添加 position:fixed; left:50%; top:50%; 这一步的目的是让子元素分别向右边和下面移动50%,从而使子元素的顶部和右边和父元素的水平中心线、垂直中心线对齐。 c、最后再用margin调整子元素的位置即可,给子元素加上margin:-高度的一半 0 0 -宽度的一半;(top和left值为负数就行了) 优点:这种居中的方式可以跨浏览器使用 - 第三种方法(要用到定位) a、给父元素添加position: relative;让它线成为参照物 b、给子元素添加 position:fixed; top: 0;right: 0; bottom: 0;left: 0; margin: auto; 第四种方法(弹性布局) a、设置一个盒子为flexbox b、给这个盒子(也就是父元素)添加display:flex c、给父元素添加水平居中justify-content: center; d、给父元素添加垂直居中align-items: center; 第五种方法(2D的变换) 简要说明:让子元素在父元素中沿着x、y两个轴进行移动 移动的距离,公式如下(父元素的宽高-子元素的宽高)/2 这是常见的五种方式,如果还有其他的希望大家在评论区补充,谢谢!

sigmoid函数原理及饱和后梯度消失的问题

sigmoid函数原理及饱和后梯度消失的问题 sigmoid函数结构 sigmoid函数,是神经网络中的一种激活函数,其输出范围在(0,1)之间。主要运动于: 1、 作为激活函数,利用输出范围(0,1)与其非线性的特点,常用于在神经网络中间层作为激活函数; 2、在神经网络的最后一层将结果规则化在(0,1)之间。 sigmoid函数饱和带来的问题 1、 梯度消失 一种解决方法是在sigmoid层之前加入Batch Normalization层,即进行批规范化处理(BN),就是对每个神经元的输出进行规范化,使得均值为 0,方差为 1,之后再进入激活函数。但是每一层规范化后,输出就以极大的概率落在靠近中心的区间,这个区域sigmoid的梯度变化很大,也就不存在梯度消失的问题,但是又比较笔直,近似于线性。于是BN引入了新的参数进行学习,对规范化后的输出做一次线性映射,同时对参数进行学习,提高输出落在非线性区间的概率, 使得sigmoid 函数梯度小和线性表达之间做了一个平衡。

Java线程池原理分析

并发包 (计数器)CountDownLatch CountDownLatch 类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。 public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(2); new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + ",子线程开始执行..."); countDownLatch.countDown(); System.out.println(Thread.currentThread().getName() + ",子线程结束执行..."); } }).start(); new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + ",子线程开始执行..."); countDownLatch.countDown();//计数器值每次减去1 System.out.println(Thread.currentThread().getName() + ",子线程结束执行..."); } }).start(); countDownLatch.await();// 減去为0,恢复任务继续执行 System.out.println("两个子线程执行完毕...."); System.out.println("主线程继续执行....."); for (int i = 0; i <10; i++) { System.out.println("main,i:"+i); } } (屏障)CyclicBarrier

利用深度优先搜索(dfs)来解决迷宫问题

利用深度优先搜索(dfs)来解决迷宫问题 一.深度优先搜索(dfs) 1.什么叫dfs 深度优先搜索类似于树的先序遍历; 是利用栈或者递归的方式实现的,体现出了后进先出的特点; 通俗来说就是一次访问一条路,一直朝着一个方向探索,直到遇到死路退回到前一个分支,继续探索; 一般来说,深度搜索解决的问题主要为寻求所有解和连通性。 2.遍历过程 (1)从图中某个初始顶点v出发,首先访问初始顶点v。 (2)然后依次从v的未被访问的邻接点w,再从w出发进行深度优先遍历,直到图中所有与v有路径相通的的顶点都被访问过为止。 3.算法设计 解决问题: (1)如何确定一个顶点是否访问过? 设置一个visited[]全局数组, visited[i]=0表示顶点i没有访问; visited[i]=1表示顶点i已经访问过。 (在图中也可以修改图本身来实现) 4.dfs算法模板 void dfs(int s) { if(找到解了) { 相应的操作; return ; } 尝试每一种可能 { if(满足条件) { 标记走过; 进行下一步dfs; 回溯一步; //恢复原状态 } } } 二.例题示范 棋盘问题 (1)问题描述: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。 (2)输入: 输入含有多组测试数据。 每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n 当为-1 -1时表示输入结束。 随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。 (3)输出: 对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。 (4)样例输入: 2 1 #. .#

GitLab服务器搭建以及汉化过程

Gitlab简介 GitLab是利用Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。 与Github类似,GitLab能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。 它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。 Gitlab环境部署 ECS配置要求:内存2G以上 下载软件包 国内镜像地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/?C=M&O=D [root@taoweidong ~]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.6.7-ce.0.el7.x86_64.rpm 安装gitLab [root@taoweidong ~]# rpm -i gitlab-ce-12.6.7-ce.0.el7.x86_64.rpm 修改gitlab配置文件指定服务器ip和自定义端口 [root@taoweidong ~]# vi /etc/gitlab/gitlab.rb 重启gitLab 检查8080端口是否被占用,如果已经被使用需要修改unicon的端口 # 检查端口是否被占用 netstat -anp |grep 端口号 [root@taoweidong ~]# gitlab-ctl reconfigure 重新加载配置文件(耗时较长) [root@taoweidong ~]# gitlab-ctl restart 重新启动 访问:http://192.168.88.128:8888 第一次访问时的页面 这里是让你修改登录密码的地方,输入新密码并且保存后会跳转到登录页面 登录页面 账户为:root 密码为:上一个页面修改后的密码 登录后会进入主页面,如下图 能进入这里,说明gitLab服务安装成功 中文配置 高版本的gitLab已经支持中文,可以在设置页面进行设置,进入主页面后 选择中文简体,点击保存后刷新页面即可切换为中文。 服务器生成SSH-Key密钥文件 [root@taoweidong ~]# ssh-keygen 查询SSH-key秘钥 配置SSH-key秘钥 使用教程 参考:https://www.cnblogs.com/niuben/p/10867877.html 参考 gitlab访问错误Whoops问题处理:https://blog.csdn.net/weixin_40816738/article/details/90551565 安装指南:https://blog.csdn.net/qq_34129814/article/details/100043914 GitLab简介:https://www.cnblogs.com/niuben/p/10867877.html

Java 多线程之间实现通讯

多线程之间如何实现通讯 什么是多线程之间通讯? 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。 画图演示 多线程之间通讯需求 需求:第一个线程写入(input)用户,另一个线程取读取(out)用户.实现读一个,写一个操作。 代码实现基本实现 共享资源源实体类 class Res { public String userSex; public String userName; } 输入线程资源 class IntThrad extends Thread { private Res res; public IntThrad(Res res) { this.res = res; } @Override public void run() { int count = 0; while (true) { if (count == 0) { res.userName = "余胜军"; res.userSex = "男"; } else { res.userName = "小紅"; res.userSex = "女"; } count = (count + 1) % 2; } } } 输出线程

[LeetCode 299,303][简单]猜数字游戏/区域和检索 - 数组不可变

299.猜数字游戏 题目链接 class Solution { public: string getHint(string secret, string guess) { ios::sync_with_stdio(0); cin.tie(0); int a[10]={0},b[10]={0}; int acnt=0,bcnt=0; int sl = secret.size(); for(int i = 1; i <= sl;i++){ if(secret[sl-i]==guess[sl-i])acnt++; else{ a[secret[sl-i]-'0']++; b[guess[sl-i]-'0']++; } } for(int i=0;i<10;i++)bcnt+=min(a[i],b[i]); return to_string(acnt)+"A"+to_string(bcnt)+"B"; } }; 303.区域和检索 - 数组不可变 题目链接 差分前缀和 class NumArray { private: vector<int>sum; public: NumArray(vector<int>& nums) { ios::sync_with_stdio(0); cin.tie(0);int flag = 0; sum.emplace_back(0); for(int i:nums){ flag += i; sum.emplace_back(flag); } } int sumRange(int i, int j) { return sum[j+1]-sum[i]; } };