hello云胜

技术与生活

0%

idea与maven版本匹配问题

新换了电脑,重新安装了开发环境,然后idea引入以前的maven项目,结果在idea里编译项目报错

Unable to import maven project: See logs for details

image-20210518171632907

检查了各处配置,均没有问题。必须去看看这个错误日志了。

去哪看这个详细日志

Help–>show log in explorer

image-20210518173454184

原因&解决:

我的idea是2019版本,然后我本地装了maven最新版3.8.1.两者有兼容性问题。

换回之前用的3.5.4版本。好了。

Markdown-here插件的使用

1,下载安装

因为墙的原因,我们不能直接从chrome商店下载安装。

去看了Markdown-here的官网,安装时又把我导向了chrome商店,所以依然不能成功。

所幸的是,官网给了一个gihub仓库的地址

https://github.com/adam-p/markdown-here/releases

从这里可以下载到离线安装包。

下载zip包,解压后。

在chrome扩展程序里,加载已解压的扩展程序。安装完成

2,使用

3,扩展

https://github.com/huanxi007/markdown-here-css

编辑:

删除选中行 ctrl + shift + k

选中所有相同的:

alt + f3

复制一行: ctrl+shift+d

切换:

多行编辑:ctrl + alt + 上下

vsCode快捷键

编辑

编辑
移动 alt + 上下
复制 alt + shift + 上下
格式化 alt+ shift + f

Idea添加注释

类注释

注释模板

1
2
3
4
5
6
7
8
9
/**
*
*
*@description:
*@author: yunsheng
*@time: ${DATE} ${TIME}
*
*/

配置方法

File–Settings搜索Templates,选File and Code Templates的Class、Interface等等进行配置

image-20210519093912830

可以看到下面有很多参数配置可以使用

效果

在新建类时会自动带上配置的模板

image-20210519094115219

快捷键方法注释

配置方法

使用File–Setting–Live Templates。

  1. 先创建一个自己的分组

image-20210519100334243

2,创建模板

然后在刚才创建的分组下,新建模板

image-20210519100649645

模板

1
2
3
4
5
6
7
8
9
/**
*
* @description:
$params$
* @return: $return$
* @author: yunsheng
* @time: $date$ $time$
*/

image-20210519101022248

3,变量设置

上一步中的模板里,$params$等是变量,idea现在并不能识别,需要进行一些配置。

点击Edit variables

image-20210519103911702

在方法内部按下m,自动生成注释

image-20210519104013504

但是参数这里比较丑,使用自定义函数进行一下格式化。groovyScript 函数调用 Idea 的 methodParameters() 函数获得参数数组,并进行格式化。

1
groovyScript("def result=''; def params=\"${_1}\".replaceAll('[\\\\[|\\\\]|\\\\s]', '').split(',').toList(); for(i = 0; i < params.size(); i++) {result+=' * @param ' + params[i] + ((i < params.size() - 1) ? '\\n' : '')}; return result", methodParameters())

image-20210519104227636

再看下效果

image-20210519104519870

但是这有个缺点,只有在方法内部使用时才能获取到参数和返回值的类型。我们一般的习惯是方法注释放在方法定义的上边。所以这种配置我个人觉得很鸡肋。我更喜欢在方法上直接/**回车自动生成注释。

一般我们用这种快捷键来写固定的代码比较舒服。

比如psvm就是main方法的快捷键。psfs是string常量的快捷写法。

免费且开源的流程图工具–Draw.io

一. 流程图工具对比

对比下我用过流程图工具:

  1. Microsoft Visio - 付费
    a. **优点:**功能最强大的流程图工具
    b. **缺点:**Mac/Linux 只有在线版,无客户端
  2. Draw.io 免费
    a. **优点:**在线 / 离线(支持 Windows / Mac / Linux/ Chrome OS),可自由选择存储位置
    b. 缺点: 协作能力差(可通过保存至 Google Drive / Github / GitLab 来协作)
  3. Process On - 免费
    a. **优点:**在线,支持协作,模板较丰富
    b. **缺点:必须登录才可以使用。**免费版仅支持 9 个文件,无法从外部导入可编辑文件

出于安全考虑,在线的工具,公司不让用。Visio公司又不给买,呵呵。

所以其实也没有选择,就Draw.io了。

二.下载

Draw.io是开源的,在github可以直接下载安装包。

image-20200502110424351

我这下载好了,不方便的可以从这下载:

安装版:

链接:https://pan.baidu.com/s/1Tt25TzY6woh9DUYqKaKyPA
提取码:rqgb

绿色版:

链接:https://pan.baidu.com/s/121jB5fsTDba9ZM205yQYjg
提取码:rg6m

三.使用

基本绘图操作

img

简单流程图模板

img

上图展示了结构简单的流程图模板, 包含了几个关键点:

  1. 基本形状: 包括开始 [Start](圆形或椭圆形) 和结束[Terminator]、处理步骤[Process](矩形)、判断条件[Decision](菱形)、子流程/或多个步骤集合(图示的橙色带竖线矩形,此图形在 General 图形集合面板), 总结起来就是有始有终, 有步骤有循环
  2. 关键文字标识: 对于有歧义的图形应该明确标识其属性。例如,左侧的数据库圆柱体也可能用了缓存或其他存储介质。如果使用了判断条件图形,条件转向必须明确标识 (如, Y/N)。
  3. 颜色或大小标识相同组件: 注意不要使用高饱和度颜色或非纯色, 推荐使用格式面板的默认颜色
    a. 同等职能组件同颜色:左侧图用紫色标识存储介质,绿色标识判断条件,橙色标识子流程/步骤,假如图中出现了文件库,也应该用紫色标识,以便于快速定位。
    b. 相同流程箭头同颜色:左侧图还使用绿色加粗箭头标识了主流程,假如出现了多个是否判断,还可以用红色统一标识否的情况
    c. 多个步骤构成一个功能可以圈选标识

对于功能比较复杂的流程图, 比如整体架构的流程图, 使用圈选仍然无法清晰表达时, 可以考虑加入泳道(swimlanes), 来让模块边界更明显. 请记住, 泳道是为了跨职能流程图而设计的.

  • 泳道的基本构成

泳道由跨职能流程图的标题、功能或模块、以及各泳道的具体流程构成。标明泳道的池名, 各泳道的名称是必须的, 同样的,相近职能或模块的泳道也可以用相同颜色标识

img

在 Draw.io 的左侧高级(Advanced)面板中可以找到泳道的图形

img

  • 移动和更改泳道位置

在 Draw.io 中移动泳道不能直接通过拖拽, 这样会导致泳道覆盖, 或者泳道脱离整个池的情况, 正确方法是: 拖拽时按住 Alt 键, 拖到预想位置释放即可.

img

以太坊简介

在区块链领域,以太坊项目是十分出名的开源项目。作为公有区块链平台,以太坊将比特币针对数字货币交易的功能进一步进行拓展,面向更为复杂和灵活的应用场景,支持了智能合约(Smart Contract)这一重要特性。

从此,区块链技术的应用场景,从单一的数字货币交易,延伸到通用计算领域。用户不再受限于仅能使用比特币脚本所支持的简单逻辑,而是可以自行设计任意复杂的合约逻辑。这就为构建各种多样化的上层应用开启了大门,可谓意义重大。

以太坊项目简介

以太坊项目

以太坊(Ethereum)项目的最初目标,是打造一个运行智能合约的平台(Platform for Smart Contract)。该平台支持图灵完备的应用,按照智能合约的约定逻辑自动执行,理想情况下将不存在故障停机、审查、欺诈,以及第三方干预等问题。

以太坊平台目前支持 Golang、C++、Python 等多种语言实现的客户端。由于核心实现上基于比特币网络的核心思想进行了拓展,因此在很多设计特性上都与比特币网络十分类似。

基于以太坊项目,以太坊团队目前运营了一条公开的区块链平台——以太坊网络。智能合约开发者使用官方提供的工具和以太坊专用应用开发语言 Solidity,可以很容易开发出运行在以太坊网络上的“去中心化”应用(Decentralized Application,DApp)。这些应用将运行在以太坊的虚拟机(Ethereum Virtual Machine,EVM)里。用户通过以太币(Ether)来购买燃料(Gas),维持所部署应用的运行。

主要特点

以太坊区块链底层也是一个类似比特币网络的 P2P 网络平台,智能合约运行在网络中的以太坊虚拟机里。网络自身是公开可接入的,任何人都可以接入并参与网络中数据的维护,提供运行以太坊虚拟机的资源。

跟比特币项目相比,以太坊区块链的技术特点主要包括:

  • 支持图灵完备的智能合约,设计了编程语言 Solidity 和虚拟机 EVM;
  • 选用了内存需求较高的哈希函数,避免出现强算力矿机、矿池攻击;
  • 叔块(Uncle Block)激励机制,降低矿池的优势,并减少区块产生间隔(10 分钟降低到 15 秒左右);
  • 采用账户系统和世界状态,而不是 UTXO,容易支持更复杂的逻辑;
  • 通过 Gas 限制代码执行指令数,避免循环执行攻击;
  • 支持 PoW 共识算法,并计划支持效率更高的 PoS 算法(即Proof of Stake,即股权权益证明)。

此外,开发团队还计划通过分片(Sharding)方式来解决网络可扩展性问题。

这些技术特点,解决了比特币网络在运行中被人诟病的一些问题,让以太坊网络具备了更大的应用潜力。

核心概念

基于比特币网络的核心思想,以太坊项目提出了许多创新的技术概念,包括智能合约、基于账户的交易、以太币和燃料等。

智能合约

智能合约(Smart Contract)是以太坊中最为重要的一个概念,即以计算机程序的方式来缔结和运行各种合约。最早在上世纪 90 年代,Nick Szabo 等人就提出过类似的概念,但一直依赖因为缺乏可靠执行智能合约的环境,而被作为一种理论设计。区块链技术的出现,恰好补充了这一缺陷。

以太坊支持通过图灵完备的高级语言(包括 Solidity、Serpent、Viper)等来开发智能合约。智能合约作为运行在以太坊虚拟机(Ethereum Virual Machine,EVM)中的应用,可以接受来自外部的交易请求和事件,通过触发运行提前编写好的代码逻辑,进一步生成新的交易和事件,可以进一步调用其它智能合约。

智能合约的执行结果可能对以太坊网络上的账本状态进行更新。这些修改由于经过了以太坊网络中的共识,一旦确认后无法被伪造和篡改。

账户

比特币在设计中并没有账户(Account)的概念,而是采用了 UTXO 模型记录整个系统的状态。任何人都可以通过交易历史来推算出用户的余额信息。而以太坊则采用了不同的做法,直接用账户来记录系统状态。每个账户存储余额信息、智能合约代码和内部数据存储等。以太坊支持在不同的账户之间转移数据,以实现更为复杂的逻辑。

具体来看,以太坊账户分为两种类型:合约账户(Contracts Accounts)和外部账户(Externally Owned Accounts,或 EOA)。

  • 合约账户:存储执行的智能合约代码,只能被外部账户来调用激活;
  • 外部账户:以太币拥有者账户,对应到某公钥。账户包括 nonce、balance、storageRoot、codeHash 等字段,由个人来控制。

当合约账户被调用时,存储其中的智能合约会在矿工处的虚拟机中自动执行,并消耗一定的燃料。燃料通过外部账户中的以太币进行购买。

交易

交易(Transaction),在以太坊中是指从一个账户到另一个账户的消息数据。消息数据可以是以太币或者合约执行参数。

以太坊采用交易作为执行操作的最小单位。每个交易包括如下字段:

  • to:目标账户地址。
  • value:可以指定转移的以太币数量。
  • nonce:交易相关的字串,用于防止交易被重放。
  • gasPrice:执行交易需要消耗的 Gas 价格。
  • gasLimit:交易消耗的最大 Gas 值。
  • data: 交易附带字节码信息,可用于创建/调用智能合约。
  • signature:签名信息。

类似比特币网络,在发送交易时,用户需要缴纳一定的交易费用,通过以太币方式进行支付和消耗。目前,以太坊网络可以支持超过比特币网络的交易速率(可以达到每秒几十笔)。

以太币

以太币(Ether)是以太坊网络中的货币。

以太币主要用于购买燃料,支付给矿工,以维护以太坊网络运行智能合约的费用。以太币最小单位是 wei,一个以太币等于 10^18 个 wei。

以太币同样可以通过挖矿来生成,成功生成新区块的以太坊矿工可以获得 3 个以太币的奖励,以及包含在区块内交易的燃料费用。用户也可以通过交易市场来直接购买以太币。

燃料

燃料(Gas),控制某次交易执行指令的上限。每执行一条合约指令会消耗固定的燃料。当某个交易还未执行结束,而燃料消耗完时,合约执行终止并回滚状态。

Gas 可以跟以太币进行兑换。需要注意的是,以太币的价格是波动的,但运行某段智能合约的燃料费用可以是固定的,通过设定 Gas 价格等进行调节。

主要设计

以太坊项目的基本设计与比特币网络类似。为了支持更复杂的智能合约,以太坊在不少地方进行了改进,包括交易模型、共识、对攻击的防护和可扩展性等。

智能合约相关设计

运行环境

以太坊采用以太坊虚拟机作为智能合约的运行环境。以太坊虚拟机是一个隔离的轻量级虚拟机环境,运行在其中的智能合约代码无法访问本地网络、文件系统或其它进程。

对同一个智能合约来说,往往需要在多个以太坊虚拟机中同时运行多份,以确保整个区块链数据的一致性和高度的容错性。另一方面,这也限制了整个网络的容量。

开发语言

以太坊为编写智能合约设计了图灵完备的高级编程语言,降低了智能合约开发的难度。

目前 Solidity 是最常用的以太坊合约编写语言之一。

智能合约编写完毕后,用编译器编译为以太坊虚拟机专用的二进制格式(EVM bytecode),由客户端上传到区块链当中,之后在矿工的以太坊虚拟机中执行。

交易模型

出于智能合约的便利考虑,以太坊采用了账户的模型,状态可以实时的保存到账户里,而无需像比特币的 UXTO 模型那样去回溯整个历史。

UXTO 模型和账户模型的对比如下。

特性 UXTO 模型 账户模型
状态查询和变更 需要回溯历史 直接访问
存储空间 较大 较小
易用性 较难处理 易于理解和编程
安全性 较好 需要处理好重放攻击等情况
可追溯性 支持历史 不支持追溯历史

共识

以太坊目前采用了基于成熟的 PoW 共识的变种算法 Ethash 协议作为共识机制。

为了防止 ASIC 矿机矿池的算力攻击,跟原始 PoW 的计算密集型 Hash 运算不同,Ethash 在执行时候需要消耗大量内存,反而跟计算效率关系不大。这意味着很难制造出专门针对 Ethash 的芯片,反而是通用机器可能更加有效。

虽然,Ethash 相对原始的 PoW 进行了改进,但仍然需要进行大量无效的运算,这也为人们所诟病。

社区已经有计划在未来采用更高效的 Proof-of-Stake(PoS)作为共识机制。相对 PoW 机制来讲,PoS 机制无需消耗大量无用的 Hash 计算,但其共识过程的复杂度要更高一些,还有待进一步的检验。

降低攻击

以太坊网络中的交易更加多样化,也就更容易受到攻击。

以太坊网络在降低攻击方面的核心设计思想,仍然是通过经济激励机制防止少数人作恶:

  • 所有交易都要提供交易费用,避免 DDoS 攻击;
  • 程序运行指令数通过 Gas 来限制,所消耗的费用超过设定上限时就会被取消,避免出现恶意合约。

这就确保了攻击者试图消耗网络中虚拟机的计算资源时,需要付出经济代价(支付大量的以太币);同时难以通过构造恶意的循环或不稳定合约代码来对网络造成破坏。

提高扩展性

可扩展性是以太坊网络承接更多业务量的最大制约。

以太坊项目未来希望通过分片(sharding)机制来提高整个网络的扩展性。

分片是一组维护和执行同一批智能合约的节点组成的子网络,是整个网络的子集。

支持分片功能之前,以太坊整个网络中的每个节点都需要处理所有的智能合约,这就造成了网络的最大处理能力会受限于单个节点的处理能力。

分片后,同一片内的合约处理是同步的,彼此达成共识,不同分片之间则可以是异步的,可以提高网络整体的可扩展性。

比特币 —— 区块链思想诞生的摇篮

比特币网络是首个得到大规模部署的区块链技术应用,并且是首个得到实践检验的数字货币实现,无论在信息技术历史还是在金融学历史上都具有十分重要的意义。比特币项目在诞生和发展过程中,借鉴了来自数字货币、密码学、博弈论、分布式系统、控制论等多个领域的技术成果,可谓博采众家之长于一身。

比特币(BitCoin,BTC)是基于区块链技术的一种数字货币实现;比特币网络是历史上首个经过大规模长时间检验的数字货币系统。

2009 年正式上线。

比特币网络在功能上具有如下特点:

  • 去中心化:意味着没有任何独立个体可以对网络中交易进行破坏,任何交易请求都需要大多数参与者的共识;
  • 匿名性:比特币网络中账户地址是匿名的,无法从交易信息关联到具体的个体,但这也意味着很难进行审计;
  • 通胀预防:比特币的发行需要通过挖矿计算来进行,发行量每四年减半,总量上限为 2100 万枚,无法被超发。

比特币的发展简史不说了,网上查一下就好。我们重点要学习的是比特币背后的区块链思想。

原理和设计

比特币网络是一个分布式的点对点网络,网络中的矿工通过“挖矿”来完成对交易记录的记账过程,维护网络的正常运行。

区块链网络提供一个公共可见的记账本,该记账本并非记录每个账户的余额,而是用来记录发生过的交易的历史信息。该设计可以避免重放攻击,即某个合法交易被多次重新发送造成攻击。

**比特币中没有账户的概念。**因此,每次发生交易,用户需要将交易记录写到比特币网络账本中,等网络确认后即可认为交易完成。

重要概念

账户/地址

比特币采用了非对称的加密算法,用户自己保留私钥,对自己发出的交易进行签名确认,并公开公钥。

比特币的账户地址其实就是用户公钥经过一系列 Hash(HASH160,或先进行 SHA256,然后进行 RIPEMD160)及编码运算后生成的 160 位(20 字节)的字符串。

交易

交易是完成比特币功能的核心概念

交易脚本

脚本(Script) 是保障交易完成(主要用于检验交易是否合法)的核心机制,当所依附的交易发生时被触发。通过脚本机制而非写死交易过程,比特币网络实现了一定的可扩展性。比特币脚本语言是一种非图灵完备的语言,类似 Forth 语言。

一般每个交易都会包括两个脚本:负责输入的解锁脚本(scriptSig)和负责输出的锁定脚本(scriptPubKey)。

输出脚本一般由付款方对交易设置锁定,用来对能动用这笔交易的输出(例如,要花费该交易的输出)的对象(收款方)进行权限控制,例如限制必须是某个公钥的拥有者才能花费这笔交易。

认领脚本则用来证明自己可以满足交易输出脚本的锁定条件,即对某个交易的输出(比特币)的拥有权。

区块

比特币区块链的一个区块不能超过 1 MB,将主要包括如下内容:

  • 区块大小:4 字节;
  • 区块头:80 字节:
  • 交易个数计数器:1~9 字节;
  • 所有交易的具体内容,可变长,匹配 Merkle 树叶子节点顺序。

其中,区块头信息十分重要,包括:

  • 版本号:4 字节;
  • 上一个区块头的 Hash 值:链接到上一个合法的块上,对其区块头进行两次 SHA256 操作,32 字节;
  • 本区块所包含的所有交易的 Merkle 树根的哈希值:两次 SHA256 操作,32 字节;
  • 时间戳:4 字节;
  • 难度指标:4 字节;
  • Nonce:4 字节,PoW 问题的答案。

可见,要对区块链的完整性进行检查,只需要检验各个区块头部信息即可,无需获取到具体的交易内容,(因为默克尔树),这也是简单交易验证(Simple Payment Verification,SPV)的基本原理。另外,通过头部的链接,提供时序关系的同时加大了对区块中数据进行篡改的难度。

创新设计

比特币在设计上提出了很多创新点,主要考虑了避免作恶、采用负反馈调节和基于概率的共识机制等三个方面。

如何避免作恶

基于经济博弈原理。在一个开放的网络中,无法通过技术手段保证每个人都是合作的。但可以通过经济博弈来让合作者得到利益,让非合作者遭受损失和风险。

实际上,博弈论早已被广泛应用到众多领域。

一个经典的例子是两个人来分一个蛋糕,如果都想拿到较大的一块,在没有第三方的前提下,该怎么制定规则才公平?

最简单的一个方案是任意一个人负责分配蛋糕,并且这个人后挑选。

注:如果推广到 N 个人呢?

比特币网络中所有试图参与者(矿工)都首先要付出挖矿的代价,进行算力消耗,越想拿到新区块的决定权,意味着抵押的算力越多。一旦失败,这些算力都会被没收掉,成为沉没成本。当网络中存在众多参与者时,个体试图拿到新区块决定权要付出的算力成本是巨大的,意味着进行一次作恶付出的代价已经超过可能带来的好处。

负反馈调节

比特币网络在设计上,很好的体现了负反馈的控制论基本原理。

比特币网络中矿工越多,系统就越稳定,比特币价值就越高,但挖到矿的概率会降低。

反之,网络中矿工减少,会让系统更容易导致被攻击,比特币价值越低,但挖到矿的概率会提高。

因此,比特币的价格理论上应该稳定在一个合适的值(网络稳定性也会稳定在相应的值),这个价格乘以挖到矿的概率,恰好达到矿工的收益预期。

从长远角度看,硬件成本是下降的,但每个区块的比特币奖励每隔 4 年减半,最终将在 2140 年达到 2100 万枚,之后将完全依靠交易的服务费来鼓励矿工对网络的维护。

注:比特币最小单位是“聪”,即 10^(-8) 比特币,总“聪”数为 2.1E15。对于 64 位处理器来说,高精度浮点计数的限制导致单个数值不能超过 2^53 约等于 9E15。

共识机制

传统共识问题往往是考虑在一个相对封闭的分布式系统中,允许同时存在正常节点、故障节点,如何快速达成一致。

对于比特币网络来说,它是完全开放的,可能面向各种攻击情况,同时基于 Internet 的网络质量只能保证“尽力而为”,导致问题更加复杂,传统的一致性算法在这种场景下难以实用。

因此,比特币网络不得不对共识的目标和过程都进行了一系列限制,提出了基于 Proof of Work(PoW)的共识机制。

首先是不实现面向最终确认的共识,而是基于概率、随时间逐步增强确认的共识。现有达成的结果在理论上都可能被推翻,只是攻击者要付出的代价随时间而指数级上升,被推翻的可能性随之指数级的下降。

此外,考虑到 Internet 的尺度,达成共识的时间相对比较长。按照区块(一组交易)来进行阶段性的确认(快照),提高网络整体的可用性。

最后,限制网络中共识的噪音。通过进行大量的 Hash 计算和少数的合法结果来限制合法提案的个数,进一步提高网络中共识的稳定性。

闪电网络

比特币的交易网络最为人诟病的一点便是交易性能:全网每秒 7 笔左右的交易速度,远低于传统的金融交易系统;同时,等待 6 个块的可信确认将导致约 1 个小时的最终确认时间。

为了提升性能,社区提出了闪电网络等创新的设计。

闪电网络的主要思路十分简单——将大量交易放到比特币区块链之外进行,只把关键环节放到链上进行确认。

比特币的区块链机制自身已经提供了很好的可信保障,但是相对较慢;另一方面考虑,对于大量的小额交易来说,是否真需要这么高的可信性?

闪电网络主要通过引入智能合约的思想来完善链下的交易渠道。

下载:

官网下载较慢,可以从github下载会快很多

我这边是下载的win64位,最新版本。

https://github.com/obsproject/obs-studio/releases/download/25.0.4/OBS-Studio-25.0.4-Full-Installer-x64.exe

如果不会,或者需要其他版本,可以给我留言,我帮你下载。

image-20200418155749277

image-20200418160359689

黑屏

https://jingyan.baidu.com/article/c910274bac0d51cd361d2d18.html

我是用方法二解决的

解决没有声音问题

在控制面板里,设置一下麦克风的权限