本文介绍怎么使用python编写爬虫爬取bgp.he.net的数据
golang使用base64Captcha做图形验证码并支持点击刷新
很多go的web框架都自带图形验证码,比如macaron和gin,但是这些验证码模块的验证码都比较弱,只能使用纯数字作为验证码,此处介绍base64Captcha包的使用方法并支持点击刷新。
树莓派作为旁路由安装OpenWrt
旁路由可以理解为接入在内网的一台普通机器,不管是用LAN还是WAN接入都无所谓,只要你能知道它的内网IP,在本地网络中直接编辑网关和DNS服务器指向它即可。
如果想内网流量都自动经过它,则只需在主路由上的DHCP分配网关、DNS设置为旁路由即可。
树莓派的硬件条件素质不够高,作为主路由性能比不上硬路由,所以可以将其作为旁路由安装软路由作为一个网关是比较合适的。
golang的channel死锁问题
Channel 介绍
默认channel
默认情况下创建的channel是阻塞和不带缓冲区的,例如:
1 | ch := make(chan int) // 创建一个阻塞的不带缓冲区的channel |
通过默认方式创建的channel有以下性质:
- 发送操作将会阻塞,直到接收端准备好了。
- 接收操作将会阻塞,直到发送端准备好了。也就是说:若channel中没有数据,接收者将会阻塞。
带缓冲区的Channel
不带缓冲区的channel只能包含一个元素(一条记录),带缓冲区的channel可以包含多条记录
1 | ch := make(chan string, 100) // 此时的ch,类似一个消息队列,可以容纳100个string类型的元素 |
- 向带缓冲区的channel写数据时不会阻塞,直到channel的缓冲区满了
- 从带缓冲区的channel中读数据也不会阻塞,直到缓冲区为空
- 从带缓冲区的channel中读取或写入数据时,是异步的,类比使用消息队列写入和读取数据
- 向带缓冲区的channel中写数据时是FIFO顺序进行的
golang之Web爬虫练习
go编程指南的题目
题目链接:https://tour.go-zh.org/concurrency/10
练习:Web 爬虫
在这个练习中,我们将会使用 Go 的并发特性来并行化一个 Web 爬虫。
修改 Crawl
函数来并行地抓取 URL,并且保证不重复。
提示:你可以用一个 map 来缓存已经获取的 URL,但是要注意 map 本身并不是并发安全的!
golang之等价二叉查找树
go编程指南的题目
题目链接:https://tour.go-zh.org/concurrency/8
练习:等价二叉查找树
1. 实现 Walk
函数。
2. 测试 Walk
函数。
函数 tree.New(k)
用于构造一个随机结构的已排序二叉查找树,它保存了值 k
, 2k
, 3k
, …, 10k
。
创建一个新的信道 ch
并且对其进行步进:
1 | go Walk(tree.New(1), ch) |
然后从信道中读取并打印 10 个值。应当是数字 1, 2, 3, ..., 10
。
3. 用 Walk
实现 Same
函数来检测 t1
和 t2
是否存储了相同的值。
4. 测试 Same
函数。
Same(tree.New(1), tree.New(1))
应当返回 true
,而 Same(tree.New(1), tree.New(2))
应当返回 false
。
Tree
的文档可在这里找到。
golang之图像练习
go编程指南的题目
题目链接:https://tour.go-zh.org/methods/25
练习:图像
还记得之前编写的图片生成器 吗?我们再来编写另外一个,不过这次它将会返回一个 image.Image
的实现而非一个数据切片。
定义你自己的 Image
类型,实现必要的方法并调用 pic.ShowImage
。
Bounds
应当返回一个 image.Rectangle
,例如 image.Rect(0, 0, w, h)
。
ColorModel
应当返回 color.RGBAModel
。
At
应当返回一个颜色。上一个图片生成器的值 v
对应于此次的 color.RGBA{v, v, 255, 255}
。