普通视图

发现新文章,点击刷新页面。
昨天以前霂森西 | 櫻玲桉

利用Cloudflare Workers将Google Drive转换成S3兼容存储

2026年4月14日 21:51

本文阅读体验最佳的方式为网页端,请前往原文阅读:https://musenxi.com/post/GDtoS3


起因是收到了Google One的邮件提示免费升级到了5T的Google Drive.

截屏2026-04-11 21.33.58.png
白给的Google Drive量大固然不错,我打算用来做Afilmory存储照片的容器。Afilmory仅支持Github仓库或是对象存储,好在有AWS S3兼容存储,那么只需要将Google Drive API包装成S3兼容的API。rclone已有实现基本的S3服务,但需要部署在服务器上。Reddit上有人也有提过这个想法,但是并没有人留下解决方案。

秉持着免费到底的原则,有没有一种办法能够既能将Google Drive转化为S3兼容存储又能实现国内流畅访问容器内的文件内容呢?我想到了利用Cloudflare的Workers服务,碰巧的是三个月前就有开发者开源了,就不用自己动手从零开始。

我在此仓库的基础上添加了允许公开读取容器的选项,更加适合作为普通图床的存储容器。

那么就开始这篇教程。

获取API Token#

该项目利用rclone获取Google Drive的API,rclone官网有详细的步骤 根据官网的步骤在Google API控制台进行操作

  1. 新建一个项目,接着点击启用API和服务
    启用API和服务
    启用API和服务
  2. 搜索google drive api,点击进入选择启用
    启用API
    启用API
  3. 在左侧栏选择凭证,如果显示的跟下面一样则点击进入配置
    配置界面
    配置界面
    受众群体选择外部
    受众群体选择外部
  4. 在OAuth权限请求页面内点击数据访问,点击添加或移除范围。
    数据访问
    数据访问
  5. 在弹出的右侧栏内找到底部的手动添加范围在文本框内填入https://www.googleapis.com/auth/docs,https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/drive.metadata.readonly,点击添加到表并更新
  6. 点击目标对象,在下方的测试用户内点击Add users输入自己的Google账号。
  7. 在左侧栏选择概览,创建OAuth客户端,应用类型选择桌面应用,点击创建。
  8. 记住弹出的界面中的客户端 ID和客户端密钥,或者直接点击下载JSON
  9. 点击目标对象,发布应用

接着下载安装rclone或是直接brew install rclone / scoop install rclone 在终端中打开输入rclone config 新建remote,输入一个名称回车后选择Google Drive对应的数字。输入刚刚记录的客户端 ID和客户端密钥。 Scope选择第一个Full access service_account_file直接留空回车 Edit advanced config选择No Use web browser因为我们有浏览器所以选择Yes

无视风险继续打开
无视风险继续打开
在弹出的窗口中登录要绑定的Google账号 成功后终端会提示Configure this as a Shared Drive (Team Drive) 这里根据实际情况选择,个人Drive就选择No 之后就keep this remote

全部结束后终端会直接显示rclone的配置文件,或者输入rclone config file获取文件的路径再打开。

配置Cloudflare Worker#

登录Cloudflare仪表盘,在存储和数据库下进入Workers KV。新建两个KV,记住这两个KV的Namespace ID。 打开仓库下载

打开根目录下的wrangler.jsonc编辑,name字段自定义这是创建的Worker的名字,下方AUTH_KV和FOLDER_CACHE对应的id填入上一步创建的两个KV的Namespace ID。

在终端中打开文件夹,

text
    # 1. S3 客户端用的密钥
    pnpx wrangler secret put ACCESS_KEY
    # 输入一个Access Key,例如:mygdrive123
    pnpx wrangler secret put SECRET_KEY
    # 输入一个Secret Key,例如:SuperStrongPassw0rd!@#456
    pnpx wrangler secret put REGION
    # 建议直接输入 auto (或诸如 us-east-1 其他的都可以)
    # 2. Google 凭证(从rclone 配置里复制)
    pnpx wrangler secret put GOOGLE_CLIENT_ID
    # 粘贴 client_id 的值
    pnpx wrangler secret put GOOGLE_CLIENT_SECRET
    # 粘贴 client_secret 的值
    pnpx wrangler secret put GOOGLE_REFRESH_TOKEN
    # 粘贴 refresh_token 的值(只粘贴 1// 开头的那一长串)
    # 3. 允许的 Bucket(非常重要!)
    pnpx wrangler secret put ALLOWED_BUCKETS
    # 输入你想使用的 bucket 名,用英文逗号分隔,例如:backup,photos,documents
    pnpx wrangler secret put PUBLIC_READ_BUCKETS
    # (可选)输入你想公开读取的 bucket 名,用英文逗号分隔,例如:backup,photos,documents

全部完成之后输入pnpx wrangler deploy发布。

然后就可以在Cloudflare的Workers中看到新发布的Worker了。

至此所有的创建流程就结束了。对应的workers.dev地址就是自定义 Endpoint

访问对应的地址显示Access denied to this bucket则说明配置成功。 成功后会自动在Google Drive内创建和bucket同名的文件夹

Worker优选IP#

因为workers.dev的地址在国内不能访问,而套上自己的域名则速度不怎么理想,这就需要使用优选IP。 Worker配置优选IP非常简单,在我们创建的Worker内的设置界面,点击添加域和路由,添加路由,输入对应的域名后添加/*

进入DNS记录,添加DNS记录,对应域名CNAME到优选域名,记得代理状态选择仅DNS。

不好👎
1 / 3不好👎
好!👍
2 / 3好!👍
直连的下载速度也是非常快
3 / 3直连的下载速度也是非常快

比较著名的社区优选域名是

配置CORS#

如果要在前端调用则需要配置CORS 进入域名内的规则→ 概述→ 响应标头转换规则内创建规则

选择自定义筛选表达式,当主机名 等于之前设置的自定义域名

设置新标头内添加静态标头 然后添加对应的所需标头就行

到这里所有工作就完全结束了,不过要注意的是免费版的Workers单账号限制100000次日请求。

家庭网络升级其三——双网口iKuai虚拟Openwrt无感分流

作者 橘夜庭
2025年12月31日 23:52

书接上文家庭网络升级其二——Openwrt插件安装踩坑指北
前文提到我之前放弃了使用iKuai虚拟Openwrt的方案转而直接将Openwrt安装到物理机上。但现在我将宽带换成了联通的500M再加上iKuai的分流实在是太好用了,于是现在重新回到原始的方案,用iKuai来PPPoE拨号,用Openwrt实现个性化上网。主路由依旧使用使用了5年的搭载 Intel 3865U、双 Intel I211 千兆网卡的工控机。
最开始还是打算使用PVE实现虚拟化,但这个2核CPU性能实在是太弱了,跑500M带宽CPU占用率都不下90%。所以还是使用iKuai内部虚拟Openwrt,五年之后的iKuai虚拟化如何呢,我想说确实比之前要好。

分流的方案一是创建wan2通过多线负载自定义运营商来分流,这样做的好处是方便维护,自定义运营商的单列表最大数有5000(这意味着只需要创建两个表就可以基本覆盖国内ip表,而且分组名称可以相同,这样分流设置只需填一条),也方便域名分流。当然这个方案前期配置比较复杂,但相信看完我这个配置流程会非常简单。

分流的方案二是利用端口分流中的下一跳网关,这个相比我四年前的一代目DHCP分配网关有一个好处就是当Openwrt上不了网不影响境内的正常上网,境内直接通过端口分流的外网线路分流走了。虽然这个方案配置起来非常简单,只需要按最传统的单臂路由配置即可,不过有一个问题就是终端分组里的ip分组单列表最多只能填1000个,这意味着通常需要设置8个分组(并且名称设置要不一样,在端口分流源地址输入需要点八次)。

不过我们都可以用https://github.com/joyanhui/ikuai-bypass这个项目对IP表自动维护更新。

我先以方案一来设置。
以我的为例,iKuai Lan地址为192.168.9.1,Openwrt Lan地址为192.168.10.1

方案一

开始虚拟

先在https://openwrt.ai/自定义构建固件,在这里可以快速配置好插件以及网络配置等,这里特别注意勾选默认eth0为Wan口会方便很多(当然如果你选择使用单臂路由的方式就不勾选,因为这样只需要一个Lan口就行,详见后文的方案二)。
下载固件img之后,先在iKuai的系统设置->磁盘管理查看有没有设置普通存储的磁盘分区,如果没有则绑定一个用来存放虚拟机。接着在文件管理内打开刚刚创建的存储分区直接上传openwrt的img,这里复制一下镜像的文件名。

进入网络设置->内外网设置点击wan1图标,点击上方wan1右边的加号,这里由于我是只有双网口所以网卡选择vnet点击绑定之后,接入方式选择静态,IP地址填写192.168.10.2,网关填写192.168.10.1,先不选择设置为默认网关,自动切换一定要先选上,线路检测设置为HTTP www.google.com

添加网卡
高级应用->虚拟机添加虚拟机。
添加虚拟机
这里的安装磁盘选择刚刚创建的存储分区,其他的按自己的情况来填。这里需要特别注意的是设备管理的设置,首先要将默认的网卡删除,因为系统默认创建的网卡不是半虚拟化模式,这样后面性能会大打折扣(我是被限制到了300M)。先添加启动盘——设备类型选择磁盘,磁盘类型选择引用磁盘,磁盘路径填/分区名称/镜像名称
再添加网卡,网卡模式选择半虚拟化模式,桥接接口第一个选lan1,第二个选wan2,这里第一个就默认是eth0。

如果是使用PVE等平台虚拟则只要在PVE多虚拟一个网卡iKuai的Wan2和Openwrt的Lan桥接到同一个网卡就行,同样iKuai的Lan和Openwrt的Wan桥接到同一个。

虚拟机,启动!

开始配置

Openwrt

如果是用Kwrt自定义固件的话应该就没什么问题,wan口自动DHCP连接了,直接访问192.168.10.1。其他可以参照这个配置。
ipconfig
进入后台之后先到网络设置,将wan口协议改为静态地址192.168.9.2(当然不改也可以到iKuai设置DHCP静态分配地址。不管怎么设置都一定要让Openwrt的地址固定!)。
全局网络选项设置数据包引导为启用所有CPU(Packet Steering)。
防火墙关闭SYN-flood 防御,关闭IP动态伪装(NAT)路由/NAT卸载类型选择软件流量卸载(开启这个对性能改善效果比较明显),入站、出站、转发全部选择接受。
然后到服务里的相关科学上网插件配置一下节点信息。

到这里对于Openwrt的基础配置就完成了。回到内外网设置如果看到wan2是绿的没有提示掉线就代表科学上网配置成功了。

iKuai

进入流控分流->端口分流添加分流方式选择外网线路,线路选择wan1,负载模式选源IP+目的IP+目的端口,源地址将Openwrt的wan口地址192.168.9.2填入进去。这样Openwrt出来的流量就不会又回去形成环路。
多线负载自定义运营商添加国内IP。回到多线负载添加线路,负载模式选择源IP+目的IP+目的端口,运营商选择刚刚创建的,单独启用wan1线路。
内外网设置里把wan2设为默认网关。
到这里基本上就实现了iKuai无感分流啦。
接着如果想要实现自动维护的话就可以用开头的那个项目。

方案二

如果是用Kwrt自定义固件的就不需要点默认eth0为wan口,同上面的前置流程一样,固件上传之后创建虚拟机的时候只需要添加一个虚拟网卡。
Openwrt的静态地址就需要和iKuai在同一个网段,以我这里为例是192.168.9.2
进入iKuai的端口分流,分流方式选择下一跳网关,填入Openwrt的地址,源地址填iKuaiDHCP分配的网段(以我为例是192.168.9.3-192.168.9.254
再添加外网线路分流方式,线路选择wan1,源地址依旧是DHCP网段,目的地址需要点配置分组,将国内IP分1000个一组粘贴进去。

到这里就完成了单臂路由的无感分流。


相比方案二我更喜欢方案一一点,只要掌握iKuai Lan->Openwrt Wan->Openwrt Lan->iKuai Wan2的基础逻辑,配置起来就非常简单。

配置ikuai-bypass

先到https://github.com/joyanhui/ikuai-bypass/releases选择适合自己安装平台的版本,我这里以openwrt(linux)为例,我是x86平台就下载amd64.zip这个文件,解压之后会有config.yml和一个可执行文件。
先打开yml进行编辑,如果使用方案一可以吧ip-group这大段注释掉,同理使用方案二可以把自定义运营商注释掉,当然也可以不动。
ikuai-url填写iKuai地址,cron后面是脚本更新列表的时间默认0 4 * * *就是每天凌晨4点更新。接着把下面每个模块中的src-addr地址改为iKuai DHCP的网段。
接着将config.yml改名为ikuai-bypass.yml 将yml和可执行文件上传到Openwrt的/opt/目录,上传完后在终端输入chmod +x /opt/ikuai-bypass赋予执行权限。
复制下面这段完整的代码输入到终端。

cat > /etc/init.d/ikuai-bypass << \EOF
#!/bin/sh /etc/rc.common
START=99
start(){
    if [ -f "/opt/ikuai-bypass" ]; then
        # -r cron : 使用程序内置的定时循环模式
        # -c ...  : 指定配置文件路径
        # > /dev/null : 丢弃日志输出,防止填满存储空间
        /opt/ikuai-bypass -r cron -c /opt/ikuai-bypass.yml > /dev/null 2>&1 &
        echo "ikuai-bypass 服务已启动 (模式: cron)"
    else
        echo "错误: 未在 /opt/ 找到 ikuai-bypass 文件"
    fi
}

stop(){
    # 查找并杀掉进程
    killall -q -9 ikuai-bypass
    echo "ikuai-bypass 服务已停止"
}

restart(){
    stop
    sleep 2
    start
}
EOF

回车后可以输入这串cat /etc/init.d/ikuai-bypass检查是否创建正确。
截屏2025-12-31 23.41.53.png
接着分别输入chmod +x /etc/init.d/ikuai-bypassservice ikuai-bypass enableservice ikuai-bypass start && ps |grep ikuai-bypass 出现/opt/ikuai-bypass -r cron -c /opt/ikuai-bypass.yml就代表成功运行了。
到iKuai里看看是否自动添加列表了吧~

别忘了将新的分流规则加上。

截屏2025-12-31 23.52.20.png

LivePhoto 2.0-新增支持插入Android Motion Photo

作者 橘夜庭
2025年5月6日 00:47

前言

先前开发了「LivePhoto-一款可以快捷插入Live图的Typecho插件」,收到了这个评论于是就着手查询资料,发现了Motion-Photo-Viewer这个开源的项目刚好可以实现需要的功能。就更新啦(没想到吧,还能继续更新)


点个Star支持一下吧

功能

启用插件后自动引入motionphoto.js。
截屏2025-05-05 23.53.47.png
如图所示,将Motion图地址直接填在第一个空就好了,视频和宽高比都留空不用填。

效果

Motion Photo

这张图由小米拍摄,不过Motion-Photo-Viewer已经测试过Google Pixel, Samsung and Huawei(Moments),应该也支持。如果想要确认图片是否支持显示只需要去这里https://dj0001.github.io/Motion-Photo-Viewer/ 上传一下图片就可以确认。

结尾

未来可能会实现的功能
目前本主题使用PJAX有兼容问题,后续应该会解决。
因为Motion图是以视频播放,所以可以播放声音,以后有空可能会添加开启声音的选项,现在是默认静音的。

广深港游记

作者 橘夜庭
2025年3月4日 17:05

缘起

去年的十二月打算去香港办银行卡,恰巧高中毕业以来没有怎么正式地去很远的地方旅游,于是借此机会也可以算作是毕业旅行的补偿。
虽然题目是广深港游记,但五天的行程主要还是在深圳和香港,只给广州留了一天的时间。(对不起了广州!)刚好友人L在深大上学于是向他提议一同去香港游玩顺便带我逛一下深圳,他说刚好也想放假了先玩一会于是就决定一同游玩。后来我在12月24号预约到了1月9号的汇丰银行开户。原先L问我香港的行程安排如何,于是用Chatgpt生成了一下,结果gpt生成的实在是“特种兵”旅行,所以我们就舍弃了这个方案,随缘游玩。

Day1 深圳

起飞的时间是1月7日的早上七点半,于是拜托家人开车送我到机场,坐上了前往深圳的飞机。

由于L到中午才考完试,所以我正好可以先到酒店办理入住再赶去深大会合。看到深圳地铁11号线可以用银联刷卡便直接使用ApplePay进站,结果到福民站出站时竟然不支持银联卡,找工作人员后便先让我出去,后面到支持银联卡的站点补交,不过到了别的站点工作人员说不用管后面会自动扣费的,最后只扣了1元钱(emmm虽然省了七块钱?但是话说哪有只适配部分站点却直接投入使用的啊喂)。12点到了深大,L先带我去食堂吃了一顿饭,有点贵(L也吐槽很贵,饭也很贵、水也很贵)不过在深圳嘛,可以理解。IMG_2108.JPEG宿舍里就可以看到腾讯大厦IMG_2109.JPEG周围都是写字楼围绕IMG_2111.JPEG深大确实很大,校区建在山丘上,道路起起伏伏,校园内还有观光车接送。

逛完学校后就一同前往中国电子第一街——华强北。IMG_2115.JPEGIMG_2126.JPEG一圈逛下来感觉最多的是手机壳市场,说实话第一次进入看到一个个店内密密麻麻地排列着格式的手机壳还是很震撼的。随后去了华强北博物馆参观。IMG_2116.JPEGIMG_2118.JPEGIMG_2120.JPEG
然后去了市民中心看了一下。IMG_2129.JPEG碰巧看到了直升机通勤。

Day2 广州

因为不想行程太赶所以就打算去两三个地方。十点坐上火车去广州,L提议去一下动漫星城。于是就到达,动漫星城!IMG_2143.JPEG一开始还没找到动漫特区,结果不知道怎么在地铁站里逛来逛去就逛到了。浏览了很多商铺还有扭蛋机,L抽了几张卡。琳琅满目的有很多,但感觉都挺贵我就没有买(钱包侥幸存活。看了小红书上的一日游攻略提到了旁边的北京路文化旅游区,于是我们就步行前往,虽然有很多博物馆,但我们就逛了大佛寺。IMG_2154.JPEG穿过大佛寺就到了步行街,街边都是一些常规的小吃和茶餐厅。下一站打算去圣心大教堂,因为离得挺近,索性就步行前往。P1000248.JPGP1000189.JPG游客很多,有很多人拍照。P1000266.JPGP1000293.JPGP1000294.JPG在教堂内坐了一会,看着彩色玻璃的光影随时间变化而变化,感觉很奇妙。
之后走到了海珠广场坐地铁到广州塔。P1000297.JPGP1000303.JPG
吃完饭天黑了,拍了一下夜景就急速赶往火车站回深圳了。
P1000333.JPG

Day3 香港

转眼就到了预约开户的时间,于是我们从福田坐火车抵达香港西九龙。IMG_2225.JPEG因为没有提前在内地换汇,于是就打算在ATM取一些,ATM上显示最多能取4000HKD但是却取不出,一直到最后输入了3000才取出来了。踏足的第一片土地
走出高铁站,热风迎面袭来,虽说小学时就想来的地方,如今踏入这片土地应该兴奋才对,但出乎意料的是竟然没有想象中的新奇,只是在心中感叹“原来这就是香港。”。因为是十点的火车,早饭也没来的及吃,于是我们准备吃一下早午餐。高铁站一出来就是公交站,我说我们步行去吧,L说可以,于是我们还是徒步前往寻找吃处。步入弥敦道的初印象便是“密集”,商铺很密集,建筑很密集,银行很密集,车辆很密集,人群很密集,麦当劳也很密集。由于麦当劳离我们很近,L和我就一拍即合决定感受一下香港的麦当劳。在自助点餐机上点餐后就使用先前办理的中银的万事达卡拍卡支付了,也是第一次线下使用这张卡。

抵港第一餐😋

万事达拍卡支付太快速了 pic.twitter.com/F7iGpc9GVf

— 橘夜庭 (@Musenxi) January 9, 2025

有点小贵🥲
第一次见ShakeShake薯条,有点新奇。吃完麦当劳之后就准备网申中银香港的账户和众安银行的账户。中银香港的APP调用16Pro的摄像头有点问题,幸好带上了iPhone12,顺利的提交了申请。L也借用了12申请,他当场下户,我因为名字的原因过了五天才开通了,众安银行也等了很久才开。网申过后,我们便继续沿着弥敦道行走到汇丰旺角分行。刚好1点过去签到。旺角分行很大,里面等待开户的人也很多,等了差不多半个小时才轮到我们,不过开户很快。接待我的经理就问了开户用途然后看了投资的历史就帮我在手机APP上操作,她说不一定能现场下卡,不过提交了之后我也很幸运当场就开出来了,整个速度很快感觉十分钟就好了,然后就是去楼下的ATM存了100HKD,因为我说要炒美股,经理帮我换汇了USD,然后说过一个月以后再来开投资账户或者美股账户(不过美股账户可以邮寄信件开通我现在也没有去开通,只开了港股账户)。两点就出来陪L往中银账户里存钱。至此最重要的事情就完成了,后面便是愉快的旅游时间。

我们随后乘坐了地铁去了星光大道。因为好像有四十多天没下过雨了,所以看上去总是雾蒙蒙的。P1000336.JPGP1000354.JPGP1000355.JPG就是沿途看看。最终终于到了麦兜铜像!以前很喜欢看麦兜,如今也是见到本人了。P1000360.JPG
逛完才下午三点,我们看时间还早就准备坐地铁去金紫荆广场打卡。P1000373.JPGP1000384.JPGP1000401.JPG本来打算翻拍“做个文明中国人”的,最后L还是就拍了一些空镜。随后我们便打算乘船前往摩天轮,使用谷歌导航结果码头太多定位并不准,走错了两个码头,最后发现原来就在广场前面,然后花了60HKD买了两张船票到了中环摩天轮。P1000411.JPGP1000420.JPGP1000433.JPGP1000442.JPGP1000454.JPGP1000457.JPG偶遇鸽子(咕咕咕),一点都不怕人。
虽然说香港的一切都很贵,一瓶水都要十几块,但是遇到摩天轮,20HKD一张票还能带你转三圈,简直是超值活动!
P1000466.JPGP1000486.JPGP1000489.JPG
然后我们就准备坐地铁回深圳吃晚饭。经过天桥,四通八达。P1000510.JPG

Day4

早上九点起来去附近吃了辉记肠粉和猪杂汤。IMG_2266.JPEG因为原先只签注了一天,所以早上去自助机签注。后面看离L约定的时间还早就只身前往莲花山公园IMG_2267.JPEGIMG_2275.JPEG公园里有无人驾驶观光车,坐了两趟,而后登山前往邓小平雕像。P1000517.JPG有一对夫妇看我带着相机就找我帮他们拍一下合影。P1000511.JPG转头才发现广场上有巨大的QQ。遂下去亲密接触一下。P1000530.JPG

一点的时候同L在福田站会合前往西九龙。这一次我们首先前往了西九艺术公园。



公园很大,很好走,休息了一会我们就前往乘坐太平山顶缆车,三点多的时候人不是很多,排了半个小时就到了。P1000544.JPG
第一次坐这种缆车欸,速度还挺快的。P1000563.JPG出站之后就是一个商场,里面有邮局、餐厅、蜡像馆还有其他的一些店铺。P1000568.JPG
买了一些甜品,(看着就很好吃。我和L都没有想好先看什么,于是就走出了商场,误打误撞进了环山的绿道,就是漫无目的地走着。P1000583.JPGP1000574.JPG
其实如果不想买山顶观景台的票话,就在绿道上闲逛也是能看到挺不错的风景的。后面我们边闲聊边走发现走的路程有点太长了,一看才发现只走了三分之一,于是我们原路返回,前往观景台。P1000587.JPGP1000594.JPGP1000606.JPGP1000608.JPG电波塔电波塔。P1000625.JPG
风景完全看不够啊喂!
随后遇到了一位韩国人拿出了拍立得问我能不能帮她们拍几张照片,那当然欣然同意,她说因为看到了我拿着相机所以认为我很专业。
L说准备去国金吃饭,接着就是返程。P1000633.JPGP1000643.JPGP1000646.JPG
下山后为了拍一下车停留了一会,然后又有一对夫妇让我帮他们拍一下合影。
随后导航到国金结果迷路了,后面用GoogleMap实景导航穿梭到了国金。中环的天桥真是四通八达,几乎每个建筑都有天桥,穿过写字楼就是商场穿过商场结果到了酒店的餐厅。
L想去AppleStore看一下,结果还预约上了当晚的Apple Vision体验,体验了一下但是感觉效果并没有想象中的震撼,倒是恐龙冲出来的时候被吓了一跳。
屏幕截图 2025-03-04 162308.png
吃完之后出来遇到天桥下有三位学生在街头卖艺(青春真好啊),在海边逛了一会儿就坐船回到尖沙咀了。


回去的时候突然想到先前听闻香港的哈根达斯很便宜一直想去吃来着,结果时间太晚已经关门了,就去麦当劳甜品店买了一个甜筒。
本来打算坐高铁回去的,结果到了高铁站太晚了,票也截至购买了,回深圳的地铁也错过了末班车,只留下我们在地铁站中凌乱。于是我决定坐大巴回去,L说他直接坐去深圳湾的车,于是就在地铁站中分别。听他后面说,他到站台的时候末班车刚走,站台还有人决定再等等看看下一辆车,结果真的等到了。这倒给我们的港旅增添了紧张的元素。不过旅行的魅力不就是如此吗,需要面对随时可能出现的不在计划中的新选支,这也正是旅行吸引我的地方。
IMG_2348.JPEG
怎么不算是奇妙夜呢。

IMG_2350.JPEG
再见香港。🥲

Day5

第五天因为L要回寝整理东西,所以过来和我吃了一下点都德就回学校了。接下来的时间也没有什么好的选择,之前一直听L说深圳就是公园多,所以我决定去深圳湾公园散散步。



好多小动物。Picsew_20250304164839.jpg
还看到了美团无人机送外卖。

到这里,我的五日广深港游记就结束了,虽然五天不是很够,但是还是很愉快轻松地游玩了一些地方,比较可惜的是很多美食都没有请手机吃,所以缺少了很多关于美食的描述。这次旅行的经历还是很奇妙,带着相机出门就遇到了很多人请求帮忙拍照,可我是随便玩玩的啊,帮别人拍就多了很多负担。

拍摄设备:Lumix S5M2X,iPhone 16Pro

基于ESP32与RC522实现RFID刷卡开门

作者 橘夜庭
2023年5月20日 19:20

前言

班级的小教室使用刷卡开门,但小教室的门禁学生卡没有录入故只有教师才能开门,所以想要到小教室自习十分不便。想到用舵机牵引,上网搜索发现已有案例分享但全网并没有找到单基于ESP32与RC522的简易方案,于是自己动手丰衣足食,遂出此文分享。

准备

文中涉及到的设备以及环境是
ESP32-WROOM-32D 推荐CH9102X芯片,免驱
SG5010舵机
ESP32 38Pin拓展版 当然只是为了后续接线与固定在门上方便为主,不加或者使用面包板也可以
杜邦线
MFRC-522射频模块
Arduino IDE

Arduino IDE环境配置

首先去IDE File-Preferences首选项最后一行添加链接https://ghproxy.com/https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
再到Boards Manager搜索esp32安装,可能会安装出错或者后续编译有莫名其妙的报错,换个版本安装一般能够解决。
这时可以基础编译适配ESP32,但我们还有MFRC-522模块与舵机,所以需要添加库,在library Manager搜索MFRC-522安装即可,再搜索ESP32Servo安装即可。需要注意的是,单搜索Servo安装的库不能支持ESP32,碰到下载ESP32Servo依旧报错的可以到Github上下下来再到C:\Users\用户名\AppData\Local\Arduino15\libraries\Servo 替换文件,Github上的名称是ESP32_Servo 需要将文件名以及文件内部所有类似名字替换为Servo即可。

串口引脚连接

RC522引脚名称ESP32引脚名称
3.3V3V3
RST27
GNDGND
MISO19
MOSI23
SCK18
SDA/SS12
舵机引脚颜色ESP32引脚名称
橙色13
红色5V
棕色GND

编写程序

连接好引脚后就进入编写程序的环节。

//Libraries
#include <SPI.h>//https://www.arduino.cc/en/reference/SPI
#include <MFRC522.h>//https://github.com/miguelbalboa/rfid
#include <Servo.h>
#include <string.h>
#include <math.h>
//Constants
#define SS_PIN 12
#define RST_PIN 27
#define SERVO_PIN 13
//Servo
Servo servoMotor;
//Parameters
const int ipaddress[4] = {103, 97, 67, 25};
//
int decid=0;
int i=0;
//Variables
byte nuidPICC[4] = {0, 0, 0, 0};
MFRC522::MIFARE_Key key;
MFRC522 rfid = MFRC522(SS_PIN, RST_PIN);

void setup() {
  //Init Serial USB
  Serial.begin(115200);//这里在串口监视器(Serial Monitor)旁边数值要调成一样
  Serial.println("welcome!");
  Serial.println(F("Initialize System"));
  //init rfid D8,D5,D6,D7
  SPI.begin();
  rfid.PCD_Init();
  Serial.print(F("Reader :"));
  rfid.PCD_DumpVersionToSerial();
  // attaches the servo on ESP32 pin
  servoMotor.attach(SERVO_PIN);
  servoMotor.write(0);
}

void loop() {
  readRFID();
  switch(decid){
    case 869660://white 这里填写读卡器读到卡后的在串口监视器(Serial Monitor)上显示的decid数字
    Serial.println("Pass!");
    servoMotor.write(180);   //舵机转180度
    delay(3500);
    servoMotor.write(0);
    break;
  }
  decid=0;
  delay(1000);
}

void readRFID(void ) { /* function readRFID */
  ////Read RFID card
  unsigned char status;   //状态变量
  unsigned char str[5];
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }
  // Look for new 1 cards
  if ( ! rfid.PICC_IsNewCardPresent())
    return;

  // Verify if the NUID has been readed
  if (  !rfid.PICC_ReadCardSerial())
    return;

  // Store NUID into nuidPICC array
  for (byte i = 0; i < 4; i++) {
    nuidPICC[i] = rfid.uid.uidByte[i];
  }
  unsigned char* id = nuidPICC;
  decid=0;
  for(i=0;i<4;i++) {  
    decid=decid+id[i]*pow(16,i);    //16转10进制
  }
  Serial.print(F("RFID In dec: "));
  printDec(rfid.uid.uidByte, rfid.uid.size);
  Serial.println();
  Serial.print("DECID:");
  Serial.println(decid);   //输出卡DECID,10进制
  // 如果传感器/读卡器上没有新卡,则返回主程序。这将在空闲时保存整个进程。
  if ( ! rfid.PICC_IsNewCardPresent())
   return;
  // Halt PICC
  rfid.PICC_HaltA();

  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();
  
  
}


/**
   Helper routine to dump a byte array as hex values to Serial.
*/
/**void printHex(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}
*/
/**
   Helper routine to dump a byte array as dec values to Serial.
*/
void printDec(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], DEC);
  }
}

代码结束。

程序烧录

选择ESP32 Dev Module,选择正确的串口
Upload一下
接着打开Monitor,刷卡,添加程序中switch语句的case
大概效果如下图,当时没写decid,大致看一下屏幕截图 2023-05-02 122213.png

实践

经过粗略测量,在门把手斜下方用热熔胶固定,再限位器粘在在舵机上方避免热熔胶纵向受力直接脱落。将rc522模块穿过门缝粘在外面。用线将门把手与舵机连接,最终实现了门外刷卡控制门内舵机向下转动拉动门把手实现开门的效果。

遇到的问题

最后效果近乎完美,广受师生好评,暂时无图。但目前采用的供电方式是使用充电宝低电流模式供电,貌似经过三个小时其依旧会自动断电,打算更换两个干电池盒试试,3V独立给ESP供电,6V独立给舵机供电。
不知是否可行。

总之到这里,整个奇妙探索旅程就结束了,总共历时半个月,总成本五十多,当然也少不了我亲爱的同桌和同学的支持。

参考:

https://rntlab.com/question/unit-9-esp32-control-servo-motor-library-problem/
https://esp32io.com/tutorials/esp32-servo-motor
https://www.electronicwings.com/esp32/rfid-rc522-interfacing-with-esp32
https://www.aranacorp.com/en/using-an-rfid-module-with-an-esp32/amp/
https://blog.csdn.net/lmf666/article/details/123527739
https://zhuanlan.zhihu.com/p/66467989
https://zhuanlan.zhihu.com/p/281103196
https://zhuanlan.zhihu.com/p/416003658

家庭网络升级其二——Openwrt插件安装踩坑指北

作者 橘夜庭
2023年2月11日 18:11

书接上文家庭网络升级其一 ——FTTH 与 WIFI6 从 0 到 1
前文提到家中网络升级成千兆,主路由依旧使用搭载 Intel 3865U、双 Intel I211 千兆网卡的工控机。
由于先前是使用ikuai作为主路由系统,内置虚拟机虚拟openwrt作为旁路由提供分流服务,虽然ikuai确实是个简单好用的系统,不过提供的虚拟化工具性能并不怎么行,导致跑满千兆时不管是主路由还是旁路由,CPU占用都会到100%屏幕截图_20230108_131153.png
(虽然是这台机子的U不怎么行就是啦。
况且先前在家庭网络改造 —— 软路由从 0 到 1一文中也提到

新版 iKuai 有虚拟机功能但目前好像不支持 aes 也算是屈才了

既然如此就索性重装个Openwrt直接到物理机吧。::quyin:1huaji::


不知是什么原因,在恩山无线论坛找的openwrt固件都无法成功进入系统,可能是因为我是用usb外接硬盘启动的缘故?
试来试去只有LEDE可以用了。koolshare Lede X64有Intel自动省电降频,自动睿频,AES指令集加速,超线程 ,intel QAT硬件加速,MPTCP等功能,非常适合这台工控机。
不过原来的koolshare论坛闭站了,好在koolcenter还提供原来的固件下载。

最初使用的是openwrt-koolshare-router-v3.2-r19470-2f7d60f0e5-x86-64-generic-squashfs-combined-efi.img.gz这个固件,这个固件首页有小白引导上网还有集成了iStore插件,简单易用非常不错,但是我碰到里面出现了安装的插件无法启用的问题,遂换了openwrt-koolshare-router-v2.37-r17471-8ed31dafdf-x86-64-generic-squashfs-combined-efi.img.gz不过现在通过酷软下载固件更新插件升级到3.2也可以用。

使用IMG写盘工具直接将固件写盘到移动硬盘上。因为这台机子支持efi且改过启动项所以插上硬盘,插电,开机,轻松点亮。开机时最好接上显示器和键盘,待屏幕上不再滚动时按下回车键,如果显示Openwrt图标即表示成功进入系统。
LEDE默认lan口ip是192.168.1.1,若要修改则需要vi /etc/config/network屏幕截图 2023-02-11 135739.png修改好后输入:wq重启即可。
电脑接上lan口,浏览器输入设置的ip地址,即可进入首页。默认密码koolshare。在网络-接口-Wan口设置好PPPOE或者是DHCP客户端就可以上网了。


原版的LEDE没有装常用的插件,所以需要自己装。安装passwall之类的则需要手动安装。推荐一个库https://github.com/WangWenBin2017/OpenWrt-SSRPLUS
万事开头先换源。
进入系统-软件包-配置OPKG/etc/opkg/distfeeds.conf替换为国内的源,我使用的是中国科学技术大学的

src/gz openwrt_koolshare_router_core https://openwrt.proxy.ustclug.org/snapshots/targets/x86/64/packages
src/gz openwrt_koolshare_router_base https://openwrt.proxy.ustclug.org/snapshots/packages/x86_64/base
src/gz openwrt_koolshare_router_luci https://openwrt.proxy.ustclug.org/snapshots/packages/x86_64/luci
src/gz openwrt_koolshare_router_packages https://openwrt.proxy.ustclug.org/snapshots/packages/x86_64/packages
src/gz openwrt_koolshare_router_routing https://openwrt.proxy.ustclug.org/snapshots/packages/x86_64/routing
src/gz openwrt_koolshare_router_telephony https://openwrt.proxy.ustclug.org/snapshots/packages/x86_64/telephony

如果想使用其他的源如阿里云等只需将https://downloads.openwrt.org换成对应的网址即可,建议换源之前将原来的复制备份一下。换源后点击更新列表测试一下。
将需要安装的ipk和其所需的依赖包上传到/tmp文件夹内
在ssh输入

cd /tmp
opkg install *.ipk

即开始安装
手动安装插件常会遇到上半部分的报错

Multiple packages (libgcc1 and libgcc1) providing same name marked HOLD or PREFER. Using latest.
Multiple packages (libpthread and libpthread) providing same name marked HOLD or PREFER. Using latest.

屏幕截图 2023-02-11 143533.png
尝试输入

opkg update
opkg install libgcc1
opkg install libpthread
opkg install libstdcpp

若遇到libatomic1libstdcpp6等,同理输入

opkg install libatomic1
opkg install libstdcpp6

若遇到上图下半部分以及这类问题

pkg_hash_fetch_best_installation_candidate: Packages for luci-app-ssr-plus found, but incompatible with the architectures configured
pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.92-1-b0eafca757efb883a35dbbcaf514bbc8) for kmod-nfnetlink

屏幕截图 2023-02-11 164746.png
则需要先到https://downloads.openwrt.org/snapshots/targets/x86/64/openwrt-x86-64.manifest下载文件打开后复制kernel - 后的一串字符,再到/usr/lib/opkg/将status内的 kernel (= 后的同格式的一串字符,全部替换屏幕截图 2023-02-11 165147.png屏幕截图 2023-02-11 165212.png

若遇到如下图问题,Resource temporarily unavailableIMG_6802.HEIC.jpg
则需要更新一下dns

echo "nameserver 114.114.114.114">/tmp/resolv.conf
rm -f /var/lock/opkg.lock
opkg update

最后看到这种的话证明已经安装完成了屏幕截图 2023-02-11 173912.png
再打开刚安装的插件,若发现提示拒绝访问,一般重启即可解决,这样就可以愉快的使用插件啦。

最终效果屏幕截图 2023-02-11 180930.png
还是很不错滴::quyin:1huaji::

家庭网络升级其一——FTTH与WIFI6从0到1

作者 橘夜庭
2023年1月18日 10:17

书接上文《家庭网络改造 —— 软路由从 0 到 1》
近期家中升级了千兆,遂出此文简单记录一下过程。

简单介绍一下家中网络设备。主路由依旧是前年提到过的搭载Intel 3865U、双 Intel I211 千兆网卡的工控机,WIFI6路由器则是选用了锐捷X60 PRO,光猫则是电信送的天翼网关4.0。

FTTH

小区比较老,先前并未支持FTTH,入户最高只支持一百兆,而且网络不稳定。近几月来业主对于网络问题向物业反映多次,最终给出了两个方案,一个是光纤到楼另一个是光纤到户。前者可以改善网络稳定问题但不能升级速率,后者虽然两者都可兼顾但需要付费打洞穿光纤。

为了升级千兆自然是要忍痛选择FTTH。

申请后的第三天上午就打洞放线完了。洞第二天电信运维就到家改线路和光猫了。微信图片_20230115215709.jpg
给的是四个千兆网口,自然是跑不满千兆速率的。

当时离原宽带到期还有八个月就没有升级千兆。这个月离到期还有两个月,就办理续费,续费到高速率的话是提前续费的这段时期直接享受高速率宽带的,不过只能提前一到两个月。晚上19:40下的单20:30就续费成功了,第一时间测了速,是千兆。
屏幕截图 2023-01-06 213911.png

喜闻乐见的百度网盘环节,svip还限速五百兆属实有点说不过去了。::quyin:speechless::屏幕截图 2023-01-06 212144.png

WIFI6

由于之前的路由器是n年以前的华为Q6子母路由器,没有WiFi6,所以就选购了锐捷X60 PRO,目前使用下来体验不错,WiFi信号覆盖强,隔了四堵墙iPhone也能有300兆。可惜的是iPhone最高跑到700兆,只有iPad可以跑满速率。

暂且就记录这么多。

十二月的冬日

作者 橘夜庭
2022年9月4日 16:46

本来是一篇去年年末写的无厘头的文章,原来是打算作为小说开头的,结果小说因为种种原因停更了。不过新来的语文老师说每周要写几篇三百字的随笔,遂想到了这篇文章,似乎拿出来改改还能用。这也是博客为数不多的字数少的文章之一了。不过最近确实不会写文章了,脑中充满灵感,但不知如何下笔也懒于下笔,于是就咕咕咕了(笑)。接下来就进入正文吧。

[...]

-Nefelibar-如何练习Freestyle(说唱)

作者 Nefelibar
2022年8月9日 15:19

前言

这篇文章献给玩说唱/喜爱说唱并且想要练习freestyle者。个人经验,仅供参考。(文中提到的说唱默认为单语言说唱,你可以都理解成是自己的母语说唱就行)

初步了解

其实freestyle分为很多种。写好了词但是不排节奏,跟着beat临时编flow,这样唱出来也是freestyle。知道一个主题,提前听了beat,在短时间内写完词然后唱出来,这也是一种freestyle。
但是我们今天要说的,是大家所接触最多的,也是最根本的 —— 只给beat,拿了麦就开说。谓之“根本”,是因为练好了这个,其它的freestyle都不算事儿了。
我最初接触到freestyle,是在电视上看到了freestyle battle的比赛(当然现在已经忘记了是什么比赛),我看到台上的选手妙语连珠,花式对骂,粗野又不失文雅,保证押韵的同时还能编排律动,时而巧用修辞手法,时而引用史实时事,钦佩之情便油然而生。于是那时刚接触说唱不久的我也开始了freestyle的探索之路。现在的水平不说很高吧,但是随便给个beat,还是能骂服一般人的。(大佬绕路)
这种东西该怎么学,比较难说,网上也没有系统的教程。多半都是靠瞎练,摸索出来的。但我作为一个好人,又有点经验,分享出来肯定能多少帮到大家。那么这里,我会用尽量通俗简洁的话语去讲解freestyle要练习的几个板块以及我自己的一些练习方法。我将其分为两大块 —— 词,Flow。词又分为两个小块 —— 押韵,内容。
img.zcool.jpeg
详见下文→

押韵
押韵这个东西,每个人的理解和对它的定位都不同。现在流传着一个说法,“在思想面前押韵不算什么”,我不做评价。但是有一点是无疑的,押韵很大程度上左右了听感,它的确是一种能力,且在普通听众中,有押韵的肯定比满口思想的更胜一筹。
押韵无非便是在句中排声母/韵母相同的字词并让它们体现出来,有些人总是去怪自己的词汇量不够,是不是应该去背韵脚?非也。仔细去看看你听过的那些说唱歌曲,听听那些复杂的多押排列,里面有你不知道,不懂的词吗?我切切实实告诉你,你缺的不是词汇量,而是提取押韵词汇的能力。因为平时用不着,所以大脑对押韵的词汇不敏感,但是它们其实都在你的脑子里。
因此应该训练的是押韵的提词能力。
*我的训练方法I:(这个很重要,之后的其它练习是以这个为基础的)
最初,找个beat,跟节奏数八拍,最后两拍的“七八”换成一个词语,下一个词要和上一个押上韵,单双押都可以。当想不出的时候就随便说一个词语,下一个词继续跟着它押。例:“一二三四五六西瓜,一二三四五六击杀,一二三四五六嘻哈,一二三四五六鸡*(bushi)”。熟练后每四拍就可以说一个词,也可以换更快的beat去跟。
IMG_20220809_162751.png
内容
有押韵之后还要有逻辑,不然就只是顺口的胡言乱语。有逻辑之后还要有思想,提高语言的深度。如果还能玩梗,那自然是锦上添花了。同时,还有一点想说的,上文我有提到一些人会为了押韵去背韵脚,一套一套地背,也许能让你快速押得上韵,但我个人不是很支持这样的做法。因为若是像这样,可能你下次想到“铅笔”之后便是“掀起”,然后是“千里”,紧接着换个韵母然后是其它的。你不会想到“天启”“仙女”这些。一套的韵脚顺着一根线走下去,就极大限制了你内容的发挥。我主张的是说你想说的,然后让押韵辅助,而不是跟着背好的韵脚硬编故事,如此的freestyle一点都不free。
*我的训练方法II:
在初步练习方法I后,尽量尝试押韵有一定关系的词汇,当然也可以是两个看起来没什么关系但是你能靠天马行空的联想与想象说出它们的关系的词。熟练后,这里有两个进阶训练 —— 1.自己随便想一个主题,只能用主题相关的词语练习押韵。例:“游乐园”“……欢乐,……看客,……度假,……木马”2.看到一个物体,然后发散出用所见所想相关的词押韵,例:看到了一卷纸巾,“纸巾”,想到每晚做那事很“使劲”,差点“失禁”,所以现在有爆棚的羞“耻心”,多了“是瘾”,所以要改过“自新”。(bushi)
u_4124831924_3813209012&fm_253&fmt_auto&app_138&f_JPEG.jpeg

Flow

首先flow是什么?这个懒得写了真的,毕竟没有一点纯度的人也不会看到这里吧……反正,不懂的可以问谷歌娘。那我直接开门见山的说,在freestyle里,flow方面需要解决这么几个问题。一,如何用flow去突出押韵。二,flow怎样配合节奏让唱的和听的人都舒服(听感)。三,如何用flow解决一句话的字数问题。(比如你一个八拍要说九个字,那么排flow时就有一拍里要说两个字)后两者的话,只能靠不断地尝试和琢磨,可以去多听听你喜欢的说唱歌手,他们的歌,flow是怎么排的,为什么好听。可以自己平时有事没事写点小文章,配beat给它读出来,要能顺畅且律动。至于第一个问题,我这边提供一个分阶练习。→
*我的训练方法III:(步步递进)
1.胡言乱语跟着beat瞎说,时不时来个加速断拍什么的。
2.在上一步的基础上在句末或当中添加押韵的词。
3.在上一步的基础上说清楚话。(可以没有逻辑)
p.s 有一个随时随地练flow的小方法。戴个耳机,听着你喜欢的beat,在日常生活中说的话也去卡beat的拍子,不需要押韵什么的,就正常说话,然后卡拍。
i2.hdslb.jpeg

结语

以上就是我练习freestyle的经验和方法了,希望能帮助你少走一些弯路。但是最终的成果能有多好,还是得看时间堆砌。像爆音,贝贝这些,哪个不曾每天对着镜子乏味地说说说。
Great works are performed not by strength, but by perseverance. -Samuel Johnson
那么我就帮你到这了,年轻人。

❌
❌