lua脚本在redis集群中执行报错--Lua script attempted to access a non local key in a cluster node...

EVAL、EVALSHA命令 Redis从2.6.0版本开始提供了eval命令,通过内置的Lua解释器,可以让用户执行一段Lua脚本并返回数据。因为Redis单线程模型的特点,可以保证多个命令的原子性(因为最近的项目需要用到简单的分布式锁,所以会用到lua来释放锁) 脚本性能 Redis保证了脚本执行的原子性,所以在当前脚本没执行完之前,别的命令和脚本都是等待状态,所以一定要控制好脚本中的内容,防止出现需要消耗大量时间的内容(逻辑相对简单)。 带宽优化 为了避免每次执行都重复的将Lua脚本内容发送,Redis提供了evalsha命令,只需要将Lua脚本内容的SHA1校验和发送即可(evalsha 6b1bf486c81ceb7edf3c093f4c48582e38c0e791 0)。Lua脚本中的变量(动态数据)请使用KEYS和ARGV获取,如果把变量放在脚本中,必然会导致每次的脚本内容都不同(SHA1),Redis缓存大量无用或者一次性的脚本内容。 Redis Cluster 或 阿里云Redis集群版使用注意事项 Redis从3.0开始支持了Cluster功能,之前使用eval的时候可能没什么问题,但当切换成Cluster模式的时候,可能会出现一些问题: ERR Error running script (call to f_4a610f5543b3c3450220da7bd47825d3b6bffae8): @user_script:1: @user_script: 1: Lua script attempted to access a non local key in a cluster nodeERR eval/evalsha command keys must be in same slot(阿里云Redis集群版) 上面的错误是因为Redis要求单个Lua脚本操作的key必须在同一个节点上,但是Cluster会将数据自动分布到不同的节点(虚拟的16384个slot,具体看官方文档),阿里云集群版的官网其实也有对应说明:在Redis集群版实例中,事务、脚本等命令要求所有的key必须在同一个slot中,如果不在同一个slot中将返回以下错误信息(:command keys must in same slot) 如何解决? CLUSTER KEYSLOT key的文档中提供了解决方法,你需要将把key中的一部分使用{}包起来,redis将通过{}中间的内容作为计算slot的key,类似key1{mykey}、key2{mykey}(如果你的key是“REDIS_LOCK_FORPR”,可以讲该key的一部分用{}括起来,例如“REDIS_LOCK_{FORPR}”)这样的都会存放到同一个slot中(缺点是不能平滑的过度老业务,需要修改原来使用的key,如果之前的key是统一管理的,也没那么麻烦) 官方地址:https://redis.io/commands/cluster-keyslot // 部分代码 private static final String DISTRIBUTE_LOCK_SCRIPT_UNLOCK_VAL = "if" + " redis.call('get', KEYS[1]) == ARGV[1]"

python中,用pyspark读取Hbase数据,并转换为dataframe格式

需要完成的关键三个点分别是,设置好连接spark的配置,通过spark从hbase中将数据读进来为rdd格式,然后将rdd格式的数据转换成dataframe的格式。 1、首先需要设置pyspark连接spark的配置,spark连接有sparkcontext和sparksession这两种方式,同时这两种方式之间可以互相转换,连接代码如下: (1)通过SparkConf和SparkContext连接 from pyspark import SparkConf, SparkContext spark_host = "spark://spark-master:7077" #spark集群的地址,如果是本地单机版的,设置为local[x],x为使用的核数,单机版的即为线程数 app_name = "test" # 设置连接配置,这里的1g是设置使用的核数 spark_conf = SparkConf().setMaster(spark_host).setAppName(app_name).set("spark.executor.memory", "1g") spark_context = SparkContext.getOrCreate(conf=spark_conf) # sparkContext 也可以通过下面的语句转换成sparkSession对象 from pyspark.sql import SparkSession spark_session = SparkSession(spark_context) (2)通过sparkSession连接,个人觉得这种方式更简洁,因为一句话就搞定了,啊哈哈 from pyspark.sql import SparkSession spark_host = "spark://spark-master:7077" app_name = "test" spark_session = SparkSession.builder.master(spark_host).appName(app_name).getOrCreate() 2、pyspark读取HBASE的数据,读取完后的数据为RDD格式,代码如下: hbase_host = "" table_name = "" """ (1)pyspark读取hbase的时候可以根据hbase中record的row_key进行筛选,但是这个筛选是连续的一片式的筛选 (2)hbase的row_key筛选可以通过前缀进行模糊匹配,比如下面的'2019-04-29_'可以取row_key前缀是2019-04-29_的行,设置的stop则是表示以前缀是2019-04-30_的record结束(但是返回结果不包含满足stop前缀的record) (3)hbase.mapreduce.scan.columns的设置是选取想要读取的hbase中的基本列以{列簇名:列名}的形式表示一列,不同的列之间用空格隔开 """ conf = { "hbase.zookeeper.quorum": hbase_host, "hbase.mapreduce.inputtable": table_name, "hbase.mapreduce.scan.row.start": '2019-04-29_',

新手学习Python使用什么环境好!!!

我是一个创作小白,也是一个编程小白,如果不小心哪位大佬看到我说的有错误或者有不同的见解随时欢迎改正,也随时欢迎批评。 我学习Python已经有一小段时间,也不算很长,但是刚开始的时候想要学习Python 然后就要找资料,在找一些好的编译环境,原来学习JAVA还有C++ 和C#的时候发现好的编译环境就是那种有提示有高亮的,这样的东西当你写代码的时候那是相当的放遍。 我就举例几种: `` 第一个Pycharm: PyCharm 是 JetBrains 开发的 Python IDE。PyCharm用于一般IDE具备的功能,比如, 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制……另外,PyCharm还提供了一些很好的功能用于Django开发,同时支持Google App Engine,更酷的是,PyCharm支持IronPython 是不是看到有代码提示就高兴了?我也用过,确实顺手,我先介绍,然后再说其他的! 第二个Vim:也是一种比较容易上手的Python编写脚本,但是刚开始需要安装一些插件!同样也有自动补全,语法高亮等等好的东西。 第三个 Atom:Atom是由 GitHub 的程序员们打造的称为“属于21世纪”的代码编辑器。它开源免费跨平台(支持 Windows、Mac、Linux 三大桌面平台),并且整合 GIT 并提供类似 SublimeText 的包管理功能,作为一个现代的代码编辑器,Atom 支持各种编程语言的代码高亮(HTML / CSS / Javascript / PHP / Python / C / C++ / Objective C / Java / JSON / Perl / coffeescript / Go / Sass / YAML / Markdown 等等)、 与大多数其他编辑器相比,Atom的语言支持已经算是覆盖非常全面了。另外,它的代码补全功能(也叫Snippets) 也非常好用,你只需输入几个字符即可展开成各种常用代码,可以极大提高编程效率。这个不用多说都是可以拥有很多好的功能。 我就介绍以上三种,其实还有很多编译环境可以编写Python的比如:Visual Studio Code(免费开源)、Sublime Text(有免费版)、Eclipse with PyDev(也可以用)等等。

5.获取终端信息,设置日期和延时

获取终端信息 编写shell脚本时,免不了处理大量当前终端的相关信息,如行数、列数等。可以使用tput和stty两个工具进行相关处理 tput 1.tput命令将通过terminfo数据库对终端会话进行初始化和操作(terminfo数据库:Unxi系统上用于定义终端和打印机的属性以及功能) 2.光标属性 文本属性 tput clear 清屏 0:黑色 5:洋红色 tput sc 保存当前光标位置 1:蓝色 6:黄色 tput civis 光标不可见 2:绿色 7:白色 tput cnorm 光标可见 3:青色 tput rc 显示输出 4:红色 技巧1 获取终端的行数和列数 tput cols or stty size tput lines 技巧2 打印当前终端名 tput longname 技巧3 指定移动光标 tput cup 10 10 将光标移动到(10,10) 技巧4 设置终端背景色 tput setb n) n为0~7 技巧5 设置文本前景色 tput setf n) n为0~7 技巧6 设置文本样式为粗体 tput bold 技巧7 设置下划线起止 tput suml

学生类定义

**题目描述 定义学生类,其中包括3个成员变量(String 姓名,String 学号,float 分数),两个构造方法(一个默认的没有参数的构造方法,另一个为带三个参数姓名学号分数的构造方法用于给成员变量赋值)和show()方法。show方法用于显示每个学生类对象的成员变量信息。显示的格式为:姓名:XXX,学号:XXXX,分数:XX 分数保留一位小数。 定义测试类,在main方法中实例化一个学生类对象,学生类对象中的成员通过键盘输入,输入的顺序为姓名 学号 分数,调用构造方法给成员变量初始化,然后调用对象的show方法输出对象信息。 输入描述 输入一个对象的信息,按照姓名 学号 成绩 输出描述 输出姓名:XXX 学号:XXX 分数:XX 其中冒号为中文冒号,每项中间一个空格。 输入样例 张三 10001 90 输出样例 姓名:张三 学号:10001 分数:90.0 ** import java.util.*; public class Main { public static void main(String []args) { Scanner input=new Scanner(System.in); String a=input.next(); String b=input.next(); String c=input.next(); Student A=new Student(a,b,c); A.show(); input.close(); } } class Student { private String name;//元 private String num;//角 private String grade;//分 Student(String name,String num,String grade){ this.

元角分转换

**题目描述 定义Money类,其含有三个成员变量:元,角,分。定义两个构造方法,一个构造方法有三个参数分别为:元,角,分;另一个构造方法只有一个参数,表示输入多少分钱,你需要在该构造方法中将分转换为元角分并初始化成员变量元角分。同时定义一个show方法,用于输出成员变量的信息。 定义测试类,创建一个Money类对象,并通过键盘输入一个整数代表多少分钱,然后调用show方法输出对应的元角分。 输入描述 输入一个整数,表示多少分钱 输出描述 输出对应的多少元,多少角,多少分 输入样例 5 76 1012 输出样例 5分 7角6分 10元1角2分 ** import java.util.*; public class Main { public static void main(String []args) { Scanner input=new Scanner(System.in); int a=input.nextInt(); Money A=new Money(a); A.show(); input.close(); } } class Money { private int a;//元 private int b;//角 private int c;//分 Money(int a,int b,int c){ this.a=a; this.b=b; this.c=c; } Money(int m){ a=m/100; b=m/10%10; c=m%10; } void show(){ if(a==0&&b==0){ System.

Airtest Project - UI 自动化测试神器

Airtest Project 是网易开发的一款跨平台 UI 自动化测试框架( http://airtest.netease.com )。通过阅读该框架的整体介绍和使用说明,总结框架的基本功能和特点如下,对 Android,iOS,3D 游戏等应用的 UI 自动化测试感兴趣的读者请务必看过来 跨平台 Airtest Project 一大特色是跨平台,支持以下应用的 UI 自动化测试 Android appiOS appWindows 应用Web 应用微信小程序应用 ( 仅支持系统内核,TBS 内核尚在开发中,http://airtest.netease.com/blog/tutorial/WechatSmallProgram/ ) 在游戏应用方面,支持以下引擎开发的 app Unity3dcocos2dx-jscocos2dx-lua 运行环境 Airtest Project 提供一套能够编写,录制,回放脚本的编辑器 AirtestIDE,目前该 IDE 已提供如下操作系统的客户端 MacWindowsLinux Ubuntu 脚本编写语言 测试脚本编写语言为 Python,兼容 Python 2.7 和 Python 3 核心模块 1. Poco 用于控件识别 https://github.com/AirtestProject/Poco Poco 框架用于对 Unity3D,cocos2dx-*,Android 原生 app,iOS 原生 app 的控件树进行解析查找,来定位 UI 例如对 Android 原生 app 的 控件定位 2. Airtest 用于图像识别

python 生成 RSA 公私钥(密钥对)

使用rsa模块生成公私钥文件: # -*- coding: utf-8 -*- import rsa (pubkey, privkey) = rsa.newkeys(1024) # 生成公钥 pub = pubkey.save_pkcs1() pubfile = open('public.pem', 'wb') pubfile.write(pub) pubfile.close() # 生成私钥 pri = privkey.save_pkcs1() prifile = open('private.pem', 'wb') prifile.write(pri) prifile.close() 执行后两个文件

大话微服务:(三)Spring Cloud Netflix 和Spring Cloud alibaba服务技术架构

一、Spring Cloud Netflix 和Spring Cloud alibaba服务技术架构比较 二、重点介绍Spring Cloud alibaba微服务一站式解决方案 Spring Cloud 本身其实只是一套微服务规范,并不是一个拿来即可用的框架,Spring Cloud Netflix 和Spring Cloud alibaba是为开发者提供了这套规范的实现方式。由于Spring Cloud Netflix 2018年12月12日进入维护模式(Maintenance Mode),所以不太适合长期再使用。故选择Spring Cloud alibaba的技术方案。 2019年7月24日Spring官方社区官方博文中宣布了Spring Cloud Alibaba正式从 Spring Cloud Incubator 孵化器毕业,成为了Spring社区的正式项目。同时国内版Github码云也提供了Spring Cloud Alibaba极速下载镜像。 三、Spring Cloud alibaba 技术架构 四、Spring Cloud alibaba 主要功能及对应组件 (一)服务的注册与发现(对标Netflix的Eureka译音尤利卡): Nacos (二)负载均衡Ribbo (三)声明式HTTP客户端Feign (四)服务容错Sentinel (五)消息驱动RocketMQ (六)API网关GateWay( 可以集成开源的Soul网关或者 spring Cloud Gateway) (七)配置管理Nacos (八)调用链监控Sleuth (九)服务限流降级(即熔断限流,对标Hystrix):Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 (十)分布式配置管理:Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。 (十一)分布式事务: Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。 (十二)阿里云对象存储(收费): Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务 (十三)分布式任务调度(收费):Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。

【c#】localStorage做缓存

c# LocalStorage做缓存 1、localStorage做缓存2、缓存使用实例 1、localStorage做缓存 1.1 LocalStorage做缓存Cache internal class Cache { private LocalStorage localStorage; public Cache(string domain = "...") { localStorage = new LocalStorage(domain); } public object this[string key] { get { return localStorage[key]; } set { if (localStorage.ContainsKey(key)) { localStorage.Remove(key); } localStorage[key] = value; localStorage.Save(); localStorage.ReLoad(); } } public IList<string> Keys { get { IList<string> keys = new List<string>(); foreach(string key in localStorage.Keys) { keys.Add(key); } return keys; } } public bool Contains(string key) { if (key == null || key.

已知数组a中的元素已按由小到大顺序排列,以下程序的功能是将输入的一个数插入数组a中,插入后,数组a中的元素仍然由小到大顺序排列

已知数组a中的元素已按由小到大顺序排列,以下程序的功能是将输入的一个数插入数组a中,插入后,数组a中的元素仍然由小到大顺序排列 #include<stdio.h> int main() { int a[10]; int i=0,j,num; while(scanf("%d",&a[i])!=EOF) { i++; } scanf("%d",&num); for(j=i-1;j>=0;j--) { if(a[j]>num) a[j+1]=a[j]; else { a[j+1]=num; break; } } for(j=0;j<i+1;j++) { if(j==i) printf("%d\n",a[j]); else printf("%d ",a[j]); } return 0; }

离散数学(第二版) 第一章、第二章习题

目录 第一章命题逻辑的基本概念习题 117 题 判断论述21 题 求下列公式的成假赋值29 题 简答题 第二章知识储备命题公式类型 习题二知识储备求下列公式的主析取范式,再用主析取范式求主合取范式.用主析取范式判断下列公式是否等值.简答题用消解法判断下列公式是否是可满足的. 第一章命题逻辑的基本概念 习题 1 17 题 判断论述 判断下面一段论述是否为真:“ π是无理数.并且如果3是无理数,则 2 \sqrt 2 2 ​ 另外 只有 6 能被 2 整除 ,6 才能被 4 整除.” 解答: p: π是无理数 1q: 3是无理数 0r: 2 \sqrt 2 2 ​ 是无理数 1s:6能被2整除 1t: 6能被4整除0 命题符号化为:p∧(q→r)∧(t→s)的真值为1,所以这一段的论述为真。 21 题 求下列公式的成假赋值 (格式丑字丑,见谅)由于是第一章节习题所以使用真值表进行计算 ┐(┐ p∧q)∧┐r(┐ q∨r)∧(p→q)(p→q)∧(┐(p∧r)∨p) 29 题 简答题 设A,B都是含命题变项p1,p2,…pn的公式,已知A∨B是矛盾式,证明当且仅当A与B都是矛盾式。 第二章 知识储备 命题公式类型 定义 2.10 设G为公式: (1) 如果G在所有解释下都是真的,则称G是恒真式(或称G是重言式,永真式);

聊聊最新版AirtestIDE的新功能

版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用 此文章来源于项目官方公众号:“AirtestProject” 今年1.20号左右,AirtestProject团队就更新了一版IDE-- AirtestIDE1.2.3 ,相比1.2.2,这个版本增加了很多新功能,下面我们就来看看具体有哪些更新: 1.兼容Android10和MIUI11 新版本对Android10有了更好的支持与兼容,Android10手机可以直接连接使用了(即无需勾选任何选项,直接点击 connect 按钮就行啦)。但是小米手机如果更新到MIUI11,需要勾选 use Javacap + use orientation 两个选项后才能使用。 注意:如果使用了本地Python环境来运行脚本的话,不要忘记将本地的 airtest + pocoui 两个库也更新到最新哟,否则可能还会使用旧的代码来连接和运行脚本,导致依然不兼容。(命令行运行 pip install -U airtest 和 pip install -U pocoui 即可更新) 另外, poco-service.apk 暂时没有更新,因此在Android10上面会弹出一个低版本的提示,不过不影响使用~(直接点击 确认 即可) 2.设置兼容模式启动 新增了一个兼容模式的设置项。若启动时需要使用兼容性模式(即双击IDE文件夹中的兼容性模式启动.bat)才能正常查看编辑窗口和Log窗口的话,可以在IDE的 选项-设置 中选择一个兼容模式后重启IDE,这样未来将会默认以兼容性模式来启动IDE: 设置项的使用详情可以参看文档: https://airtest.doc.io.netease.com/IDEdocs/settings/1_ide_settings/#_5 3.新增TV按钮窗口 针对部分电视APP,IDE新增了一个 TV按钮 的快捷窗口,可以用鼠标点击来发送 上下左右 + 确认 按钮的ADB消息: 按钮使用详情可以参看文档:https://airtest.doc.io.netease.com/IDEdocs/device_connection/7_android_assistant/#4-tv 4.更新了Yosemite.apk Yosemite.apk 更新了版本,请各位重新安装新版本的应用,以获得更好的使用效果和Android10的兼容。在运行到脚本到 text() 语句时、或是连接手机时勾选了 use javacap 模式,airtest会自动检测并安装新版本的 Yosemite.apk 。但是前提是必须使用IDE自带的环境来运行脚本,或者是本地环境的airtest已经更新到最新的1.1.3版本。 各位也可以考虑手工安装到手机, Yosemite.apk 文件就在IDE的目录中,搜索一下就能找到啦。 5.Airtest更新到1.1.3 Airtest更新了版本,关于log()接口,和报告生成的LogToHtml有了一些改动,可以更好地显示报错信息并且简化了生成报告的代码等;另外还新增了脚本图片精度压缩的配置项,具体请查看Airtest更新公告:https://github.com/AirtestProject/Airtest/releases/tag/v1.1.2 6.poco新增对cocos-creator和UE4的支持 Poco-SDK新增了cocos-creator和UE4两款引擎的支持,具体的接入方法请查阅公众号往期对应的推文: 只需要3步,你就能接入UE4 Poco SDK啦~

hanoi塔(汉诺塔)--C语言

hanoi塔(汉诺塔)–C语言 一.什么是hanoi塔 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。 并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 即 规则: 1.每次只能移动一个圆盘; 2. 圆盘可以插在A,B,C中任意一根柱子上; 3.任何时刻都不能将较大的圆盘压在较小的圆盘上面。 n盘汉诺塔就是n个圆盘在A,B,C三个柱子上面按照上述规则进行移动。 二.hanoi塔解题思路 ————当然hanoi塔的题目是一道很典型的采用递归思路来进行解决的问题; 1.问题分解 首先,我们需要将n个圆盘从柱子A移动到柱子C上面: 将1 ~ n-1个圆盘作为整体从A借助C移动到B上;将A上的第n个圆盘从A移动到C;再将B上的1 ~ n-1个圆盘整体从B借助A移动到C上。 这样问题就从移动n个圆盘简化为了移动n-1个圆盘的问题; 问题层层化简,最后就能简化成1个圆盘的移动问题。 这样就完成了hanoi塔的移动。 2.设置递归 我们由问题分解中的思路就能够得到递归; 其中递归的结束条件就是只有一个圆盘的时候,而调用就是移动n-1个圆盘的时候; 所以我们以此就能够写出递归的代码: void hanoi(int n,char x,char y,char z) { if(n==1) move(x,1,z); //将编号为1的圆盘从x移动到z else{ hanoi(n-1,x,z,y); //将x上编号为1至n-1的圆盘借助z移到y move(x,n,z); //将编号为n的圆盘从x移到z hanoi(n-1,y,x,z); //将y上编号为1至n-1的圆盘借助x移到z } } 三.具体讲解 以三盘hanoi塔作为例子具体讲解: 1.初始状态 ABC第一层1第二层2第三层3 (圆盘3最大,圆盘1最小) 要将三个圆盘从A移动到C。 2.递归 n=3 ——所以执行hanoi(n-1,x,z,y); n=2 ——所以执行hanoi(n-1,x,z,y); (这里的x代表柱子A,y代表柱子C,z代表柱子B,是从上面的x,z,y传递而来) n=1 ——结束递归,将1号圆盘从A移动到C 递归工作栈的工作状态: n值x值y值z值3ABC n值x值y值z值2ACB3ABC n值x值y值z值1ABC2ACB3ABC 到1的时候就该move(x,1,z) ABC第一层第二层2第三层31 同时出栈

[maven] springboot将jar包打包到指定目录

大家好,我是烤鸭: 今天分享一下springboot将jar包打包到指定目录下。 由于之前上线都是一个打包到一个jar,由于服务多了,1个包100多M,哪怕是小版本上线都需要重新上传jar包。 1.目的 将不常用的比如spring,druid等不常用打包到lib目录,这样每次上线不需要上传这些。第三方或者常改动的还打包到本身的jar包内,每次上线都会新打包。 这样原来的100多M的jar包,可以变成2、3M。 如图所示: 原来的打包方式 改后的方式: 2.修改pom 简单解释一下,includes标签内就是打入jar包第三方jar。将上面的2M的包解压缩后,就是includes的包。如图所示。 excludeGroupIds和excludeArtifactIds 是配置不在lib目录里的包,由于java启动加载的机制是优先加载jar包, 再加载外部目录,如果jar包都存在两个地方,这样配置就没有意义了,每次还是得重新发布lib目录,所以将includes 中的包,再在excludeGroupIds 和 excludeArtifactIds 配置上。 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.0.5.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> <goal>build-info</goal> </goals> </execution> </executions> <configuration> <layout>ZIP</layout> <includes> <include> <groupId>nothing</groupId> <artifactId>nothing</artifactId> </include> <include> <groupId>com.etc</groupId> <artifactId>etc-manage-api</artifactId> </include> <include> <groupId>com.etc</groupId> <artifactId>etc-manage-core</artifactId> </include> <include> <groupId>com.etc</groupId> <artifactId>etc-manage-rpc-api</artifactId> </include> <include> <groupId>com.sinoiov.etc.apollo</groupId> <artifactId>apollo-spring-boot-starter</artifactId> </include> </includes> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <excludeGroupIds> com.

shell变量里的字符替换

shell变量里的字符替换 b=${a/123/321};将${a}里的第一个123替换为321 b=${a//123/321};将${a}里的所有123替换为321 shell调试: sh -x aaa.sh from: http://bbs.chinaunix.net/viewthread.php?tid=218853&extra=&page=7#pid1628522 shell十三问 不過,假如你只看到 ${ } 只能用來界定變量名稱的話,那你就實在太小看 bash 了﹗ 有興趣的話,你可先參考一下 cu 本版的精華文章: http://www.chinaunix.net/forum/viewtopic.php?t=201843 為了完整起見,我這裡再用一些例子加以說明 ${ } 的一些特異功能: 假設我們定義了一個變量為: file=/dir1/dir2/dir3/my.file.txt 我們可以用 ${ } 分別替換獲得不同的值: ${file#*/}:拿掉第一條 / 及其左邊的字串:dir1/dir2/dir3/my.file.txt ${file##*/}:拿掉最後一條 / 及其左邊的字串:my.file.txt ${file#*.}:拿掉第一個 . 及其左邊的字串:file.txt ${file##*.}:拿掉最後一個 . 及其左邊的字串:txt ${file%/*}:拿掉最後條 / 及其右邊的字串:/dir1/dir2/dir3 ${file%%/*}:拿掉第一條 / 及其右邊的字串:(空值) ${file%.*}:拿掉最後一個 . 及其右邊的字串:/dir1/dir2/dir3/my.file ${file%%.*}:拿掉第一個 . 及其右邊的字串:/dir1/dir2/dir3/my 記憶的方法為: # 是去掉左邊(在鑑盤上 # 在 $ 之左邊) % 是去掉右邊(在鑑盤上 % 在 $ 之右邊) 單一符號是最小匹配﹔兩個符號是最大匹配。 ${file:0:5}:提取最左邊的 5 個字節:/dir1

modelsim do文件简介及仿真波形分析注意事项

目录 前言 Modelsim指令介绍 步骤一:创建run_wave.do 步骤二:打开Modelsim 步骤三:do run_wave.do 步骤4:run_sim.bat 补充介绍 参考 前言 本文对.do文件进行整理介绍,并在后文引用 “ bitrocco ” 的一篇博文做补充介绍。 经验之言: 事例: 1、SIM文件夹下:test_model.v是RTL代码(需要被仿真的文件),test_model_2019.v是备份的历史代码(不是想仿真的文件)。由于编译指令是编译SIM文件夹下的所有.v文件,从而若test_model_2019.v存在逻辑错误、而test_model.v中没有,则会导致一种现象,modelsim的波形与test_model.v逻辑描述不一样。该问题可能是由于test_model_2019.v文件影响导致,因为两个文件的模块名一致,从而导致modelsim编译文件的时候,使用了错误的文件。 2、ISE编译的仿真库与vivado编译的仿真库不通用;vivado编译的仿真库与Modelsim版本有关,若版本不匹配,会导致仿真库编译时个别IP 报错。 仿真 1、文件准备:将待仿真的 tb_top.v、被测文件.v、批处理文件.bat、wave.do文件准备好。 2、文件功能说明。 run.bat:批处理文件是将modelsim的工作路径切换到当前文件夹路径;之后运行wave.do。 wave.do:执行:创建本地库、将逻辑库名映射库路径、编译IP、编译RTL、添加仿真库等功能。 bram_i32o32_d1024.v:被仿真文件。由于这个Xilinx IP会调用blk_mem_gen_v8_4.v文件,因此需要将blk_mem_gen_v8_4.v也放在该文件夹中。 3、在以上文件准备好后,直接运行run.bat,即可实现自动打开modelsim对tb_top进行仿真。 备注:该仿真文件夹中不可以含有其他modelsim版本编译产生的work文件夹,否则会导致编译失败。也即在仿真文件夹中,只需要准备上面所需的文件,不要含有其他东西即可。 4、vivado软件在创建IP时,sim文件夹里存放的是IP仿真文件,simulation文件夹里放的是仿真model,有的IP会调用simulation中的文件用于行为仿真。 这里提供wave.do的参考示例。 #================================================================ # Clear #================================================================ # 退出当前仿真 quit -sim # 清输出窗口 .main clear #================================================================ # Create work library #================================================================ # It will create a "work" folder in current folder # 创建本地库 vlib work # 将逻辑库名映射库路径 vmap work work #================================================================ # Compile Xilinx/Inter IP core #================================================================ # Add File path and Compile them vlog .

同样是应届生,为什么有的同学一毕业就月薪1万以上?

速报 2020年经济下行趋势明显,毕业生出路在哪儿? 今年毕业生人数颇多,又赶上大环境不好,很多公司裁员、缩招。别说offer,连出门找实习都难。 “大学四年我都学了啥?” “是啊,现在咋找实习丰富简历啊” “今年毕业的我该怎么办,要哭了” “论文没写,offer没有,天天躺尸ing” 其实像腾讯、阿里、抖音快手这类互联网公司,在疫情期间用户暴涨,用人需求猛增30%,非常缺技术人员。 左一条形柱为IT行业人才需求,远高于其他行业 这次疫情倒逼大量产业互联化,尤其是优秀的开发工程师,未来的发展前景与涨薪幅度都非常大,而且对专业的限制越来越小。 Boss直聘上一个本科毕业的前端、Java开发工程师,薪资高达20K! >> 向左滑动查看下一张图片 << 前端、Java等开发岗位薪资高达20K+ 这些数据告诉我们:想险中求发展,转行进入互联网行业,现在就是最好的时机。 很多人听完很心动,但仍然心存些许疑惑 何以解忧? 作为一家有社会责任感的公司,在这个特殊时期为即将毕业的同学定制化推出【应届生千人高薪培养计划】,寻找并帮助1000位优秀的在校大学生,在4-6个月内拿到10k以上高薪offer。 培养计划由开课吧新职课的教研团队历经180多天的研发,并联合87家互联网公司的企业师父教学。 新培养体系目前已经过100多位学生的验证,其中90%的学员拿下月薪1万以上的offer。 部分学员就业情况 以下均为应届毕业生第一份工作情况 学员 毕业学校 岗位 薪资 W同学 曲阜师范大学 前端工程师 12K Z同学 河北科技师范 Java工程师 13K F同学 佳木斯大学 前端工程师 12K L同学 河南理工大学 Python工程师 17K Z同学 河北联合大学 Java工程师 14K M同学 北京吉利大学 Python工程师 18K W同学 湖南农业大学 前端工程师 12K Q同学 四川大学 大数据工程师 20k 注:为保护学员个人隐私,隐去学员姓名,信息若有虚假,愿承担法律责任 现在吴师兄为读者中的大学生争取到了50个0元免费试学的名额,只要你符合以下条件,就可扫码加入0元试学训练营 入学条件 1 统招本科及以上学历(需提供学信网证明) 2 计算机相关专业或有理工科背景优先 3 即将毕业的大学生或每天有3小时以上学习时间 4

memcpy速度太慢?掌握这个技术让内存拷贝效率成倍提升

封面出自:板栗懒得很 memcpy是C/C++的一个标准函数,原型void *memcpy(void *dest, const void *src, size_t n),用于从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。 neon是适用于ARM Cortex-A系列处理器的一种128位SIMD(Single Instruction, Multiple Data,单指令、多数据)扩展结构。neon支持一次指令处理多个数据,比如处理8个8-bit、4个16-bit、2个32-bit或1个64-bit。正是这个特性可以用于加速内存拷贝。 在正常情况下memcpy的性能已经足够使用了,但是当我们因为某些原因在拷贝大内存遇到瓶颈的时候,可以考虑使用neon来加速内存拷贝。比如我在使用glMapBufferRange把PBO从GPU内存映射到CPU内存的时候遇到了耗时问题,拷贝921600字节的数据需要30ms,在使用neon后,内存拷贝耗时直接降低到了4ms,相差将近8倍。事实上,在arm平台上使用neon指令可以高效提升数据并行处理性能,而不仅仅局限于内存拷贝。google开源的libyuv内部也使用了neon指令来并行处理数据。 使用neon指令 #ifdef __ARM__ static void neon_memcpy(volatile unsigned char *dst, volatile unsigned char *src, int sz) { if (sz & 63) sz = (sz & -64) + 64; asm volatile ( "NEONCopyPLD: \n" " VLDM %[src]!,{d0-d7} \n" " VSTM %[dst]!,{d0-d7} \n" " SUBS %[sz],%[sz],#0x40 \n" " BGT NEONCopyPLD \n" : [dst]"+r"(dst), [src]"+r"(src), [sz]"+r"(sz) : : "

基于笛卡尔坐标系下的三边定位的研究(TOA方式定位)

基于笛卡尔坐标系下的三边定位的简单研究(TOA方式定位) 引言: 在无线定位中,TOA方式下的三边定位有它的优越性,定位精度高,三个基站就可实现精确定位。目前的超宽带技术的普及应用,普遍采用该种定位的方法。三边定位一般有两种数学上的计算方法,一是向量法。二是笛卡尔坐标系法。本篇主要探讨第二种方式。 现实中的应用场景一般有2D(二维)和3D(三维空间)。本文就这两种方式分别予以叙述。 一、在平面2D坐标下的计算方式: 我们可以通过三圆的相交,可以确定一个目标点。从数学几何上不难求解得到目标点的坐标: 这里源节点的坐标(Xi, Yi),其中: 二、在空间3D坐标下的计算方式: 在空间3D模式下,从几何模型上来看,三个球相交会形成两个交点。4个球相交形成一个交点,该计算的方式与平2D模式有相似但又有区别。在某些定位中,往往已知道目标点的运动区域特性,或者定位的需求往往只需关注某个投影面,所以一般三个源节点就可计算得出目标点的投影面的坐标点。投影面的选择一般选择三个源节点所在的平面。 目标点(上图中的标签T0),并非在三个圆的交点上(三圆的半径为目标点到源节点空间距离),而是三个圆相交点所在弦线的交点上。 明确了这点几何特性,就不难求出目标点的坐标了。 在具体的定位中,往往就不是单单三个基站了,显然更多的基站将获得更多的解集,也就意味着更高的精度了。

什么是类 ? 什么是对象 ? 类和对象有什么关系 ?什么是封装?什么是继承?

1、什么是类? (1)类是一种抽象的概念。 (2)类:具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。 2、什么是对象? (1)对象是一种具体的概念。 (2)对象:对象是人们要进行研究的任何事物,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。对象具有状态,一个对象用数据值来描述它的状态。对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。 3、类与对象之间的关系? 类与对象的关系就如模具和铸件的关系,类的实例化的结果就是对象,而对象的抽象就是类,类描述了一组有相同特性(属性)和相同行为的对象。解释的通俗一点就是,人是一种类,而具体的某一个人就是一个对象,每一个对象都符合这个类型的标准。一个类的所有对象都有相同的属性(都是人类),但有不同的属性值(名字、身高不一样等),不同的类的属性不完全相同。 4、什么是封装?封装的作用? (1)封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术,在java中通过关键字private,protected和public实现封装。什么是封装?封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。 适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性。 (2)简单的理解就是:封装就是将一些复杂的或是不想让你看到的事物包装起来,叫做封装。从程序的角度来说就是,把一些内部复杂的逻辑或是不想让其他人员修改程序内部进而把部分程序包装起来,叫做封装。举一个 遥控器的例子,无论是电动玩具赛车遥控器还是电视遥控器,其内部都是复杂的电路板,由于技术人员出于对电路板的保护的角度来说或是不想其他人员看到内部丑陋的电路板的角度来说,通过手柄来包装都能达到这俩种效果。 (3)封装的作用: ① 对象的数据封装特性彻底消除了传统结构方法中数据与操作分离所带来的种种问题,提高了程序的可复用性和可维护性,降低了程序员保持数据与操作内容的负担。 ②对象的数据封装特性还可以把对象的私有数据和公共数据分离开,保护了私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控性的目的。 5、什么是继承?继承的说明? (2)继承的重要说明: 1>、子类拥有父类的所有成员变量和成员函数 2>、子类可以拥有父类没有的方法和属性 3>、子类就是一种特殊的父类 4>、子类对象可以当作父类对象使用 上述是对基本概念的理解和汇总,如有不恰当之处,请联系本人及时删除,谢谢!

Hadoop集群搭建【web端不显示从节点问题】

系统:CentOS7 环境:jdk8 版本:hadoop-2.7.7 结构 hadoop01namedata、nodedatahadoop02nodedatahadoop03nodedata 配置 hadoop-2.7.7/etc/hadoop/hadoop-env.sh export JAVA_HOME=/opt/app/jdk1.8.0_221 //这里是我的jdk安装目录 配置 hadoop-2.7.7/etc/hadoop/core-site.xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop01:9000</value> <final>true</final> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/kjctar/tmp</value> <!-- 临时目录 --> </property> <!-- i/o properties --> <property> <name>io.file.buffer.size</name> <value>4096</value> </property> </configuration> 配置hadoop-2.7.7/etc/hadoop/hdfs-site.xml <!-- /home/hadoopdata/ 是我定义的元数据目录 --> <configuration> <property> <name>dfs.namenode.name.dir</name> <value>/home/hadoopdata/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/home/hadoopdata/dfs/data</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.blocksize</name> <value>134217728</value> </property> <property> <name>fs.checkpoint.dir</name> <value>/home/hadoopdata/checkpoint/dfs/cname</value> </property> <property> <name>dfs.http.address</name> <value>hadoop01:50070</value> </property> <property> <name>dfs.secondary.http.address</name> <value>hadoop01:50090</value> </property> <property> <name>dfs.

安装Ubuntu14.04win10双系统

1.去掉uboot的安全启动 2.使用U盘及Ultroliso做安装盘 3.机械盘中留出一部分作为安装盘300G 4.Ubuntu分区情况: 挂载点 / 主分区 30G EXT4 挂载点 / home 逻辑分区 剩余EXT4 挂载点 / boot 逻辑分区200M(500M 主分区) EXT4 挂载点 swap 逻辑分区 = 内存大小 8196 M 5 系统安装在机械盘 如果安装了win10+ubuntu双系统后 需要重新安装ubuntu系统 安装步骤如下 1.删除ubuntu所在的磁盘卷 2.使用EasyUEFI 删除启动项(如果试用期过,使用破解版,必须要删除) 3.到步骤2 ubuntu16.04 1. apt-get install wine 2.新建工程 3.解压包,替换source,wrap and rebuild 两个包 4 .build整个工程,apt-get install autoconf aclocal-1.14: command not found https://jingyan.baidu.com/article/ab0b563072e697c15afa7d98.html 因为16.04默认安装php7.0环境,但是php7目前兼容性并不是很好,如果自行安装php5需要清除php7的已安装包,否则会报错。不过呢,php7性能比php5快好多。下面我们说php5的安装 https://jingyan.baidu.com/article/fdffd1f8980188f3e98ca103.html autoreconf: 未找到命令 yum -y install install autoconf automake libtool apt-get install autoconf

使用C语言输出菱形详解

// Written by Harry 一、思维过程 观察要输出的形状 --- 确定大体思路 --- 转化为数学模型 --- 将问题逐个击破 二、完整代码(以7*7菱形为例) #include <stdio.h> int main() { int i,j,k; //定义菱形行数i、每行输出次数j、每行中输出空格计数器k for(i=1;i<=4;i++) //上半部分有四行 { k = 1; //空格计数器 for(j=1;j<=i+3;j++) //每行输出4~7次 { if(k<=4-i) { printf(" "); k++; } else printf("*"); } printf("\n"); } for(i=1;i<=3;i++) //下半部分有三行 { k = 1; //计数器 for(j=1;j<=7-i;j++) { if(k<=i) { printf(" "); k++; } else printf("*"); } printf("\n"); } system("pause"); return 0; } 输出结果: 三、分步说明 1.观察要输出的形状

Multer中文文档

此文档于2016年10月3日翻译时multer的版本是1.2.0,它可能不是最新的! 甚至可能存在翻译错误!你可能需要阅读原版英语README 此文档仅供参考! Multer Multer 是一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,它主要用于上传文件。它是写在 busboy 之上非常高效。 注意: Multer 不会处理任何非 multipart/form-data 类型的表单数据。 其它语言 English (英语)한국어 (朝鲜语)Русский язык (俄語) 安装 $ npm install --save multer 使用 Multer 会添加一个 body 对象 以及 file 或 files 对象 到 express 的 request 对象中。 body 对象包含表单的文本域信息,file 或 files 对象包含对象表单上传的文件信息。 基本使用方法: var express = require('express') var multer = require('multer') var upload = multer({ dest: 'uploads/' }) var app = express() app.

10大排序算法——01冒泡排序(Java实现)

冒泡排序(Bubble Sort) 冒泡排序也叫起泡排序 冒泡排序的执行流程 1.从头开始比较每一对相邻元素,如果第一个比第二个大,就交换他们的位置。(执行完第一轮,最后的那个元素就是最大的元素) 2.忽略从步骤1中找到的那个最大元素,然后重复执行步骤1,直到元素有序 来看代码: public int[] bubbleSort(int[] array ){ for (int end = array.length; end > 0; end--) { for (int begin = 1 ; begin<end ; begin++) { if(array[begin]<array[begin-1]) { int index = array[begin]; array[begin]=array[begin-1]; array[begin-1] = index; } } } return array; } 调用一下试试 public static void main(String[] args) { BubbleSort b = new BubbleSort(); int[] array = {9,8,7,4,5,6,1,2,3}; System.out.println("排序前"); for (int i = 0; i < array.

Vmware,Virtual Box虚拟机安装IMG系统镜像(img系统镜像安装syncloud云盘)

IMG是一种镜像文件,不同于ISO系统镜像,IMG是不带引导的系统镜像,也就是说在为虚拟机安装镜像的时候,不能像ISO文件那样方便安装,直接从Iso文件引导安装系统,IMG是一种硬盘分区的镜像文件,要先把IMG镜像文件刻录到硬盘或者是U盘,系统从硬盘和U盘进行系统引导,树莓派这类开发板的系统大多都是这类的系统镜像,系统镜像烧录到sd卡,就可以直接在sd卡启动系统,非常方便,在虚拟机上安装这类系统镜像有两个方法。 1.把img系统镜像转为VDI或VMDK格式文件 img系统镜像转为VDI或VMDK这类的虚拟机使用的虚拟硬盘文件就可以让虚拟机从硬盘启动系统,就和树莓派一样了。 1.把img镜像转换为VDI或VMDK软件可以用自带的命令行实现,也可以用软件实现。 打开windows带的命令行,进入virtual box的安装目录,里面有一个VBoxManage.exe文件,然后输入 VBoxManage.exe convertdd *.img *.vdi 用virtual box自带的命令行文件,把img镜像文件转换为VDI文件,这样就可以在virtual box新建虚拟机时指定vdi硬盘文件,就可以安装系统了,如果想要在VMware上使用vdi文件,则还要vdi文件转为vmdk文件,用下面的命令实现。 VBoxmManage clonehd *.vmdk *.vdi --format vdi 2.使用软件自动完成vmdk,img,vhd之间的文件转换,软件名字是starwind software Image converter ,软件的官网是 https://www.starwindsoftware.com/starwind-v2v-converter 主要支持的vmdk,vhd,img文件之间的互相转换,vmdk是vmware的虚拟文件系统,virtual box可以用vhd文件系统,vhd是微软虚拟磁盘文件,virtual box可以用这个虚拟磁盘,virtual box支持的虚拟磁盘文件格式很多,vhd文件也可以用于微软自家的Hyper-V虚拟机,另外windows系统也可以从vhd文件中启动。 选择要转换的虚拟磁盘文件,我这里的是syncloud的amd64的img系统镜像转换为vmdk,virtual box最近的网络设置有些问题,就只好用vmware了。img镜像已经被识别出来了,大小是3.47GB。选择好文件之后,点击next 选择要转换的文件类型,支持的文件有6种,其实是3种,vhd和vmdk和img文件,vmdk和vhd文件都各有两种类型,growable imgae类型是指,系统镜像不是固定的大小,但是会随着添加数据而增大,而pre-allocated image文件类型则是固定大小的,不会增大文件大小,这就和vmware创建虚拟机时所选的是否立即分配所有所有磁盘空间是一样的意思。另外如果是vmware esx服务器的虚拟磁盘,则要选择vmware esx server image选项,这个我没试过。 选择虚拟磁盘的类型,选择scsi就好,scsi的读写速的快,ide的格式有点过时了。选好后点击next。 选择转换后的目标虚拟磁盘文件的位置,点击next 等待转换完成,点击finish。 2.创建syncloud虚拟机之后删除创建的磁盘,先不要开机,在硬件选项中新建硬盘,选择创建好的虚拟机镜像文件。 网络模式选好桥接模式,然后点击添加。 选择转换后的虚拟磁盘文件,vmware只支持vmdk文件,独立模式选不选随便,全凭自己选择。 这里选择保持现有格式来选择最大兼容性。 虚拟磁盘大小选择默认就好,就如它所说就算是扩容也不能扩大分区和文件系统的大小。 已经添加好了,接下来就可以启动虚拟机了。 可以看出系统是debin系统,启动选择第一项,如果虚拟机没有从硬盘启动就在虚拟机启动时,按f2键进入bios界面设置从硬盘启动。 默认用户名是root,密码是syncloud,在网页端激活设备之后,密码就会改为设置的密码。 安装过程这里就略过了,详细过程可以看我的另一篇博客,有详细的安装过程。 https://blog.csdn.net/lionwerson/article/details/104906046 2.img文件通过Win32DiskImager,balenaEtcher之类的刻盘软件,写入到U盘或硬盘。 这种方式主要是用来把synlcoud系统安装在树莓派上或者是x86之类的pc上的方式。这类嵌入式的系统大都是这样的安装方式。 etcher软件需要在设置中开启unsafe mode模式之后就可以在U盘之外的驱动器刻录镜像,可以用于老旧的x86 pc插入硬盘当做nas设备。而Win32DiskImager只支持u盘之类的外设驱动器刻录系统。 3.后记 syncloud虽然好用,但是如果要是在自己的局域网中搭建的话,还不如直接搭建nextcloud之类的网盘软件,从分配的域名访问自己的设备速度肯定不如局域网快,我想着这也就是它实在是太小众的原因,折腾到现在总算是弄完了,但是还有一些问题没有解决,比如官方的img镜像就算转换为vmdk文件也就只有3g的系统空间,官方也有一个解决办法,不过是用于提供的virtual box的虚拟机镜像的,解压之后用下面的命令就可以让磁盘空间变为50g,但是我想应该也可以把转换后的vdi虚拟磁盘文件再转换为vmdk文件,vmdk扩容也都是通过转换为vdi文件然后再转为vmdk文件实现磁盘文件系统和分区扩容的。另外也可以通过gparted-live的系统镜像(相当于windows pe系统)实现扩容。另外在系统激活的页面如果没有设备名字是因为主机名没有设置,设置之后就可以获取到设备的名字了。 VBoxManage modifymedium disk syncloud-vbox-[version].vdi --resize 50000 #resize指的是重新分配磁盘空间为50g,syncloud是解压之后的vdi虚拟磁盘文件,要注意文件位置

用大白话讲清 -> 能让青铜秒变钻石的Pycharm无敌快捷键——CTRL+Q(快查文档)

一、概念 这是一个快速查看类/函数/方法等详细信息的快捷键,新手使用该快捷键可以非常快速的入门python。 二、遇到生疏的方法的解决方案 新手在学习中,经常会记不住如何调用方法,该传什么,返回又是什么的时候,基本有三种解决方法。 1、按住CTRL并点击方法名,跳转至相应的代码页面,直接阅读源码 优点:直观 缺点:要有一定的代码功底,比较费时和繁琐 2、改变编程思维,从面向对象改成面向百度,直接搜 优点:易理解 缺点:繁琐和费事就不提了,最恶心的是碰到复制黏贴型的答案,很有可能把人带偏 3、直接CTRL+Q,pycharm会自动展开文档详细信息 优点:快速、直观、简单明了 缺点:没有缺点 三、使用方法 把鼠标放在方法名上按CTRL+Q(第一种文档) 1、传参:在1区域中展示的是需要传递的参数。 以randint为例,这里有三个参数。 第一个self是特殊的参数,可以不用管,是实例的指代,类似于JAVA的this。 第二和第三的a和b都是形参名,类型并没有办法得知。这里的any并不是表示可以传递任意类型的参数。 2、返回值:这里展示的就是返回值的类型。如果无返回,展示的是None 3、文档注释:英文好的同学可以直接看懂这个,不过就算英文不好。这里面写的大多数都是关键字,猜也能猜个大概。 把鼠标放在方法名上按CTRL+Q(第二种文档) 再次按下CTRL+Q后,会切换另一种文档形式。这里就非常详细的说明了randint会返回一个integer类型的数字N,范围是a <= N <=b。也就是说范围包括传递的参数本身,一目了然。 通过这个快捷键,新手在面对无数多的方法而迷茫的时候。一个CTRL+Q就可以快速的让你知道你想明白一切 >_<

Java小程序 数值取基数

Java 整数类型取基数 对于数值的基数读取,博主这里有两个方案,如果有其他读取方案,可以写在评论 首先是第一种方案 public class Base1 { public int[] base(int index) { String str = index+""; //将数值转换为字符串类型 char[] c = str.toCharArray(); int[] arrayInt = new int[c.length]; for (int i = 0; i < c.length; i++) { String s = c[i]+""; arrayInt[i]= Integer.parseInt(s); } return arrayInt; } public static void main(String[] args) { int[] array= new Base().base(157896); for (int i = 0; i < array.length; i++) { if(i!=0) System.out.print(" "

解决OverflowError: mktime argument out of range

问题出现 begin = time.mktime(time.strptime('1970-01-01 00:00:00', '%Y-%m-%d %H:%M:%S')) 系统提示: Traceback (most recent call last): File "<stdin>", line 1, in <module> OverflowError: mktime argument out of range 问题分析 mktime()是localtime()的反函数,localtime根据秒数返回时间戳它的参数是struct_time或完整的9个元组,它返回一个浮点数,可以视为从最早时间戳开始的描述。Windows中时间戳是有范围的,参考官方文档,只要不在这个范围内,使用时就会报错文档中提到不能早于midnight, January 1, 1970,不能晚于23:59:59 January 18, 2038 问题解决 使用以下命令找到windows中最早的时间戳 >>> time.localtime(0) time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0) 可以发现,时间戳是从1970年1月1日早上8点开始的,于是将开始时的代码修改如下即可正常运行 begin = time.mktime(time.strptime('1970-01-01 08:00:00', '%Y-%m-%d %H:%M:%S')) 另外,在查询时发现,该问题在windows系统中会出现,而在Linux系统中则不会出现。

httpcliet发送xml报文,接受xml报文

发送:使用httpclient public static String postXML(String url,String xmlFileName){ CloseableHttpClient client = null; CloseableHttpResponse resp = null; log.info(xmlFileName); try{ HttpPost httpPost = new HttpPost(url); httpPost.setHeader("Content-Type", "text/xml; charset=UTF-8"); client = HttpClients.createDefault(); StringEntity entityParams = new StringEntity(xmlFileName,"utf-8"); httpPost.setEntity(entityParams); client = HttpClients.createDefault(); resp = client.execute(httpPost); String resultMsg = EntityUtils.toString(resp.getEntity(),"utf-8"); return resultMsg; }catch (Exception e){ log.info(e.getMessage()); }finally { try { if(client!=null){ client.close(); } if(resp != null){ resp.close(); } } catch (IOException e) { e.printStackTrace(); } } return null; } 使用request接收xml报文:

.Net Core3.1 配置Pomelo.EntityFrameworkCore.MySql数据操作(2)

引入Pomelo.EntityFrameworkCore.MySql程序包 ConfigureServices // other service configurations go here // replace "YourDbContext" with the class name of your DbContext services.AddDbContextPool<DbModel>(options => options // replace with your connection string .UseMySql("Server=localhost;Database=test;User=root;Password=woshishui;", mySqlOptions => mySqlOptions // replace with your Server Version and Type .ServerVersion(new ServerVersion(new Version(8, 0, 19), ServerType.MySql)) )); appsettings.json { "ConnectionStrings": { "DefaultConnection": "Server=localhost;database=test;uid=root;pwd=woshishui;" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*" } 创建Models实体类 alltestitem

C# 获取字符串字节长度

C# 获取字符串字节长度 一、C# 获取字符串字节长度 1.在C# 语言中使用string 字符串Unicode 编码 2.在C#语言中常用汉字 占 3个字节 方式1:使用默认编码类获取字节长度 Console.WriteLine(Encoding.Default.GetByteCount("张三"));//输出:6 //常用 一个字母,数字 一个字节 Console.WriteLine(Encoding.Default.GetByteCount("ab")); //输出:2 方式2: //常用汉字 ,一个汉字 3个字节 Console.WriteLine(ASCIIEncoding.Default.GetBytes("张网").Length); //输出:6 Console.WriteLine(UnicodeEncoding.Default.GetBytes("张网").Length); //输出:6 二、在字符串判断中,由于中文和英文 占据宽度不同,有时需要根据字节长度控制字符串数量 会用到字节长度判断。 更多: .net里Release的pdb文件有什么用 是否可以删除 .Net AppDomain详解(二) C#如何测试代码运行时间

一个后端程序员如何被公司逼的开始写前端代码!奉劝各位最好选择前后端分离的公司...

hello~各位读者好,我是鸭血粉丝(大家可以称呼我为「阿粉」),在特殊的日子里,大家要注意安全,尽量不要出门,无聊的话,就像阿粉一样,把时间愉快的花在学习上吧。 事情起因 阿粉自从学会Java以来,一直都是在从事关于Java的开发,不论是换了几家公司,阿粉一直都是负责的关于后台的业务,很多都是前后端分离的,前端是写前端的代码,后端只负责逻辑实现和返回所需要的值,但是让人没想到的事发生了,公司前端临时被其他项目组调走,领导要求项目还要上线,阿粉不得不再次扮演全职员工上线。 每天最多的时间就是看前端小姐姐写的代码,另外的一件事就是和前端小姐姐沟通怎么去写前端代码,为此阿粉还付出了两顿饭的代价! 为什么要前后端分离 之前在看一个哥们的博客的时候,觉得这个哥们说的特别的好,为什么前后端分离,因为前后端分离已成为互联网项目开发的业界标准使用方式,通过 Nginx + Tomcat的方式(也可以中间加一个nodejs)有效的进行解耦,并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务(多种客户端,例如:浏览器,车载终端,安卓,IOS等等)打下坚实的基础。这个步骤是系统架构从猿进化成人的必经之路。 说白了,前端和后端的区别在哪? 前端 通过 UI 给出的图,做出相应的格式的网站,把精力放在html5,css3,jquery,angularjs,bootstrap,reactjs,vuejs,这些前端内容模块上。 后端 把数据库中的数据,用 json 或者其他的格式,还给页面,实现动态展示的功能,把精力放在java基础,设计模式,jvm原理,还有对性能的优化上。 二者也是有本质区别的,后端注重的是并发,优化,安全等,而前端注重的是浏览器兼容性,页面是不是好看等。 阿粉现在的公司,还处于最原始的时期,那是个什么样子的呢? 这种开发模式其实很多小公司还是使用这种开发模式,这种模式有很大的弊端存在,大家一定都知道,开发效率及其低下,很多时候,要先有图,然后再 HTML 页面,然后再是我们后端来补充数据,这种方式之后出现问题我给大家来展示一下。 在这里,也是最容易出现问题的,如果线上出了问题,就出现了相互甩锅的情况了; 前端会后端说:你那里有问题么?我这里的前端代码没啥问题呀! 后端对前端说:有点小小的问题,你看,这个样式填充上去的时候,格式乱了,而且..... 接下来的事情很常见,前端坐到后端的位置上,开始调试代码,这是不是很尴尬,一次两次没问题,但是次数多了,这个锅到底该谁来背!肯定是后端,你看你连个前端代码都不会改,心底里会给你个深深的鄙视!为了不让领导对你鄙视,接下来你就出现了: 加班就变成了习以为常的事情了,这就是前后端不分离的弊端,现在很多小型企业都还是这种开发模式,和阿粉的小型公司一样。前后端没有分离的整体图解如下: 既然前后端不分离的既然这么多,那么前后端分离肯定没有这么多麻烦吧,是的,没错,前后端分离,写代码的速度明显变快,而且要求也比较高,大家可以看图: 从图中看出来了一个问题,前端后端同时可以干活,光从这个上面来说,开发效率那是杠杠的呀,要是按照前后端不分离的时候,那时间周期可能节省一半左右的时间,虽然大部分的时间可能花在了讨论接口的上面,但是实际开发起来,那速度可是飞快。 那么既然前后端不分离会出现问题,那么前后端分离会出现问题么?答案一样是肯定的,也是会出现同样的问题的,如果说客户的“不合理需求”变了,只要说当时商量的接口和接口形式不变,那么很简单,个人改个人的,不用想,开发效率依旧很快! 既然前后端分离了,那么后端还要会前端么? 之前星球的刚刚入职的小伙子曾经问过我一个问题,我刚刚入职。老大给我的活又是后端又是前端的,你说这个工作我到底是做还是不做,在这里阿粉想要给大家传递一些观念! 刚入职场的新人 因为现在好多的人都是培训出来的,而培训出来的人百分之90的人是只会写后端的代码,但是对于JS,和HTML那是一点都不会,因为在培训班的时候可能那些老师会对你说,没事这东西是前端写,不用你们来弄,实际上错了。 公司很多时候,需要你去完成JS部分和简单的修改HTML部分,但是相对而言,你如果说不会写CSS的话,那么老大可能会原谅你,但是如果你说你不会JS,不好意思,老大可能在心里已经有了辞你的念头了,这都啥时候了,你竟然连JS都不会写,对于新人而言,刚入职场,需要你学的东西有很多,这只是其中的一部分,不可能说那么多人都去写前端代码,毕竟没有那么多的“全栈”。 阿粉就是当初在公司,每天也是恶补前端,现在只能说JS没有任何问题,比如说现在最火的Vue.js,还有之前比较火的Angular,而且会一些简单的HTML,但是对于CSS,阿粉表示,真的不会。 这也是阿粉为什么会给起了这么一个标题,尽量的选择前后端分离的公司,不然你一定会去写前端的一部分代码,毕竟小公司出了问题,一定是会找你的。 你公司需要你写前端么?欢迎大家留言,小编非常乐意和大家交流心得。 精彩回顾 为什么Mysql的常用引擎都默认使用B+树作为索引? 从页面输入网址,回车到显示内容,这中间到底经历了什么? Tomcat出现漏洞了,阿粉问你,线上版本更换了么? 你知道 DNS,那我猜你一定不知道 HTTPDNS < END > 如果大家喜欢我们的文章,欢迎大家转发,点击在看让更多的人看到。也欢迎大家热爱技术和学习的朋友加入的我们的知识星球当中,我们共同成长,进步。

程序卡死在while(TimingDelay!=0);(keil优化造成的)

可能原因 1、声明TimingDelay时要使用volatile修饰(keil编译前对TimingDelay进行了默认优化造成的) 2、也可能是main中没有调用systick_init(); void Delay_ms(__IO u32 nTime) { TimingDelay = nTime; if (SysTick_Config(SystemCoreClock / 1000)) //1us中断一次 { while (1); } // 使能滴答定时器 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; while(TimingDelay != 0); SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk; }

隐私政策网址(URL)

隐私政策网址(URL) 本软件尊重并保护所有使用服务用户的个人隐私权。为了给您提供更准确、更有个性化的服务,本软件会按照本隐私权政策的规定使用和披露您的个人信息。但本软件将以高度的勤勉、审慎义务对待这些信息。除本隐私权政策另有规定外,在未征得您事先许可的情况下,本软件不会将这些信息对外披露或向第三方提供。本软件会不时更新本隐私权政策。您在同意本软件服务使用协议之时,即视为您已经同意本隐私权政策全部内容。本隐私权政策属于本软件服务使用协议不可分割的一部分。 1.适用范围 a)在您使用本软件网络服务,本软件自动接收并记录的您的手机上的信息,包括但不限于您的健康数据、使用的语言、访问日期和时间、软硬件特征信息及您需求的网页记录等数据; 2.信息的使用 a)在获得您的数据之后,本软件会将其上传至服务器,以生成您的排行榜数据,以便您能够更好地使用服务。 3.信息披露 a)本软件不会将您的信息披露给不受信任的第三方。 b)根据法律的有关规定,或者行政或司法机构的要求,向第三方或者行政、司法机构披露; c)如您出现违反中国有关法律、法规或者相关规则的情况,需要向第三方披露; 4.信息存储和交换 本软件收集的有关您的信息和资料将保存在本软件及(或)其关联公司的服务器上,这些信息和资料可能传送至您所在国家、地区或本软件收集信息和资料所在地的境外并在境外被访问、存储和展示。 5.信息安全 a)在使用本软件网络服务进行网上交易时,您不可避免的要向交易对方或潜在的交易对方披露自己的个人信息,如联络方式或者邮政地址。请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。如您发现自己的个人信息泄密,请您立即联络本软件客服,以便本软件采取相应措施。

Java小程序 输入一个字符串,将每一个单词首字母大写

Java 小程序 01 输入一个字符串,将每一个单词首字母大写 1.首先写一个接收传入的单词,并将传入单词首字母大写。这一步比较简单,没什么好说的! private String titleCase (String str) { //转换操作,将传入的字符串的首字母取出后转换为大写,然后在传回 String s = str.charAt(0)+""; s=s.toUpperCase(); str=s+str.substring(1); return str; } 2.写接收一个需要将每个单词首字母改为大写的字符串和分隔字符串的符号,都是String类型。然后通过split() 方法将字符串语句str分隔成单词,存储在array数组中,通过for循环,将分隔好的单词传入titleCase ()中,然后通过创建StringBuilder 来存储修改好的单词。 public String transformation(String str,String character) { //将传入的字符串已给定的字符串切割,然后进行处理 String[] array = str.split(character); StringBuilder sbu = new StringBuilder(); for (int i = 0; i < array.length; i++) { if(i!=0) sbu.append(" "); sbu.append(titleCase(array[i])); } return sbu.toString(); } 以上两个主要方法 下面是完整实现代码: import java.util.*; @SuppressWarnings("resource") public class StringTransformation { private String str ; public StringTransformation(String str, String character) { inspect(str); inspect(character); this.

移远EC20 获取基站时间来给终端对时

移远EC20 获取基站时间来给终端对时 第一节 EC20 手册说明 AT +CCLK 该命令用来获取模组的系统时间。 <time> String type value, format is “yy/MM/dd,hh:mm:ss±zz”, indicate year (two last digits), month, day, hour, minutes, seconds and time zone (indicates the difference, expressed in quarters of an hour, between the local time and GMT; range -48...+56). E.g. May 6th, 1994, 22:10:00 GMT+2 hours equals to “94/05/06,22:10:00+08”. Example AT+CCLK? //Query the local time +CCLK: “08/01/04,00:19:43+00” OK AT+CTZU automatic time zone update Set command enables and disables automatic time zone update via NITZ.

redis实现分页的方法

每个主题下的用户的评论组装好写入Redis中,每个主题会有一个topicId,每一条评论会和topicId关联起来,大致的数据模型如下: { topicId: 'xxxxxxxx', comments: [ { username: 'niuniu', createDate: 1447747334791, content: '在Redis中分页', commentId: 'xxxxxxx', reply: [ { content: 'yyyyyy' username: 'niuniu' }, ... ] }, ... ]} 将评论数据从MySQL查询出来组装好存到Redis后,以后每次就可以从Redis获取组装好的评论数据,从上面的数据模型可以看出数据都是key-value型数据,无疑要采用hash进行存储,但是每次拿取评论数据时需要分页而且还要按createDate字段进行排序,hash肯定是不能做到分页和排序的。 那么,就挨个看一下Redis所支持的数据类型: 1、String: 主要用于存储字符串,显然不支持分页和排序。 2、Hash: 主要用于存储key-value型数据,评论模型中全是key-value型数据,所以在这里Hash无疑会用到。 3、List: 主要用于存储一个列表,列表中的每一个元素按元素的插入时的顺序进行保存,如果我们将评论模型按createDate排好序后再插入List中,似乎就能做到排序了,而且再利用List中的LRANGE key start stop指令还能做到分页。嗯,到这里List似乎满足了我们分页和排序的要求,但是评论还会被删除,就需要更新Redis中的数据,如果每次删除评论后都将Redis中的数据全部重新写入一次,显然不够优雅,效率也会大打折扣,如果能删除指定的数据无疑会更好,而List中涉及到删除数据的就只有LPOP和RPOP这两条指令,但LPOP和RPOP只能删除列表头和列表尾的数据,不能删除指定位置的数据,(备注:其实还有 LREM命令可以做到删除,但是非常不方便),而且当存在接口高并发访问时,这个list可能会无限延长,且里面的数据会存在很多重复,这就会影响到正常的业务,所以List也不太适合。 4、Set: 主要存储无序集合,无序!排除。 5、SortedSet: 主要存储有序集合,SortedSet的添加元素指令ZADD key score member [[score,member]…]会给每个添加的元素member绑定一个用于排序的值score,SortedSet就会根据score值的大小对元素进行排序,在这里就可以将createDate当作score用于排序,SortedSet中的指令ZREVRANGE key start stop又可以返回指定区间内的成员,可以用来做分页,SortedSet的指令ZREM key member可以根据key移除指定的成员,能满足删评论的要求,所以,SortedSet在这里是最适合的(时间复杂度O(log(N)))。 所以,需要用到的数据类型有SortSet和Hash,SortSet用于做分页排序,Hash用于存储具体的键值对数据。SortSet结构中将每个主题的topicId作为set的key,将与该主题关联的评论的createDate和commentId分别作为set的score和member,commentId的顺序就根据createDate的大小进行排列。 当需要查询某个主题某一页的评论时,就可主题的topicId通过指令zrevrange topicId (page-1)×10 (page-1)×10+perPage这样就能找出某个主题下某一页的按时间排好顺序的所有评论的commintId。page为查询第几页的页码,perPage为每页显示的条数。 当找到所有评论的commentId后,就可以把这些commentId作为key去Hash结构中去查询该条评论对应的内容。 这样就利用SortSet和Hash两种结构在Redis中达到了分页和排序的目的。 当然,也可以直接只使用SrotedSet类型,而不使用Hash类型,直接将评论存放在member中。 但为什么要将评论和排序放到不同的类型里?其中的好处是,可以对评论设置不同的排序类型,比如按时间的正反序,点赞的正反序,查看次数的正反序等。而这样只需要维护不同的SrotedSet排序,不需要维护多套评论的内容了。 详细代码参考:https://www.cnblogs.com/afeng2010/p/10042790.html

5种Redis数据结构详解

本文我们主要和大家分享 5种Redis数据结构详解,希望文中的案例和代码,能帮助到大家。 2.1.1 全局命令 1 查看所有键 key* 2 键总数 dbsize (dbsize命令在计算键总数的时候不会遍历所有键,而是直接获取Redis内置的键总数变量,时间复杂度为O(1),而keys命令会遍历所有键,时间复杂度为O(n),当Redis保存了大量键时,线上环境禁止使用) 3 检查键是否存在 exists key 存在返回1,不存在返回0 4 删除键 del key 返回成功删除键的个数,不存在的返回0 5 键过期 expire key seconds ttl 命令会返回剩余过期时间 -1 键没设置过期时间 -2 键不存在 6 键的数据类型结构 type key 返回类型,不存在返回none 2.1.2 数据结构和内部编码 每种数据结构都有自己的底层的内部编码实现,而且是多种实现,这样Redis会在合适的场景选择合适的内部编码 每种数据结构都有两种以上的内部编码实现,例如list数据结构包含了linkedlist和ziplist两种内部编码,可以通过object encoding命令查询内部编码 Redis这样设计有两个好处:第一:可以改进内部编码,而对外的数据结构和命令没有影响。第二 多种内部编码实现可以在不同的场景下发挥各自的优势。比如,ziplist比较节省内存,但是列表元素比较多的情况下,性能有所下降,这时候Redis会根据配置选项将列表类型的内部实现转换为linkedlist 2.1.3 单线程架构 Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务 1 引出单线程模型 调用客户端的过程:发送命令,执行命令,返回结果 所有的命令在一个队列里排队等待被执行,不存在多个命令被同时执行的情况 2 为什么单线程还能跑这么快 第一,纯内存访问,Redis将所有数据放在内存中,内存的响应时间长约100纳秒,这是Redis达到每秒万级别访问的重要基础 第二,非阻塞I/O,Redis使用epoll作为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间 第三 单线程避免了线程切换和竟态产生的消耗 单线程带来几个好处:第一,单线程简化数据结构和算法的实现。第二,单线程避免了线程切换和竟态产生的消耗。但是对于每个命令的执行命令是有要求的,如果某个命令执行时间过长,就会造成其他命令的阻塞,Redis是面向快速执行场景的数据库,单线程是理解Redis的核心 2.2 字符串 Redis的字符串类型是其他几种的基础,值可以是字符串(简单,复杂的json,xml),数字(整型,浮点),二进制(图片,音频,视频),最大值不能超过512MB 2.2.1 命令 1 常用命令 1 设置值 set key value 秒级过期时间 毫秒级过期时间 nx|xx

mybatis多表查询(一个实体包含其他对象)

场景重现: top_trans_order 订单表中是一笔交易的核心数据 top_trans_extend 订单拓展表中存储该笔交易的附加信息 需求:展示当前订单的全部信息 则必须获取交易拓展表中该笔交易的相关数据 解决方法: Order 实体类包含它自身的所有字段属性,与此同时还要把交易拓展实体当做订单实体的属性 例如 一、实体类写法 @Data public class TopTransOrder { private Long id; private String ordId; private String sourceRegionId; private String regionId; private String routeRegionId; private String productId; private String reqDate; ....... 多个字段 // 交易拓展信息实体 topTransExtend必须与xml中的property属性值相同 private TopTransExtend topTransExtend; } 二、mybatis映射器.xml写法 resultMap=“transExtendMap” 为拓展实体的map对应的ID <resultMap id="BaseResultMap" type="类Order全路径"> <id column="id" jdbcType="BIGINT" property="id" /> <result column="ord_id" jdbcType="VARCHAR" property="ordId" /> <result column="source_region_id" jdbcType="VARCHAR" property="sourceRegionId" /> <result column="

LaTeX入门|(1)从Word到LaTeX:LateX排版常用指令

从word的需要到latex的使用 写在前面 学习latex之前大多数使用word的,甚至精通word排版的,对于latex这种使用代码编程进行论文排版或ppt制作就显得比较费劲,比如平时很简单的居中、加粗、空行、插图等一键操作,到了latex中就抓瞎。 为了写个作业模板(为论文模板作准备),我尝试了word的一些常用功能,并总结了其LaTeX的表述方式,总结在下文中。这里并没有做到干湿分离(命令与文本分离),只是单纯为了实现想要的操作。 一、准备工作 环境准备 环境:MacOS Catalina 10.15.3 tex版本:Texlive2019 编辑器:TexStudio or VScode 下载texlive2019后一路next即可,在终端验证是否安装成功,最好打开texlive utilitly进行安装包的更新,以防出错;下载texstudio之后,打开设置–>常规–>语言,设置为中文,打开构建,选择默认编译器为xeLatex。 Latex的构成 latex可以分成命令与文本,故大的构成为导言区与正文区,导言区的基本指令为指明文档类与加载宏包 \documentclass[选项]{文档类} \usepackage{宏包} 正文区的基本构成如下: \begin{document} 正文 \end{document} Hello TeX 加载文档类(article、book、letter等),加载宏包(ctex、amsmath等)在document环境中可以输入正文,简单示例如下: \documentclass[a4paper, UTF8]{article} % 使用UTF-8编码,默认纸张为A4 \usepackage{ctex} \begin{document} This is my first Latex document.\\ Hello TeX! \end{document} macOS此时会出现无法加载中文的情况,及时使用UTF8 方法一: \usepakage[fontset=mac]{ctex} 方法二: \usepakage{CJK} \setCJKmainfont{Songti SC} %使用系统中文字体库 二、中文排版说明 用word写文档时,一般使用默认设置,然后直接打字、空格、回车或者点点工具栏即可完成一篇文档 页面设置-geometry latex进行页面设置需要加载geometry宏包。在指明文档类的时候可以设置纸张大小,也就是设置了paperheight和paperwidth,我们可以从word页面设置上将参数复制过来,使用如下命令进行页面设置。 \usepackage{geometry} \geometry{ a4paper, left=3.17cm, right=3.17cm, top=2.54cm, bottom=2.54cm, headsep=1.5cm, footskip=1.75cm } 页眉页脚-fancy 页眉页脚设置需调用 f a n c y fancy fancy宏包。

用大白话讲清 -> Python的__new__()方法

一、new方法的作用 作用:new方法主要是在内存中为对象分配空间并且返回对象的引用 class Test(object): def __new__(cls, *args, **kwargs): print("new方法被执行啦") test = Test() print(test) # 执行的结果: new方法被执行啦 None 1、因为new方法是一个魔术方法(魔术方法就是类被加载的时候,就会自动执行的方法),所以我们创建一个Test的实例的时候,就执行了new方法,输出了"new方法被执行啦"这句话。 2、print一个实例,就是调用这个实例的str方法,我们没有重写str方法,所以应该会输出这个实例的内存地址值。 3、不过我们重写了new方法,所以内存中没有开辟空间,故而str只能输出None 二、什么时候重写new方法 因为python所有的类都是继承object类的,所以不重写new方法也照样能够继承下来使用,但是当我们想让任意个实例的内存地址值都是同一个时,我们就需要重写new方法了,几乎是个固定格式 总结: 需要使N个实例都是同一个内存地址时,重写new方法 需要时N个实例是N个内存地址时,不要重写new方法 class Test(object): # 定义一个类属性 instance = None # 重写new方法 def __new__(cls, *args, **kwargs): # 判断类属性是否为空,如果为空,则调用父类的new方法开辟空间. if cls.instance is None: # 注意:new是一个静态方法,在调用时需要主动传递cls参数 cls.instance = super().__new__(cls) return cls.instance # 否则返回原有值 else: return cls.instance test01 = Test() print(test01) test02 = Test() print(test02) #执行结果 <__main__.Test object at 0x000001FFE50E9438> <__main__.

texlive miktex 更换镜像

比如华科大镜像 华中科技大学开源镜像站 如果你用texlive,那么包管理器名字就叫tlmgr.exe,在命令提示符里运行如下命令 tlmgr option repository http://mirror.hust.edu.cn/CTAN/systems/texlive/tlnet/ 如果你用miktex,包管理器叫mpm.exe 。运行如下命令就可更换到浙江大学: mpm.exe --set-repository= http://mirrors.zju.edu.cn/CTAN/systems/win32/miktex/tm/packages/ 还可以运行 mpm.exe --list-repositories 来查看各个URL的格式 作者:朴素的贝叶斯 链接:https://www.zhihu.com/question/26584112/answer/269623053 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

PTA---01-复杂度1 最大子列和问题

给定K个整数组成的序列{ N1,N2,…,NK},“连续子列”被定义为{Ni,Ni+1,…,Nj},其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。 本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下: 数据1:与样例等价,测试基本正确性;数据2:102个随机整数;数据3:103个随机整数;数据4:104个随机整数;数据5:105个随机整数; 输入格式: 输入第1行给出正整数K (≤100000);第2行给出K个整数,其间以空格分隔。 输出格式: 在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。 输入样例: 6 -2 11 -4 13 -5 -2 输出样例: 20 根据浙江大学的数据结构课程,陈越姥姥的讲解,这里给出她在课堂上四个算法的实现代码。 算法1:复杂度T(N) = O(n^3) int MaxSubseqSum1(int a[], int n) { int max = 0; int i,j,k; int thisSum; for (i = 0; i < n; i++)//i是子列左端位置 { for(j = i; j < n; j++)//j是子列右端位置 { thisSum = 0;//thisSum是从a[i]到a[j]的子列和 for(k = i; k < j; k++) thisSum += a[k]; if(thisSum > max)//如果刚得到的这个子列和更大 max = thisSum;//则更新结果 }//j循环结束 }//i循环结束 return max; } 算法2:复杂度T(N) = O(n^2) int MaxSubseqSum2(int a[], int n) { int max = 0; int i,j; int thisSum; for (i = 0; i < n; i++)//i是子列左端位置 { thisSum = 0;//thisSum是从a[i]到a[j]的子列和 for(j = i; j < n; j++)//j是子列右端位置 { thisSum += a[j];//对于相同的i,不同的j,只要在j-1次循环的基础上累加1项即可 if(max < thisSum)//如果刚得到的这个子列和更大 max = thisSum;//则更新结果 }//j循环结束 }//i循环结束 return max; } 算法3 ,分而治之 ,复杂度O(Nlogn) int Max3( int A, int B, int C ) { /* 返回3个整数中的最大值 */ return A > B ?

小程序二维码base64转为图片(二维码的获取)

一、base64 1、base64图片 base64 格式图片数据,无法被 getImageInfo直接调用 2、解决方法 1、首先使用 wx.base64ToArrayBuffer 将 base64 数据转换为 ArrayBuffer 数据 2、使用 FileSystemManager.writeFile 将 ArrayBuffer 数据写为本地用户路径的二进制图片文件 3、此时的图片文件路径在 wx.env.USER_DATA_PATH 中, wx.getImageInfo 接口能正确获取到这个图片资源并 drawImage 至 canvas 上 封装一个js文件 const fsm = wx.getFileSystemManager(); const FILE_BASE_NAME = ‘tmp_base64src’; const base64src = function(base64data) { return new Promise((resolve, reject) => { const [, format, bodyData] = /data:image/(\w+);base64,(.*)/.exec(base64data) || []; if (!format) { reject(new Error(‘ERROR_BASE64SRC_PARSE’)); } const filePath = ${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}; const buffer = wx.base64ToArrayBuffer(bodyData);