安装

问题:connect: permission denied
当前用户添加到docker属组即可

sudo groupadd docker
sudo gpasswd -a ${USER} docker
// 重启 docker 服务
sudo service docker restart
// 切换当前会话到新 group 或者重启 X 会话
newgrp - docker

基本信息

Docker 是服务器—-客户端架构
本机需要有服务运行,如果没有运行使用下面命令启动

# service 命令的用法
$ sudo service docker start

# systemctl 命令的用法
$ sudo systemctl start docker

container 本身也是个文件,停止运行不会删除,

# 列出本机正在运行的容器
$ docker ps

# 列出本机所有容器,包括终止运行的容器
$ docker ps -a

删除
$ docker container rm [containerID]

查看容器信息

docker inspect containerID
阅读全文 »

文件比较是最常用的功能了,beyondcompare 一直在用,下面了解一下 git 里面的源码比较
有三种格式:
正常格式(normal diff)
上下文格式(context diff)
合并格式(unified diff)

比较文件

diff -y -W 50 -w --suppress-common-lines ./eostexas.abi ./eostexas.abibak

-W或--width 在使用-y参数时,指定栏宽。
--suppress-common-lines 在使用-y参数时,仅显示不同之处
-y或--side-by-side 以并列的方式显示文件的异同之处。

“|”表示前后2个文件内容有不同
“<”表示后面文件比前面文件少了1行内容
“>”表示后面文件比前面文件多了1行内容

比较文件夹

diff -Nrq a b

r 表示递归
q 只输出不一样的文件

GNU Diffutils

合并格式的 diff

现在都是这个格式的。 -u 表示 unified

diff -u f1 f2

变动的位置用两个@作为起首和结束。

@@ -1,7 +1,7 @@

前面的”-1,7”分成三个部分:减号表示第一个文件(即f1),”1”表示第1行,”7”表示连续7行。合在一起,就表示下面是第一个文件从第1行开始的连续7行。同样的,”+1,7”表示变动后,成为第二个文件从第1行开始的连续7行。

创建补丁

diff -ruaN oldfile newfile > patchfile.patch

-r: 递归遍历子目录
-u: 使用合并格式输出
-a: 将所有文件视为文本文件
-N: 将未出现的文件视为空文件(比较目录时有用)
oldfile及newfile可以是一个目录,配合-r参数使用就会递归比较这两个目录。

合并patch

-p1表示去掉第一层路径分隔符,即./,此时得到的old文件夹位于当前路径中,于是就可以正确的打补丁了。
不用 p1 会提示
can't find file to patch at input

patch -p1 < ./commit.diff

List特点:元素有放入顺序,元素可重复,支持for循环,也就是通过下标来遍历,也可以用迭代器

Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法,只能用迭代,因为他无序,无法用下标来取得想要的值。

Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。

Map适合储存键值对的数据

线程安全集合类
Vector,HashTable,StringBuffer

非线程安全集合类
LinkedList、ArrayList、HashSet,HashMap,StringBuilder

Makefile中的CFLAGS、CXXFLAGS、LDFLAGS、LIBS
CFLAGS: 指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include。
CXXFLAGS表达上与CFLAGS相同。
CFLAGS用于C代码,CXXFLAGS用于C++代码
对C文件 CFLAGS 和 CPPFLAGS 效果相同,对C++文件就只识别 CPPFLAGS

make foo.o CPPFLAGS="-I/usr/include"
make foo.o CFLAGS="-I/usr/include"

LDFLAGS:用于指定库文件的位置。用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib。
LIBS:告诉链接器要链接哪些库文件,如LIBS = -lpthread -liconv

有时候LDFLAGS指定-L虽然能让链接器找到库进行链接,但是运行时链接器却找不到这个库,如果要让软件运行时库文件的路径也得到扩展,那么我们需要增加这两个库给”-Wl,R”:

LDFLAGS =-L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib

如果在执行./configure以前设置环境变量export LDFLAGS=”-L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib” ,注意设置环境变量等号两边不可以有空格,而且要加上引号(shell的用法)。那么执行configure以后,Makefile将会设置这个选项,链接时会有这个参数,编译出来的可执行程序的库文件搜索路径就得到扩展了。

export LDFLAGS="-L/opt/openssl/lib  -Wl,R/opt/openssl/lib"

LIBS=-lcrypto

查看boost版本

dpkg -s libboost-dev | grep 'Version'
or
cat /usr/include/boost/version.hpp | grep "BOOST_LIB_VERSION"

编译 1.64 版

// 这里的东西可能需要,目前还没需要,这里为什么会有 libboost-all-dev 不确定
sudo apt-get update
sudo apt-get install build-essential g++ python-dev autotools-dev libicu-dev build-essential libbz2-dev libboost-all-dev

Download source file from: http://www.boost.org/users/history/version_1_64_0.html
tar -xzvf boost_1_64_0.tar.gz
cd boost_1_64_0
./bootstrap.sh --prefix=/usr/local
./b2
./b2 install

编译 1.41 版

支持 thread 库编译

在下面文件中查找 TIME_UTC 修改为 TIME_UTC_ 防止冲突

boost_1_41_0/boost/thread/xtime.hpp
boost_1_41_0/libs/thread/src/pthread/timeconv.inl
找到下面文件 修改对应行 #ifdef __GLIBCXX__ // gcc 3.4 and greater:
boost_1_41_0/boost/config/stdlib/libstdcpp3.hpp

#ifdef __GLIBCXX__ // gcc 3.4 and greater:
# if defined(_GLIBCXX_HAVE_GTHR_DEFAULT) \
|| defined(_GLIBCXX__PTHREADS) \
|| defined(_GLIBCXX_HAS_GTHREADS)

修改一个 GCC 错误提示

找到 unspecified_bool_type() 添加上面两行
/Users/zhengjun/project/boost_1_41_0/boost/exception_ptr.hpp

~exception_ptr() throw() { }

operator unspecified_bool_type() const
{
return _empty() ? 0 : &exception_ptr::bad_alloc_;
}

编译

./bootstrap.sh
./bjam install

开源库
andlabs/ui
astilectron

astilectron 是一个Electron应用程序,通过TCP套接字提供API,允许执行Electron的方法以及捕获Electron的事件。

bitcoin mempool 是保存一些等待网络确认的交易的。每次交易广播到网络后需要平均 10 分钟左右的确认时间。
根据 mempool 里面交易的多少,等待时间可能会较长

每笔被网络校验过的交易都会放到 mempool 中,等待矿工的确认。当一个矿工验证一笔交易并且放入到区块中时,
会自动收到确认信息。

每个节点都有自己的 mempool 并且可以独立设置合适的大小。当一个新区块被广播时,每个节点从 mempool 中
移除掉已被确认的交易。

每个矿工根据手续费等条件排序处理未确认交易。 1M 的 mempool 说明没有积压。当 size 增大时,说明有交易处理积压了

函数定义

函数声明

func function_name( [parameter list] ) [return_types] {
函数体
}

/* 函数返回两个数的最大值 */
func max(num1, num2 int) int {...}

下面示例为 float64 基本类型扩充了方法IsEqual,该方法主要是解决精度问题。 其方法调用方式为: a.IsEqual(double) ,如果不扩充方法,我们只能使用函数IsEqual(a, b float64)

//定义新的类型double,主要目的是给float64类型扩充方法
type double float64

//判断a是否等于b
func (a double) IsEqual(b double) bool {
var r = a - b
if r == 0.0 {
return true
} else if r < 0.0 {
return r > -0.0001
}
return r < 0.0001
}

//判断a是否等于b
func IsEqual(a, b float64) bool {
var r = a - b
if r == 0.0 {
return true
} else if r < 0.0 {
return r > -0.0001
}
return r < 0.0001
}

func main() {
var a double = 1.999999
var b double = 1.9999998
fmt.Println(a.IsEqual(b))
fmt.Println(a.IsEqual(3))
fmt.Println( IsEqual( (float64)(a), (float64)(b) ) )

}

函数返回多个值

func swap(x, y string) (string, string) {
return y, x
}

func main() {
a, b := swap("Mahesh", "Kumar")
fmt.Println(a, b)
// 有时候只关心某一个返回值,可以把其他的返回值赋给_
_, b:= swap("a","b")

}

支持给返回值命名后,实际上就是省略了变量的声明,return时无需写成return n,err 而是将直接将值返回

func ReadFull(r Reader, buf []byte) (n int, err error) {
for len(buf) > 0 && err == nil {
var nr int
nr, err = r.Read(buf)
n += nr
buf = buf[nr:]
}
return
}

值,引用传参

/* 定义交换值函数*/
func swap(x *int, y *int) {
var temp int
temp = *x /* 保持 x 地址上的值 */
*x = *y /* 将 y 值赋给 x */
*y = temp /* 将 temp 值赋给 y */
}

/* 调用 swap() 函数
* &a 指向 a 指针,a 变量的地址
* &b 指向 b 指针,b 变量的地址
*/
swap(&a, &b)

一维数组传参

下面两种方式

void myFunction(param [10]int)
{
}

void myFunction(param []int)
{
}

其他传参

入参中,如果连续的参数类型一致,则可以省略连续多个参数的类型,只保留最后一个类型声明。

// 入参a和b均是float64数据类型
func IsEqual(a, b float64) bool
func IsEqual(a, b float64, accuracy int) bool

变参:入参支持变参,即可接受不确定数量的同一类型的参数

// 参数args是的slice,其元素类型为int 。经常使用的fmt.Printf就是一个接受任意个数参数的函数
func Sum(args ...int)
fmt.Printf(format string, args ...interface{})

函数的使用

函数作为值

func main(){
/* 声明函数变量 */
getSquareRoot := func(x float64) float64 {
return math.Sqrt(x)
}

/* 使用函数 */
fmt.Println(getSquareRoot(9))

}

函数闭包

Go 语言支持匿名函数,可作为闭包。匿名函数是一个”内联”语句或表达式。匿名函数的优越性在于可以直接使用函数内的变量,不必申明。
以下实例中,我们创建了函数 getSequence() ,返回另外一个函数。该函数的目的是在闭包中递增 i 变量,代码如下:

func getSequence() func() int {
i:=0
return func() int {
i+=1
return i
}
}

func main(){
/* nextNumber 为一个函数,函数 i 为 0 */
nextNumber := getSequence()

/* 调用 nextNumber 函数,i 变量自增 1 并返回 */
fmt.Println(nextNumber())
fmt.Println(nextNumber())
fmt.Println(nextNumber())

/* 创建新的函数 nextNumber1,并查看结果 */
nextNumber1 := getSequence()
fmt.Println(nextNumber1())
fmt.Println(nextNumber1())
}
以上代码执行结果为:
1
2
3
1
2

defer 延迟函数

延迟执行,在声明时不会立即执行,而是在函数return后时按照后进先出的原则依次执行每一个defer。这样带来的好处是,能确保我们定义的函数能百分之百能够被执行到,这样就能做很多我们想做的事,如释放资源,清理数据,记录日志等

菊花性寒,阳虚慎喝。怕冷、脾胃虚寒的人应少喝。无论哪种菊花,性质都偏寒,一般阳虚体质(平时怕冷)和脾胃虚寒(一吃凉东西就胃痛、胃不舒服)的人不宜多饮。
菊花气味清香、凉爽舒适,味辛、甘、苦,微寒,归肺、肝经。
对体寒体虚的人来说,菊花茶中加些冰糖,能稍微减弱一下寒性,更加适合他们的体质
而对于体热体壮的人,加冰糖就会减弱菊花茶清热的功效。

白菊花

平肝、清肝明目宜用白菊花,可用于头痛眩晕等症状

黄菊花

疏散风热宜用,可防治风热感冒

金丝皇菊

皇菊,又叫金丝皇菊,用它来泡茶,具有“香、甜、润”三大特点。
具有极高含量的黄酮素(有提高免疫力,降低血压等功效),还含有丰富的多种氨基酸,维生素以及微量元素。
金丝皇菊的功效主要是两方面:散风热、护目明目

变绿色

有哪几类人群适合饮用金丝皇菊呢

  1. 热毒盛,肝火盛,易上火者
    因为金丝皇菊蕴含的清热解毒的特质,所以它可以清热毒,去火,还能加强人体的免疫力,对于防止和预防感冒病毒也是很有作用。
  2. 经常盯着电子屏幕的人群
    金丝皇菊则有清肝明目,缓解眼睛疲劳的作用,常喝还能保护视力哦。
  3. 三高人群
    作为高血压、高血脂以及高血糖人群,经常会面临各种问题,而大皇菊含有丰富的黄酮素,可以作为一种强抗氧化剂,能够减缓衰老速度、改善血液的循环,降低胆固醇等,对于改善三高人群的问题很有作用。

冲泡方法

  1. 菊花山楂茶
    材料:金丝皇菊5克,山楂5克,金银花5克。
    做法:加入金丝皇菊等三种材料,用沸水冲泡,10分钟后即可饮用。
    作用:适用于肥胖症、高血脂以及高血压等的患者,能够化瘀消脂、清凉降压、减肥瘦身。

  2. 菊花枸杞茶
    材料:适量的大皇菊和枸杞
    做法:将金丝皇菊和枸杞置入茶壶中,用沸水冲泡,十分钟即可饮用。
    作用:可以缓解眼睛疲劳或干涩,对于经常熬夜上班或者长期学习的人群十分有用。

  3. 三花茶
    材料:少量的金丝皇菊、金银花和茉莉花。
    做法:将三种材料置入茶壶之中,用沸水冲泡,等待十分钟后即可。
    作用:对于风热感冒能够有预防和治疗的作用,还可以对咽喉肿痛等有效果,经常食用可以起到降火,静心凝神。

“分片”(Sharding)是以太坊为了解决扩容问题而设计的一种技术方案。

“分片”的大致设计思路是:将区块链网络中的每个区块变为一个子区块链,子区块链中可以容纳若干(目前为100个)打包了交易数据的Collation(大概可以称为“校验块”,为了在分片的情景中将其与区块的概念区分开),这些Collation最终组成一个在主链上区块;因为这些Collation是整体作为区块存在的,所以其数据必定是全部由某个特定的矿工所打包生成,本质上和现有协议中的区块没有区别,所以不再需要增加额外的网络确认。这样,每个区块的交易容量就大概扩大了100倍;而且这种设计还有利于未来的继续扩展,整个扩展计划目前也被大致分为4个阶段;

分片技术承诺通过改变网络验证的方式来增加吞吐量。分片技术独特于其他解决扩容的链上技术的关键特性,就是它可以进行水平扩容,也就是说,网络的吞吐量随着挖矿网络的扩展而增加。这种特殊的特性可能使它成为推动区块链技术被快速采用的理想技术。

分片技术是一种基于数据库分片传统概念的扩容技术,它将数据库分割成多个碎片并将这些碎片放置在不同的服务器上。在公共区块链的情境中,网络上的交易将被分成不同的碎片,其由网络上的不同节点组成。因此,每个节点只需处理一小部分传入的交易,并且通过与网络上的其他节点并行处理就能完成大量的验证工作。将网络分割为碎片会使得更多的交易同时被处理和验证。因此,随着网络的增长,区块链处理越来越多的交易将成为可能。这种属性也称为水平扩容。

公共区块链平台今天面临的最大问题之一就是可扩展性。所有主流的平台都在努力提高每秒的交易量。事实上,当今的公共以太坊网络和比特币网络平均每秒可以处理7-10笔交易。这一数字远低于像Visa这样的集中支付处理器,后者平均每秒能处理约8000笔交易。

阅读全文 »