基于【自定义remle(二)】项目增加加密功能
1:数据库t_user表增加一列(盐)
增加字段:salt
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`password` varchar(100) NOT NULL,
`salt` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
2:javaBean增加一个属性(盐)
com\shiro\vo\UserVo.java
//加密 盐
private String salt;
3:mapper层增加添加用户方法
com\shiro\mapper\UserMapper.java
//注册用户
public void addUser(UserVo userVo);
4:mapper.xml层增加添加用户方法
com\shiro\mapper\UserMapper.xml
insert into t_user(username, password,salt) values (#{username},#{password},#{salt})
5:service接口增加添加用户的方法以及实现
com\shiro\service\UserService.java
/*注册用户*/
public void addUser(UserVo userVo);
com\shiro\service\impl\UserServiceImpl.java
public void addUser(UserVo userVo) {
priority_queue排序方式的理解 priority_queue的默认排序方式是从大到小排序。
如果要改变其排序方式有两种方式:
方式一:
priority_queue<int,vector<int>,less<int>>s;//定义优先级队列s,less表示按照递减(从大到小)的顺序插入元素 priority_queue<int,vector<int>,greater<int>>s;//定义优先级队列s,greater表示按照递增(从小到大)的顺序插入元素 方式二:
在结构体里进行重载:
struct AC { int a,b,c; friend bool operator <(AC m1,AC m2) { return m1.a>m2.a; } }s[10]; 这样可以使priority_queue< AC>q 以从小到大的方式排序。
看到这里我有一个疑问:
类比sort 的排序方式,如果sort(s,s+3);就会是从大到小排序。
这是为什么呢?
实际上这就要聊聊重载的本质
上面的代码可以这样理解:
如果 m1.a>m2.a 那么m1 < m2 就成立,但是对于priority_queue来说,其默认排序方式是从大到小,即m1<m2与之矛盾,返回值为 0 ,所以生成的结果则为 m2 m1。
反过来,对于sort来说,从小到大是其默认的排序方式,所以如果m1.a > m2.a 成立,则m1 < m2 成立,符合其默认的排序方式,于是函数内部的返回值就应该是 1,所以最后生成的结果就是m1 m2。
例子:颜色:粉色[10] 尺码:S[5]
去掉[ ]及内容:
preg_replace("/\[.*\]/", '', $str)1
处理后效果:颜色:粉色 尺码:S
小技巧:可把[ ]改为其他符号应用在需要的地方
ps:下面看下利用正则表达式提取括号内内容
比如现在要提取 中华人们共和国,简称(中国) 这句话中括号里的“中国”
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test
{
public static void main(String[] args)
{
String str ="中华人民共和国,简称(中国)。";
Matcher mat = Pattern.compile("(?<=\\()(\\S+)(?=\\))").matcher(str);//此处是中文输入的()
while(mat.find()){
System.out.println(mat.group());
}
}
}
最后附一下用到的零宽断言:
总结
以上所述是小编给大家介绍的正则表达式去除中括号(符号)及里面包含的内容,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
STM32RTC实时时钟实验讲解,从入门到放弃。 文章目录 STM32RTC实时时钟实验讲解,从入门到放弃。 前言一、RTCRTC是什么?RTC工作过程及寄存器 二、实验部分步骤分解代码部分 总结 前言 本文参考了网上的博文,并加以归纳总结,帮助新手从入门到放弃 。
提示:以下是本篇文章正文内容:
一、RTC RTC是什么? RTC(Real Time Clock):实时时钟,是指可以像时钟一様输出实际时间的电子设备,一般会是集成电路,因此也称为时钟芯片。总之,RTC只是个能靠电池维持运行的32位定时器,并不像实时时钟芯片,读出来就是年月日。RTC就只一个定时器而已,掉电之后所有信息都会丢失,因此我们需要找一个地方来存储这些信息,于是就找到了备份寄存器(BKP)。因为它掉电后仍然可以通过纽扣电池供电,所以能时刻保存这些数据。 STM32 的实时时钟(RTC)是一个独立的定时器。 STM32 的 RTC 模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。
RTC和后备寄存器通过一个开关供电,在VDD有效时该开关选择VDD供电,否则由VBAT引脚供电。后备寄存器(10个16位的寄存器)可以用于在关闭VDD时,保存20个字节的用户应用数据。 RTC和后寄存器不会被系统或电源复位源复位;当从待机模式唤醒时,也不会被复位。实时时钟具有一组连续行的计数器,可以通过适当的软件提供日历时钟功能,还具有闹钟中断和阶段性中断功能。 RTC的驱动时钟可以是一个使用外部晶体的32.768kHz的振荡器、内部低功耗RC振荡器或高速的外部时钟经128分频。内部低功耗RC振荡器的典型频率为40kHz。为补偿天然晶体的偏差,可以通过输出一个512Hz的信号对RTC的时钟进行校准。 RTC具有一个32位的可编程计数器,使用比较寄存器可以进行长时间的测量。有一个20位的预分频器用于时基时钟,默认情况下时钟为32.768kHz时,它将产生一个1秒长的时间基准。
因为RTC 模块和时钟配置系统(RCC_BDCR 寄存器)是在后备区域,即在系统复位或从待机模式唤醒后 RTC 的设置和时间维持不变。但是在系统复位后,会自动禁止访问后备寄存器和 RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置时间之前, 先要取消备份区域(BKP)写保护,我们就先看一下,RTC的工作过程。
RTC工作过程及寄存器 图中浅灰色的部分都是属于备份域的,在VDD掉电时可在VBAT的驱动下继续运行.这部分仅包括RTC的分频器,计数器,和闹钟控制器.若VDD电源有效,RTC可以触发RTC_Second(秒中断)、RTC_Overflow(溢出事件)和RTC_Alarm(闹钟中断).从结构图可以看到到,其中的定时器溢出事件无法被配置为中断.如果STM32原本处于待机状态,可由闹钟事件或WKUP事件(外部唤醒事件,属于EXTI模块,不属于RTC)使它退出待机模式.闹钟事件是在计数器RTC_CNT的值等于闹钟寄存器RTC_ALR的值时触发的.
因为RTC的寄存器是属于备份域,所以它的所有寄存器都是16位的.它的计数RTC_CNT的32位由RTC_CNTL和RTC_CNTH两个寄存器组成,分别保存计数值的低16位和高16位.在配置RTC模块的时钟时,把输入的32768Hz的RTCCLK进行32768分频得到实际驱动计数器的时钟TR_CLK = RTCCLK/37768 = 1Hz,计时周期为1秒,计时器在TR_CLK的驱动下计数,即每秒计数器RTC_CNT的值加1(常用)
RTC只是一个时钟,但与RTC相连的有两个系统时钟,一个是APB1接口的PCLK1另一个是RTC时钟。这样,RTC功能也就分为两个部分:第一部分,APB1接口部分,与APB1总线相连,MCU也就是通过这条总线对其进行读写操作。另一部分,RTC核,由一系列可编程计数器组成,这部分又再细分为两个组件:预分频模块与32位可编程计数器。预分频模块用来产生最长为1秒的RTC时间基准,而32位的可编程的计数器可被初始化为当前的系统时间。
RTC核心模块
第一模块:RTC的预分频模块(可编程产生1s的RTC时间基准TR_CLK)20位的预分频器,如果在 RTC_CR 寄存器中设置了相应的允许位,则在每个TR_CLK 周期中 RTC 产生一个中断(秒中断)。
第二模块:32位计数器(可初始化当前系统时间),可被初始化为当前的系统时间,一个 32 位的时钟计数器,按秒钟计算,可以记录 4294967296 秒,约合 136 年 左右,作为一般应用,这已经是足够了的。(RTC_CNT是一个32位寄存器,可存储的最大值为(232-1),这样的话就是在232秒之后溢出,大概换算为:Time = 2 32 /365/24/60/60大约等于136年)感兴趣的可以看一下UNIX时间戳;
闹钟寄存器RTC_ALR:
RTC 还有一个闹钟寄存器 RTC_ALR,用于产生闹钟。系统时间按 TR_CLK 周期累加并与存储在 RTC_ALR 寄存器中的可编程时间相比较,如果 RTC_CR 控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断 由于RTC内核完全独立与APB1接口,软件只能通过APB1的接口访问RTC的预分频值、计数器值和闹钟值,相关的寄存器值是在APB1时钟进行重新同步的RTC上升沿被更新,所以在读取RTC寄存器曾经被禁止的APB1接口前,必须等待RTC_CRL寄存器的PSF位被置1。 需要了解一下RTC的原理,先来看一下相关的寄存器。
uniapp 层级高 app运行时 遮罩层显示的时候 map在遮罩层上方 1.在需要弹出框的页面中 配置pages.json
{ "path": "pages/con-teacher/outService", "style": { "app-plus": { "titleNView": false, //禁用原生导航栏 // 弹出层 "subNVues": [{ "id": "map", // 唯一标识 "path": "pages/con-teacher/subnvue/frame", // 页面路径 "type": "popup", //样式 "style": { "position": "popup", "margin": "auto", "width": "440rpx", "height": "440rpx", "background": "transparent" } }] } } 2.对应页面写代码了
3.在父页面中怎么引用 以及怎么打开或关闭
通过在pages.json中的id获取 .show() .hide() // 打开 const subNVue = uni.getSubNVueById('map') // 打开 nvue 子窗体 subNVue.show('fade-in', 300, function() { onsole.log('打开哦'); }) 关闭 dialogClose(){ const subNVue = uni.
引子
字典,形如 dic = {'a':1 , 'b':2 , 'c': 3},字典中的元素没有顺序,所以dic[0]是有语法错误的。并且不可以有重复的键值,所以 dic.add['c'] = 4后,字典变成 {'a':1 , 'b':2 , 'c': 4}.
待解决问题
如何根据需要可以根据“键”或“键值”进行不同顺序的排序?
函数原型
sorted(dic,value,reverse)
dic为比较函数,value 为排序的对象(这里指键或键值),
reverse:注明升序还是降序,True--降序,False--升序(默认)
案例
dic = {'a':3 , 'b':2 , 'c': 1}
注意
排序之后原字典没有变,顺序依旧
两个函数
1.lambda
功能: 创建匿名函数
区别: 和def函数定义,以下两点区别
lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符;而def则会把函数对象赋值给一个变量
lambda它只是一个表达式,而def则是一个语句
案例:
2.iteritems()
功能: iteritems()以迭代器对象返回字典键值对
区别: 和item相比:items以列表形式返回字典键值对
案例:
注释: 在函数sorted(dic.iteritems(), key = lambda asd:asd[1])中,第一个参数传给第二个参数“键-键值”,第二个参数取出其中的键([0])或键值(1])
一、Python的排序
1、reversed()
这个很好理解,reversed英文意思就是:adj. 颠倒的;相反的;(判决等)撤销的
print list(reversed(['dream','a','have','I']))
#['I', 'have', 'a', 'dream']
2、让人糊涂的sort()与sorted()
一、什么是Socket 在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。
我的理解就是Socket就是该模式的一个实现:即socket是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。
Socket()函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
二、网络中进程如何通信 既然Socket主要是用来解决网络通信的,那么我们就来理解网络中进程是如何通信的。
1、本地进程间通信 消息传递(管道、消息队列、FIFO)同步(互斥量、条件变量、读写锁、文件和写记录锁、信号量)?【不是很明白】共享内存(匿名的和具名的,eg:channel)远程过程调用(RPC) 2、网络中进程如何通信 我们要理解网络中进程如何通信,得解决两个问题:
我们要如何标识一台主机,即怎样确定我们将要通信的进程是在那一台主机上运行。我们要如何标识唯一进程,本地通过pid标识,网络中应该怎样标识? 解决办法:
TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机传输层的“协议+端口”可以唯一标识主机中的应用程序(进程),因此,我们利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。 三、Socket怎么通信 现在,我们知道了网络中进程间如何通信,即利用三元组【ip地址,协议,端口】可以进行网络间通信了,那我们应该怎么实现了,因此,我们socket应运而生,它就是利用三元组解决网络通信的一个中间件工具,就目前而言,几乎所有的应用程序都是采用socket,如UNIX BSD的套接字(socket)和UNIX System V的TLI(已经被淘汰)。
Socket通信的数据传输方式,常用的有两种:
a、SOCK_STREAM:表示面向连接的数据传输方式。数据可以准确无误地到达另一台计算机,如果损坏或丢失,可以重新发送,但效率相对较慢。常见的 http 协议就使用 SOCK_STREAM 传输数据,因为要确保数据的正确性,否则网页不能正常解析。
b、SOCK_DGRAM:表示无连接的数据传输方式。计算机只管传输数据,不作数据校验,如果数据在传输中损坏,或者没有到达另一台计算机,是没有办法补救的。也就是说,数据错了就错了,无法重传。因为 SOCK_DGRAM 所做的校验工作少,所以效率比 SOCK_STREAM 高。
例如:QQ 视频聊天和语音聊天就使用 SOCK_DGRAM 传输数据,因为首先要保证通信的效率,尽量减小延迟,而数据的正确性是次要的,即使丢失很小的一部分数据,视频和音频也可以正常解析,最多出现噪点或杂音,不会对通信质量有实质的影响。
四、TCP/IP协议 1、概念 TCP/IP【TCP(传输控制协议)和IP(网际协议)】提供点对点的链接机制,将数据应该如何封装、定址、传输、路由以及在目的地如何接收,都加以标准化。它将软件通信过程抽象化为四个抽象层,采取协议堆栈的方式,分别实现出不同通信协议。协议族下的各种协议,依其功能不同,被分别归属到这四个层次结构之中,常被视为是简化的七层OSI模型。
它们之间好比送信的线路和驿站的作用,比如要建议送信驿站,必须得了解送信的各个细节。
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接,客户端在收发数据前要使用 connect() 函数和服务器建立连接。建立连接的目的是保证IP地址、端口、物理链路等正确无误,为数据的传输开辟通道。
TCP建立连接时要传输三个数据包,俗称三次握手(Three-way Handshaking)。可以形象的比喻为下面的对话:
[Shake 1] 套接字A:“你好,套接字B,我这里有数据要传送给你,建立连接吧。” [Shake 2] 套接字B:“好的,我这边已准备就绪。” [Shake 3] 套接字A:“谢谢你受理我的请求。 2、TCP数据报结构: 带阴影的几个字段需要重点说明一下:
(1) 序号:Seq(Sequence Number)序号占32位,用来标识从计算机A发送到计算机B的数据包的序号,计算机发送数据时对此进行标记。
(2) 确认号:Ack(Acknowledge Number)确认号占32位,客户端和服务器端都可以发送,Ack = Seq + 1。
mybatis笔记 框架
软件开发中的一套解决方案,不同的框架解决不同的问题 好处:框架封装很多细节,使开发者可以使用极简的方式实现功能,大大提高开发效率 三层框架
【表现层】 用于展示数据 【业务层】 处理业务需求 【持久层】 数据库交互 持久层技术解决方案
【JDBC技术】 Connection PreparedStatement ResultSet 【Spring的JdbcTemplate】 spring对jdbc的简单封装 【Apache的DBUtils】 和JdbcTemplate很像,是对Jdbc的简单封装 以上都不是框架 JDBC是规范 JdbcTemplate和DBUtils都只是工具类 一、概述 mybatis是持久层框架,java写的
封装jdbc操作很多细节
开发者只需关注sql语句本身无需关注注册驱动,创建连接等繁杂过程
【ORM】 Object Relational Mappging 对象关系映射 把数据库表和实体类及实体类属性对应,操作实体 类就实现操作数据库表 需做到:实体类中属性和数据库表字段名称操持一致 二、入门 环境搭建
创建maven工程并导包 mybatis-3.4.5.jar mysql-connector-java-5.1.6.jar log4j-1.2.12.jar 创建对应实体类以及dao接口创建并配置mybatis主配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!-- mybatis的主配置文件 --> <configuration> <!-- 配置环境 --> <environments default="mysql"> <!-- 配置mysql环境 --> <environment id="mysql"> <!-- 配置事务类型 --> <transactionManager type="
最近想运行一个网络,用到了centernet,需要安装DCNv2,折腾了两天,记录一下填坑的过程。
下载
(1)github上最新版的DCNv2源码在"https://github.com/CharlesShang/DCNv2",但是该版本源码不支持PyTorch1.7,如果使其支持PyTorch1.7需要做以下修改:
将DCNv2/src/cuda/dcn_v2_cuda.cu中所有的THCState_getCurrentStream(state)替换成c10::cuda::getCurrentCUDAStream()。 (2)github上有支持PyTorch1.7的源码,“https://github.com/lbin/DCNv2/tree/pytorch_1.7”,可以直接使用。
修改torch/utils/cpp_extension.py文件
该文件一般在你的python安装目录site-packages文件夹下,比如我的在conda虚拟环境路径/lib/python3.7/site-packages/torch/utils/cpp_extension.py。
(1)将源码command = [‘ninja’, ‘-v’]修改成command = [‘ninja’, ‘–version’],注意version前面是两条短横线。
(2)将源码compiler_info.decode().strip()修改成compiler_info.decode(‘gbk’).strip()。
编译
在DCNv2目录下执行./make.sh即可。
错误
在使用conda安装torch、torchvision的环境中,一直出现如下错误,实在找不到解决方法。
g++: error: xxx/DCNv2/src/vision.o: No such file or directory g++: error: xxx/DCNv2/src/cpu/dcn_v2_psroi_pooling_cpu.o: No such file or directory g++: error: xxx/DCNv2/src/cpu/dcn_v2_im2col_cpu.o: No such file or directory g++: error: xxx/DCNv2/src/cpu/dcn_v2_cpu.o: No such file or directory g++: error: xxx/DCNv2/src/cuda/dcn_v2_im2col_cuda.o: No such file or directory g++: error: xxx/DCNv2/src/cuda/dcn_v2_psroi_pooling_cuda.o: No such file or directory g++: error: xxx/src/cuda/dcn_v2_cuda.
有时候需要在单机事件或函数中要求我们新窗口打开页面
在点击触发事件函数中:
const {href} = this.$router.resolve({ path:"跳转的路由地址" }) window.open(href,'_blank')
redis-cli -h localhost -p 6379 -a mypassword
点击查看router-link详细解释
rotuer-link的to的几种使用方式
1》to='/home' 2》:to='"/home"' 3》:to='{path:"/home"}' 4》:to='{ path:"/home", query:{userId:111} }' 5》:to="{ name:'user', params:{userId:111} }" 如何通过js方式进行跳转,有以下几种方式
*router.push *router.replace *router.go *router.back *router.forward 示例:点击按钮跳转至设置页面
<template> <div> <router-view></router-view> <router-link to="/">首页</router-link> <!-- <router-link to="/fav">收藏</router-link> --> <router-link :to='{path:"/fav",query:{userId:123}}'>收藏</router-link> <router-link to="/config" tag='h1'>设置</router-link> <button @click='toConfig'>跳转至设置页面</button> </div> </template> <script> export default{ methods:{ toConfig(){ this.$router.push({ path:"/config" }) } } } </script> <style scoped> .router-link-active{ color: red; } </style> router-link tag标签,router-link默认渲染出来是一个a标签,如果想渲染成其他标签,可以设置tag即可。类似tag=‘button’,这样的写法。
<router-link to="/config" tag='h1'>设置</router-link> //设置将会被渲染成一个h1标签 最后:router-link-active:默认触发的className。设置为某个颜色,即点击某个router-link的菜单后,该菜单即变为什么颜色
从区块链诞生的那一刻起,区块链的安全事件就层出不穷,无论是比特币、以太坊还是最近的 Filecoin 都在不断地改进中,不断地提升自身的安全性。但是,这个一个新生事物,多数都是包含着无数的缺陷诞生的,同样受到各种追捧和持续快速地迭代。
在区块链领域流行着一句话:In BlockChain We Trust。为什么?区块链运行起来,参与的人员众多,良莠不齐,许多节点经常遭受攻击,但是大家还是说 “In Blockchain We Trust”。也就是说,我们就是相信区块链。
这一方面表明区块链是颠覆性的,其本身就是一种建立信任的技术,另一方面,大家也相信,区块链是一种安全的技术。这一点有些意思,因为许多人看到的是区块链领域发生的安全时间,而很少思考区块链所带来的安全变革。
区块链的安全问题
大家经常提到的区块链安全,涉及到的方面非常多,但其实,多数都是与传统的软件系统的安全性有共通之处。大体说来,可以考虑以下一些方面(我对这些安全问题加一些评注,以蓝色斜体表示):
代码安全:许多安全问题来自于代码漏洞,非常著名的就是 Ethereum 的 DAO 事件,直接导致以太坊分叉至两个网络:ETH 和 ETC;Filecoin 前段事件发生的网络暂停事件,也是一个代码问题导致的安全事件,所幸的是,未发生资金方面的问题。(评:代码问题是一个通用的问题,在任何的软件系统和网络中都存在,与是不是区块链没有直接关系。)
私钥遗失或被盗:这是大家谈论的比较多的安全问题,业界也在不停地教育和改善系统,一些对私钥的保存和找回的机制和方式也逐渐成熟。(评:这和一般系统中的账号和密码丢失类似,但中心化系统一般可以通过身份认证找回,而区块链系统的去中心化特性,使得找回私钥需要一些其他的方式。)
黑客入侵:最著名的就是直接导致门头沟(Mt.Gox)倒闭的黑客事件了,当然几乎所有交易所都发生了黑客入侵和丢币的事件,这似乎也是区块链领域的常见安全问题。(评:这些安全事件都发生在中心化交易所,这些安全事件与区块链技术本身关系不大。反而,这些安全事件正说明去中心化的安全性更高,你什么时候听说过去中心化交易所的黑客事件?)
钓鱼攻击:完全与区块链没有关系,中心化系统的常规安全问题
女巫攻击/路由攻击:这通常发生在有些区块链系统还不成熟,或者参与人比较少的情况,需要对链和网络有一定的控制权
51% 攻击:老生常谈了。(评:这是区块链真正的安全问题。但这也正是区块链的设计基础,即网路朝着符合大多数人(或投票权)的方向走。同时这也要求一条链必须要有足够的去中心化,和足够的参与度来保障安全)
我们看一看,上面提到的安全问题,除了51% 攻击区块链特有的,而其他部分,都基本上与区块链没有直接的关系,是通用网络都会遇到的问题。而 51% 攻击,从另一份方面来讲,也体现了区块链的安全性之高,要作恶的成本之高昂,在一条成熟的、参与人众多的链面前,这种攻击显得太难而不可行。
区块链对网络安全的提升
如果我们提升一个层次,真正考虑网络的安全问题,而不是拘泥于一个一个点来看。我们会发现,实际上,区块链技术解决了非常多的安全问题。这也是为什么说区块链是第三代互联网的基石的重要原因。因为第三代互联网(Web3.0)是一个可信的网络,可信的基础就来自于区块链。
区块链赋能Web3.0,通过去中心化技术建立信任,那么没有那么多的安全软件,没有防火墙,没有安全专家为每一个网络软件的运行把关,行吗?区块链说,这都不需要。
开源是安全的基础:没有绝对的代码安全,但是,一条成熟的公链,其代码必然是开源的,共享的,经过很多人验证和测试的,经过审计的。在安全的世界里,早就有一条共识,加密要用大家都认可的开源算法和实现,安全机制要采用标准的开源的经过验证的机制,而不是私有的、未公开的。区块链作为一个去中心化的系统,其运行机制和经济激励都以开源为基础,当持续运行下去,其安全和信任度会越来越高。如今的比特币网络就是一个最好的例证。
开放和去中心化使攻击无处借力:第二代互联网的基础设施被网络寡头把控,尽管这些寡头投入重金来保障安全,但是安全事件常年不断,Gmail停服,Twitter故障,微博罢工,信用卡账号被盗等等。但是,一条区块链网络运行起来,除非代码问题(前面提到,非常少而且会快速成熟),绝不会停工,长久服务,这就是技术和架构本身带来的安全性。
密码学技术保障运算和存储安全:黑客入侵是传统软件和系统非常头疼的问题,但是,你听说过有黑客入侵一条区块链吗?有黑客能够为一个上线的智能合约植入木马吗?区块链的验证技术使得这些安全攻击不可行,Bitcoin的一个交易一旦发生,Ethereum的一个合约一旦上链就不可篡改。Filecoin 的一份内容上线后任何时候检索出来都保证没有任何偏差。这些技术,是区块链的基础,也是天然地保证交易、计算和存储的安全。
激励机制导致攻击成本高昂:区块链世界欢迎任何形式的运算,因为本身区块链世界就是开放的,你可以上传自己的应用,有人用就好。按照传统的观点,这不是为病毒泛滥大开方便之门?不然,因为区块链的经济激励机制使得病毒传播和运行并不可行,因为每一个运算、每一份存储都有定价,区块链世界没有免费的午餐。要传播、要运行,那就付费。这从根本上解决了无阻碍传播和攻击的问题。
模块重用提升安全:一条公链很重要的特性就是智能合约之间的相互调用,也就是说,你可以把一条链看成一台计算机,而不是像Web2.0世界中网络是联通的,但实际上各种应用之间是割裂了。相似的程序实现相似的功能,但代码各不相同,带来无数的安全问题。而在区块链世界中,已经经过验证的合约和接口直接使用,使得应用的建立变得更简单也更安全。试想,一个传统的借贷系统需要多么复杂,会有多少的安全问题,然而,在区块链世界,借用已经诞生的应用和模块,你可以利用数百行代码,构建复杂的应用,代码量减少几个数量级,安全问题也就更容易处理。
透明性和可追踪性提升安全:也就是我们常说的 Availability/Transparency 和 Tracibility。如果一个应用的所有事物都被记录,并能够追踪,其安全性就更容易把握。而这恰恰是区块链的重要特性之一。
安全的另一个维度
In BlockChain We Trust
业界有无数的安全公司,从不同的角度来处理安全问题,提出了无数的安全方案和设想。但如果我们要真的安全,必然做颠覆式的思考。提升一个维度来看问题。
从另一个角度来看问题,你会发现,新的范式下,以前你看见的问题都不再是问题了,自然地被解决了。一些新的问题还会出现,但是角度完全不同了。
传统的安全更注重个体,如何保障个体的安全从而保证网络的安全,它基于的基础是,网络是由个体组成的,没有个体就没有网络;而对于区块链而言,网络是基础,运算、存储、网络链接等等不再依赖于哪一个个体,网络就是网络,每一个个体网络构建的细胞,它基于的基础是:网络是一个整体,个体依赖网络而存在。每一个个体都可以随意进入或退出网络,个体构成的整体更重要,这就如我们身体的细胞,每天在更新,但人还是那个人,我们的记忆,发展都是延续的。
有了这个理解,安全就是一个整体的设计。区块链中密码学技术的广泛应用,所有事务和交易的强制验证,代码开源和共享,激励机制的采用都在更上一个维度来建立一个更安全和更可信任的网络。
程序员必备三十道算法题(21~30题) 21、题目:求1+2!+3!+…+20!的和
程序分析:此程序只是把累加变成了累乘。
<script> var sum = 0; for(var i = 1;i <= 20;i++){ var a = 1; for(var j = i;j > 0;j--){ a *= j; } sum += a; } alert('和为' + sum); </script> 22、题目:利用递归方法求5!。
程序分析:递归公式:fn=fn_1*4!
方法一递归: <script> function text(a) { if(a == 0 || a == 1){ return 1; }else { return a * text(a - 1) } } alert('5!为' + text(5)) </script> 方法二: <script> var a = prompt('输入要求阶层的数'); var sum = 1; if(a == 0 && a == 1){ alert(1); } for(var i = 1;i <= a;i++){ sum *= i; } alert(sum); </script> 23、题目:打印出 100-1000之间所有的“水仙花数”;
New option
【Rev:5936】【Rev:6045】【Rev:6049】The new system variable binlog_impossible_mode controls what happens if the server cannot write to the binary log, for example, due to a file error. For backward compatibility, the default for binlog_impossible_mode is IGNORE_ERROR, meaning the server logs the error, halts logging, and continues updates to the database. Setting this variable to ABORT_SERVERmakes the server halt logging and shut down if it cannot write to the binary log
把page.json文件所有的注释信息删掉再创建就可以了
从官网下载相应的压缩包,U/C两个版本安装方案相同解压sudo tar -zxvf ideaIC-2020.3.2.tar.gz 此时在解压的文件夹下,执行idea.sh就可以使用了移动文件夹到opt文件夹下sudo mv idea-IC-203.7148.57/ /opt/idea/ 创建“快捷方式”cd /usr/share/applications sudo touch idea.desktop sudo gedit idea.desktop # or other editor 粘贴下方文本并保存
[Desktop Entry] Name=IntelliJ IDEA Comment=IntelliJ IDEA Exec=/opt/idea/bin/idea.sh # idea路径 Icon=/opt/idea/bin/idea.png Terminal=false Type=Application Categories=Developer; 最后执行
sudo chmod u+x idea.desktop 即可在抽屉里找到图标。
C2服务器 全称Command & Control Server
又称C&C服务器
常见于病毒木马控制主机后,攻击者通过C2服务器转发命令
Python--基本语法元素
基本语法元素
程序的格式框架
缩进
注释
命名与保留字
变量
命名
保留字
数据类型
字符串
字符串的序号
字符串的使用
数字类型
列表类型
语句与函数
赋值语句
分支语句
函数
输入函数 input()
输出函数 print()
评估函数 eval()
注:该学习笔记内容针对Python语言程序设计视频课,部分课件截图来自视频课课件,中国大学MOOC–Python语言程序设计,有兴趣的同学可自行搜索
基本语法元素
Python 语言程序设计的第一章基础,内容包括:程序的格式框架、命名与保留字、数据类型语句与函数、Python程序的输入输出等
程序的格式框架
代码高亮:编程的色彩辅助体系,不是语法要求
缩进
一行代码开始前的空白区域,表达程序的格式框架。
缩进表达程序的格式框架,包括单层缩进和多层缩进—
严格明确:缩进是语法的一部分,缩进不正确程序运行错误
所属关系:表达代码间包含和层次关系的唯一手段
长度一致:程序内一致即可,一般用4个空格或1个TAB
注释
用于提高代码可读性的辅助性文字,不被执行。
不被程序执行的辅助性说明信息
单行注释:以#开头,其后内容为注释
#这里是单行注释
多行注释:以’’‘开头和结尾
‘’’ 这是多行注释第一行
这是多行注释第二行 ‘’’
命名与保留字
变量
程序中用于保存和表示数据的占位符号。
用来保存和表示数据的占位符号
变量采用标识符(名字) 来表示,关联标识符的过程叫命名
TempStr 是变量名字
可以使用等号(=)向变量赋值或修改值,=被称为赋值符号
TempStr = “82F” #向变量TempStr赋值"82F"
命名
关联标识符的过程
命名规则: 大小写字母、数字、下划线和中文等字符及组合
如: TempStr, Python_Great, 这是门Python好课
注意事项: 大小写敏感、首字符不能是数字、不与保留字相同
conda源: 1.上海交大源: 上海交大的: https://mirrors.sjtug.sjtu.edu.cn/#/ 添加上海交大源:
channels: - https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/main/ - https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/free/ - https://mirrors.sjtug.sjtu.edu.cn/anaconda/cloud/conda-forge/ ssl_verify: true 2.清华源: 清华的: https://mirrors.tuna.tsinghua.edu.cn/ 添加清华源:
channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ ssl_verify: true 3.中科大源: 中科大源官网: https://mirrors.ustc.edu.cn/ 添加中科大源:
channels: - https://mirrors.ustc.edu.cn/anaconda/pkgs/main/ - https://mirrors.ustc.edu.cn/anaconda/pkgs/free/ - https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/ ssl_verify: true pip源 :【建议使用豆瓣或者阿里的,超级超级快】
1.豆瓣源: [global] index-url = https://pypi.doubanio.com/simple trusted-host = pypi.doubanio.com 2.阿里源: [global] index-url = https://pypi.doubanio.com/simple trusted-host = pypi.doubanio.com 国内其它pip源
清华:https://pypi.tuna.tsinghua.edu.cn/simple中国科技大学:https://pypi.mirrors.ustc.edu.cn/simple/华中理工大学:http://pypi.hustunique.com/山东理工大学:http://pypi.sdutlinux.org/ 附上笔者的conda源和pip源:【复制粘贴、刷新即可使用】 channels: show_channel_urls: true channel_alias: https://mirrors.tuna.tsinghua.edu.cn/anaconda default_channels: - https://mirrors.