[Windows]做一回自己电脑的明白人

Windows 7 已经停止更新,全球无数的 Windows 7 用户其实并不会随着微软的脚步而更新自己的硬件。Windows 10 对硬件的要求其实是很高的。 一般的 8G 内存的机器才能勉强胜任原来 Windows 7 4G 内存的机器,Win10 对 CPU 的要求更是让很多 Win7 用户抓狂。

怎样让自己的 Win7 跑得更快更安全?怎样确保之前卸载的软件,已经卸载干净?除了常规的三板斧,我们也需要明白 Windows 后面启动起来的资源。腾讯的电脑管家可以检测一部分不需要启动的服务以及任务,但是对于许多内核级的驱动,电脑管家无能为力。 Sysinternal 里有一个叫做 autorun 的工具,对于检查系统启动缓慢,可能的病毒加载是一个神器。当然使用这个工具,需要专业人员。非专业人员就算下载启动了这个工具,估计也是一头雾水。

下面的截屏,假定你已经下载并启动了 autorun,那么切换菜单里的 User ,分别检查 Logon Tab 里的内容,就可以看到每个用户(包括系统用户)可能启动的一些程序,其实你会非常震撼,原来你的系统启动了那么多乱七八糟的程序,你可以右键 Delete,或者直接按 Ctr-D 逐个删除。另外一个需要检查的地方是 “Drivers” tab,那里也是藏污纳垢之地,有些垃圾软件就是利用那个地方隐藏在系统的后面做一些龌龊的事情,例如 360,2345 之类的。当然,这些东西,你也不能乱删,最好先禁用,然后重启,如果重启正常,那就可以删除。 如果重启不正常,可以用 F8 , 恢复到上次启动正常,就可以继续启动,否则,需要用 Win PE 之类的工具修复。甚至重新安装 Windows 。

Ubuntu/Debian 修改任意 Mac 地址

有个叫做 macchanger 的软件包, 直接 apt install 即可

其实这个也是然并卵, ethtool -P eth0 就可以查看到物理 Mac 地址

有另外一篇文章说用 ethtool 就可以修改 eeprom 从而直接修改 Mac 地址。

然而, 这个需要 supports-eeprom-access = yes (运行 ethtool -i eth0), 如果网卡不支持的话,其实还是无解的。

至于其他办法用 dmidecode 等来获取 Mac 地址, 或许有效, 但是还不如 ethtool 直接。

结论, 要真的修改 Mac 地址,需要网卡支持,其他情况下,只是意淫修改一下 Mac 而已, 一条 ethtool -P 命令就能得到真实的 Mac 地址。(ethtool 是从 eeprom 里读取的)

用 qemu-nbd 命令 rescue Proxmox 下的 vm

一台 Ubuntu VM 修改了 vgname,启动不了了。 在 Proxmox 主机上,用以下命令挂接 VM 的磁盘:

# qm show 122 --pretty|grep drive // 查看 vmid=122 的磁盘路径
# modprobe nbd
# qemu-nbd -c /dev/nbd0 /mnt/pve/vmpool/images/122/vm-122-disk-0.qcow2
# fdisk -l // 验证 nbd 盘已经可以看到
# mount /dev/mapper/xingyun02-root /mnt
# chroot /mnt 

以上步骤就进入虚拟机根文件系统,直接可以对虚拟机操作了。 之后 umount , qemu-nbd -d ,然后 qm restart 120 就可以启动虚拟机了。

[How to] 怎样把 Proxmox 主机上的 USB 设备映射到虚拟机内

参考: https://pve.proxmox.com/wiki/USB_physical_port_mapping

把 USB 设备插入 PVE 主机后, dmesg 可以看到

假定虚拟机 ID 为 120,修改虚拟机配置文件: /etc/pve/qemu-server/120.conf,添加:

usb0: host=1-1.1.4

主机上 # qm stop 120; sleep 3; qm start 120 // 不是 qm restart
Ubuntu 的虚拟机内,默认 Kernel 没有 usbserial 模块,需要

sudo apt-get install linux-image-extra-virtual
sudo reboot
lsmod|grep usbserial
ls -al /dev/ttyUSB0

域名的价格-从 Godaddy 迁移到阿里云

FreeLAMP.com 是创始人徐永久自 2001 年开始就注册的域名,一直放在 GoDaddy 上,在创业之前,因为是注册了5年的域名,所以就一直放在 GoDaddy,这次终于要到期重新续费了。 GoDaddy 的价格是 3年 345 元,而阿里上的续费一个 .com 域名的价格是三年 207元,产品的竞争力可想而知。

域名和备案没有必然的关系,只有服务器主机在国内的运营商的,才需要备案。国内的备案不支持 .org 域名。其他 .org.cn, .com.cn, .net.cn 之类的基本都是假域名,可以忽略。中国的创新,从 .com.cn 迁移到 .cn 是非常快而高效的,你去看澳洲或者新西兰的 .com.au, 或者 .co.nz 其实一直在那里沿用,直接用 mydomain.au 或者 mydomain.nz 的域名很少,这些国家其实都是懒,不作为。

吐槽一下 GoDaddy 的域名管理界面,需要翻墙才能访问不说,界面十分的不好用,而且 API 的使用也十分的 Low。价格问题不是主因,是不接地气才是这些外企失败的原因。

如果是去拍卖一个域名,同样的域名,阿里上是 39.8k,而 GoDaddy 上要 41k

怎样在亚马逊 AWS 上申请12个月免费的 EC2

首先需要准备的物资:
1. 一张 Visa 或者 Master 的信用卡(说银联也可以)
2. 一个电子邮件(这是你 AWS 上的身份,每年可以换不同的邮件申请免费 EC2 )
3. 一个能接收验证码的手机(废话)

账号申请时,会问 Professional 还是 Personal,就选择 Personal 好了。然后填写个人地址,手机号码,然后填写信用卡号码,预扣1美元校验信用卡有效性。然后,信用卡银行会往你在银行登记的手机号码自动语音电话,让你确认境外交易。账号就算创建好了, 也会收到邮件提示。但是屏幕提示是需要24小时以内才会生效。也就是说,没有正式生效之前,是不可以开实例的。大概等了1-2个小时以后,就可以去开实例了。

开实例之前, 要首先选择 Region ,这个非常重要,一般选亚洲的,切换不同的区域, URL 的网址也会不一样,你 ping URL 里的域名,选择延迟比较小的就可以了。 我们就选择东京(Tokyo) 的区域,香港的区域是需要另外 Enable 的,懒得去 Enable 以免生成另外的费用。

之后就选择操作系统类型,我们选 Ubuntu 1804 普通版本,选 Free Tier 的 1G 内存, 1vCPU,8GB SSD*,然后把公网IP 地址和KeyPair 保存下来,等会儿要用到。接下来点击其中的 Security Group,为 Inbound Rule 添加tcp/udp 端口,默认只有 22 端口,根据自己的实际情况,开通对应的 tcp/udp 端口。

这样子一个基本的免费 EC2 申请就算完成了。

高级一点的,我们可以通过 aws-cli ,也就是在命令行下对实例进行操作。在右上角个人昵称的地方下拉,选择 My Security Credentials,然后创建 Access Key。把 Key 保存下来,在 aws-cli 就可以使用的。

要登录 Linux EC2 主机,我们需要 Windows 上安装 ssh 客户端,或者通过 Linux 主机登录,我们在 Windows 上安装了 Cygwin ,可以直接通过其中的 ssh 命令登录 EC2. $ ssh -i tokyo.pem ubuntu@52.195.x.x ,这样子就登录了, 然后 sudo -s 就可以成为超级用户,为所欲为了。

针对高级用户,接下来,我们把前面下载到的一个 Access Key 的 csv 文件记录下来。然后用以下命令配置好 profile,注意后面的 profile name “free_ec2” 可以随便取。

$ aws configure --profile=free_ec2

根据 CSV 里的 keyID 和 keySecret 粘贴,输入区域名:ap-northeast-1,就可以在 $HOME/.aws 下看到生成或者添加的 config 和 credentials 两个文件了。 我们写了一个简单的脚本,可以监控实例是否正常运行,如果有不正常的情况会报错。

#!/bin/bash
profiles=$(sed -n -e 's/\[\(.*\)\]/\1/p' credentials)
[ -z "$profiles" ] && exit 0
for P in $profiles; do
STATUS=$(aws ec2 describe-instance-status --profile $P|jq ".InstanceStatuses"|jq ".[]"|jq -r ".InstanceState.Name,.SystemStatus.Status"|paste -d ' ' - -)
[ "${STATUS}" != "running ok" ] && echo "Error: Something Wrong with AWS Instance! [$STATUS]"
done
$ vim /etc/hostanme
$ sudo apt upgrade
$ sudo reboot
$ sudo apt install kcptun shadowsocks-libev*
$ sudo snap install v2ray (this won't work due to apparmor issue)

开源智能家居系统 Home Assistant 入门

如果可以在你家的宠物猫上贴/绑一个小的低功耗蓝牙发射器,然后在一个小的家庭智能网关上搜集到这个蓝牙的位置,你是不是可以全天候监控你家萌宠,在你不在家的时候撒欢的情况了呢?本文尝试在一台 x86 虚拟机上安装这个开源的智能家居软件,待以后我们更新发布一个新的安装到树莓派或者香橙派的版本,那就是真正的智能家居系统了。

在我们的 Proxmox VE 6 集群里,找了一台空的 Ubuntu 1904 的虚拟机 1G 内存 1 vCPU。虚拟机主机名设为 lamp-u02。你问为什么要用虚拟机啊,就是为了隔离啊, 测试的东东不想和其他系统混杂,所以,我们的三台物理机的集群里,安装了很多七七八八的各种虚拟机。

开始按照网上参考文章安装,安装流程非常顺利。

$ sudo apt-get install python3-pip python3-venv
$ sudo apt-get install build-essential libssl-dev libffi-dev python-dev
$ sudo echo > /etc/pip.conf <<EOF
[global]
trusted-host=mirrors.aliyun.com
index-url=https://mirrors.aliyun.com/pypi/simple/
EOF
$ sudo useradd -rm homeassistant
$ cd /srv
$ sudo mkdir homeassistant
$ sudo chown homeassistant:homeassistant homeassistant
$ sudo su -s /bin/bash homeassistant
$ cd /srv/homeassistant
$ python3 -m venv .
$ source bin/activate
$ pip3 install homeassistant
$ hass &

等后台下载一些依赖,并启动到 “Starting Home Assistant” 可以浏览器登录 http://lamp-u02:8123/ 进入服务,来玩耍一把了。

设置好账号后,就进入一个地址定位界面,貌似自动检测不工作。 我们切换到火狐浏览器进入翻墙的情形,来测试一下定位地址的自动检测功能。显然由于不可知的原因,这个自动检测地址不工作,我们只好手工拖动地图到我们的实际位置,然后选择时区, +8 的时区选择里,居然没有中国的任何城市! :-(【后面我们会手工修改】,我们暂时选择新加坡,保存后,点击完成。这个服务就算设置好了。

接下来,我们点击集成,点击右下角的 + 号,就可以添加不同的设备或者服务了。里面有大金空调的直接输入 IP 地址就可以监控,还包括 海信,华为等设备,直接可以连接 MQTT , 还可以连接 Twillo(短信服务提供商) 等。

我们接下来去手机上安装一个 Home Assitant 的应用。 iOS 上在 App Store 里搜索 Home Assistant 第一个有房子形状的就是了。

安装完 App 后,确保手机 Wi-Fi 和 Home Assisstant 服务器在同一个网络内,App 就可以自动发现,如果没有发现的话,可以尝试手工输入 URL: http://192.168.x.x:8123/ 让 App 去发现,成功之后,点击三个允许授权,然后会出现白屏是因为中间在传输数据,大概需要 3-5分钟,手机上和 PC 浏览器上都可以出现手机的详细信息了。

下面来玩一把高级的,上面提到过,没有 上海这个时区。 其实,时区也是可以手工填写的,但是是不是 GMT+8,我们没有确认,中间没有天气预报这个模块了。 我们要初始化怎么办?实际上很简单粗暴,直接删除 .storage 目录就可以:

 $ rm -rf  /home/homeassistant/.homeassistant/.storage 

重启后,就会在浏览器上要求重新创建用户名和密码。我们要修改的时区的名称就在 .storage 目录下的 core.config 里。 把 Asia/Singapore 修改为 Asia/Shanghai 后,我们用 $ kill -HUP $(pgrep hass) 就可以重启原来启动的 hass 进程。虚拟机的 SSH console 上就可以看到重启的信息。 浏览器界面进入“配置=>通用”,就可以看到时区已经显示为 Asia/Shanghai 了。

最后, 我们把 hass 搞成一个自启动的服务, 这个在 Ubuntu 下很简单, 编辑一个启动脚本。 (请注意这个脚本和其他网络上介绍的有不一样的)

$ sudo echo > /lib/systemd/system/homeassistant@.service <<EOF
[Unit]
Description=Home Assistant
After=network-online.target

[Service]
Type=simple
User=%i
ExecStart=/srv/homeassistant/bin/hass -c "/home/%i/.homeassistant"

[Install]
WantedBy=multi-user.target
EOF
$ systemctl daemon-reload
$ systemctl --now enable homeassistant@homeassistant
$ systemctl  status homeassistant@homeassistant  // 查看服务启动情况

对以上的这个启动脚本做个解释,其中的 User=%i, 这个 %i 其实就是 服务名里面 @ 后面部分,也就是 homeassistant 。也就是说,要启动多个服务的话,只要在一个新的 HOME 下, 例如 /home/newuser 下配置好 .homeassistant 目录里,无需添加其他脚本,我们可以启动一个新的服务: systemctl start homeassistant@newuser 即可。(当然里面的端口号要修改)怎么修改启动的端口(例如 8122 )呢? 修改 configuration.yaml,把其中的 http: 部分修改成如下即可。

  base_url: lamp-u02:8122
    server_port: 8122

好了, 一个完整的配置安装教程基本完成,如果手头有其他苹果的,亚马逊的, Google 的音箱之类的,都可以爽爽的玩起来了。

什么?你不想用 8123 端口访问?前端加一个 Nginx 反向代理就可以,小儿科了。 就不介绍了。 请记住, 不能直接用普通用户启动端口号低于 1024 的 TCP 服务,例如 80/443 都必须以 root 启动。

但是问题是家庭里面,谁也不想开一台虚拟机跑这个东东吧?接下来,我们后面会尝试用其他方法来安装这个软件到小巧玲珑的树莓派,或者香橙派,或者香蕉派上面,然后在手机端就可以配置整个家庭的智能家居,在小巧的设备上配置上 DDNS,就可以远程在手机上控制家里的设备了。 譬如,你能想到的,下班前,先把家里的电饭煲开启,天冷了, 家里的空调/地热可以预先开启。等等等等。

所有这些,你都可以通过这个开源的软件来控制,好向往啊!

关于代码开发中的 Changelog

因为我们在做一个项目的自动版本更新(让用户手动点击更新 SaaS 软件的版本),开发中混乱的版本管理和 Commit 注释,有时候让人抓狂。

这里有两个链接或许值得阅读:
https://keepachangelog.com/en/1.0.0/
https://co-pilot.dev/changelog#best-practices-release-dates-apply

  • Changelog 的正式文件名就叫 CHANGELOG.md
  • 必须是倒排序的
  • 用 ISO 格式(YYYY-MM-DD)来写日期,并和版本号一起写在每个 Change 的开头
  • 对不同的修改进行归类
  • 高亮重大的修改和功能废弃

这篇文章里有比较好的例子: https://depfu.com/blog/what-makes-a-good-changelog
另外可以参考 github 上 MD 写作指引: https://help.github.com/en/github/writing-on-github/basic-writing-and-formatting-syntax