0xAbCd Log,堂堂复活!
时隔三年,我的个人网站终于重建……
725 字
|
4 分钟
|
加载中...
Cover Image of the Post

你已经历许多。现在,开启你伟大的探索吧:从早期网站的摇篮,到浩瀚星宇(?

咳咳,说正经的。之前的三年我其实也写过几篇文章,但从来没想想过自己建个站,也从来没打算发自己的作品。一直以来我都是放在 BSOD-MEMZ 的网站上(也就是上面这三个,基本上都是我建的)。然而时代变了,或者说是我变了,我逐渐开始在b站上有了自己的投稿,同时 BSOD-MEMZ 也有了自己从零写 html+css+js 搭建的 xxtsoft · xxt8582753 (BSOD-MEMZ) 的个人网站。在他网站的影响下,我也起了重新自建站的念头,开始想写几篇文章投上去。

以前的我不投稿也不自建站,很大一部分原因都是自己不敢,什么都顾虑,怕发网上被人群嘲。实际上完全是以前的我自作多情,或许是看网上某些逆天玩意看多了导致的,想这么多干嘛,做自己就行了,随别人怎么看,那是别人的事。

正如左侧边栏头像下面的,Just be yourself.\n

技术#

一开始我是打算买服务器的,一看价格……

这都够我续三年域名了

说到域名,这个 0xabcd.dev 也是我深思熟虑后想出来的。HxAbCd,越看越像个十六进制……别说,0xabcd,还真是个十六进制数,于是就这么决定了。

然后是顶级域名,以前买域名都是哪个便宜买哪个,殊不知续费价格贵的上天,所以没一个续费过。.top 虽然相当便宜,才 3$/年,但是很丑,第一个否决掉了。然后是 .xyz,很遗憾,已经被注册了,最终在 ChatGPT 先生的建议下选择了 .dev,很符合这个博客的基调,价格也跟 .xyz差不多(12$/年,也没便宜到哪去,不过勉强能接受)。

接下来就是框架的选择。偶然发现了到二叉树树的博客站 AcoFork Blog,使用的 Fuwari 挺好看,便照着上面的教程跟着搭了下,随后部署到 Netlify 上,都是很基本也很熟悉的操作,也没什么难度,轻松部署。

然后就是个性化,这方面慢慢来吧……一时半会估计搞不完,说不定可能会自己魔改点东西(Web开发苦手,可能改都改不动)。\n

过去的遗留#

以前的文章应该会视情况搬上来(黑 历 史),视频也有打算做个文字稿发一下什么的,总之敬请期待吧。","metadata":{"headings":[{"depth":2,"slug":"历程","text":"历程#"},{"depth":2,"slug":"技术","text":"技术#"},{"depth":2,"slug":"过去的遗留","text":"过去的遗留#"}],"localImagePaths":["image.png"],"remoteImagePaths":[],"frontmatter":{"title":"0xAbCd Log,堂堂复活!","published":"2025-08-11T00:00:00.000Z","description":"时隔三年,我的个人网站终于重建……","image":"cover.png","tags":["建站","Astro","Fuwari","Netlify"],"category":"技术","draft":false,"minutes":4,"words":725,"excerpt":"你已经历许多。现在,开启你伟大的探索吧:从早期网站的摇篮,到浩瀚星宇(?"},"imagePaths":["image.png"]}},"collection":"posts","slug":"site-revive"}; const umamiConfig = {"enable":true,"baseUrl":"https://us.umami.is","shareId":"43Xmt1sB9z6bG1e0","timezone":"Asia/Shanghai"}; // 获取文章浏览量统计 async function fetchPostCardViews(slug) { if (!umamiConfig.enable) { return; } try { // 调用全局工具获取 Umami 分享数据 const { websiteId, token } = await getUmamiShareData(umamiConfig.baseUrl, umamiConfig.shareId); // 第二步:获取统计数据 const currentTimestamp = Date.now(); const statsUrl = `${umamiConfig.baseUrl}/api/websites/${websiteId}/stats?startAt=0&endAt=${currentTimestamp}&unit=hour&timezone=${encodeURIComponent(umamiConfig.timezone)}&url=%2Fposts%2F${slug}%2F&compare=false`; const statsResponse = await fetch(statsUrl, { headers: { 'x-umami-share-token': token } }); if (statsResponse.status === 401) { clearUmamiShareCache(); return await fetchPostCardViews(slug); } if (!statsResponse.ok) { throw new Error('获取统计数据失败'); } const statsData = await statsResponse.json(); const pageViews = statsData.pageviews?.value || 0; const visits = statsData.visits?.value || 0; const displayElement = document.getElementById(`page-views-${slug}`); if (displayElement) { displayElement.textContent = `浏览量 ${pageViews} · 访问数 ${visits}`; } } catch (error) { console.error('Error fetching page views for', slug, ':', error); const displayElement = document.getElementById(`page-views-${slug}`); if (displayElement) { displayElement.textContent = '统计不可用'; } } } // 页面加载完成后获取统计数据 function initPostCardStats() { const slug = entry.slug; if (slug) { fetchPostCardViews(slug); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initPostCardStats); } else { initPostCardStats(); } })();

欸,我不是窗口吗?——胭脂,但是Windows
使用 `Python 3.13` + `PySide6`,仿照胭脂的PV制作的 Windows 窗口动画程序。灵感来自于 BSOD-MEMZ 和 《强 风 大 窗 口》
666 字
|
3 分钟
|
加载中...
Cover Image of the Post

hxabcd
/
enji_but_pyqt
Waiting for api.github.com...
00K
0K
0K
Waiting...
def sequence_update(pos):
2
if 0 <= pos < 700:
3
app.yan.preload_seqframe(get_res(\"frames/yan\"))
4
app.zhi.preload_seqframe(get_res(\"frames/zhi\"))
5
app.small_teto1.preload_seqframe(get_res(\"frames/small_teto1\"))
6
elif 700 <= pos < 9160:
7
app.yan.show()
8
app.zhi.show()
9
app.small_teto1.show()
10
app.yan.widget.start_loop(3)
11
app.zhi.widget.start_loop(3)
12
app.small_teto1.widget.start_loop(3)
13
elif 9160 <= pos < 11791:
14
app.yan.hide()
15
...

如上述代码,动画的播放是根据播放进度控制的

一开始有想过用sleep什么的,发现根本不准,容易牵一发而动全身,很快否决了。后来 ChatGPT 先生再次提出了他的高见:用 QMediaPlayer,还能检测播放进度

好用爱用😋

动态资源加载#

这得追溯到开发到到一半的时候……

仅仅37帧,更何况这样的还有六个

全部加载恐怕得上到2G……

于是不得不将动态加载提上日程,踩了不少坑,但结果相对来说还是比较显著的(虽然最后还是有 860MB…)

关键帧动画#

跟上面的动态加载差不多,都是为了减少内存占用。一开始想直接用序列帧,结果嘛自然是内存爆炸。反手让AI写了个关键帧提取器(还放在目录的 /tools 目录下面,感兴趣的可以看看),出乎意料的好用

尽可能少的 AI 使用#

幻觉:你好

实际上不使用AI的真实原因是我免费额度用完了,加之懒得折腾那些东西

正好可以锻炼一下自己的水平(


这些真的有用……吗?

其实只要足够生草就行了,大抵是这个人喜欢造轮子罢……

","metadata":{"headings":[{"depth":2,"slug":"视频版本","text":"视频版本#"},{"depth":2,"slug":"概述","text":"概述#"},{"depth":2,"slug":"亮点","text":"亮点#"},{"depth":3,"slug":"与原pv相同的字体","text":"与原PV相同的字体#"},{"depth":3,"slug":"基于时间的帧控制","text":"基于时间的帧控制#"},{"depth":3,"slug":"动态资源加载","text":"动态资源加载#"},{"depth":3,"slug":"关键帧动画","text":"关键帧动画#"},{"depth":3,"slug":"尽可能少的-ai-使用","text":"尽可能少的 AI 使用#"}],"localImagePaths":["image1.png","image2.png","image3.png","image4.png","nerd_teto.jpg","image5.png"],"remoteImagePaths":[],"frontmatter":{"title":"欸,我不是窗口吗?——胭脂,但是Windows","published":"2025-07-23T00:00:00.000Z","description":"使用 `Python 3.13` + `PySide6`,仿照胭脂的PV制作的 Windows 窗口动画程序。灵感来自于 BSOD-MEMZ 和 《强 风 大 窗 口》","image":"cover.jpg","tags":["编程","Python","Windows","窗口动画"],"category":"技术","draft":false,"minutes":3,"words":666,"excerpt":"使用 Python 3.13 + PySide6,仿照胭脂的PV制作的 Windows 窗口动画程序。灵感来自于 BSOD-MEMZ 和 《强 风 大 窗 口》"},"imagePaths":["image1.png","image2.png","image3.png","image4.png","nerd_teto.jpg","image5.png"]}},"collection":"posts","slug":"enji_but_pyqt"}; const umamiConfig = {"enable":true,"baseUrl":"https://us.umami.is","shareId":"43Xmt1sB9z6bG1e0","timezone":"Asia/Shanghai"}; // 获取文章浏览量统计 async function fetchPostCardViews(slug) { if (!umamiConfig.enable) { return; } try { // 调用全局工具获取 Umami 分享数据 const { websiteId, token } = await getUmamiShareData(umamiConfig.baseUrl, umamiConfig.shareId); // 第二步:获取统计数据 const currentTimestamp = Date.now(); const statsUrl = `${umamiConfig.baseUrl}/api/websites/${websiteId}/stats?startAt=0&endAt=${currentTimestamp}&unit=hour&timezone=${encodeURIComponent(umamiConfig.timezone)}&url=%2Fposts%2F${slug}%2F&compare=false`; const statsResponse = await fetch(statsUrl, { headers: { 'x-umami-share-token': token } }); if (statsResponse.status === 401) { clearUmamiShareCache(); return await fetchPostCardViews(slug); } if (!statsResponse.ok) { throw new Error('获取统计数据失败'); } const statsData = await statsResponse.json(); const pageViews = statsData.pageviews?.value || 0; const visits = statsData.visits?.value || 0; const displayElement = document.getElementById(`page-views-${slug}`); if (displayElement) { displayElement.textContent = `浏览量 ${pageViews} · 访问数 ${visits}`; } } catch (error) { console.error('Error fetching page views for', slug, ':', error); const displayElement = document.getElementById(`page-views-${slug}`); if (displayElement) { displayElement.textContent = '统计不可用'; } } } // 页面加载完成后获取统计数据 function initPostCardStats() { const slug = entry.slug; if (slug) { fetchPostCardViews(slug); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initPostCardStats); } else { initPostCardStats(); } })();
使用 ClassIsland 自动化,全自动登录希沃白板
ClassIsland 「自动化」与 Auto Login for EasiNote 强强联手、珠联璧合,让你的希沃白板使用体验再飞跃。
377 字
|
2 分钟
|
加载中...
Cover Image of the Post
还在课前输密码?自动登录希沃,告别繁琐操作
Auto Login for EasiNote 是一个使用 Python 编写的 CLI 工具,可以用于自动登录希沃白板。通过 PyAutoGUI 实现自动识别并点击来模拟登录
466 字
|
2 分钟
|
加载中...
Windows 11,**都不用
前几天,我因为 Win11 的稳定性过于“优良”,重装了系统。借这个机会,正好说说 Win11 究竟有多烂。
438 字
|
2 分钟
|
加载中...