代码高亮
前段时间对 Hugo 不太满意,恰好了解到 Project Gemini 和 gemtext,想从头写一个静态网页生成器,将 gemtext 转为 HTML。
大概是离期末还有一个月的时候,在学校想了几天如何实现 <highlight> </highlight> 内的高亮。虽然最后生成器因为太复杂而放弃了,但还是想记录下那几天的想法。
Hugo syntax highlighting
在 Markdown 中,用以下语法创建一个代码块,Hugo 将对 CODE 里的内容进行语法高亮。
```LANG [OPTIONS]
CODE
```
以 C 语言为例,生成类似下方的 HTML
<div class="highlight">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#a6e22e">SDL_SetHint</span>(SDL_HINT_VIDEO_WAYLAND_ALLOW_LIBDECOR, <span style="color:#e6db74">"0"</span>);
</span></span></code></pre>
</div>
<pre> 标签内设置了代码块的背景颜色(#272822),Tab 宽度(4),未被高亮的文字的颜色(#f8f8f2) 等属性
<code> 标签指定语言(language-c) 和布局样式(style="display:flex;")。
...
<code class="language-c" data-lang="c">
<span style="display:flex;">...</span>
<span style="display:flex;">...</span>
<span style="display:flex;">...</span>
<span style="display:flex;">...</span>
</code>
...
从 <span style="display:flex;"> 开始到 </span> 结束代表一行代码;每新增一行,会添加一个 <span style="display:flex;"> </span> 元素。
<span style="display:flex;"><span><span style="color:#a6e22e">SDL_SetHint</span>(SDL_HINT_VIDEO_WAYLAND_ALLOW_LIBDECOR, <span style="color:#e6db74">"0"</span>);
</span></span>
SDL_SetHint(SDL_HINT_VIDEO_WAYLAND_ALLOW_LIBDECOR, "0");
在一行内,用 <span style="...">TEXT</span> 显示带有高亮/斜体等样式的文本,无需高亮的文本将遵循 <pre> 标签内设置的的样式。
Wayland: SDL3 改变窗口大小时极其卡顿
SDL3 创建的窗口在改变大小时极其卡顿,测量 while (SDL_PollEvent(&event)) {} 耗时大多
在几百至上千毫秒,严重拖慢了窗口重绘
Gnome 50.1
SDL_GPU Driver: Vulkan
在基于 Gnome 的桌面上存在此问题
问题早在 2025 年就已经出现
相关 Issue: Wayland: extreme lag when resizing window
What desktop are you using? This is a known issue with GNOME based desktops, which use the libdecor backend. The root issue is libdecor not passing the resize flag through, which needs a new version of libdecor to be released to be remedied.
原因应为 SDL 使用 libdecor 在 Wayland 下绘制窗口装饰,但是 libdecor 没能向下传递 resize 标志
BiliBili 直播取流 [M3U8]
在 Web 平台上,BiliBili 使用 HLS 协议,提供一个动态刷新的 m3u8 文件以实现直播流的传输。主引索文件可以
通过发送附带cid和mid参数的请求获得。
cid: 直播间长 ID
mid: 主播 ID
[GET] https://api.live.bilibili.com/xlive/play-gateway/master/url?cid=<cid>&mid=<mid>
返回示例
#EXTM3U
#EXT-X-CONTENT-STEERING:SERVER-URI="reserved",PATHWAY-ID="https://cn-jxnc-cm-01-39.bilivideo.com",BILI-PATHWAY-PRIORITY="https://cn-jxnc-cm-01-39.bilivideo.com,https://d1--cn-gotcha204b.bilivideo.com,https://cn-jssz-cm-02-74.bilivideo.com,https://cn-jxnc-cm-01-38.bilivideo.com",BILI-CTR-MODE=1,BILI-TTL=150
#EXT-X-STREAM-INF:BANDWIDTH=1382434,RESOLUTION=1280x720,CODECS="avc1.640028,avc1.640028",BILI-ORDER=0,BILI-DISPLAY="超清",BILI-QN=250,PATHWAY-ID="https://cn-jxnc-cm-01-39.bilivideo.com",BILI-STREAM="live_690608693_5023542"
https://cn-jxnc-cm-01-39.bilivideo.com/live-bvc/349602/live_690608693_5023542_2500/index.m3u8?expires=1770550381&len=0&oi=0x24098a550c210dc000000000000005af&pt=android&qn=250&trid=100711865d771a89b85d2ea9f29c88698866&bmt=2&sigparams=cdn,expires,len,oi,pt,qn,trid,bmt&cdn=cn-gotcha01&sign=52df38eb4e41d151bc699663e85776f3&site=e0c17361b5ba8b39d1436ef89dc05f47&free_type=0&mid=516951631&sche=ban&bvchls=1&sid=cn-jxnc-cm-01-39&chash=1&sg=lr&trace=8388681&isp=cm&rg=South&pv=Guangdong&expected_qn=0,0,0&info_source=cache&deploy_env=prod&long_ab_flag=live_default_longitudinal&strategy_id=122&hdr_type=0&codec=0&origin_bitrate=1669&media_type=0&sk=11e6e03140d4fe707653c968459991d30709595305d5a5f68483e2a81ebc11b9&ld=autoqn&source=puv3_master&long_ab_flag_value=test&score=1&pp=rtmp&suffix=2500&flvsk=7b9ca197a822eebb7933bf2a49b49d0ff551d1ce373042b837995692e840d6e6&hot_cdn=909705&long_ab_id=45&strategy_type=1&sl=2&p2p_type=0&strategy_version=latest&vd=nc&zoneid_l=151371779&sid_l=stream_name_cold&src=puv3&order=1
#EXT-X-STREAM-INF:BANDWIDTH=1382434,RESOLUTION=1280x720,CODECS="avc1.640028,avc1.640028",BILI-ORDER=0,BILI-DISPLAY="超清",BILI-QN=250,PATHWAY-ID="https://d1--cn-gotcha204b.bilivideo.com",BILI-STREAM="live_690608693_5023542"
https://d1--cn-gotcha204b.bilivideo.com/live-bvc/349602/live_690608693_5023542_2500/index.m3u8?expires=1770550381&len=0&oi=0x24098a550c210dc000000000000005af&pt=android&qn=250&trid=100711865d771a89b85d2ea9f29c88698866&bmt=2&sigparams=cdn,expires,len,oi,pt,qn,trid,bmt&cdn=cn-gotcha204&sign=d0aacbc6618bcafdac6e768dce5388a3&site=e0c17361b5ba8b39d1436ef89dc05f47&free_type=0&mid=516951631&sche=ban&bvchls=1&trace=64&isp=cm&rg=South&pv=Guangdong&suffix=2500&flvsk=7b9ca197a822eebb7933bf2a49b49d0ff551d1ce373042b837995692e840d6e6&hot_cdn=909705&long_ab_id=45&long_ab_flag_value=test&score=1&pp=rtmp&strategy_type=1&sl=2&p2p_type=0&strategy_version=latest&info_source=cache&deploy_env=prod&long_ab_flag=live_default_longitudinal&strategy_id=122&expected_qn=0,0,0&media_type=0&sk=11e6e03140d4fe707653c968459991d30709595305d5a5f68483e2a81ebc11b9&ld=autoqn&source=puv3_master&hdr_type=0&codec=0&origin_bitrate=1669&vd=bc&src=puv3&order=2
#EXT-X-STREAM-INF:BANDWIDTH=2968287,RESOLUTION=1920x1080,CODECS="avc1.4d4028,avc1.4d4028",BILI-ORDER=1,BILI-DISPLAY="蓝光",BILI-QN=400,PATHWAY-ID="https://cn-jssz-cm-02-74.bilivideo.com",BILI-STREAM="live_690608693_5023542"
https://cn-jssz-cm-02-74.bilivideo.com/live-bvc/346968/live_690608693_5023542_4000/index.m3u8?expires=1770550381&len=0&oi=0x24098a550c210dc000000000000005af&pt=android&qn=400&trid=100711865d771a89b85d2ea9f29c88698866&bmt=2&sigparams=cdn,expires,len,oi,pt,qn,trid,bmt&cdn=cn-gotcha01&sign=1f0d41867e09db304254a95f831259c6&site=e0c17361b5ba8b39d1436ef89dc05f47&free_type=0&mid=516951631&sche=ban&bvchls=1&sid=cn-jssz-cm-02-74&chash=1&sg=lr&trace=8388681&isp=cm&rg=South&pv=Guangdong&suffix=4000&deploy_env=prod&ld=autoqn&long_ab_flag_value=test&sk=abd899906f241e8c24106d90b71e63c1&codec=0&media_type=0&strategy_type=1&hdr_type=0&pp=rtmp&source=puv3_master&score=1&p2p_type=0&flvsk=83a3e6596fa5ad85e9bd49d83400af03&sl=2&strategy_id=122&strategy_version=latest&long_ab_id=45&long_ab_flag=live_default_longitudinal&origin_bitrate=2513&expected_qn=0,0,0&hot_cdn=909705&info_source=cache&vd=nc&zoneid_l=151371779&sid_l=stream_name_cold&src=puv3&order=1
#EXT-X-STREAM-INF:BANDWIDTH=2968287,RESOLUTION=1920x1080,CODECS="avc1.4d4028,avc1.4d4028",BILI-ORDER=1,BILI-DISPLAY="蓝光",BILI-QN=400,PATHWAY-ID="https://d1--cn-gotcha204b.bilivideo.com",BILI-STREAM="live_690608693_5023542"
https://d1--cn-gotcha204b.bilivideo.com/live-bvc/346968/live_690608693_5023542_4000/index.m3u8?expires=1770550381&len=0&oi=0x24098a550c210dc000000000000005af&pt=android&qn=400&trid=100711865d771a89b85d2ea9f29c88698866&bmt=2&sigparams=cdn,expires,len,oi,pt,qn,trid,bmt&cdn=cn-gotcha204&sign=b1dc7d3832440d88374fc3c85c947582&site=e0c17361b5ba8b39d1436ef89dc05f47&free_type=0&mid=516951631&sche=ban&bvchls=1&trace=64&isp=cm&rg=South&pv=Guangdong&p2p_type=0&flvsk=83a3e6596fa5ad85e9bd49d83400af03&sl=2&strategy_id=122&hdr_type=0&pp=rtmp&source=puv3_master&score=1&strategy_version=latest&long_ab_id=45&long_ab_flag=live_default_longitudinal&origin_bitrate=2513&expected_qn=0,0,0&hot_cdn=909705&info_source=cache&sk=abd899906f241e8c24106d90b71e63c1&codec=0&media_type=0&strategy_type=1&suffix=4000&deploy_env=prod&ld=autoqn&long_ab_flag_value=test&vd=bc&src=puv3&order=2
#EXT-X-STREAM-INF:BANDWIDTH=5167204,RESOLUTION=1920x1080,CODECS="avc1.640032,avc1.640032",BILI-ORDER=2,BILI-DISPLAY="原画",BILI-QN=10000,PATHWAY-ID="https://cn-jxnc-cm-01-38.bilivideo.com",BILI-STREAM="live_690608693_5023542"
https://cn-jxnc-cm-01-38.bilivideo.com/live-bvc/690859/live_690608693_5023542_bluray/index.m3u8?expires=1770550381&len=0&oi=0x24098a550c210dc000000000000005af&pt=android&qn=10000&trid=100711865d771a89b85d2ea9f29c88698866&bmt=2&sigparams=cdn,expires,len,oi,pt,qn,trid,bmt&cdn=cn-gotcha01&sign=6746b82ed6d71fcc621e893f70ddfade&site=e0c17361b5ba8b39d1436ef89dc05f47&free_type=0&mid=516951631&sche=ban&bvchls=1&sid=cn-jxnc-cm-01-38&chash=1&sg=lr&trace=8388681&isp=cm&rg=South&pv=Guangdong&p2p_type=0&long_ab_flag_value=test&hdr_type=0&score=1&flvsk=7b9ca197a822eebb7933bf2a49b49d0fda05a1d90eeb730a95fec16224245865&media_type=0&ld=autoqn&pp=rtmp&codec=0&strategy_type=1&sk=11e6e03140d4fe707653c968459991d393aca952e9f26d4184fc6f1531cee2a7&source=puv3_master&long_ab_id=45&long_ab_flag=live_default_longitudinal&sl=2&hot_cdn=909705&strategy_id=122&suffix=bluray&origin_bitrate=2584&expected_qn=0,0,0&info_source=cache&strategy_version=latest&deploy_env=prod&vd=nc&zoneid_l=151371779&sid_l=stream_name_cold&src=puv3&order=1
#EXT-X-STREAM-INF:BANDWIDTH=5167204,RESOLUTION=1920x1080,CODECS="avc1.640032,avc1.640032",BILI-ORDER=2,BILI-DISPLAY="原画",BILI-QN=10000,PATHWAY-ID="https://d1--cn-gotcha204b.bilivideo.com",BILI-STREAM="live_690608693_5023542"
https://d1--cn-gotcha204b.bilivideo.com/live-bvc/690859/live_690608693_5023542_bluray/index.m3u8?expires=1770550381&len=0&oi=0x24098a550c210dc000000000000005af&pt=android&qn=10000&trid=100711865d771a89b85d2ea9f29c88698866&bmt=2&sigparams=cdn,expires,len,oi,pt,qn,trid,bmt&cdn=cn-gotcha204&sign=74cd72665f7486c3d1f855c3c8515b7e&site=e0c17361b5ba8b39d1436ef89dc05f47&free_type=0&mid=516951631&sche=ban&bvchls=1&trace=64&isp=cm&rg=South&pv=Guangdong&deploy_env=prod&suffix=bluray&origin_bitrate=2584&expected_qn=0,0,0&info_source=cache&strategy_version=latest&p2p_type=0&long_ab_flag_value=test&hdr_type=0&score=1&flvsk=7b9ca197a822eebb7933bf2a49b49d0fda05a1d90eeb730a95fec16224245865&media_type=0&ld=autoqn&long_ab_flag=live_default_longitudinal&sl=2&pp=rtmp&codec=0&strategy_type=1&sk=11e6e03140d4fe707653c968459991d393aca952e9f26d4184fc6f1531cee2a7&source=puv3_master&long_ab_id=45&hot_cdn=909705&strategy_id=122&vd=bc&src=puv3&order=2
在#EXT-X-STREAM-INF标签中标明分辨率(RESOLUTION)和画质(BILI-QN),通过下方的链接可以获取对应画质下的子 m3u8 文件,且内容不断刷新。
一个子 m3u8 示例如下
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-START:TIME-OFFSET=0
#EXT-X-MEDIA-SEQUENCE:1770539728
#EXT-X-TARGETDURATION:1
#EXT-X-MAP:URI="h1770531613.m4s"
#EXT-BILI-AUX:698b02|K|73303|dbf63b3c
#EXTINF:1.00,73303|dbf63b3c
1770539728.m4s
#EXT-BILI-AUX:698ea7|N|28dae|80f22557
#EXTINF:1.00,28dae|80f22557
1770539729.m4s
#EXT-BILI-AUX:6993cc|N|2b0cf|a8f05729
#EXTINF:1.00,2b0cf|a8f05729
1770539730.m4s
#EXT-BILI-AUX:699699|N|1b84e|593274a6
#EXTINF:1.00,1b84e|593274a6
1770539731.m4s
#EXT-BILI-AUX:699a81|N|2089|73adb345
#EXTINF:0.17,2089|73adb345
1770539732.m4s
#EXT-BILI-AUX:699b49|K|69b77|803deeb
#EXTINF:1.00,69b77|803deeb
1770539733.m4s
#EXT-BILI-AUX:699eff|N|1ae9c|2b23bf02
#EXTINF:1.00,1ae9c|2b23bf02
1770539734.m4s
#EXT-BILI-AUX:69a2e7|N|1b11f|1d5eea4a
#EXTINF:1.00,1b11f|1d5eea4a
1770539735.m4s
#EXT-BILI-AUX:69a6df|N|603ee|3240e418
#EXTINF:1.00,603ee|3240e418
1770539736.m4s
#EXT-BILI-AUX:69aae9|N|3c82|3c10d873
#EXTINF:0.17,3c82|3c10d873
1770539737.m4s
#EXT-X-MAP:URI="h1770531613.m4s"作为初始化片段将不会变化,用于提供元数据。
Linux Input Subsystem
最近在写一个能够显示键盘输入的应用,需要实时获取键盘输入;在 SDL的 API 中有用于获取键盘输入的函数
SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event)
{
if (event->type == SDL_EVENT_KEY_DOWN) {
SDL_Log("key: %s", SDL_GetKeyName(event->key.key));
}
}
通过 SDL_KeyboardEvent结构体能获取所有的按键输入,但当窗口焦点丢失时,无论是否置顶窗口,都无法
继续获取输入。
input 子系统
Input subsystem is a collection of drivers that is designed to support all input devices under Linux. Most of the drivers reside in drivers/input, although quite a few live in drivers/hid and drivers/platform.
The core of the input subsystem is the input module, which must be loaded before any other of the input modules - it serves as a way of communication between two groups of modules:
…
Wifibox的配置与使用
最近几天,我在Redmi Book Pro 14s上安装了FreeBSD 14.1-RELEASE,也算是体验了一把UNIX哲学,但因FreeBSD的驱动太过匮乏了,导致我的安装并不顺利,也就有了这篇文章
bhyve
bhyve,发音为“beehive”,是 FreeBSD 的虚拟机管理程序 / 虚拟机管理器,支持带有“POPCNT”(POPulation Count)功能的 Intel 和 AMD 处理器上的多种客户操作系统,以及在实验中支持 gic0:ARM Generic Interrupt Controller v3.0 功能的 ARM64/aarch64 处理器
bhyve 支持多种存储和网络后端、UEFI、FreeBSD 加载器和 GRUB 启动、PCI 直通 (PPT)、集成 VNC 和 9pfs 服务器以及更多功能
Wifibox
bhyve supports passing of host PCI devices to a virtual machine for its exclusive use of them.
Wifibox则是借助其PCI直通技术,部署了一个 Linux 客户机,借助 PCI 直通技术驱动 FreeBSD 主机系统上的无线网卡
Wifibox的日志位于/var/run/wifibox/appliance/log,可以很方便地观察它的运行状态
配置
我的网卡是RTL8852be,用ifconfig查看只有一个设备,其ip为127.0.0.1,若网卡在FreeBSD下有驱动支持,则需要额外禁用自带驱动
安装 Wifibox
- 因为安装需要网络,我们将数据线插入电脑,开启USB网络共享,用
ifconfig查看是否识别到设备ue0
dhclient ue0 # 获取ip
连接完后安装 Wifibox
…路由器开启 IPV6
光猫配置
进入光猫的后台,我的光猫用普通的账号root密码admin进是能进去,但是很多设置只能看,最后找到了超级用户密码
账号:telecomadmin
密码:admintelecom
输入密码进入后台,找到wan设置,把路由器的wan改为桥接,并把ipv4改为ipv4/ipv6。
如果是灰色的不能更改,在不能点击的ipv4设置上右键,点击检查,查看时候有disable属性,如果有的话,对准属性右键,点击edit attribute删除disable,不需要关闭,直接点击ipv4就应该能设置了需要注意的是,如果用普通账号登陆,比如上面的root,是无法设置开启ipv6的,即使删去disable,点击应用后仍然是ipv4
开启ipv6
光猫设置完成了,现在登陆路由器后台,以小米路由器为例,点击常用设置-上网设置,开启ipv6,上网方式选择native,然后在上网设置里选择PPoE拨号上网,输入你的宽带帐号密码
输入正确的帐号密码,这下应该能成功连上网了,等一会,你会发现后台出现了ipv6的地址,访问ipv6测试如果成绩是10/10那么说明你就成功了(如果不行的话重启路由器和光猫试试)
关闭防火墙
得到公网ipv6之后,关闭防火墙让外部流量能够访问
因为低端的小米路由器默认是没有关闭防火墙的开关的,所以我们需要ssh连接路由器进行手动配置
温馨提示:此教程可能不适用于较新的路由器,作者用的是红米AC2100
- 首先登陆你路由器的后台,然后查看地址栏,找到
stok=xxxxxxxx把=到/中间的复制下来 - 浏览器输入以下内容 < stok >换成你上面复制的内容,如果输出{“code”:0}那就是成功
http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=longdike&ssid=-h%3B%20nvram%20set%20ssh_en%3D1%3B%20nvram%20commit%3B%20sed%20-i%20's%2Fchannel%3D.*%2Fchannel%3D%5C%22debug%5C%22%2Fg'%20%2Fetc%2Finit.d%2Fdropbear%3B%20%2Fetc%2Finit.d%2Fdropbear%20start%3B
- 浏览器进入,同样,< STOK >换成自己stok
http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=longdike&ssid=-h%3B%20echo%20-e%20'admin%5Cnadmin'%20%7C%20passwd%20root%3B
-
完成后,使用
ssh [email protected]连接路由器,密码为admin -
因为openssh7.0以后的版本不再支持ssh-dss(DSA)算法,所以可能会报错,尝试使用以下命令连接
ssh -oHostKeyAlgorithms=+ssh-rsa [email protected]
- 连上以后就好办了,使用
vi /etc/config/firewall修改配置文件,修改config defaults改为
config defaults
option syn_flood '0'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'ACCEPT'
option drop_invalid '0'
option disable_ipv6 '0'
- 最后重启防火墙
/etc/init.d/firewall restart
DDNS-GO
简单好用的DDNS。自动更新域名解析到公网IP(支持阿里云、腾讯云、Dnspod、Cloudflare、Callback、华为云、百度云、Porkbun、GoDaddy、Google Domain)
- 在浏览器输入
http://127.0.0.1:9876/登陆后台 - DNS服务商选择自己注册域名的服务商
- 创建并填入
AccessKeyID和secret - 获取ip的方式接口或网卡都行
- Domains填入自己的域名和二级域名
- 点击save保存即可完成配置
之后尝试用域名+网站端口访问网站
…KernelSU 内核编译
编译环境
教程基于 Linux,可以选择实机安装或者使用 wsl2, 如何安装请看使用 WSL 在 Windows 上安装 Linux
wsl将系统各盘挂载至``/mnt``目录,通过此挂载点可以实现文件传输