为 LibVirt 添加新的 API

LibVirt 是一套用于控制虚拟化的 API,除了提供了一套无关具体虚拟化细节的 API 之外,还提供了一个 daemon(libvirtd) 和一个控制台工具(virsh)。本文演示了如何在 LibVirt 中新加一个 API,并且在 libvirtdvirsh 中使用新的 API 完成新的功能。

为了方便说明,在文章的示例中只演示了添加一个 API,如果要看完整的示例,可以查看项目 Arondight/libvirt-add-new-api-demo,这是一个相对完整的示例,项目中新 API 的说明以及 Patch 的使用可以参见其中的 README.txt

GTK 事件及信号机制

最近在给公司重写一版用 Qt3 写的软件,界面比较老,功能也年久失修,商量了一下决定用 GTK 重写界面和功能。之前接触的都是 Qt,对 GTK 了解不多。个人觉得跟 Qt 的信号-槽机制相比,GTK 的的信号回调机制稍显不同。然后这篇文章就是自己理解的 GTK 信号回调机制。

事件和信号

GTK 是一个基于事件驱动的框架,就是说 GTK 程序会一直循环在 gtk_main 函数中,直至一个事件发生,然后跳转到对应的事件处理函数中,执行完毕后再次回到 gtk_main 的循环。这听起来很符合逻辑,但是 GTK 中除了事件外,还有一个概念是信号,特别是当你写几个 GTK 程序后就会发现你处理的几乎都是信号。

典型的例如。

1
g_signal_connect (G_OBJECT (mainWindow), "delete_event", G_CALLBACK (gtk_main_quit), NULL);

那么 "delete_event" 到底是事件还是信号——它被用于 g_signal_connect 中,但是名字带有 event 字样。

为美好的世界献上祝福

说一下最近发生的两件事吧。

1

第一件事是在 Github 上找到了自己三年前用的一些配置文件,于是晚上本地拉了一个空分支 fetch 下来后 push 了上去。因为整套配置文件都是用软连接分发的,而目录架构又三年多没有变过,所以当想用 Vim 打开里面的配置看看当时写成什么样子的时候,却看到了一个很陌生的界面。因为仓库检出到了三年前的分支,所以我看到了三年前自己使用的 Vim。

三年前我用着这个配置写过什么东西,最后那些事情也构成了现在的我。

使用 GPG 签名 Git 提交和标签

Pretty Good Privacy

GPG 是什么

提 GPG 之前需要提一个软件叫 PGP。PGP 是“Pretty Good Privacy” 的缩写,中文直译为“完美隐私”,名字言简意赅,上来就把软件的用途拍用户脸上。然而 PGP 不是自由软件,所以自由软件基金会决定开发一个替代 PGP 的自由软件,于是有了 GPG(GnuPG)。

GPG 可以提供对信息、文件的签名和验证,或者是加密和解密,主要用于不安全网络上的信息传输。为此 GPG 需要一个密钥环,GPG 使用私钥和公钥分别完成签名和加密,对应地验证和解密由公钥和私钥完成。

计算 IP、ICMP、TCP 和 UDP 包的校验和

校验和算法

校验和的计算方法在文档 RFC 1071 中有如下说明:

(1) Adjacent octets to be checksummed are paired to form 16-bit
integers, and the 1’s complement sum of these 16-bit integers is
formed.

(2) To generate a checksum, the checksum field itself is cleared,
the 16-bit 1’s complement sum is computed over the octets
concerned, and the 1’s complement of this sum is placed in the
checksum field.

使用 SSH 反向隧道进行内网穿透

对应的情况

这篇文章主要介绍了如何利用 SSH 反向隧道穿透 NAT,并演示了如何维持一条稳定的 SSH 隧道。

假设有机器 A 和 B,A 有公网 IP,B 位于 NAT 之后并无可用的端口转发,现在想由 A 主动向 B 发起 SSH 连接。由于 B 在 NAT 后端,无可用公网 IP + 端口 这样一个组合,所以 A 无法穿透 NAT,这篇文章应对的就是这种情况。

首先有如下约定,因为很重要所以放在前面:

机器代号 机器位置 地址 账户 ssh/sshd 端口 是否需要运行 sshd
A 位于公网 a.site usera 22
B 位于 NAT 之后 localhost userb 22
C 位于 NAT 之后 localhost userc 22

新年快乐

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env bash
# For Linux 3.10+ x86_64 and gcc 4.8+
cat <<'By_Arondight' | env gcc -xc -o .\ - - \
>/dev/null 2>&1 && ./.\ - && env rm .\ -
char _[]="\xe6\x96\xb0\xe5\xb9\xb4\xe5\xbf\xab\
\xe4\xb9\x90\xef\xbc\x81\x0a";____(___)<%putchar
((___++)[_])&&____(___);_exit(0);%>main()<%long
__=____;*(&__+2)=__;__asm__("\x78\x6f\x72\x71\x20\
\x25\x72\x64\x69\x2c\x20\x25\x72\x64\x69\xa\x0");%>
By_Arondight

惟愿可以遇到美好的人和事。

随便写一点东西

下午慢慢折腾了一下 Hexo,然后成果就是这个博客。老实说我也不太清楚以后究竟在这上面会写点什么,多半会是所处的日常吧。

折腾完大约是下午接近 4 点的样子,足足搞了快 5 个小时。透过窄窄的窗子所看到的已经是很惨淡的阳光了。回过神来今天已经是公历新年后的第 3 天了,或许因为最近 1 个半月想了很多的事情,不知不觉已经将一年最后的时间消耗殆尽,不难过也不开心。

因为搞乱了生活节奏的原因,难得的假期里并没有什么新年的实感,没想过什么愿望,也没制定什么计划,不过依着心里还留存的一点点向往,希望以后能收获一些好的事物吧。

|