使用 树莓派 + HomeKit 来控制空调

每天回到家后、睡觉前,都会发现找不到空调遥控器==,在几经折腾后终于想到用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时被调用)。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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
elasticsearch rollup

日志数据冗余且庞大,使用es的rollup功能可以预先对数据做处理,节省数据存储空间。

基本功能初识

rollup位于es x-pack包,本文使用的es版本是7.2.0。这里主要讨论rollup api对应的start和search功能,同时对于rollup的搜索和普通的搜索有什么区别。

  1. rollup 基本使用

    具体如何创建、删除、查看、启停rollup服务参看elasticsearch的官方文档。

  2. rollup start

    rollup创建完成后需要调用start才能开始执行,默认是stop状态

    1
    POST /_rollup/job/{id}/_start

    这个请求会落到TransportStartRollupAction的taskOperation,接着调用RollupJobTask的start,然后调用RollupIndexer类的实现ClientRollupPageManager执行搜索和bulk操作,


崇明岛一日游

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

Read more
Rust HTTP 框架设计-以Axum 0.6为例

Author: suikammd ihciah
一个 HTTP Server 内部包括很多部分:协议实现(h1、h2、压缩等)、连接状态管理(keepalive)、请求分发、中间件、业务逻辑等。用户可以全部自行实现,但其实除了业务逻辑之外的部分都是较为通用的能力。我们将这些通用能力与用户的业务逻辑解耦,即 HTTP 框架。

由于 Rust 生态中 hyper 已经提供了较为完备的 HTTP 协议实现,基于 hyper 实现 HTTP 框架就只需要提供包括路由、共享状态、中间件等能力。

本文从 HTTP 框架的设计角度,以新版本 Axum 作为例子,分析 Rust 下 HTTP 框架如何提供合理抽象与类型约束。基于 Rust 强大的类型系统,我们可以写出高效且正确的代码。

Read more