米米的博客

做了一点微小的工作

笔者第一次在购物网站上看到 Yeelight 烛光氛围灯时,便被它精巧的外观设计所吸引,果断地入手了一台。使用 Yeelight 配套 App,灯光的亮度可以通过蓝牙进行控制,非常方便。

在 iOS 10 中,苹果正式推出了 HomeKit,用于集中管理家中的智能硬件。可惜的是,Yeelight 烛光氛围灯并不能够直接接入到 HomeKit。笔者搜索了相关的解决方案,找到了可以运行在树莓派上的 Homebridge 及其插件 homebridge-yeelight。Homebridge 是一个 Node.js 服务器,能够模拟成 HomeKit 的网关,与 iOS 和 macOS 上的家庭 App 配对。而 Homebridge 强大的插件系统则能够控制原本不属于 HomeKit 生态圈的硬件,实现对家庭 App 的兼容。

homebridge-yeelight 原版插件在 2019 年就停更了,这一插件支持 Yeelight 彩光灯,但并没有适配烛光氛围灯。幸运的是,一位热心网友提交了 Pull Request 增加这个功能。这里需要深入研究 Yeelight 灯具的蓝牙通讯规则,工作量着实不小。另一个问题是,homebridge-yeelight 插件使用的用于蓝牙通讯的库 noble bluetooth-hci-socket 也停更了,后者是 C++ 写的,依赖于 libbluetooth-dev。由于 v8 引擎的 API 发生变化,这个库只能适配到 Node.js 8,在最新的 Node.js 16 中过不了编译。

又经过一番搜索,笔者发现 noble 这个库被 abandonware 组织救活了,这一组织的宗旨就是集众人之力,fork 并维护一些被抛弃的项目。对于 homebridge-yeelight 插件而言,将依赖包设置为 @abandonware/noble 就又可以用起来了。

安装流程

下面介绍完整的安装流程。注意,Homebridge 并不需要用 root 运行(只需要先用 setcap 给权限就行,后文会讲),而且笔者的经验表明,npm 依赖装在 root 权限下容易产生灾难性的后果。因此后面的操作用 pi 这个用户即可。

安装 Node.js

如果树莓派上还没有安装 Node.js,那么可以先安装 nvm,再用 nvm 管理 Node.js 版本。

1
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash

这一行命令将在用户的家目录下创建.nvm 目录。如果执行时 curl 卡住,那就挂个代理。

完成后,按照提示重启终端,就可以使用 nvm 安装 Node.js 了。

1
nvm install 16

可以执行 node 或者 npm 试试安装是否正确。

然后执行

1
sudo setcap cap_net_raw+eip $(eval readlink -f `which node`)

这将允许 Node.js 和 Homebridge 搜索蓝牙设备。每次更新 Node.js 后都需要再次执行以上命令。

安装 Homebridge

接下来全局安装 Homebridge 及其插件。

1
npm install -g homebridge https://gitpkg.vercel.app/stevenjoezhang/homebridge_yeelight/yeelight

homebridge-yeelight 插件将会安装依赖 @abandonware/bluetooth-hci-socket,并默认使用预编译版本的动态库;如果没有找到则会使用 node-gyp 进行编译。若是在安装时遇到报错,可以检查一下是不是这个原因。从源码编译的话就需要先执行以下命令

1
sudo apt install libbluetooth-dev

运行 Homebridge

执行

1
homebridge

如果没有报错,那么就安装成功了。初次执行时 Homebridge 会在用户的家目录下创建.homebridge 目录。为了配置 Yeelight 插件,需要用文本编辑器创建一个 config.json 文件

1
vim ~/.homebridge/config.json

然后写入以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"bridge": {
"name": "YeeBridge",
"username": "18:00:27:40:BC:1B",
"port": 51825,
"pin": "031-45-154"
},
"platforms": [
{
"platform" : "yeelight",
"name" : "yeelight"
}
]
}

保存好配置文件后,检查一下树莓派的蓝牙是否处于开启状态,然后重启 Homebridge。这时,树莓派附近的 Yeelight 烛光氛围灯就可以被发现了。

接下来,使用 iOS 的家庭 App,扫描 Homebridge 运行时输出的二维码,即可完成配置。

使用 USB 蓝牙接收器

如果觉得树莓派自带的 UART 蓝牙模块信号不好,可以使用一个外接的 USB 蓝牙接收器。

在连接 USB 蓝牙接收器后,执行 hciconfig 命令,如果识别出两个设备,其中一个是 Bus: USB,说明树莓派支持这一接收器。这时可以禁用掉自带的蓝牙模块,方法是编辑 /boot/config.txt

1
sudo vim /boot/config.txt

在最后加一行

1
dtoverlay=disable-bt

最后重启系统即可。


参考文章:借助树莓派与 HomeBridge ,将 YeeLight 彩光灯接入 Apple HomeKit | Matrix 精选

ArcGIS 提供了非常强大的 JavaScript API,允许用户方便地在浏览器中展现 3D 地形等场景。同时,ArcGIS 也提供了一个底层接口 externalRenderers 来访问 SceneView 的 WebGL 上下文,这进一步地拓展了用户自定义的自由度。一些第三方 WebGL 库,例如 three.js,与这一功能兼容。ArcGIS 官方提供了一个样例,能够用 three.js 的 WebGLRenderer 实时渲染国际空间站的位置:Use three.js from an external renderer

在 externalRenderers 的官方文档中,提到了 Binding the correct render target 的问题。原因是 ArcGIS 的 SceneView 并没有使用 WebGL 默认的 framebuffer,如果调用 gl.bindFramebuffer(null),之后的渲染将不能够正确的显示在屏幕上。ArcGIS 提供了一个名为 bindRenderTarget() 的方法,用于解决这一问题。在官方样例中,可以找到修改 three.js 行为的代码:

1
2
3
4
5
6
7
8
9
10
// The ArcGIS API for JavaScript renders to custom offscreen buffers, and not to the default framebuffers.
// We have to inject this bit of code into the three.js runtime in order for it to bind those
// buffers instead of the default ones.
var originalSetRenderTarget = this.renderer.setRenderTarget.bind(this.renderer);
this.renderer.setRenderTarget = function(target) {
originalSetRenderTarget(target);
if (target == null) {
context.bindRenderTarget();
}
};

这一段代码在 three.js r79 版本中是有效的,不过在 r127 版本中,WebGLRenderer 的 framebuffer state 被重构了,使得 context.bindRenderTarget 未能正确地执行,造成无法渲染的问题。

解决方案是,在 render 方法中的 this.renderer.state.reset(); 之后,加入一行 context.bindRenderTarget();。而 ArcGIS 官方样例中对 setRenderTarget 的修改则不再被需要了。

相比于 Steam,Epic Games 并没有提供一键移动游戏安装位置的功能,因此需要手动修改 Epic Games 的数据文件。操作步骤如下。

  1. 关闭 Epic Games Launcher。
  2. 手动将游戏文件用剪切粘贴的方式移动到新的位置。
  3. 在文件管理器中进入目录 C:\ProgramData\Epic\EpicGamesLauncher\Data\Manifests
  4. 这个目录下有许多.item 格式的 manifest 文件。使用文本编辑器(例如记事本或者 Visual Studio Code)打开它们,根据文件的内容找到你移动的游戏对应的 manifest 文件。
  5. 将这个 manifest 文件中的 ManifestLocationInstallLocationStagingLocation 的值从旧的安装位置修改为新的安装位置,然后保存。
  6. 进入目录 C:\ProgramData\Epic\UnrealEngineLauncher\LauncherInstalled.dat
  7. 将其中 InstallLocation 的值改为新的安装位置,然后保存。
  8. 重新启动 Epic Games Launcher 即可。

参考文章:Moving Epic store games From one drive to another

RPM 是在 Linux 下广泛使用的软件包管理器,由 Red Hat 开发。它的全称是 RPM Package Manager,和 PHP、GNU 一样,是一个递归的缩写。RPM 软件包后缀名是.rpm,不过在 Ubuntu 这种使用 APT 包管理器的发行版上并不支持这种格式。将 RPM 解包后,便可以得到软件的本体。

这是将.rpm 转为.tar.gz 的方法,以 openmpi 为例:

1
2
3
rpm2cpio openmpi-4.1.0-1.src.rpm | cpio -idv
tar -xzf openmpi-4.1.0.tar.gz
./configure --prefix=$HOME && make && make install

通过 alien 甚至可以直接将.rpm 转为.deb

1
2
3
sudo apt install alien
sudo alien openmpi-4.1.0-1.src.rpm
sudo dpkg -i openmpi-4.1.0-2.src.deb

本文同时作为北京大学《量子力学讨论班》课程论文提交。转载请注明出处。

矩阵力学是量子力学的一种表述形式,由海森堡、玻恩和约尔当于 1925 年完成。矩阵力学的思想出发点是玻尔原子模型中许多观点,例如电子的轨道,并不是可观测量。海森堡计划创造一个理论,只用实验中经常接触到的光谱线的频率、强度等物理量,完成对于系统动力学的描述。本文跟随海森堡的思路,对矩阵力学的发展过程进行了深入研究。

引言

19 世纪末,对于原子光谱学的研究取得了很大的进展,并产生了一些经验公式。其中有一条里兹组合规则(Ritz combination principle),其内容为:对光谱中的一条频率为的谱线,总是可以找到两个正整数与之对应;倘若存在对应的谱线,那么可以给出的值为

并且,这个原子的光谱中,也一定包含频率为的谱线。特别地,若,那么有

从物理意义上来说,此过程的初末状态相同,即,那么里兹组合规则将蕴含的对称性。

对于氢原子这一最基础的情况,莱曼(Lyman)线系、巴耳末(Balmer)线系、里兹 - 帕申(Ritz-Paschen)线系等光谱线系被相继发现,它们的频率都满足里兹组合规则。1889 年,瑞典物理学家里德伯(Rydberg)提出了表示氢原子谱线的经验公式:

其中被称为里德伯常数。这一公式现在被称为里德伯 - 里兹公式(Rydberg formula),它为玻尔提出氢原子模型提供了灵感。

旧量子论

所谓「旧量子论」,指的是诞生于 20 世纪初期的一系列量子理论,包括普朗克黑体辐射理论和玻尔氢原子模型。开尔文勋爵(Lord Kelvin)所提出的著名的「两朵乌云」说 \footnote {1900 年 4 月 27 日,开尔文勋爵给英国皇家研究院做了一个广为人知的演讲,题为《覆盖热量和光线的动力学理论的十九世纪的乌云》(Nineteenth-Century Clouds over the Dynamical Theory of Heat and Light)。},就包含将经典统计物理中的能均分定理应用于黑体辐射时出现的「紫外灾难」问题。普朗克最终通过数学技巧给出了能够拟合维恩公式(Wien's displacement law)和瑞利 - 金斯公式(Rayleigh–Jeans law)的黑体辐射定律,解决了这一问题,并通过研究其物理意义,提出了普朗克量子化条件,那就是

普朗克的能量量子化假说,揭开了量子理论的序幕。1913 年,玻尔(Bohr)在他的导师卢瑟福(Rutherford)的研究基础上,提出了著名的玻尔氢原子模型。这一模型引入了一些重要的假说:

  • 一个是「轨道」的概念,也就是说核外电子是在特定的轨道中运动,并且这样的运动是稳定的;\footnote {这一假说是为了解决经典电动力学理论中,电子会因为作加速运动时的电磁辐射失去能量,最终落到原子核中的问题。需要注意的是,玻尔的「轨道」思想与后来量子力学中「定态」的概念还有一定差距。}
  • 另一个是「跃迁」,电子从一个轨道到另一个轨道,将会吸收或发射光子,频率满足

这一套理论的推导还利用了所谓的对应原理,即在普朗克常数趋于 0,或者量子数趋于无穷时,量子体系的行为将会趋于经典体系。换言之,当量子数足够大时,氢原子可以看成电子围绕质子作圆周运动的朴素的经典模型。玻尔由此给出了轨道能量的表达式

并且,给出了一个推论,那就是角动量量子化条件

1916 年,索末菲(Sommerfeld)推广了这一条件,为 \footnote {可见玻尔的角动量量子化条件正是索末菲量子化条件的特殊情况,对角度环路积分得到的体现为。}

以上就是旧量子论的主要内容,它解决了氢原子光谱的波长问题,从理论上给出了里德伯常数的表达式。通过不同的实验方法给出的普朗克常数的值在误差范围内是相同的,这给了物理学者们强大的信心。但是,仍有许多问题无法通过旧量子论解决。例如,不同的谱线有强有弱,谱线强度表现的是发生某种跃迁的概率,但旧量子论无法给出理论研究。再如,玻尔的氢原子模型对类氢离子取得了成功,对于离子光谱的计算与毕克林(Pickering)线系吻合;但是对于多电子体系,或者存在外磁场的情况,就束手无策。

旧量子论所面临的这些巨大的局限性,必须依靠新的理论才能解决。

阅读全文 »
0%