墨卡托坐标转经纬度

发布在 Golang

今天获取百度地图数据时候发现其坐标都是类似12945050.96,4826978.52这种而非常见的经纬度,之前获取百度外面商家信息时就发现了这个问题但没深入研究,搜索后发现这种表示方法叫做墨卡托坐标。不得不说,关于坐标的标准还真是挺多的,根据经纬度查询位置可以使用这个网站

阅读全文

环境搭建

前提需要电脑中存在gitdockerdocker-compose命令以及有golang开发环境。

首先创建目录存放Fabric代码,注意路径和权限,在启动服务时候会向其中写一些文件,最开始我就是没注意到这点报错了。

1
sudo mkdir /opt/gopath/src/github.com/hyperledger/

进入刚才创建的目录后拉取代码:

1
2
cd /opt/gopath/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric.git

当前版本是1.1。

阅读全文

Raft算法

发布在 区块链

相比与Paxos算法,Raft更容易理解。首先推荐个动画视频 (注意这个动画真的基于raft算法,所以每次选举出的节点都是不同的,我观看某些章节时候甚至出现过3次选举过程),然后是raft论文中文版raft主页,基本结合这3个网站就能理解raft了。

在Raft算法中,有3种角色:

  • Leader
  • Follower
  • Candidate

大体分为2个过程:

  1. 选举(Leader Election)
  2. 日志同步(Log Replication) 阅读全文

原文,互斥锁(Mutex)也是go并发系列最后一篇文章。

临界区

在说互斥锁前,理解并发编程中的临界区(Critical section)是十分重要的。当一个程序并发执行时,共享资源不应该在同一时刻被多个goroutine修改。这段修改共享资源的代码就叫做临界区。举个例子,我们有一个代码片段用于修改变量x自增1。

1
x = x+1

如果上面的代码在唯一的goroutine中执行,不会有任何问题。

阅读全文

原文

什么是Select

select语法用来从多个读/写的channel中选择一个,如果没有任何channel就绪select语句将被阻塞。如果多个就绪,则随机选择一个。语法和switch类似,除了case后面跟随的是channel。

阅读全文

原文,这里为了方便理解我把worker pools翻译成线程池。

什么是缓冲区Channel

之前讨论的所有channel都是不带缓冲区的,因此读取和写入都会被阻塞。创建一个带缓冲区的channel也是可能的,这种channel只有在缓冲区满后再写入或者读取一个空的channel时才会被阻塞。

创建一个带缓冲区的channel需要一个额外的参数容量来表明缓冲区大小:

1
ch := make(chan type, capacity)

上面代码中的 capacity 需要大于0,如果等于0的话则是之前学习的无缓冲区channel。

阅读全文

原文,建议先看完goroutine部分再看这篇。

什么是channels

channels可以理解成是goroutine之间通信的管道,和水流从管道的一端到另一端类似,数据也可以从管道的一端发送另一端接收。

声明channels

每个channel都需指定一个类型,这个类型是表明哪种类型的数据可以通过管道传输,而其他类型的不可以。

chan T指接受类型T的channel。

channel的默认值是nilnil channel不能被任何类型使用所以和map或者slices一样,要使用make关键字来进行定义。

1
2
3
4
5
6
7
8
9
10
11
12
package main

import "fmt"

func main() {
var a chan int
if a == nil {
fmt.Println("channel a is nil, going to define it")
a = make(chan int)
fmt.Printf("Type of a is %T", a)
}
}

上面声明了变量名为a的channel,并且默认值是nil,因此判断语句成立并且初始化类型为int的channel,程序输出如下:

1
2
channel a is nil, going to define it  
Type of a is chan int

通常我们使用一种更简洁的办法:

1
a := make(chan int)

阅读全文

原文,建议理解并发(concurrency)、并行(parallelism)区别后再看这方面的内容。

Goroutines是啥?

Goroutines是一个可以和其他函数或方法并发执行的函数或方法。也可以把它理解为轻量级的线程(roy注:这话听起来和大python中的协程很像啊!),而创建Goroutine的开销却远远小于线程。因此在大多数的Go程序都可以并发执行成千上万的Goroutine。

Goroutines的优势

  • Goroutine和线程相比及其节省开销,它们仅需要占用几kb的栈空间,而且栈空间可以根据程序的需要增加或回收。而同样情形下线程占用的栈空间只能被指定并且不可修改。
  • Goroutine采用多路复用的方式来减少对系统线程的占用。程序中一个线程中可能包含几千个Goroutine,如果任何Goroutine在线程中阻塞比如需要等待用户输入,那么将会创建新的系统线程并把剩下的Goroutine转移到新系统线程中。所有的操作都由运行时自动处理,作为开发人员不用纠结于实现这个的细节了,Go为此提供了清晰的API。
  • Goroutine之间的通信使用channel,channel被设计用来防止Goroutine之间访问共享内存可能造成的冲突。channel可以理解为Goroutine通信的管道。我们将在后面的文章中讨论channel。
阅读全文

BasicPaxos算法

发布在 区块链

CPA理论

分布式系统中有个经典的CAP理论,就是说任何分布式系统最多满足一致性(Consistency),可用性(Availability),分区容错性(Partition Tolerance)这三者中的两个。

既然是分布式,必然将节点部署到不同的网络中,而这则会引起一致性问题。想解决一致性,就需要保证每次操作所有节点都成功执行,而这又会降低可用性。既然分区已经是事实,所以工程上应该尽量在保证一致性的前提下提高可用性。

而一致性又可以分为:

  • 强一致性:上次写什么,下次就一定能读到什么,这需要牺牲可用性。
  • 弱一致性:并不保证更新后所有线程都能读到最新值,需要一段时间进行同步。
  • 最终一致性:弱一致性的一种特例。
阅读全文
作者的图片

Roy

微信公众号:hi-roy


野生程序猿


China