Other

spi

[SPI].SPI协议详解 - aaronGao - 博客园 (cnblogs.com)      ■概述 Spi是一种全双工、高速的、同步的通信总线。 主从结构  ■SPI接口 SPI接口缩写SSEL:slave select,常常也被写作CS(chip select)或SS(slave select)SCK:serial clock,常常也写作SCLK或SCLMISO:master input slave output,常常被简写为SO(slave output,也有说是serial output)MOSI:master output slave input,常常被简写为SI(slave input,也有说是serial input) ■SPI通信方式 CPOL :Clock Polarity(时钟极性 )CPHA :Clock Phase(时钟相位)  ■用途 Flash芯片 OLED屏  

LeetCode 0077 Combinations

原题传送门 1. 题目描述 2. Solution 1、思路分析 递归,回溯法。递归调用树如下图所示 2、代码实现 package Q0099.Q0077Combinations; import java.util.ArrayList; import java.util.List; /* Solution 1: Backtracking */ public class Solution { public List<List<Integer>> combine(int n, int k) { List<List<Integer>> result = new ArrayList<>(); combine(result, new ArrayList<>(), 1, n, k); return result; } private void combine(List<List<Integer>> result, List<Integer> curResult, int start, int n, int k) { if (k == 0) { result.add(new ArrayList<>(curResult)); return; } for (int i = start; i <= n - k + 1; i++) { curResult.

RabbitMQ 工作队列

每日一句 如果你执意追逐我的幻影,迟早会被真正的我打败。 https://www.ylcoder.top/post/1649241412 概述 工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,我们可以在安排任务之后再执行。 我们把任务封装为消息并将其发送到队列,在后台运行的工作进程将弹出任务,并最终执行作业。 当有多个工作线程时,这些工作线程将一起处理这些任务。 轮询分发消息 在这里案例中我们会启动两个工作线程,一个消息发送线程 源码:https://github.com/yltrcc/rabbitmq-demo/tree/master/demo2/src/main/java/com/yltrcc/demo 不公平分发 轮询分发在某些场景下并不是很好。 例子:比如有两个消费者在处理任务,其中有1个消费者1处理任务非常快,另外一个消费者2处理速度很慢。 这个时候采用轮询分发,速度快的消费者1很大部分时间处于空闲状态,处理慢的消费者2一直在处理。 这种情况下其实不太好,但是RabbitMQ不知道,它依然很公平的进行分发。 为了避免这种情况,我们可以设置参数 它的意思是:这个任务我还没有处理完或者我还没有应答你,你先别分配给我,我目前只能处理一个任务,然后RabbitMQ就会把任务分配给没有那么忙的那个空闲消费者。 当然如果所有的消费者都没有完成手上的任务,队列还在不停的添加新任务,队列有可能就会遇到队列被撑满的情况,这个时候就只能添加新的worker或者改变其他存储任务的策略。 预取值 本身消息的发送就是异步发送的,所以在任何时候,channel 上肯定不止只有一个消息另外来自消费者的手动确认本质上也是异步的。 因此这里就存在一个未确认的消息缓冲区,因此希望开发人员能限制此缓冲区的大小,以避免缓冲区里面无限制的未确认消息问题。 这个时候就可以通过使用** basic.qos 方法设置“预取计数”值来完成的。该值定义通道上允许的未确认消息的最大数量**。一旦数量达到配置的数量, RabbitMQ 将停止在通道上传递更多消息,除非至少有一个未处理的消息被确认。 例如,假设在通道上有未确认的消息 5、6、7,8,并且通道的预取计数设置为 4,此时RabbitMQ 将不会在该通道上再传递任何消息,除非至少有一个未应答的消息被 ack。 比方说 tag=6 这个消息刚刚被确认 ACK,RabbitMQ 将会感知这个情况到并再发送一条消息。 消息应答和 QoS 预取值对用户吞吐量有重大影响。通常,增加预取将提高向消费者传递消息的速度。 面试题 String和StringBuilder、StringBuffer的区别? String是只读字符串,String 的底层是一个 char[] 通过final关键字进行修饰,所以说它的内容是不能被改变的。 StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同, 区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。 字符串的+操作其本质是创建了StringBuilder对象进行append操作,然后将拼接后的StringBuilder对象用toString方法处理成String对象, 这一点可以用javap -c Test.class命令获得class文件对应的JVM字节码指令就可以看出。 Redis 怎么查看所有的key? # 列出所有的key redis> keys * # 列出匹配的key redis>keys apple* 1) apple1 2) apple2 LeetCode 3 无重复字符的最长子串 题目链接 https://leetcode-cn.

python数据处理-matplotlib入门(2)-利用随机函数生成变化图形2

鉴于上一篇中最后三个问题: 1、上述程序是否能进行优化(比如功能相同的) 2、创建三个3个实例,用了3个语句,能否建一个函数,只输入一个数n,就自动创建n个实例?同时,每个实例的num_times随机,(n比较大时,num_times应该比较小) 3、当实现上述功能后,程序运行,只输入一个参数(创建实例的个数),就会自动生成对应的num_times,并分别调用相关函数生成对应图表。  可以,在类Rand_moving()中计算每一步的方向和移动位置时,都用到了一个乘法公式, x_direction = choice([1,-1]) #x的移动方向,1向上,0不变,-1向下 x_distance = choice([0,1,2,3,4,5]) #x的每次移动的像素, x_step = x_direction*x_distance #移动方向乘以移动距离,以确定沿x移动的距离 y_direction = choice([1,-1]) #y的移动方向,1向上,0不变,-1向下 y_distance = choice([0,1,2,3,4,5]) #y的每次移动的像素, y_step = y_direction*y_distance #移动方向乘以移动距离,以确定沿y移动的距离 因此可以整理出一个计算方法,可以直接调用,至于2,3很明显,也是可以完成的。 第一步,将乘法公式提出来单独形成一个作用于自身的方法,代码如下: def get_step(self,direction,distance): return distance*direction def fill_moving(self): while len(self.x_values)<self.num_times:#循环不断运行,直到漫步包含所需数量的点num_times x_step = self.get_step(choice([1,-1]),choice([0,1,2,3,4,5])) #直接调用get_step方法,使代码更加简洁 y_step = self.get_step(choice([1,-1]),choice([0,1,2,3,4,5])) 完成第1问,代码变得更加简洁明了。 第2、3个问题: 1)要能生成实例个数n,且还有对应的移动次数num_times,可考虑用字典,即实例个数为key,对应移动次数num_times为键值,当输入2时,如 caselist={’1‘:'150000',’2‘:'250000'} 2)读取字典每个项目,将对应的key和value传递给由Rand_moving类创建的实例,key的个数即为需要创建实例的个数,对应的value值为移动次数。 3)输入数字,即为字典key的个数,存入字典,同时利用随机函数生成一个num_times保存到对应的value中。  完成思路: 1,重新定义一个类 New_case() 作用:接收一个数据,并根据这个数据自动生成一个字典, class New_case(): #定义New_case类 def __init__(self,numbers): #定义要创建的实例个数 self.numbers=numbers self.caselist={} #定义一个空的caselist字典 self.

python pyauto模块详解

# 获取当前鼠标位置print(pyautogui.position())在每次调用PyAutoGUI的函数后设置2.5秒的暂停: # 暂停2.5spyautogui.PAUSE = 2.5 此外,为了防止程序出问题,当鼠标移动到屏幕左上角,会引发pyautogui.FailSafeException错误进而中止程序。关闭命令如下(不建议关闭): pyautogui.FAILSAFE = False 鼠标移动 # 用num_seconds(秒)将鼠标移动到(x,y)位置 x = 200y = 100 num_seconds = 1 pyautogui.moveTo(x, y, duration=num_seconds) # 用num_seconds(秒)将鼠标从当前位置向右移动xOffset,向下移动yOffset # 如果duration为0或未指定,则立即移动。 xOffset = 30 yOffset = -50 num_seconds = 0.5 pyautogui.moveRel(xOffset, yOffset, duration=num_seconds) 鼠标拖动# 用num_seconds(秒)将鼠标推动到(x,y)位置# 鼠标拖动是指按下鼠标左键移动鼠标。x = 200y = 100num_seconds= 1pyautogui.dragTo(x, y, duration=num_seconds) # 用num_seconds(秒)将鼠标从当前位置向右拖动xOffset,向下推动yOffsetxOffset = 30yOffset = -50num_seconds = 0.5pyautogui.dragRel(xOffset, yOffset, duration=num_seconds) 鼠标单击# 将鼠标移动到(moveToX,moveToY)位置,点击鼠标num_of_clicks次,每次点击间隔secs_between_clicks秒# button表示单击方式,'left'左键单击,'middle'中键单击,'right'右键单击moveToX = 500moveToY = 600num_of_clicks = 1secs_between_clicks = 1pyautogui.

AtCoder Beginner Contest 247 C D E题解

https://atcoder.jp/contests/abc247/tasks/abc247_c 递归即可解决: #include<iostream> #include<cstdio> #include<algorithm> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<map> #include<set> #include<vector> #include<queue> #include<string> #include<bitset> #include<ctime> #include<deque> #include<stack> #include<functional> #include<sstream> typedef long long ll; using namespace std; typedef unsigned long long int ull; #define maxn 200005 #define ms(x) memset(x,0,sizeof(x)) #define Inf 0x7fffffff #define inf 0x3f3f3f3f const int mod = 1e9 + 7; #define pi acos(-1.0) #define pii pair<int,int> #define eps 1e-5 #define pll pair<ll,ll> #define lson 2*x #define rson 2*x+1 long long qupower(int a, int b) { long long ans = 1; while (b) { if (b & 1)ans = ans * a; b >>= 1; a = a * a; } return ans; } inline int read() { int an = 0, x = 1; char c = getchar(); while (c > '9' || c < '0') { if (c == '-') { x = -1; } c = getchar(); } while (c >= '0'&&c <= '9') { an = an * 10 + c - '0'; c = getchar(); } return an * x; } const int N = 65540; int a[N]; void sol(int x){ if(x==1){printf(1 );return;} sol(x-1); printf(%d ,x); sol(x-1); } int main(){ //ios::sync_with_stdio(false); int n; n = read(); sol(n); } https://atcoder.

nginx开放webdav,openwrt专用,kodi可用。

简介: webdav是基于HTTP的扩展协议,类似FTP了,可以上传,可以下载。 我现在有一个openwrt,有2G内存,500G硬盘,挂了aria2下载电影。 平时习惯用kodi通过samba看电影,可是还是有点不方便,只能局域网,并不能广域网,这个webdav,就可以突破samba的限制,实现广域网访问了。 反正公网IPV6也调试完成,把家,办公室,父母家都连起来吧。 一:openwrt的IPV6 这个可以翻前面的文章,不赘述了。 二:openwrt,安装nginx opkg update opkg remove nginx luci-ssl-nginx nginx-util nginx-ssl --force-depends opkg install nginx-all-module opkg install luci-ssl-nginx 三:方法一:增加端口访问 1.增加webdav账号密码 echo admin:$(openssl passwd 123456) >/etc/nginx/conf.d/.davpasswd 2.配置共享目录及权限 本例目录是/storage/data/share mkdir /storage mkdir /storage/data mkdir /storage/data/share chown -R nobody:nogroup /storage/data/share/ chmod -R 700 /storage/data/share/ 3.配置nginx配置文件 增加一个配置文件/etc/nginx/conf.d/webdav.conf 本例端口是8080 server { listen 8080; listen [::]:8080; server_name _; charset utf-8; location / { root /storage/data/share; if ($request_method = MKCOL) { # 解决 MKCOL 需要以'/'结尾 rewrite ^(.

自制YUM源远程仓库

自制YUM仓库 目录自制YUM仓库YUM仓库配置文件YUM仓库类型远程YUM仓库 如果想要制作一个本地的YUM仓库,那么必须要先了解YUM的配置文件中的一些参数含义 YUM仓库配置文件 # 仓库名称 [base] # 仓库描述 name=CentOS-$releasever- Base - mirrors.aliyun.com # 仓库地址baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/ # 检测签名机制(1:开启检测 0:关闭检测) gpgcheck=1 # 签名机制秘钥地址gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-Cen YUM仓库类型 搭建yum支持的的软件源主要有以下两种: 1.远程仓库 http:// 端口一般是80 https:// 端口一般是443 ftp:// 端口一般是21 2.本地仓库 file:// 没有端口(本地协议) 远程YUM仓库 先决条件: 创建仓库的命令 createrepo 要有rpm包 网站获取 镜像获取 yum源获取 yum源的配置文件 1.安装创建仓库的命令 [root@localhost ~]# yum install -y createrepo2.通过镜像,获取rpm包 挂载镜像[root@localhost ~]# mount /dev/cdrom /mnt 安装vsftpd服务 [root@localhost ~]# yum install -y vsftpd启动服务 [root@localhost ~]# systemctl start vsftpd

Leetcode 169. 多数元素

169. 多数元素 - 力扣(LeetCode) (leetcode-cn.com)   思路 1: 1. 先对所有元素进行排序 2. 返回位于数组最中间的元素 func majorityElement(nums []int) int { lenth:=len(nums) sort.Ints(nums) return nums[lenth/2] }  

WordPress删除文章同时同时删除缩略图及图片附件的方法

最近很多小伙伴在问我WordPress删除文章时,文章内所上传到媒体库的图片等附件不会自动删除, 占用了网站空间(虽然本人用的是vps,但是还是有很多人用了虚拟主机,空间有限), 因此下面说明通过几行代码的简单方式实现在删除文章时自动删除缩略图以及图片附件, 这样就不用手动去媒体库寻找并删除,准确而且效率高。 代码如下: /** * WordPress删除文章同时同时删除缩略图及图片附件的方法 * https://www.admin17.cn */ $post_ID ); foreach ( $thumbnails as $thumbnail ) { wp_delete_attachment( $thumbnail->meta_value, true ); } //删除图片附件 $attachments = $wpdb->get_results( SELECT * FROM $wpdb->posts WHERE post_parent = $post_ID AND post_type = 'attachment' ); foreach ( $attachments as $attachment ) { wp_delete_attachment( $attachment->ID, true ); } $wpdb->query( DELETE FROM $wpdb->postmeta WHERE meta_key = '_thumbnail_id' AND post_id = $post_ID ); } add_action('before_delete_post', 'delete_post_and_attachments'); 将上述代码放到主题 functions 文件中即可使用,