0%

玩转树莓派 | 自动上报IP

安装和配置mutt 和 msmtp

muttmsmtp 是两个常用的邮件客户端和 SMTP(简单邮件传输协议)工具。它们通常被一起使用来发送和接收电子邮件。

  1. mutt:
    • mutt 是一个文本模式的邮件客户端,它提供了一个基于终端的用户界面,可以在 Linux 上以命令行方式使用。
    • mutt 支持多种邮件协议,包括 POP3 和 IMAP,因此可以使用它来连接到不同的邮件服务器来接收和阅读邮件。
    • mutt 具有丰富的配置选项和自定义功能,可以通过编辑配置文件进行优化和修改。可以设置邮箱、签名、邮件过滤规则等。
  2. msmtp:
    • msmtp 是一个用于发送邮件的 SMTP 客户端工具,它允许通过外部的 SMTP 服务器发送电子邮件。
    • msmtp 配合 mutt 使用时特别方便,因为 mutt 默认不包含 SMTP 邮件发送功能,而 msmtp 可以作为其外部的 SMTP 发送器。
    • msmtp 配置简单,只需编辑一个配置文件,并在其中指定 SMTP 服务器的详细信息,如服务器地址、端口、用户名和密码等。

执行如下命令安装 mutt 和 msmtp:

阅读全文 »

玩转树莓派 | 24小时无人直播

安装 FFMPEG

在树莓派终端输入如下命令,等待安装完成。

1
sudo apt install ffmpeg

设置视频播放路径和直播地址

设置视频所在顶层路径,递归查找该路径下所有的待直播视频,接着利用 ffmpeg 逐个播放所有视频。

使用方法为:nohup ./run.sh <视频顶层目录> <你的rtmp直播地址> <你的直播码> &

这样便可以利用树莓派实现 24 小时无人在线直播了。

阅读全文 »

处理器微结构

现代处理器为了增加指令的吞吐,引入了指令流水线。相比单指令周期处理器,指令流水线将一条指令的执行过程划分为多个阶段,经典的5级流水线包括:取指(Instruction Fetch, IF)、译码(Instruction Decode, ID)、执行(Execution, EX)、访存(Memory, MEM)和写回(Write Back, WB) 5个阶段。指令流水线的每个阶段都有一套独立的硬件单元,因此在理想状态下,每个时钟周期每个阶段对应的硬件单元都能执行一次对应的操作,这样就形成了流水线,处理器每个时钟周期就可以完成一条指令的执行。图1展示了5级流水线指令执行过程,从第5个时钟周期开始,每个时钟周期都会完成一条指令的执行。

阅读全文 »

本篇博客转载自:http://igoro.com/archive/gallery-of-processor-cache-effects/

In this blog post, I will use code samples to illustrate various aspects of how caches work, and what is the impact on the performance of real-world programs.

The examples are in C#, but the language choice has little impact on the performance scores and the conclusions they lead to.

阅读全文 »

大数表示方法

对于大数 $A$,其基于底层数据类型 BN_ULONG 可以被表示为:

其中,底数 $b= 1 << sizeof(BN_UNLOG)$。

对于 LP64 系统,unsigned longpointer 数据类型长度为 64 比特,BN 定义了如下基本宏定义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// crypto/bn/bn_lcl.h
/*
* 64-bit processor with LP64 ABI
*/
# ifdef SIXTY_FOUR_BIT_LONG
# define BN_ULLONG unsigned long long
# define BN_BITS4 32
# define BN_MASK2 (0xffffffffffffffffL)
# define BN_MASK2l (0xffffffffL)
# define BN_MASK2h (0xffffffff00000000L)
# define BN_MASK2h1 (0xffffffff80000000L)
# define BN_DEC_CONV (10000000000000000000UL)
# define BN_DEC_NUM 19 // 64-bit ~ 19-dec
# define BN_DEC_FMT1 "%lu"
# define BN_DEC_FMT2 "%019lu"
# endif

// include/openssl/bn.h
# ifdef SIXTY_FOUR_BIT_LONG
# define BN_ULONG unsigned long
# define BN_BYTES 8
# endif
# define BN_BITS2 (BN_BYTES * 8) // 64
# define BN_BITS (BN_BITS2 * 2) // 128
# define BN_TBIT ((BN_ULONG)1 << (BN_BITS2 - 1)) // 1 << 63

# define BN_FLG_MALLOCED 0x01
# define BN_FLG_STATIC_DATA 0x02

在定义大数的基本存储类型之后,BN 定义了 BIGNUM 结构体如下:

1
2
3
4
5
6
7
8
9
// crypto/bn/bn_lcl.h
struct bignum_st {
BN_ULONG *d; /* Pointer to an array of 'BN_BITS2' bit chunks. */
int top; /* Index of last used d +1. */
/* The next are internal book keeping for bn_expand. */
int dmax; /* Size of the d array. */
int neg; /* one if the number is negative */
int flags;
};

基于上述定义的大数,其十进制表示为:

此外,在 crypto/bn/bn_lcl.h 文件中还定义了 bn_mont_ctx_st bn_recp_ctx_stbn_gencb_st 三种用于大整数乘法和除法的上下文。

大整数乘法

  • 基线算法

    使用 双精度 中间变量,算法复杂度 $O(n^2)$,进位累加次数 $n*n$

  • Comba 算法

    使用 三精度 中间变量,算法复杂度 $O(n^2)$,进位累加次数 $2*n$

  • Karatsuba 算法

    使用 分而治之 思想,算法复杂度 $O(n^{log_23}) \approx O(n^{1.585})$

  • Montgomery 算法(蒙哥马利算法)

    快速计算模乘、模幂运算(蒙哥马利算法

阅读全文 »

本篇博客翻译自Emulating x86 AES Intrinsics on ARMv8-A

最近,我需要移植一些 C 加密代码才能在 ARMv8-A(aarch64) 处理器上运行。问题在于代码使用了一些 x86 AES 内部函数,编译器在面向 ARM 体系结构时无法识别这些内部函数。ARMv8-A确实有一个可选的加密扩展,其中包括几个 AES 指令,但它们的语义与 x86 指令略有不同。我对 AES 没有太多经验,最初发现这非常令人困惑,因为我假设所有 AES 实现都需要以相同的方式工作(毕竟 AES 是一个标准!事实证明,这两种方法都足以实现 AES,但 x86 和 ARM 选择以不同的方式解决问题。

阅读全文 »

Tun/Tap 虚拟网卡

Tun/Tap 驱动程序实现了虚拟网卡的功能, Tun 表示虚拟的是点对点设备, Tap 表示虚拟的是以太网设备, 这两种设备针对网络包实施不同的封装. 利用 Tun/Tap 驱动, 可以将 TCP/IP 协议栈处理好的网络分包传给任何一个使用 Tun/Tap 驱动的进程, 由进程重新处理后再发送到物理链路中.

阅读全文 »

安装 vmware-tools

参考链接1。

挂载目录

若重启后,发现共享文件夹不显示,则检查 vmware-tools 服务是否没有启动,执行以下命令启动服务:

1
service vmware-tools start

或者执行如下命令手动挂载:

1
2
3
4
5
# 方式一
vmhgfs-fuse -o subtype=vmhgfs-fuse,allow_other /mnt/hgfs/

# 方式二
mount -f vmhgfs .host:/ /mnt/hgfs

参考链接

vmware Linux虚拟机挂载共享文件夹