使用 msmtp 和 GMail 账号部署服务器 SMTP 发信(2024年)

实验室新添加的服务器需要一个基本的邮件通知功能,也就是在某些事件发生时能够向外发送电子邮件进行通知。众所周知,配置电子邮件的基础设施通常会很麻烦。因此,我在寻找解决方案时有以下三点考虑:

  • 服务器程序发送电子邮件的接口应该通用。因此,我优先考虑使用提供了兼容/usr/sbin/sendmail命令的软件。
  • 避免额外注册邮箱账号的麻烦。因此我选择重复利用我已有的 GMail 账号。
  • 考虑 GMail 的特有限制。由于使用 Google 主密码进行 SMTP 发信身份认证的操作已经被 GMail 认为不安全而禁用了,所以这次必须变相使用用户名和密码完成 SMTP 配置。Google 提供了一个名为 App passwords 的特别功能,能够根据需要创建一个起替代作用的纯文本密码。

我最后选择的解决方案是 msmtp 配合 msmtp-mta 以及 GMail SMTP + App Passwords 组合。整个过程基本是遵循Gmail with an App Password这篇英文博客文章来部署的。

本文的配置在2024年10月有效,但无法保证永远生效。请在进行配置之前先行验证方法的有效性。
继续阅读

Hide “AMD Software” entry in Windows 11 Context Menu (right-click menu)

Background

I just bought a Lenovo 14p Gen 3 laptop with preinstalled Windows 11. Since it is an AMD-based laptop, it has an AMD configuration software installed, namely AMD Software: Adrenalin Edition. It provides several useful features for screen display. However, the annoying thing is that it adds an extra entry in Windows 11’s default Context Menu. Luckily, there is a way to block such entry without uninstalling the AMD software.

Desktop right click menu in default installation
Desktop right click menu, showing the annoying “AMD software: Adrenalin Edition” entry.

Steps to hide entry using Regedit

  1. Open regedit.exe and visit \HKEY_CLASSES_ROOT\PackagedCom\ClassIndex\. There should be several tens of entries (keys) under that, all named after {UUID}.
  2. Expand all entries you saw in Step 1 and look for the entry containing keyword AdvancedMicroDevicesInc (“AMD”). Once you find it, copy its corresponding UUID string. We will use it in the steps below.
    In this case, the UUID starting with 6767... is what we need.
  3. Open regedit.exe and visit \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\. There should be three keys under Shell Extensions: Approved, Blocked, and Cached. If there is no Blocked key on your system, manually create it by right-clicking Shell Extensions, and create a new key named Blocked.
  4. Enter Blocked key (which appears as a directory in regedit tool). Under directory Blocked, create a new String (aka type REG_SZ). Rename the String as {UUID}, in which UUID is the same UUID as we found in Step 2.
    Example of final result under Shell Extensions\Blocked key
  5. Go back to desktop and try with right click. If everything is done correctly, the AMD Software entry will immediately disappear in the right-click menu.
  6. If you want to revert our modification, simply delete the value we created in Step 4.

References

Quick guide: set up chroot environment and build Debian packages (sbuild version)

TL;DR: Pbuilder-related tools are ineffective and redundant. By installing sbuild and schroot, one can set up clean and reusable chroot environments quickly and use the sole sbuild command to build Debian source packages (using src tree or .dsc files).
Fade away please pbuilder/cowbuilder; long live sbuild!


Quick example

Install tools and preparation

sudo apt update;
sudo apt install sbuild schroot;
sudo mkdir -p /var/lib/sbuild/chroots; # the last component is made by us
sudo chown sbuild:sbuild /var/lib/sbuild/chroots;

Initialize a chroot environment using sbuild-createchroot

# Assume host machine is of x86_64 architecture, create an unstable chroot
sudo sbuild-createchroot unstable /var/lib/sbuild/chroots/unstable-amd64 \
  --alias=sid --alias=UNRELEASED http://deb.debian.org/debian;

Keep (s)chroot environment updated

sudo sbuild-update -ud unstable;

Build a Debian package using sbuild with previously created chroot environment

# If you want to drop superuser privilege, add yourself into sbuild group first.
# Other settings might be needed. See sbuild-adduser(1).
# #################################
# Option 1: have proper Debian source package
sbuild -A -v -d unstable /path/to/package.dsc
#
# Option 2: chdir into extracted source tree with .orig tarball in parent directory
sbuild -A -v -d unstable
# Option 3: integrate with git-buildpackage (gbp)
gbp buildpackage --git-builder=sbuild -A -v -d unstable
#
# Notes:
# 1. If you need source-only changes (https://wiki.debian.org/SourceOnlyUpload),
#    append "--source" to sbuild's invocation
# 2. If you want to sign your build, append "-kxxxxxxxx"
#    to your sbuild's invocation, where xxxxxxxx is you gpg keyid

How to destroy schroot environment properly

If you do not wish to use schroot and sbuild anymore, you may use the following tool to properly destroy the schroot environment:

# Destroy the chroot instance named "unstable"
sudo sbuild-destroychroot unstable
# This script actually does nothing other than providing instructions.
# You will need to follow the printed instruction and safely
# destroy the schroot instance by yourself.

References

To be continued…


Updates

  • July 19, 2020: Replace httpredir.debian.org with CDN-enabled deb.debian.org.
  • July 19, 2020: Add text related to sbuild-destroychroot.
  • July 22, 2020: Remove “sudo” from sbuild invocation. No privilege is needed in this case.

被雪藏的大号瑞士军刀:eric6 IDE

作为一个有跨平台强迫症和被Python惯坏的业余伪程序员,我在挑选开发桌面应用的时候果断地选择了PyQt,因为它结合了Python的强大、快速开发的特点与Qt的跨平台性质。

然而常见的图形应用程序大都需要集成开发环境(IDE)以辅助开发,在挑选IDE时我着实费了一番功夫。让我们简单地列一下现在(2016年初)能够排得上名的IDE

  • PyCharm,常见的选择,据说十分强大,然而它是JetBrains公司的产品(意味着你要结合Java使用),也存在商业版,有一种不爽的感觉。
  • Eclipse,没用过不做评价。但是还是Java
  • Python IDLE,这东西能用?

今天我要推荐的是一款不是那么出名的软件:eric6 IDE。

继续阅读

HTML中ruby和黑幕的初步应用

名词解释

不了解Ruby为何物的请自行上网搜索;这里给一个维基百科链接。简而言之是在正常字符上方显示一些小型的字符,常用在东亚文字中,例如中文中对汉字进行注音以及日文中对汉字注假名。当然,经过广大人民群众的发掘,它已经有了进阶的用法。

<ruby>标签是HTML5新引入的标签。

黑幕是广大人民群众的一种表现形式:文字由黑框覆盖,反白可以显示出文字内容,和删除线有异曲同工之妙。常见于娱乐用的网站,例如萌娘百科这样的站点。


继续阅读

VPS搭建记录(一):发行版选择与基础服务搭建

非常幸运地,我曾经抓住机会用正当方式获得了 github education 的100$ DigitalOcean 代金券。在此鄙视一下滥用这个项目进行套利的无良商人。

这学期有机会使用网银+Paypal 激活了DO帐号,开了一个10刀每月的VPS,放在新加坡节点。

VPS 能用来干什么呢?无外乎以下用途:

  • 科学上网
  • 搭建个人博客
  • 挂机运行程序
  • 搭建个人邮件服务器
  • 运行其它服务

因此,以下一系列文章主要围绕以上内容展开。


继续阅读

Python3处理XML的笔记

应该说,Python(3)不愧其名,在各个方面都能够优雅地进行编程与处理数据。今天我来整理一下在Python3中处理XML的一些方法。
先注明:所提及的前两个库都是 Python3 自带的标准库,请参考官方文档文档:https://docs.python.org/3/library/ 以了解详细使用用法。


标准库中的首选:xml.etree.ElementTree

据说大家都喜欢这个库,那么我就把它列在最前面。据说它性能好,易于理解,那么我就姑且这样认为。
等我多用用再写这一部分啦。

标准库中的所谓标准:xml.domxml.dom.minidom

首先说一下什么是DOM

The Document Object Model, or “DOM,” is a cross-language API from the World Wide Web Consortium (W3C) for accessing and modifying XML documents. A DOM implementation presents an XML document as a tree structure, or allows client code to build such a structure from scratch. It then gives access to the structure through a set of objects which provided well-known interfaces.
来源:python3-doc 20.6节

如果你研究过原生的Javascript中操作DOM的内容的话,你可能对xml.dom这个库产生好感:它是遵从W3C DOM API而设计的。由于W3C只为Java, ECMAScript, IDL三者规定了标准的API接口,Python(3)的非官方实现在很大程度上是参考了IDL中的API设计,但没有刻意追求百分百相同。
W3C对于DOM的设计是分层次(Level)的,越是高层的标准包含了越多的特性与内容(同时,其被采纳的越少)。Python(3)中实现了对DOM Level 2 Spec.的兼容,暂时没有管Level 3的内容。xml.dom.minidom是一个简易的实现,只实现了第一层的规范与少量的第二层规范内容,同样其实现代码也被大大简化。
xml.dom库的功能是完备而齐全的。你可以使用它解析、生成、输出XML文件与字符串。
总体感觉用这个库和原生JS中操作DOM的感觉很类似,大部分方法的名称都相同,可以找到一种亲切感。


第三方库的选择:lxml

pypi上面有一些有意思的库,例如lxml。这个库号称xml.etree.ElementTree的加强版,据说提供了强大的功能(听说例如完整的XPath支持),但唯一的不方便之处是它依赖著名的libxml2库,而这是一个用C语言写成的库,所以安装时需要编译它。如果你的工作环境支持的话,用一用试试也无妨。

ed 文本编辑器使用笔记

昨晚抽风一般地想要学学 ed 究竟应该怎么用,于是花了十多分钟学习了一下基础用法,可以保证在紧急情况下“存活”。稍微整理一下自己学到的用法:

调用

ed [file]

一般使用

如果是创建新文件的话,进入程序后除了光标什么都不会显示;如果是打开已有文件,那么会显示一行文件大小的字节数,然后光标到下一行等待用户输入。
ed 是基于行的文本编辑器,也就是说同时只能显示或编辑文件的某一行。和 Vi 类似,存在两种模式:输入模式和命令模式。默认打开文件后进入命令模式。
既然是基于行的编辑器,那么 ed 有一个“当前行”的概念,可以使用 n 查看之,会打印出当前所在行号。默认打开文件后自动跳转至文件末尾(也就是最后一行)。
在命令模式下输入编辑器不认识的命令,会回显一个问号 ? 表示输入错误。

文字输入

切换至输入模式的命令如下:

  • a,在当前行的下一行开始插入文字;
  • i,在当前行的上一行开始插入文字;
  • c,抹除当前行的所有文字,重新输入。

注意 c 命令的危险性。
切换至输入模式后,就请随意地打字吧,回车也会忠实地写入文件。缺点是没有办法修改回车符以前的输错的文字。如果想修改,必须退出当前的输入模式再尝试修改。
补充说明,如果你想要删除文字,可以在定位到某行之后,配合使用 c 与 . 来达到删除所在行的目的。
如果想退出输入模式,在新行输入 . 即可。就是英文句点。

导航

以下导航命令当然是在命令模式下。

  • 直接输入行号并回车,跳转到对应行,并回显对应行的文字(不带行号)。
  • 输入回车,会跳转到下一行,并回显对应行的文字(不带行号)。
  • 输入 . ,会重复显示当前行的文字(不带行号)。
  • 输入 n,会回显当前行的文字(带行号)。

保存与退出

在编辑已有文件的时候,输入 w 可以进行保存,回显新文件的字节大小。
在编辑新文件时,需要在 w 后接上文件名。回显相同。
q 可以退出编辑器。在没有保存文件的时候,则必须用 Q 强制退出。当然 ctrl+c 是没有用的。

科大网络通的自动化

自2014年2月起,jameszhang 更新了科大的网络通界面,适当简化了登陆流程,原来绿油油的界面也不见了。

要想自动化地连接网络通,最好的方法是网络通脚本,这里收集一下,也许不是都能用,等以后再整理。

1. jameszhang 简化过的脚本,原文发表在瀚海星云BBS的USTCnet版某帖子

#!/bin/bash
curl --data "name=user&password=pass&cmd=set&type=出口&exp=time"
http://wlt.ustc.edu.cn/cgi-bin/ip

2. socketk (雨中片汤) 写的 python3 脚本,原文发表在瀚海星云BBS的Love版某帖子

原注:python3的语法,本来是自用的,所以没有把用户名和密码搞成参数,大家在中括号
里面改成自己的就妥了~

3. (待整理)