限流器

限流器主要是防止高并发流量打垮服务,常见的限流器算法有计数器、令牌桶和漏桶,令牌桶在令牌不足时会直接拒绝请求,漏桶在请求不足时会阻塞请求。本文实现一个允许适量流量激增的限流器。只是写着玩,不要喷我写的挫谢谢。

Read more
理解golang函数传递slice

开始看golang的时候,最纠结的就是函数传递slice,这个slice到底有没有发生变化。最近发现周围的同事也没有弄清楚,于是打算仔细看下,在函数里修改传递的slice会不会改变原来的slice。

slice 结构

首先从slice的结构入手,可以看到slice底层其实就是一个数组

type slice struct {
array unsafe.Pointer
len int
cap int
}

type SliceHeader struct {
Data uintptr
Len int
Cap int
}
Read more
基于antlr的词法和语法分析

最近工作经常跟antlr打交道,一开始半懂不懂,各种瞎写胡试,也能work。工作做完之后就想系统了解下编译器前端到底做了哪些事情,也就是词法分析和语法分析究竟做了什么,以及antlr的lexer和parser的语法。

编译器前端到底做了哪些事情

从一个比较high level的角度看待编译器前端对字符串的处理流程,第一步是做词法解析,将字符串解析成Token序列,第二步是做语法分析,根据语法匹配命中相应的语法规则。

  1. 词法分析

    以这句SPL查询search id |stats count by id为例,词法分析做的事情就是把这个字符串解析成Token序列:search、id、stats、count、by、|,同时也会拿到这些token对应的类型。

  2. 语法分析

    词法分析的结果作为语法分析器的输入,经过语法分析之后会确定这个SPL的AST语法树。

Read more
搭建本地https服务器
  1. 生成证书
    (1)生成rsa密钥 openssl genrsa -des3 -out server.key 1024
    (2)去掉密钥文件保护密码 openssl rsa -in server.key -out server.key
    (3)生成ca对应的csr openssl req -new -key server.key -out server.csr
    (4)自签名 openssl x509 -req -days 1024 -in server.csr -signkey server.key -out server.crt
    (5)cat server.crt server.key > server.pem

Read more
Use-HomeKit-Control-AirConditioner

每天回到家后、睡觉前,都会发现找不到空调遥控器==,在几经折腾后终于想到用HomeKit来控制家里的空调,将红外发射器连接到树莓派上,这样就可以直接用手机控制空调啦!(嗯,手机不会找不到的ʕ •ᴥ•ʔ)

PreRequisite

  • 树莓派 + 红外发射(接收)器
  • 杜邦线(母对母)
  • iPhone手机安装HOME app
Read more
AWS-Save-Money

目的

在编译Petalinux的时候,需要至少4核CPU。GCE的虚拟机用完了,AWS计算资源又非常贵,不过还好有免费的$100可以用。因此我决定采取非常丑的办法(还不是因为菜),在准备编译时关闭AWS Instance,从t2.micro(AWS免费)升级到t2.xlarge,然后启动机器将Public IP发送到Telegram Bot;在编译完成时关闭并降级最后再重新启动Instance。

此外,希望能让Telegram Bot定时发送账单信息给我,毕竟$100眨眼就没了。

Read more
Petalinux DMA驱动

计划先整理下驱动的基础知识,再介绍下设备树相关dts文件的写法。

最简单的内核驱动代码示例

首先以最简单的内核驱动代码为例,介绍如何编写以及编译驱动代码。

内核驱动代码至少需要包含两个函数,init函数(insmod时被调用)、exit函数(rmmod时被调用)。

简单的内核驱动代码示例如下所示:

#include <linux/module.h>
#include <linux/version.h>
#include <linux/kernel.h>
static int __init init_mod ( void ) /* Constructor */
{
printk ( KERN_INFO " Module1 start\ n ");
return 0;
}
static void __exit end_mod ( void ) /* Destructor */
{
printk ( KERN_INFO " Module1 end\ n ");
}
module_init ( init_mod );
module_exit ( end_mod );
MODULE_LICENSE (" GPL ");
MODULE_AUTHOR (" SUIKAMMD");
MODULE_DESCRIPTION (" Driver Module ");
Read more
aarch64 交叉编译

目的

在文章基于Xilinx zcu104版的petalinux编译(ffmpeg)中我介绍了如何在zcu104板上搭建操作系统,为了将海康威视摄像头拍摄下来的图像传输到zcu104板子PS的DDR处,我基于libavutil、libavformat、libavcodec这些库实现了自动抓取视频流中的关键帧并将它们存储为JPG格式(后续需要转换为YUV格式)的代码。

优雅的做法是在其他的平台上编译代码,在zcu104上只运行release版本,细心的同学应该已经看到在介绍搭建操作系统的那篇文章中并没有安装gcc库。代码在GCE上的虚拟机上交叉编译,使其可以在zcu104上安装的的操作系统上运行,zcu104对应的硬件架构是aarch64。

这时目标已经明确,在x86_64上交叉编译可以在aarch64架构上运行的代码,因为我已经将ffmpeg库安装进petalinux,所以在编译时所有库都可以动态链接。

Read more
基于Xilinx zcu104版的petalinux移植linux(ffmpeg)

Petalinux是Xilinx推出的嵌入式Linux开发工具。本篇文章基于Xilinx官方文档Petalinux Tools Documentation,另外在本篇文章中指出了我在编译过程中遇到的一些错误,希望能帮大家节省时间,轻喷。

(如遇到问题请在我的githubsuikammd上提issue,谢谢,还没有搞评论区,拖延症=。=)

环境准备

  1. Ubuntu虚拟机,我是在Google Cloud Engine上免费申请的虚拟机,区域是台湾,速度比较快,大小是15GB内存、4个vCPU以及60GB硬盘。(不要自己折腾VMware,后续petalinux编译需要翻墙,速度极慢,而且GCE上面可以随便折腾,感谢咕咕!)
  2. Petalinux SDK Installer、zcu104 BSP file,这两个文件均可以在file download中下载,我下载的版本都是2018.1的。如果需要下载高版本的,请注意查看板子是否支持,SDK installer和BSP的版本必须一致!
Read more
崇明岛一日游

从金桥出发,租车到达崇明岛。虽然是国庆期间,路上也不怎么堵车,一路都在睡觉。
到达崇明岛前经过了一个小岛,阳光很好,在树影交错的路上行驶。路两边有卖橘子、螃蟹等各种特产的小贩。
Imgur
超级温馨啊,想想自己岁数大的时候,头发斑白,也能像这两位老人一样幸福

Read more