米米的博客

做了一点微小的工作

在文章 DIY 辉光管时钟中,笔者介绍了自己设计辉光管时钟数字逻辑部分的一些思路。除此之外,升压电路也是在驱动辉光管时必不可少的组件,但由于当时缺乏设计经验,所以没有研究这个问题,而是买了一个成品的基于 MC34063 的升压电路板。这个方案其实是有一些问题的,比如说需要 12V 输入电压才能工作,并且转换效率有待商榷。所以笔者决定自己设计一个升压电路,这样就可以完全掌握整个电路的设计。

当然,我还没有能力完全从零开始设计这样一个电路,得先参考一下现有的解决方案。目前市面上已有的方案,除了 MC34063,还有 MAX1771 和 LM3481 等。经过搜索,发现 OMNIXIE 出品的 NCH8200HV 非常满足我的需求。它的体积非常小巧,集成起来很方便,并且只需要 5V 输入就可以驱动。但是,OMNIXIE 为了保护版权,没有公开 NCH8200HV 的原理图,售卖的成品中两个 IC 和一个二极管上的丝印也被打磨掉了。通过肉眼识别,可以发现电路板上有一个型号为 TTRN-060S-054 的变压器,和阻值分别为 0.01 欧、499 千欧、69.8 千欧和 10 兆欧的贴片电阻。

OMNIXIE NCH8200HV

结合这些信息,可以搜索得到一个开源的升压电路原理图:辉光管 5V-170V 升压测试模块原理图 PCB 工程文件。这个方案基于 MAX668 芯片和型号为 TPH1R403NL 的 MOS 管。其中,69.8 千欧和 10 兆欧的电阻是为了分压进行电压反馈,而 0.01 欧的电阻是电流采样电阻;499 千欧的电阻则是控制 MAX668 输出的 PWM 频率。通过观察 NCH8200HV 上一些关键元件的连接方式,可以判断出这个开源的原理图使用的是与之相同的拓扑:耦合电感式的 Boost 电路。

阅读全文 »

网盘是一种存储、备份、分享文件的便捷方式,在近十年得到了长足发展。许多公司都在自家产品的生态圈里加入了云存储的功能,例如苹果的 iCloud 和微软的 OneDrive,它们的侧重点是本地文件的备份和同步。而百度网盘和已经凉掉的 360 网盘,则注重于文件分享和离线下载。只可惜很多网盘服务商和迅雷这样的下载工具都有会员制度,并对非会员进行了下载限速,这对免费用户很不友好。那么,有没有办法集合这些网盘服务的优点呢?答案是存在的,那就是自行部署私有云服务。无论是一台树莓派,还是一个 VPS 主机,都可以轻松地搭建支持离线下载、方便进行同步和分享的私有云。

目前几种主流的私有云服务包括:SeafilePydioownCloudNextcloud。这些服务都各有特色。SeaFile 面向的是企业网盘,基于 Python 开发。Pydio 新推出的 Cells 由 Go 语言重写,提供面向团队的文件共享服务,但是在社区支持上有所欠缺。而 ownCloud 和 Nextcloud 则是基于 PHP 的开源项目,Nextcloud 是由原来的 ownCloud 团队成员独立出来开发的,它们有很多相似之处,但 Nextcloud 在许多方面都更胜一筹(例如移动端的支持)。
经过笔者自己的测试,不管是搭建个人使用还是团队协作用的私有云服务,Nextcloud 的功能基本上都可以击败其他的竞争对手。这篇文章也将主要介绍 Nextcloud,其它服务的搭建方式可以在它们各自的官网上找到。

安装 Nextcloud

笔者几年前安装过一次 Nextcloud,当时还需要手工配置 PHP 和 MySQL 的环境,步骤有些繁琐。现在,Nextcloud 已经提供了一键安装的 Docker 镜像,可以让我们在几分钟内搭建起一个 Nextcloud 服务。使用方法是,创建一个 docker-compose.yml 文件,并填入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
version: '2'

volumes:
nextcloud:
db:

services:
db:
image: mariadb:10.6
restart: always
command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
volumes:
- db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=
- MYSQL_PASSWORD=
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud

app:
image: nextcloud
restart: always
ports:
- 8080:80
links:
- db
volumes:
- nextcloud:/var/www/html
environment:
- MYSQL_PASSWORD=
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_HOST=db

其中,需要设置 MYSQL_ROOT_PASSWORD 和两个相同的 MYSQL_PASSWORD,使 Nextcloud 可以连接数据库。然后,运行以下命令:

1
docker-compose up -d

完成后,访问 http://localhost:8080 就可以看到 Nextcloud 的页面了。在初次登录时,需要设置管理员账号和密码,然后就可以开始使用了。

配置 Cloudflare Tunnel

如果服务器有公网 IP,那么配置好防火墙就可以直接访问 Nextcloud 了。但是,如果服务器没有公网 IP,那么就需要进行内网穿透。下文将介绍使用 Cloudflare 的 Tunnel 服务来实现内网穿透的方法。

首先,需要注册 Cloudflare 账号,并将域名托管在 Cloudflare 上。随后,在 Cloudflare 的控制面板中点击 Zero Trust,并在侧栏目录中选择 Access 下的 Tunnels。在这个页面中,就可以创建一个新的 Tunnel。在 Tunnel 的设置页面中,可以根据你的操作系统选择安装的命令。以 Debian 系为例,命令类似

1
2
3
curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared.deb
sudo cloudflared service install ...

完成后,就可以在 Public hostnames 面板中设置公网访问的域名了。将域名设置为你的一个子域名,并将添加的 Service 设置为 http://localhost:8080 即可。这样,我们就可以在外网访问 Nextcloud 了。

根据微软的文档 Options for using Windows 11 with Mac® computers with Apple® M1® and M2™ chips,现在可以通过 Parallels® Desktop 18 在 M1 Mac 上安装 ARM 架构的 Windows 虚拟机。本文将介绍具体的步骤。

首先是安装 Parallels® Desktop,具体步骤可以参考 ParallelsDesktopCrack

然后,需要准备一个 ARM 架构的 Windows ISO 镜像。微软并没有直接提供镜像的下载,但所需的文件其实都可以通过 Windows Update 的服务器获得。通过网站 UUP dump,可以方便的获取到生成 ISO 镜像的脚本文件。

打开 UUP dump 网站后,在搜索框中输入关键词 “Windows 11 arm64”,并将搜索结果按照时间排序。结果中可能包括稳定版本和 Insider Preview 版本。笔者测试时发现,Insider Preview 版本的资源可能下载失败,因此可以选择稳定版本,例如 Windows 11, version 22H2 (22621.1485) arm64。之后,按照提示选取语言和系统版本,即可进入到下载页面。

UUP dump下载页面

点击 Create download package 按钮,即可下载到一个包含脚本文件的压缩包。

压缩包中存在一个名为 readme.unix.md 的文档,里面给出了继续生成 ISO 镜像所需要的软件依赖。不过,笔者测试时,发现其中的依赖 [email protected] 在 M1 Mac 上无法正常安装。要解决这个问题,安装方法应改为:

1
2
brew tap minacle/chntpw
brew install cabextract wimlib cdrtools minacle/chntpw/chntpw

在安装完成后,即可执行

1
bash uup_download_macos.sh

如果一切顺利的话,此目录下将出现一个名称类似 22621.1_MULTI_ARM64_ZH-CN.ISO 的镜像文件。最后,在 Parallels Desktop 中创建一个新的虚拟机,选择 ISO 镜像文件安装系统即可。

Parallels Desktop安装Windows 11


参考文章:How to Download and Install Windows 11 ARM With ISO

在文章将 Yeelight 烛光氛围灯接入 Apple HomeKit 中,笔者介绍了通过 Homebridge 将设备加入 HomeKit 的方法。此后,笔者也发现,Home Assistant 相比于 Homebridge 功能更加强大,能够将全部智能设备集中管理,创建自动化也非常方便,因此切换到了 Home Assistant。不过,家中还有大量的公牛智家开关没有找到办法接入 Home Assistant,原因是这一型号的智能开关并不像小米等品牌有开放的协议用于控制,网络上也没有找到相关的开源代码。这样就只能通过对公牛智家 App 的抓包和逆向分析,来得到通过 Home Assistant 进行控制的方法了。

经过分析,实现设备操作需要的几个 API 分别是:

  • /v1/auth/form,提交用户名和密码进行登录(如果是在公牛智家 App 中通过手机验证码登录,就需要先设置密码)
    登录成功后,服务器将下发 access_tokenrefresh_tokenopenid
  • /v1/auth/token,提交 refresh_token,换一个新的 access_token
    出于安全原因,access_token 的有效期并不长,因此需要定时刷新
  • /v2/home/devices,提交 access_token,获取设备列表
  • /v1/dc/setDeviceProperty/,提交 access_token 和设备 Id,改变设备开关状态

同时,当用户通过物理按键操作了开关之后,还需要能够在 Home Assistant 中接收到反馈,实时更新开关的状态。在公牛智家 App 中,发现了相关的 MQTT 代码。订阅 MQTT 需要提供 access_tokenopenid,订阅成功后就可以获取到设备的状态通知了。

全部代码已开源至 hass-iotbull,可以直接在 Home Assistant 中使用。

iOS 16 中引入了全新的天文墙纸,可以将地球照片设置为桌面背景,并且能够根据地理位置和时间进行实时地渲染。那么有办法在 macOS 上用上类似的壁纸么?答案是肯定的,我们可以使用 Himawari 8 气象卫星的地球照片作为壁纸。

在网上搜索相关的关键词,我们可以找到很多 Windows 上的实现。而在 macOS 上,更换壁纸的方式有所不同。比较简单的方式是创建一个 Swift 脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env swift

import Cocoa

do {
// get the main (currently active) screen
if let screen = NSScreen.main {
// get path to wallpaper file from first command line argument
let url = URL(fileURLWithPath: CommandLine.arguments[1])
// set the desktop wallpaper
try NSWorkspace.shared.setDesktopImageURL(url, for: screen, options: [:])
}
} catch {
print(error)
}

将其保存为 chwall.swift,然后将其设置为可执行文件:

1
chmod +x chwall.swift

然后,我们使用一个 Python 脚本来下载 Himawari 8 的地球照片,并调用 chwall.swift 将图片设置为壁纸:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from PIL import Image
import os
import datetime
import requests
import subprocess
from itertools import product
import traceback
import tempfile

IMAGE_SIZE = 688
IMAGE_ROW = 2
IMAGE_COLUMN = 2

images_dir = os.path.join(os.path.dirname(__file__), 'images')
if not os.path.exists(images_dir):
os.makedirs(images_dir)

def compose_img():
# 获取最新图片的时间,感谢 @Zhmou 的建议
latest_times = requests.get('https://rammb-slider.cira.colostate.edu/data/json/himawari/full_disk/geocolor/latest_times.json')
time = str(latest_times.json()['timestamps_int'][0])
dirpath = f'{time[:4]}/{time[4:6]}/{time[6:8]}'
# 下载的是四张小图,合成一张大图做壁纸
full_image = Image.new(
'RGB', (IMAGE_SIZE * IMAGE_COLUMN, IMAGE_SIZE * IMAGE_ROW))

for i, j in product([0, 1], [0, 1]):
imgname = f'00{i}_00{j}.png'
# 图片地址样式:https://rammb-slider.cira.colostate.edu/data/imagery/2022/10/12/himawari---full_disk/geocolor/20221012123000/00/000_000.png
url = 'https://rammb-slider.cira.colostate.edu/data/imagery/' + \
dirpath + '/himawari---full_disk/geocolor/' + time + '/01/' + imgname
print(f'图片 {url} 正在下载…')
# 设置 `stream=True` 后可以直接用 PIL 打开
response = requests.get(url, stream=True)
image_path = os.path.join(images_dir, imgname)
img = Image.open(response.raw)
width, height = img.size
# 检查图片大小是否正确
assert width == height == IMAGE_SIZE
img.save(image_path)
print(f'图片 {imgname} 下载成功!')
# 合成壁纸图片
full_image.paste(img, (j * IMAGE_SIZE, i * IMAGE_SIZE))
full_image.save(os.path.join(images_dir, 'full.png'))
# 计算生成的壁纸尺寸
height = int(IMAGE_SIZE * IMAGE_ROW / 0.618)
width = int(height / 9 * 16)
image = Image.new('RGB', (width, height))
image.paste(
full_image, (int(width / 2 - IMAGE_SIZE * IMAGE_ROW / 2), int(height * 0.382 / 2)))
# 创建一个临时文件存储壁纸
image_path = tempfile.NamedTemporaryFile(suffix='.png').name
image.save(image_path)
print(f'图片 {image_path} 保存成功!')
return image_path

try:
# 设置桌面壁纸
subprocess.run(['./chwall.swift', compose_img()])
print('壁纸设置成功!')
except Exception as e:
print('壁纸设置失败!')
traceback.print_exc()

最后,使用 Launchd 来定时运行这个脚本,即可实现自动更换壁纸。

需要注意,macOS 会缓存使用过的壁纸,相关的目录包括

  • ~/Library/Application Support/Dock/desktoppicture.db
  • /private/var/folders/**/**/com.apple.desktoppicture

这些缓存不会自动清除,经常更换壁纸的话缓存占用的空间会增加。


参考文章:
How can I programmatically change the background in Mac OS X?
OS X: com.apple.desktoppicture folder grows when changing the wallpaper

有关 GitHub 仓库:
SpaceEye

0%