米米的博客

做了一点微小的工作

笔者第一次在购物网站上看到 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%