2025-04-25 17:18:00
我分享这个 flow 是因为我有分享视频中片段的需求,但是又不想用相机拍摄,相机拍摄效果可能也不好。下载下来再裁剪又太麻烦。尤其是我喜欢看车祸警示录,有时候看到某些事故非常搞笑,我就用这个手段录制下来,视频可能就10s,30s,然后再微信分享,就很 nice 了。如果是分享10min的完整视频那种,就不如直接贴链接,或者直接下载下来再分享,不需要使用本文方案进行录制。
你是否会因为难以下载 YouTube, X(Twitter), 小红书, Instagram, 微博 之类的网站上的视频而发愁呢……虽然下载这些网站的视频大多都有在线工具或者命令行工具,可以在 GitHub 寻找。
但是目前经过我的日常使用,小红书和微博上的视频资源不是很轻松就能下载下来,或者下载用时很久,还可能下载下来文件太大(比如下载时无法执行码率和分辨率),不利于再次分享。
我为了解决这个问题,一开始使用了 NVIDIA Geforce Experience,但是这个只能录制屏幕的完整内容,如果想要录制屏幕当中的某一块区域,英伟达这个软件就不行了。
于是转而使用 Obs Studio。下面这段介绍来自 DeepSeek V3
OBS Studio(Open Broadcaster Software)是一款免费开源的跨平台直播和录屏软件,广泛用于游戏直播、教学演示、视频创作等场景。以下是其核心特点:
官网下载:OBS Project
社区活跃,遇到问题可通过论坛或GitHub快速解决。适合追求高自由度、零成本的用户。
我在使用 Windows 11 电脑。安装好 Obs Studio 之后,打开软件,进行初始化配置,我不直播,所以只进行了 recording 录制相关的初始化,最后 apply settings,应用设置。
添加源。我拿录制B站车祸警示录的视频举例,使用 edge 浏览器播放B站视频,那么来源选择【窗口采集】,选中正在运行的 edge 那个窗口,标题前缀是 [msedge.exe]
,
如果不想录入当前电脑麦克风的声音,请将 Mic 给静音。
此时会录制整个窗口的画面,如果想录制视频播放区域,需要添加一个裁剪/填充
的【滤镜】,如下图,设置好距离左,顶部,右,底部的像素数量关闭即可。
在开始录制前确保输出的视频画面充满整个画布,勾选使用此源的尺寸作为输出分辨率 (重要重要!否则输出的视频可能有很多“留黑”空白区域)
最后再点击【开始录制】,同时播放 edge 浏览器窗口的视频,在视频结束时(或者你想截取的视频片段刚好结束)点击【停止录制】。
最终录制视频呈现的质量,设置项在 【设置】->【输出】->【录制】->【录像质量,录像格式,视频编码器,音频编码器,音轨】等配置。
建议录像格式使用MPEG-4,方便传播,比如微信就可以直接预览 mp4 视频。
2025-04-25 13:40:00
使用了这个插件: https://github.com/zyuzhi/MarkdownKatex-typecho ,下载了 v1.0.1
,但是点击创建文章之后无法返回所有文章页面。另外博客首页也无法加载,禁用插件即恢复正常。懒的去追究原因了,索性不用插件改用其他方法。
我家里的一台机器也部署了 typecho,同样都是 docker compose 部署的,和当前 typecho 实例的区别大概就是
v1.2.0
vsv1.2.1
。家里机器上的 typecho 是 1.2.0,当前实例是 1.2.1,有可能是版本升级导致的原有插件失效,因为上述插件 GitHub 源代码是2018年左右最终打包到 release 发行的。
在 typecho v1.2.1
实例上测试如下方法可以为 typecho 博客添加 latex 支持。
方法参考: https://www.xrgzs.top/posts/typecho-use-mathjax-add-latex-support
将以下代码添加到 footer.php </body>
关闭标签之前。我这个主题这个文件在 components/footer.php
。我上面参考的博客将这段脚本引用放在了 index.php,可能会引起 DOM 渲染紊乱,比如图片被拉长,主页 footer 在页面中间渲染。放在 footer.php
的 </body>
前,此时 DOM 已解析完成,图片布局已稳定,脚本加载不再影响初始渲染
<script async type="text/javascript"
src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>
将以下代码添加到 header.php 的适当位置。我这个主题这个文件在 components/header.php
。
<script async type="text/javascript"
src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
extensions: ["tex2jax.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
processEscapes: true
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script>
物体所受合外力 $\mathbf{F}$ 与其加速度 $\mathbf{a}$ 满足:
$$ \mathbf{F} = m\mathbf{a} = \frac{d\mathbf{p}}{dt} $$
其中:
两个质点间的引力大小:
$$ F = G\frac{m_1 m_2}{r^2} $$
式中普适常量: $G \approx 6.674 \times 10^{-11}\, \mathrm{m^3 \cdot kg^{-1} \cdot s^{-2}}$
2025-04-25 13:15:11
以下是我和DeepSeek R1的对话
新能源汽车使用7kW 交流慢充和外面的直流快充,哪个充电时损耗更高?7kW 交流慢充的电流大概30A,44度电池大概需要7个小时;使用外面直流快充桩,假如功率是70kW,充满需要1小时,但是充电电流最大180A左右。请计算一下哪种充电方式电损耗更多?
在比较新能源汽车使用7kW交流慢充和70kW直流快充的充电损耗时,需综合考虑线损和转换效率。以下是关键分析步骤:
在合理假设下,直流快充的总损耗更低(约3kWh),因其转换效率更高且充电时间短。但若按用户提供的错误数据(快充输入70kWh),则损耗更高,此情况不符合实际。实际使用中,快充是更高效的选择。
我给出的快充功率70kW,但实际充电功率并不是恒定70kW 呀,功率会随着电池soc的增高而降低的。所以快充充满一般都需要1小时。请再计算看看
在考虑快充功率动态变化的情况下,重新计算两种充电方式的损耗如下:
指标 | 直流快充(动态功率) | 交流慢充(7kW) |
---|---|---|
总损耗 | 约2.54kWh | 约5.55kWh |
损耗比例 | 5.8%(44kWh电池) | 12.6% |
核心原因 | 转换效率高(95%)、时间短、线损低 | 转换效率低(90%)、时间长、线损高 |
即使考虑快充功率随SOC动态下降的情况,直流快充的总损耗(约2.54kWh)仍显著低于交流慢充(约5.55kWh)。核心原因在于:
实际建议:若需减少充电损耗,优先选择直流快充;若考虑电池寿命,可适当使用慢充平衡。
2025-03-25 14:26:00
21年8月我写过这篇:全国各省份 5A 级景区
时间到了2025年3月,全国5A变化挺大的,今天再来处理一下全部数据。数据来自文化和旅游部 at 2025-03-25 14:32:24
先上代码
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.http.ContentType;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.collections.CollectionUtils;
import java.util.Collections;
/**
* @author: hellodk
* @description AllProvince5ASpot
* @date: 3/25/2025 1:47 PM
*/
public class AllProvince5ASpot {
private static int globalCounter = 0;
public static void main(String[] args) {
AllProvince5ASpot spot = new AllProvince5ASpot();
spot.printAll5ASpot();
System.out.println("一共有多少个景区?" + globalCounter);
}
private void printAll5ASpot() {
final String baseUrl = "https://www.mct.gov.cn/tourism/api/content/getContentListByDirId";
int totalPage;
int totalItem = 0;
int currPage = 1;
JSONObject body = new JSONObject();
body.put("directoryId", "4");
body.put("searchList", Collections.emptyList());
body.put("size", 100);
body.put("page", currPage);
HttpResponse resp = HttpUtil.createPost(baseUrl)
.body(body.toJSONString(), ContentType.JSON.getValue())
.timeout(60000)
.execute();
if (!resp.isOk()) {
System.err.println("第一次就请求失败。现退出程序");
return;
}
JSONObject res = JSON.parseObject(resp.body());
// .data.contentList.totalPages
// totalElements
totalPage = res.getJSONObject("data").getJSONObject("contentList").getInteger("totalPages");
totalItem = res.getJSONObject("data").getJSONObject("contentList").getInteger("totalElements");
System.out.println("总的页数:" + totalPage);
System.out.println("总的景区数:" + totalItem);
JSONArray items = res.getJSONObject("data").getJSONObject("contentList").getJSONArray("content");
printSpot(items);
while (currPage <= totalPage) {
currPage++;
ThreadUtil.safeSleep(3000);
body.put("page", currPage);
resp = HttpUtil.createPost(baseUrl)
.body(body.toJSONString(), ContentType.JSON.getValue())
.timeout(60000)
.execute();
if (!resp.isOk()) {
System.err.println("第 " + currPage + " 次请求失败。现跳过当次,准备下一次请求");
continue;
}
res = JSON.parseObject(resp.body());
items = res.getJSONObject("data").getJSONObject("contentList").getJSONArray("content");
printSpot(items);
}
}
private void printSpot(JSONArray items) {
if (CollectionUtils.isNotEmpty(items)) {
System.out.println();
System.out.println("----");
for (Object item : items) {
globalCounter++;
JSONObject spot = (JSONObject) item;
System.out.print("景区名称:" + spot.getString("name") + " ");
System.out.print("地区:" + spot.getString("provinceName") + " ");
System.out.print("A级:" + spot.getString("gradesName") + " ");
System.out.print("评定年份:" + spot.getString("year"));
System.out.println();
}
System.out.println("----");
System.out.println();
}
}
}
输出如下:
总的页数:4
总的景区数:358
一共有多少个景区?358
注意这些只包含了5A
2025-03-07 14:01:00
先说明一下,网上的一些教程已经过时,从MIUI各个版本迭代到如今 HyperOS 改了又改,很多方法失效了。通过拨号键盘输入 *#*#6485#*#*
现在已不展示 MF_05 和 MF_06 的值。
系统里的【电池保护】功能只使用通俗语言描述了电池健康度,没有显示剩余容量的百分比。
当前是2025年3月,我经过实践得知,通过拨号键盘输入 *#*#284#*#*
,手机会生成Bug检测报告,仔细查阅这份 txt 报告,能得到当前手机容量和循环次数。
生成bug检测报告大概率很慢,需要耐心等待,系统通知栏会有进度条。生成成功之后,zip 文件存在于 内部存储器/MIUI/debug_log/bugreport-2025-03-07-120503.zip
,我是把这个文件拷贝到了电脑上。然后解压缩此 zip 文件,得到 bugreport-Redmi K70-2025-03-07-121000.zip
,继续解压缩这个 redmi k70 的 zip 文件,得到 bugreport-vermeer-UKQ1.230804.001-2025-03-07-12-05-04.txt
这个文件。不同型号这个文件名不同,你需要查看的是 bugreport 开头的并且扩展名是 .txt 的文件。使用 vscode 或者其他文本编辑器搜索这个文件
1️⃣ 搜索 battery capacity
能够得到电池当前容量
2️⃣ 搜索 cycle count
能得到手机循环次数,实际上这里的 Full charge 的值也是现在手机电池的最大容量,4825000就是 4825毫安时,除以出厂时的典型容量5000毫安时可得,容量还剩 96.5%
我的 K70 是2023-12-02到手的,典型容量是5000毫安时。手机电池一般是三元锂软包,我的经过了402次循环还剩96.5%的容量,说明我的电池使用习惯还不错。
PS: 今天2025-03-07,距离2023-12-02已经过了461天,这段时间K70一直是我的主力机。
开始时间:2023年12月02日 00:00
结束时间:2025年03月07日 00:00
相差年数:2年
相差月数:15月
相差周数:65周余6天
相差天数:461天
相差小时:11064时
2024-10-13 11:48:00
我的 seafile 安装在内网,服务地址是 http://10.10.10.5:8088
,然后我使用 frp 将其暴露在了公网 https://seafile.940304.xyz
。
正常情况下在任何联网设备上都可以通过域名 seafile.940304.xyz
访问,并且能够上传和下载。但是当我处于 10.10.10.0/24
家里的内网时,我发现上传文件走了公网(seafile.940304.xyz
所在服务器),所以数据包兜了个圈再回到我家,这样的表现就是上传下载文件都非常缓慢,最大速率刚好是我的公网机器的带宽。我发现这是 seafile 系统设置当中 FILE_SERVER_ROOT
这个变量定义成了 https://seafile.940304.xyz/seafhttp
导致的,于是寻求解决办法。
一个临时办法:
当我处于家庭内网时,如果需要上传大文件,我可以手动改一下系统配置,将 FILE_SERVER_ROOT 改成 http://10.10.10.5:8088/seafhttp
,这样可以临时解决上传速度慢的问题。
但是这样未免有点低效。我开始上网搜索解决办法,看到如下这些相似的帖子:
思索再三之后,配合 gpt-4o 对我的一些建议,我发现一个不错的解决办法,因为我的家庭网络使用了 openwrt 作为网关路由器,并且当时构建的镜像使用 nginx
替代了原本的 uhttpd
作为 web server,这样就更加接近我的目标了。简单说下实现思路
SERVICE_URL
保持公网地址 https://seafile.940304.xyz/
;FILE_SERVER_ROOT
的值保持公网地址 https://seafile.940304.xyz/seafhttp
。此时非内网的公网下访问、上传、下载都没有问题seafile.940304.xyz
域名直接映射到 10.10.10.1
,这是我的 openwrt 地址seafile.940304.xyz
的请求全都转发到 10.10.10.5:8088
以下是详细步骤。
填入公网的地址即可。SERVICE_URL
填入公网地址 https://seafile.940304.xyz/
;FILE_SERVER_ROOT
的值填入公网地址 https://seafile.940304.xyz/seafhttp
,然后保存。
打开 openwrt 后台管理页面,进入 网络
-> DHCP/DNS
-> 主机名映射
,添加一条记录,主机名 seafile.940304.xyz
,IP地址 10.10.10.1
然后保存。
这个操作是否生效了可以在本地局域网任何一台机器使用命令 nslookup seafile.940304.xyz
检查,返回结果是 10.10.10.1
则说明配置正常且生效了。否则可能还是域名对应的公网地址
nginx 配置如下,文件名 /etc/nginx/conf.d/seafile-on-pvedebian11.conf
,其中 ssl 证书和私钥 key 部分是我从我的公网机器上 copy 过来的。
server {
listen 443 ssl;
server_name seafile.940304.xyz;
ssl_certificate /etc/letsencrypt/live/940304.xyz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/940304.xyz/privkey.pem;
access_log /var/log/nginx/seafile_access.log;
error_log /var/log/nginx/seafile_error.log;
location / {
proxy_pass http://10.10.10.5:8088;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /seafhttp {
proxy_pass http://10.10.10.5:8088/seafhttp;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
然后检查 nginx 配置是否正确和重载 nginx 服务即可。
在内网使用公网域名正常访问,并且是反向代理过的,访问、上传和下载速度都极快。可以通过 openwrt 上的 nginx 日志验证。
检查 openwrt 上 nginx 的日志文件 /var/log/nginx/seafile_access.log
[root@openwrt_ai_dk_20240831:11:54 AM /etc/nginx/conf.d] # tail -n 10 /var/log/nginx/seafile_access.log
10.10.10.108 - - [13/Oct/2024:11:03:55 +0800] "GET /api/v2.1/admin/web-settings/ HTTP/1.1" 200 1176 "https://seafile.940304.xyz/sys/web-settings/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:03:55 +0800] "GET /media/img/seafile-logo.png?t=1728788662258 HTTP/1.1" 200 12612 "https://seafile.940304.xyz/sys/web-settings/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:03:55 +0800] "GET /media/favicons/favicon.png?t=1728788662258 HTTP/1.1" 200 45439 "https://seafile.940304.xyz/sys/web-settings/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:03:55 +0800] "GET /media/custom/login-bg.jpg?t=1728788662258 HTTP/1.1" 200 338345 "https://seafile.940304.xyz/sys/web-settings/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:05:19 +0800] "GET / HTTP/1.1" 200 2227 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:05:20 +0800] "GET /api/v2.1/notifications/ HTTP/1.1" 200 689 "https://seafile.940304.xyz/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:05:20 +0800] "GET /api/v2.1/repos/?type=mine HTTP/1.1" 200 1394 "https://seafile.940304.xyz/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:24:32 +0800] "GET / HTTP/1.1" 200 2229 "https://seafile.940304.xyz/sys/web-settings/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:24:32 +0800] "GET /api/v2.1/notifications/ HTTP/1.1" 200 689 "https://seafile.940304.xyz/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:24:32 +0800] "GET /api/v2.1/repos/?type=mine HTTP/1.1" 200 1394 "https://seafile.940304.xyz/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
并且,在内网依然可以使用内网IP和端口访问,并且此时上传和下载还是走 https://seafile.940304.xyz/seafhttp
匹配到的 nginx 反向代理,即 http://10.10.10.5:8088/seafhttp
,所以还是走的内网,速度依然最佳。
于是这个问题通过设置公网地址+公网域名映射内网ip+nginx反向代理完美解决。