2 Commits

Author SHA1 Message Date
mayx
556e27c9ad Update 2 files
- /index.html
- /assets/js/main_new.js
2026-06-01 05:36:14 +00:00
mayx
5a4baf5f4b Update 4 files
- /_data/ai-cache.json
- /_data/other_repo_list.csv
- /assets/js/pjax.js
- /_layouts/post.html
2026-06-01 01:09:42 +00:00
6 changed files with 21 additions and 63 deletions

View File

@@ -177,5 +177,6 @@
"/2026/02/08/xslt.html": "这篇文章讲述了Google计划弃用XSLT技术以及作者对这一决定的调查和应对方案。Google基于XSLT用户占比低、库存在漏洞等原因建议将其从Web标准中删除。作者发现许多用户依赖XSLT进行博客订阅美化甚至将其作为博客框架。为了对抗这一趋势有人创建了网站https://xslt.rip并开发了Polyfill库通过WASM方式保持XSLT功能。虽然Polyfill库需要额外引用JS代码但作者已将其提交至CDNJS。随后作者探讨了替代方案包括使用纯CSS美化订阅源由AI生成feed.css以及混合XHTML的方式通过添加XHTML命名空间来实现链接等功能但这种方法会产生“不纯粹”的警告。文章最后总结技术可能会消失但总有其他技术可以解决问题并强调了适应浏览器厂商决策的重要性。", "/2026/02/08/xslt.html": "这篇文章讲述了Google计划弃用XSLT技术以及作者对这一决定的调查和应对方案。Google基于XSLT用户占比低、库存在漏洞等原因建议将其从Web标准中删除。作者发现许多用户依赖XSLT进行博客订阅美化甚至将其作为博客框架。为了对抗这一趋势有人创建了网站https://xslt.rip并开发了Polyfill库通过WASM方式保持XSLT功能。虽然Polyfill库需要额外引用JS代码但作者已将其提交至CDNJS。随后作者探讨了替代方案包括使用纯CSS美化订阅源由AI生成feed.css以及混合XHTML的方式通过添加XHTML命名空间来实现链接等功能但这种方法会产生“不纯粹”的警告。文章最后总结技术可能会消失但总有其他技术可以解决问题并强调了适应浏览器厂商决策的重要性。",
"/2026/03/01/llm3.html": "这篇文章介绍了作者近期在LLM部署和应用方面的经历主要包括以下几个方面\n\n首先作者升级硬件从单张RTX4090 48GiB升级到双路RTX4090 48GiB并购买了TRX40+TR 3960X的主板套装用于运行GPT-OSS模型。随后作者尝试使用vLLM框架替换Ollama并成功配置了GPT-OSS模型达到了接近190Tps的性能。\n\n其次作者体验了DeepSeek 1M上下文模型发现其在处理长上下文任务时表现出色能够展现摘要无法捕捉的细节并成功生成简历、分析人格等。\n\n此外作者还尝试使用DeepSeek重构Mabbs并发现DeepSeek能够识别作者的博客信息这表明训练样本中包含了作者的信息。\n\n最后作者在8GiB内存的MacBook Pro上运行了LFM2.5-1.2B-Thinking模型并使用了Apollo软件体验了其快速的推理速度和良好的思考能力。作者总结认为AI的发展令人惊叹软件优化使其在有限硬件环境下也能运行。", "/2026/03/01/llm3.html": "这篇文章介绍了作者近期在LLM部署和应用方面的经历主要包括以下几个方面\n\n首先作者升级硬件从单张RTX4090 48GiB升级到双路RTX4090 48GiB并购买了TRX40+TR 3960X的主板套装用于运行GPT-OSS模型。随后作者尝试使用vLLM框架替换Ollama并成功配置了GPT-OSS模型达到了接近190Tps的性能。\n\n其次作者体验了DeepSeek 1M上下文模型发现其在处理长上下文任务时表现出色能够展现摘要无法捕捉的细节并成功生成简历、分析人格等。\n\n此外作者还尝试使用DeepSeek重构Mabbs并发现DeepSeek能够识别作者的博客信息这表明训练样本中包含了作者的信息。\n\n最后作者在8GiB内存的MacBook Pro上运行了LFM2.5-1.2B-Thinking模型并使用了Apollo软件体验了其快速的推理速度和良好的思考能力。作者总结认为AI的发展令人惊叹软件优化使其在有限硬件环境下也能运行。",
"/2026/04/14/ai-agent.html": "这篇文章介绍了“AI个人助理”Agent的发展现状和各种尝试。作者体验了OpenClaw、QClaw、WorkBuddy、Cline、LuckClaw和ApkClaw等不同的Agent项目发现它们在功能、易用性和性能上各有优劣。OpenClaw安装和使用存在困难国内大厂的QClaw和WorkBuddy则更易于上手但免费额度有限。作者认为开发任务更适合在编辑器集成AI中进行如GitHub Copilot。LuckClaw在微型开发板上运行表现出色ApkClaw则利用手机的优势操作移动应用。尽管Agent技术仍存在诸多问题但其应用场景不断拓展有望吸引更多人参与其中推动AI应用化进程。", "/2026/04/14/ai-agent.html": "这篇文章介绍了“AI个人助理”Agent的发展现状和各种尝试。作者体验了OpenClaw、QClaw、WorkBuddy、Cline、LuckClaw和ApkClaw等不同的Agent项目发现它们在功能、易用性和性能上各有优劣。OpenClaw安装和使用存在困难国内大厂的QClaw和WorkBuddy则更易于上手但免费额度有限。作者认为开发任务更适合在编辑器集成AI中进行如GitHub Copilot。LuckClaw在微型开发板上运行表现出色ApkClaw则利用手机的优势操作移动应用。尽管Agent技术仍存在诸多问题但其应用场景不断拓展有望吸引更多人参与其中推动AI应用化进程。",
"/2026/05/01/virtual-net.html": "这篇文章介绍了作者在尝试异地组网搭建虚拟局域网时对多种组网工具的探索和体验。作者首先尝试了n2n但由于其项目停止更新且在NAT后的机器间存在掉线问题最终选择了WireGuard作为主要方案。文章详细描述了WireGuard的配置过程包括在Linux、OpenWrt和openEuler系统上的安装和配置并遇到了各种各样的挑战例如在红米AX3000路由器上找不到内核模块以及在openEuler上缺少WireGuard相关包。此外文章还提到了Netmaker和Headscale等WireGuard的控制平面以及VNT和EasyTier等其他组网工具并总结了最终选择WireGuard的原因简单、够用、可靠性不错且已经投入了大量配置。" "/2026/05/01/virtual-net.html": "这篇文章介绍了作者在尝试异地组网搭建虚拟局域网时对多种组网工具的探索和体验。作者首先尝试了n2n但由于其项目停止更新且在NAT后的机器间存在掉线问题最终选择了WireGuard作为主要方案。文章详细描述了WireGuard的配置过程包括在Linux、OpenWrt和openEuler系统上的安装和配置并遇到了各种各样的挑战例如在红米AX3000路由器上找不到内核模块以及在openEuler上缺少WireGuard相关包。此外文章还提到了Netmaker和Headscale等WireGuard的控制平面以及VNT和EasyTier等其他组网工具并总结了最终选择WireGuard的原因简单、够用、可靠性不错且已经投入了大量配置。",
"/2026/06/01/dedupe.html": "这篇文章介绍了如何通过优化游戏资源文件来节约游戏占用的硬盘空间。作者由于Mac只有256GiB的硬盘存储空间在下载了几十部游戏后空间不足于是寻找解决方法。文章主要介绍了以下几点\n\n1. 使用jdupes工具去除重复素材作者发现许多游戏使用相同的引擎和素材导致硬盘空间浪费。通过使用jdupes工具进行硬链接可以有效去除重复文件节约空间。\n\n2. 不同引擎的处理方式:\n - 对于RPG制作大师MV/MZ作者使用RPG Maker Decrypter工具解密资源文件并将图片转换为WebP格式以压缩空间。\n - 对于RPG制作大师XP/VX/VA作者使用mkxp-z工具跨平台运行游戏并通过RPG Maker Decrypter解包资源文件与RTP素材合并后进行去重。\n - 对于Ren'Py游戏作者使用unrpa工具解包rpa文件但由于公共资源不多仅在系列游戏情况下进行解包。\n\n3. 最终效果通过以上优化作者成功将游戏文件夹大小从47G降至33G节约了大量硬盘空间。"
} }

View File

@@ -28,7 +28,6 @@ http://162.215.134.149:4000/mayx/blog
http://durfee.mycrestron.com:3000/mayx/blog http://durfee.mycrestron.com:3000/mayx/blog
https://gitea.nongnghiepso.com/mayx/blog https://gitea.nongnghiepso.com/mayx/blog
https://codes.tools.asitavsen.com/mayx/blog https://codes.tools.asitavsen.com/mayx/blog
http://50.19.111.193:3000/mayx/blog
https://git.zeroplay.io/mayx/blog https://git.zeroplay.io/mayx/blog
http://45.33.87.87/mayx/blog http://45.33.87.87/mayx/blog
http://168.126.28.36:3000/mayx/blog http://168.126.28.36:3000/mayx/blog
@@ -184,7 +183,6 @@ http://120.46.23.215:3000/mayx/blog
http://121.41.2.71:3000/mayx/blog http://121.41.2.71:3000/mayx/blog
http://110.41.177.80:5000/mayx/blog http://110.41.177.80:5000/mayx/blog
https://gitea.dsmaster.myds.me/mayx/blog https://gitea.dsmaster.myds.me/mayx/blog
https://gitea.primecontrols-dev.com/mayx/blog
http://www.scserverddns.top:13000/mayx/blog http://www.scserverddns.top:13000/mayx/blog
https://git.lucas-michel.fr/mayx/blog https://git.lucas-michel.fr/mayx/blog
https://git.imvictor.tech:2/mayx/blog https://git.imvictor.tech:2/mayx/blog
1 repo_url
28 http://durfee.mycrestron.com:3000/mayx/blog
29 https://gitea.nongnghiepso.com/mayx/blog
30 https://codes.tools.asitavsen.com/mayx/blog
http://50.19.111.193:3000/mayx/blog
31 https://git.zeroplay.io/mayx/blog
32 http://45.33.87.87/mayx/blog
33 http://168.126.28.36:3000/mayx/blog
183 http://121.41.2.71:3000/mayx/blog
184 http://110.41.177.80:5000/mayx/blog
185 https://gitea.dsmaster.myds.me/mayx/blog
https://gitea.primecontrols-dev.com/mayx/blog
186 http://www.scserverddns.top:13000/mayx/blog
187 https://git.lucas-michel.fr/mayx/blog
188 https://git.imvictor.tech:2/mayx/blog

View File

@@ -162,7 +162,7 @@ $.get(BlogAPI + "/suggest?id={{ page.url }}&update=" + lastUpdated.valueOf(), fu
<div id="gitalk-container" data-page-id="{{ page.id }}"></div> <div id="gitalk-container" data-page-id="{{ page.id }}"></div>
<script> <script>
var gitalk = new Gitalk(Object.assign({ id: '{{ page.id }}' }, GitalkConfig)) var gitalk = new Gitalk($.extend({ id: '{{ page.id }}' }, GitalkConfig));
gitalk.render('gitalk-container') gitalk.render('gitalk-container');
</script> </script>
<!-- <![endif]--> <!-- <![endif]-->

View File

@@ -1,51 +1,21 @@
/**
* 根据 URL ?kw= 参数高亮页面内匹配的关键词。
* 提取为全局函数,供 pjax.js 在页面切换后复用,避免重复实现。
*/
function highlightKeyword() { function highlightKeyword() {
const urlParams = new URLSearchParams(window.location.search); var match = location.search.match(/[?&]kw=([^&]+)/);
const keyword = urlParams.get('kw')?.trim(); var kw = match ? $.trim(decodeURIComponent(match[1].replace(/\+/g, ' '))) : '';
if (!kw) return;
if (!keyword) return; var reg = new RegExp('(' + kw.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + ')', 'gi');
var escapeMap = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' };
// 转义正则表达式特殊字符,避免安全问题 $('section, section *').not('script, style, textarea').contents().filter(function() {
const escapedKeyword = keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); return this.nodeType === 3;
// 创建不区分大小写的正则表达式(全局匹配) }).each(function() {
const regex = new RegExp(`(${escapedKeyword})`, 'gi'); var escapedText = this.nodeValue.replace(/[&<>"']/g, function(m) { return escapeMap[m]; });
var highlighted = escapedText.replace(reg, '<mark>$1</mark>');
// 递归遍历并高亮文本节点 if (escapedText !== highlighted) {
const escapeHTML = str => str.replace(/[&<>"']/g, $(this).replaceWith(highlighted);
tag => ({
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#39;'
}[tag] || tag));
function highlightTextNodes(element) {
$(element).contents().each(function () {
if (this.nodeType === Node.TEXT_NODE) {
const $this = $(this);
const text = escapeHTML($this.text());
// 使用正则替换并保留原始大小写
if (regex.test(text)) {
const replaced = text.replace(regex, '<mark>$1</mark>');
$this.replaceWith(replaced);
}
} else if (
this.nodeType === Node.ELEMENT_NODE &&
!$(this).is('script, style, noscript, textarea')
) {
highlightTextNodes(this);
} }
}); });
} }
$('section').each(function () {
highlightTextNodes(this);
});
};
function initCopyButtons() { function initCopyButtons() {
$('.copy').remove(); $('.copy').remove();

View File

@@ -10,19 +10,12 @@
var PJAX_OPTS = { var PJAX_OPTS = {
container: CONTAINER, container: CONTAINER,
fragment: CONTAINER, fragment: CONTAINER,
timeout: 8000, timeout: 5000,
scrollTo: false scrollTo: false
}; };
// ========== 各组件重初始化 ========== // ========== 各组件重初始化 ==========
/** AI 摘要post.html 内联脚本pjax 后由 executeScripts 触发) */
function reinitAISummary() {
if (typeof ai_gen === 'function' && $('#ai-output').length) {
try { ai_gen(); } catch (e) { /* ignore */ }
}
}
/** Google Analytics 页面浏览事件 */ /** Google Analytics 页面浏览事件 */
function trackPageView() { function trackPageView() {
if (typeof gtag === 'function') { if (typeof gtag === 'function') {
@@ -114,7 +107,6 @@
initVisitors(); initVisitors();
initCopyButtons(); initCopyButtons();
highlightKeyword(); highlightKeyword();
reinitAISummary();
reinitLive2d(); reinitLive2d();
trackPageView(); trackPageView();
scrollToAnchor(); scrollToAnchor();
@@ -134,9 +126,6 @@
$('body').addClass('pjax-loading'); $('body').addClass('pjax-loading');
}); });
$(document).on('pjax:complete', doPjaxComplete); $(document).on('pjax:complete', doPjaxComplete);
$(document).on('pjax:error', function (xhr, textStatus, error) {
console.warn('[pjax] error, fallback:', error);
});
$(document).on('pjax:end', function (event, xhr, options) { $(document).on('pjax:end', function (event, xhr, options) {
var $container = $(options.container || PJAX_OPTS.container); var $container = $(options.container || PJAX_OPTS.container);

View File

@@ -12,7 +12,7 @@ image: https://screenshot.mayx.eu.org/
<!-- 遍历分页后的文章 --> <!-- 遍历分页后的文章 -->
<table class="entry-content h-feed"> <table class="entry-content h-feed">
{% for post in paginator.posts %} {% for post in paginator.posts %}
<tr><td class="h-entry" data-url="{{ post.url }}"> <tr><td class="h-entry post-row" data-url="{{ post.url }}">
<h2 class="p-name"><a class="post-link u-url" href="{{ post.url }}">{{ post.title }}{% if post.layout == "encrypt" %} [加密] {% endif %}</a></h2> <h2 class="p-name"><a class="post-link u-url" href="{{ post.url }}">{{ post.title }}{% if post.layout == "encrypt" %} [加密] {% endif %}</a></h2>
<p> <p>
<time class="date dt-published" datetime="{{ post.date | date_to_xmlschema }}">{{ post.date | date: "%-d %B %Y" }}</time> <time class="date dt-published" datetime="{{ post.date | date_to_xmlschema }}">{{ post.date | date: "%-d %B %Y" }}</time>
@@ -79,7 +79,7 @@ image: https://screenshot.mayx.eu.org/
<a href="https://xn--sr8hvo.ws/next"></a><br /><a href="https://icp.gov.moe/?keyword=20218888" target="_blank">萌ICP备 20218888号</a></small> <a href="https://xn--sr8hvo.ws/next"></a><br /><a href="https://icp.gov.moe/?keyword=20218888" target="_blank">萌ICP备 20218888号</a></small>
<input name="live2dBGM" value="https://music.163.com/song/media/outer/url?id=523658881.mp3" type="hidden" /> <input name="live2dBGM" value="https://music.163.com/song/media/outer/url?id=523658881.mp3" type="hidden" />
<script> <script>
$(document).on('click', '.h-entry', function(e) { $(document).on('click', '.post-row', function(e) {
if ($(e.target).closest('.p-category').length === 0) { if ($(e.target).closest('.p-category').length === 0) {
go($(this).attr('data-url')); go($(this).attr('data-url'));
} }