48 Commits

Author SHA1 Message Date
mayx b8b29f86d5 Update 4 files
- /_data/other_repo_list.csv
- /_data/links.csv
- /nilaila-verify.txt
- /index.html
2026-07-18 09:39:55 +00:00
mayx 0e4e4d2fb7 Update 4 files
- /_data/other_repo_list.csv
- /_data/ai-cache.json
- /bo-ke-verify-24f0040157c07cc424b28b7b52ea734d.txt
- /_posts/2026-07-01-vibe-coding.md
2026-07-14 12:07:34 +00:00
mayx 7943cc7d6a Update 5 files
- /_data/other_repo_list.csv
- /index.html
- /_posts/2026-07-01-vibe-coding.md
- /assets/js/main_new.js
- /assets/js/main.js
2026-06-30 16:00:55 +00:00
Mayx 772e3ed0b7 Merge pull request #204 from exyone-js/master
添加友链 - Add exyone's blog links to links.csv
2026-06-25 15:50:29 +08:00
exyone ee4c9acfde Update EXYONE blog URL in links.csv 2026-06-25 15:37:06 +08:00
exyone 2acc1f6fd7 Add exyone's blog links to links.csv 2026-06-25 14:41:12 +08:00
Mayx 5f2a3a99ee Merge pull request #203 from xingwangzhe/patch-1
友链:xingwangzhe
2026-06-09 15:43:55 +08:00
王兴家 36cf19d4aa 友链:xingwangzhe
名称	姓王者的博客
图标	https://xingwangzhe.fun/avatar.webp
网址	https://xingwangzhe.fun/
描述	探索、学习、进步、创造无限可能!
2026-06-09 15:37:22 +08:00
Mayx 9c769e4ab2 Merge pull request #202 from Typhoon-Messenger/patch-1
Update links.csv
2026-06-09 15:15:58 +08:00
初然忆 fd5f1703dd Update links.csv 2026-06-09 15:11:55 +08:00
mayx 2a512a487d Update 3 files
- /_data/other_repo_list.csv
- /_data/links.csv
- /assets/js/jquery.min.js
2026-06-03 06:45:43 +00:00
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
mayx 71d493c2a8 Update 4 files
- /_data/other_repo_list.csv
- /_posts/2026-06-01-dedupe.md
- /assets/js/pjax.js
- /index.html
2026-05-31 16:00:35 +00:00
mayx 156f964333 Update 3 files
- /_data/other_repo_list.csv
- /assets/js/main_new.js
- /assets/js/pjax.js
2026-05-27 02:37:23 +00:00
mayx 481df19596 Update 5 files
- /_layouts/default.html
- /_data/proxylist.yml
- /assets/js/main.js
- /assets/js/pjax.js
- /assets/js/main_new.js
2026-05-23 10:06:55 +00:00
mayx 1a529143a8 Update 6 files
- /assets/js/pjax.js
- /assets/js/gitalk.min.js
- /assets/js/jquery.min.js
- /assets/css/gitalk.css
- /_data/proxylist.yml
- /_tools/stormkit-env_install
2026-05-22 16:07:03 +00:00
mayx b25a864ee3 Update 3 files
- /_layouts/default.html
- /assets/js/pjax.js
- /assets/css/style.scss
2026-05-22 12:52:39 +00:00
mayx c5ad917d9e Update 6 files
- /_layouts/post.html
- /_layouts/default.html
- /assets/js/main.js
- /assets/js/pjax.js
- /_data/other_repo_list.csv
- /Live2dHistoire/live2d/js/message.js
2026-05-22 12:00:45 +00:00
mayx d6274791a8 Update 2 files
- /assets/js/pjax.js
- /index.html
2026-05-21 10:11:01 +00:00
mayx 111dc1e25f Update 2 files
- /assets/js/pjax.js
- /index.html
2026-05-21 08:27:59 +00:00
mayx c4ae25dcb1 Update 10 files
- /assets/js/jquery.pjax.min.js
- /assets/js/main.js
- /assets/js/pjax.js
- /_layouts/default.html
- /_layouts/post.html
- /_data/proxylist.yml
- /_data/other_repo_list.csv
- /Live2dHistoire/live2d/js/message.js
- /index.html
- /search.html
2026-05-21 07:38:17 +00:00
mayx 862bffac80 Update 3 files
- /_data/proxylist.yml
- /_data/other_repo_list.csv
- /_tools/envs_post-receive
2026-05-19 03:31:46 +00:00
mayx c888a89f41 Update 4 files
- /_layouts/default.html
- /_data/other_repo_list.csv
- /_data/links.csv
- /llms.txt
2026-05-18 15:24:55 +00:00
mayx b48e93890c Update 3 files
- /llms.txt
- /_tools/ai-summary.js
- /humans.txt
2026-05-18 05:08:37 +00:00
mayx f6b35814b1 Update 3 files
- /_data/other_repo_list.csv
- /humans.txt
- /llms.txt
2026-05-18 04:25:41 +00:00
mayx fe26e4f6c3 Update 2 files
- /_data/other_repo_list.csv
- /_data/ai-cache.json
2026-05-05 12:22:11 +00:00
mayx 45f1183f9a Update 2 files
- /_data/other_repo_list.csv
- /_posts/2026-05-01-virtual-net.md
2026-05-01 10:54:34 +00:00
mayx dd1141d872 Update 3 files
- /_data/proxylist.yml
- /_data/other_repo_list.csv
- /proxylist.md
2026-04-26 12:29:39 +00:00
mayx c0ca105edc Update 3 files
- /README.md
- /_data/proxylist.yml
- /_data/other_repo_list.csv
2026-04-25 15:20:00 +00:00
mayx bc45ef27b8 Update 2 files
- /_data/proxylist.yml
- /_data/other_repo_list.csv
2026-04-21 07:20:53 +00:00
mayx 47f623b8eb Update 2 files
- /_layouts/xslt_container.html
- /_data/other_repo_list.csv
2026-04-17 01:53:23 +00:00
mayx 33122e34b5 Update 3 files
- /_posts/2026-04-14-ai-agent.md
- /_data/other_repo_list.csv
- /_data/ai-cache.json
2026-04-15 11:35:09 +00:00
mayx 100d3405f7 Update 2 files
- /_posts/2026-04-14-ai-agent.md
- /_data/other_repo_list.csv
2026-04-14 12:44:42 +00:00
mayx a7ff7c2c37 Update 2 files
- /_data/other_repo_list.csv
- /_data/proxylist.yml
2026-03-28 16:02:31 +00:00
mayx 47e04279d0 Update 2 files
- /_data/other_repo_list.csv
- /_data/proxylist.yml
2026-03-27 09:18:40 +00:00
mayx cd478c22a2 Update 3 files
- /_data/other_repo_list.csv
- /_data/links.csv
- /_posts/2025-12-01-linux.md
2026-03-23 14:07:38 +00:00
mayx e094b6d205 Update 3 files
- /_data/links.csv
- /_data/other_repo_list.csv
- /_layouts/default.html
2026-03-21 19:22:38 +00:00
mayx e8653b0efd Update 5 files
- /_data/other_repo_list.csv
- /_layouts/default.html
- /proxylist.md
- /other_repo_list.md
- /links.md
2026-03-17 12:19:07 +00:00
mayx e516a5d08c Update 4 files
- /index.html
- /_layouts/post.html
- /_layouts/xslt_container.html
- /_data/other_repo_list.csv
2026-03-14 20:05:09 +00:00
mayx cf76264bb0 Update 2 files
- /_data/other_repo_list.csv
- /_data/proxylist.yml
2026-03-13 17:15:05 +00:00
mayx 0a7608b3f0 Update 4 files
- /_data/other_repo_list.csv
- /_data/proxylist.yml
- /index.html
- /_layouts/post.html
2026-03-12 16:17:24 +00:00
mayx 5fd8d2fe0f Update 2 files
- /archives.md
- /_data/other_repo_list.csv
2026-03-08 10:54:41 +00:00
mayx c9dfb10733 Update 3 files
- /_data/ai-cache.json
- /_data/proxylist.yml
- /_data/other_repo_list.csv
2026-03-04 12:01:56 +00:00
mayx 23fff44d79 Update 3 files
- /_posts/2026-03-01-llm3.md
- /_data/other_repo_list.csv
- /_data/proxylist.yml
2026-03-01 09:08:52 +00:00
mayx 6630ba964b Update 3 files
- /_data/other_repo_list.csv
- /_data/proxylist.yml
- /assets/css/feed.css
2026-02-26 14:54:24 +00:00
mayx 00aec9bad0 Update 5 files
- /_data/other_repo_list.csv
- /_data/links.csv
- /_data/proxylist.yml
- /assets/css/feed.css
- /_layouts/default.html
2026-02-25 07:29:29 +00:00
mayx 2ab6982684 Update 3 files
- /assets/css/style.scss
- /_data/other_repo_list.csv
- /_data/ai-cache.json
2026-02-11 09:54:52 +00:00
37 changed files with 1344 additions and 859 deletions
+108 -95
View File
@@ -22,6 +22,8 @@ if (!norunFlag) {
var sleepTimer_ = null; var sleepTimer_ = null;
var AITalkFlag = false; var AITalkFlag = false;
var talkNum = 0; var talkNum = 0;
// 暴露到全局,供 pjax.js 在页面切换后重新调用
window._live2d = { initTips: null, showMessage: null, showHitokoto: null };
(function () { (function () {
function renderTip(template, context) { function renderTip(template, context) {
var tokenReg = /(\\)?\{([^\{\}\\]+)(\\)?\}/g; var tokenReg = /(\\)?\{([^\{\}\\]+)(\\)?\}/g;
@@ -33,11 +35,11 @@ if (!norunFlag) {
var currentObject = context; var currentObject = context;
var i, length, variable; var i, length, variable;
for (i = 0, length = variables.length; i < length; ++i) { for (i = 0, length = variables.length; i < length; ++i) {
variable = variables[i]; variable = currentObject[variables[i]];
currentObject = currentObject[variable]; if (variable === undefined || variable === null) return '';
if (currentObject === undefined || currentObject === null) return ''; currentObject = variable;
} }
return currentObject; return String(currentObject);
}); });
} }
@@ -56,14 +58,20 @@ if (!norunFlag) {
showMessage('你都复制了些什么呀,转载要记得加上出处哦~~', 5000); showMessage('你都复制了些什么呀,转载要记得加上出处哦~~', 5000);
}); });
// 缓存 message.json 数据,供 PJAX 重绑定使用
var tipsData = null;
function initTips() { function initTips() {
$.ajax({ $.ajax({
cache: true, cache: true,
url: message_Path + 'message.json', url: message_Path + 'message.json',
dataType: "json", dataType: "json",
success: function (result) { success: function (result) {
tipsData = result;
// 解绑旧事件(用命名空间避免影响其他绑定)
$.each(result.mouseover, function (index, tips) { $.each(result.mouseover, function (index, tips) {
$(tips.selector).mouseover(function () { $(tips.selector).off('mouseover._live2d_tips mouseout._live2d_tips');
$(tips.selector).on('mouseover._live2d_tips', function () {
var text = tips.text; var text = tips.text;
if (Array.isArray(tips.text)) text = tips.text[Math.floor(Math.random() * tips.text.length + 1) - 1]; if (Array.isArray(tips.text)) text = tips.text[Math.floor(Math.random() * tips.text.length + 1) - 1];
text = text.renderTip({ text: $(this).text() }); text = text.renderTip({ text: $(this).text() });
@@ -72,7 +80,7 @@ if (!norunFlag) {
clearInterval(liveTlakTimer); clearInterval(liveTlakTimer);
liveTlakTimer = null; liveTlakTimer = null;
}); });
$(tips.selector).mouseout(function () { $(tips.selector).on('mouseout._live2d_tips', function () {
showHitokoto(); showHitokoto();
if (liveTlakTimer == null) { if (liveTlakTimer == null) {
liveTlakTimer = window.setInterval(function () { liveTlakTimer = window.setInterval(function () {
@@ -82,7 +90,8 @@ if (!norunFlag) {
}); });
}); });
$.each(result.click, function (index, tips) { $.each(result.click, function (index, tips) {
$(tips.selector).click(function () { $(tips.selector).off('click._live2d_tips');
$(tips.selector).on('click._live2d_tips', function () {
if (hitFlag) { if (hitFlag) {
return false return false
} }
@@ -106,46 +115,22 @@ if (!norunFlag) {
} }
}); });
} }
window._live2d.initTips = initTips;
initTips(); initTips();
var text; var text;
if (document.referrer !== '' && document.referrer.split('/')[2] !== window.location.host) { if (document.referrer !== '' && document.referrer.split('/')[2] !== window.location.host) {
var referrer = document.createElement('a'); var referrer = document.createElement('a');
referrer.href = document.referrer; referrer.href = document.referrer;
text = '嗨!来自 <span style="color:#0099cc;">' + referrer.hostname + '</span> 的朋友!';
var domain = referrer.hostname.split('.')[1]; var domain = referrer.hostname.split('.')[1];
if (domain == 'baidu') { if (domain == 'baidu' || domain == 'so' || domain == 'google') {
text = '嗨! 来自 百度搜索 的朋友!<br>欢迎访问<span style="color:#0099cc;">「 ' + document.title.split(' | ')[0] + ' 」</span>'; var source = domain == 'baidu' ? '百度搜索' : domain == 'so' ? '360搜索' : '谷歌搜索';
} else if (domain == 'so') { text = '嗨! 来自 ' + source + ' 的朋友!<br>欢迎访问<span style="color:#0099cc;">「 ' + document.title.split(' | ')[0] + ' 」</span>';
text = '嗨! 来自 360搜索 的朋友!<br>欢迎访问<span style="color:#0099cc;">「 ' + document.title.split(' | ')[0] + ' 」</span>'; } else {
} else if (domain == 'google') { text = '嗨!来自 <span style="color:#0099cc;">' + referrer.hostname + '</span> 的朋友!';
text = '嗨! 来自 谷歌搜索 的朋友!<br>欢迎访问<span style="color:#0099cc;">「 ' + document.title.split(' | ')[0] + ' 」</span>';
} }
} else { } else {
if (window.location.pathname == "/") { //主页URL判断,需要斜杠结尾 text = getWelcomeText();
var now = (new Date()).getHours();
if (now > 23 || now <= 5) {
text = '你是夜猫子呀?这么晚还不睡觉,明天起的来嘛?';
} else if (now > 5 && now <= 7) {
text = '早上好!一日之计在于晨,美好的一天就要开始了!';
} else if (now > 7 && now <= 11) {
text = '上午好!工作顺利嘛,不要久坐,多起来走动走动哦!';
} else if (now > 11 && now <= 14) {
text = '中午了,工作了一个上午,现在是午餐时间!';
} else if (now > 14 && now <= 17) {
text = '午后很容易犯困呢,今天的运动目标完成了吗?';
} else if (now > 17 && now <= 19) {
text = '傍晚了!窗外夕阳的景色很美丽呢,最美不过夕阳红~~';
} else if (now > 19 && now <= 21) {
text = '晚上好,今天过得怎么样?';
} else if (now > 21 && now <= 23) {
text = '已经这么晚了呀,早点休息吧,晚安~~';
} else {
text = '嗨~ 快来逗我玩吧!';
}
} else {
text = '欢迎阅读<span style="color:#0099cc;">「 ' + document.title.split(' | ')[0] + ' 」</span>';
}
} }
showMessage(text, 12000); showMessage(text, 12000);
})(); })();
@@ -172,6 +157,7 @@ if (!norunFlag) {
console.log(sleepTimer_); console.log(sleepTimer_);
} }
} }
window._live2d.showHitokoto = showHitokoto;
function checkSleep() { function checkSleep() {
var sleepStatu = sessionStorage.getItem("Sleepy"); var sleepStatu = sessionStorage.getItem("Sleepy");
@@ -213,6 +199,7 @@ if (!norunFlag) {
//if (timeout === null) timeout = 5000; //if (timeout === null) timeout = 5000;
//hideMessage(timeout); //hideMessage(timeout);
} }
window._live2d.showMessage = showMessage;
function talkValTimer() { function talkValTimer() {
$('#live_talk').val('1'); $('#live_talk').val('1');
} }
@@ -384,74 +371,100 @@ if (!norunFlag) {
}; };
}; };
//获取音乐信息初始化 //获取音乐信息初始化
var bgmListInfo = $('input[name=live2dBGM]'); var $bgm = $('#live2d_bgm');
if (bgmListInfo.length == 0) {
$('#musicButton').hide(); // 音乐按钮点击事件(幂等,使用命名空间避免重复绑定)
} else { $('#musicButton').off('click._bgm').on('click._bgm', function () {
var bgmPlayNow = parseInt($('#live2d_bgm').attr('data-bgm')); if ($('#musicButton').hasClass('play')) {
var bgmPlayTime = 0; $bgm[0].pause();
var live2dBGM_Num = sessionStorage.getItem("live2dBGM_Num"); $('#musicButton').removeClass('play');
var live2dBGM_PlayTime = sessionStorage.getItem("live2dBGM_PlayTime"); sessionStorage.setItem("live2dBGM_IsPlay", '1');
if (live2dBGM_Num) { } else {
if (live2dBGM_Num <= $('input[name=live2dBGM]').length - 1) { $bgm[0].play();
bgmPlayNow = parseInt(live2dBGM_Num);
}
}
if (live2dBGM_PlayTime) {
bgmPlayTime = parseInt(live2dBGM_PlayTime);
}
var live2dBGMSrc = bgmListInfo.eq(bgmPlayNow).val();
$('#live2d_bgm').attr('data-bgm', bgmPlayNow);
$('#live2d_bgm').attr('src', live2dBGMSrc);
$('#live2d_bgm')[0].currentTime = bgmPlayTime;
$('#live2d_bgm')[0].volume = 0.5;
var live2dBGM_IsPlay = sessionStorage.getItem("live2dBGM_IsPlay");
var live2dBGM_WindowClose = sessionStorage.getItem("live2dBGM_WindowClose");
if (live2dBGM_IsPlay == '0' && live2dBGM_WindowClose == '0') {
$('#live2d_bgm')[0].play();
$('#musicButton').addClass('play'); $('#musicButton').addClass('play');
sessionStorage.setItem("live2dBGM_IsPlay", '0');
} }
sessionStorage.setItem("live2dBGM_WindowClose", '1'); });
$('#musicButton').on('click', function () {
if ($('#musicButton').hasClass('play')) { // BGM 事件监听(仅绑定一次,使用标志位避免重复)
$('#live2d_bgm')[0].pause(); if (!window._live2d._bgmEventsBound) {
$('#musicButton').removeClass('play'); $bgm[0].addEventListener("timeupdate", function () {
sessionStorage.setItem("live2dBGM_IsPlay", '1'); sessionStorage.setItem("live2dBGM_PlayTime", $bgm[0].currentTime);
} else { });
$('#live2d_bgm')[0].play(); $bgm[0].addEventListener("ended", function () {
$('#musicButton').addClass('play'); var listNow = parseInt($bgm.attr('data-bgm'));
sessionStorage.setItem("live2dBGM_IsPlay", '0'); listNow++;
var inputs = $('input[name=live2dBGM]');
if (inputs.length === 0) return;
if (listNow > inputs.length - 1) {
listNow = 0;
} }
var listNewSrc = inputs.eq(listNow).val();
if (!listNewSrc) return;
sessionStorage.setItem("live2dBGM_Num", listNow);
$bgm.attr('src', listNewSrc);
$bgm[0].play();
$bgm.attr('data-bgm', listNow);
});
$bgm[0].addEventListener("error", function () {
$bgm[0].pause();
$('#musicButton').removeClass('play');
showMessage('音乐似乎加载不出来了呢!', 0);
}); });
window.onbeforeunload = function () { window.onbeforeunload = function () {
sessionStorage.setItem("live2dBGM_WindowClose", '0'); sessionStorage.setItem("live2dBGM_WindowClose", '0');
if ($('#musicButton').hasClass('play')) { if ($('#musicButton').hasClass('play')) {
sessionStorage.setItem("live2dBGM_IsPlay", '0'); sessionStorage.setItem("live2dBGM_IsPlay", '0');
} }
} };
document.getElementById('live2d_bgm').addEventListener("timeupdate", function () { window._live2d._bgmEventsBound = true;
var live2dBgmPlayTimeNow = document.getElementById('live2d_bgm').currentTime; }
sessionStorage.setItem("live2dBGM_PlayTime", live2dBgmPlayTimeNow);
}); // 初始化 BGM(根据当前页面是否有 BGM 输入)
document.getElementById('live2d_bgm').addEventListener("ended", function () { if (typeof window._live2d.initBGM === 'function') {
var listNow = parseInt($('#live2d_bgm').attr('data-bgm')); window._live2d.initBGM();
listNow++;
if (listNow > $('input[name=live2dBGM]').length - 1) {
listNow = 0;
}
var listNewSrc = $('input[name=live2dBGM]').eq(listNow).val();
sessionStorage.setItem("live2dBGM_Num", listNow);
$('#live2d_bgm').attr('src', listNewSrc);
$('#live2d_bgm')[0].play();
$('#live2d_bgm').attr('data-bgm', listNow);
});
document.getElementById('live2d_bgm').addEventListener("error", function () {
$('#live2d_bgm')[0].pause();
$('#musicButton').removeClass('play');
showMessage('音乐似乎加载不出来了呢!', 0);
});
} }
} }
// 暴露 BGM 初始化函数,供 PJAX 重初始化时调用
window._live2d.initBGM = function() {
var bgmListInfo = $('input[name=live2dBGM]');
var $bgm = $('#live2d_bgm');
if (bgmListInfo.length === 0) {
$('#musicButton').hide();
if ($bgm.length) $bgm[0].pause();
return;
}
var bgmPlayNow = parseInt($bgm.attr('data-bgm')) || 0;
var bgmPlayTime = 0;
var live2dBGM_Num = sessionStorage.getItem("live2dBGM_Num");
var live2dBGM_PlayTime = sessionStorage.getItem("live2dBGM_PlayTime");
if (live2dBGM_Num) {
if (parseInt(live2dBGM_Num) <= bgmListInfo.length - 1) {
bgmPlayNow = parseInt(live2dBGM_Num);
}
}
if (live2dBGM_PlayTime) {
bgmPlayTime = parseFloat(live2dBGM_PlayTime);
}
var newSrc = bgmListInfo.eq(bgmPlayNow).val();
$bgm.attr('data-bgm', bgmPlayNow);
if ($bgm.attr('src') !== newSrc) {
$bgm[0].pause();
$bgm.attr('src', newSrc);
$bgm[0].currentTime = bgmPlayTime;
}
$bgm[0].volume = 0.5;
var live2dBGM_IsPlay = sessionStorage.getItem("live2dBGM_IsPlay");
var live2dBGM_WindowClose = sessionStorage.getItem("live2dBGM_WindowClose");
if (live2dBGM_IsPlay == '0' && live2dBGM_WindowClose == '0') {
$bgm[0].play();
$('#musicButton').addClass('play');
}
sessionStorage.setItem("live2dBGM_WindowClose", '1');
$('#musicButton').show();
};
$(document).ready(function () { $(document).ready(function () {
var AIimgSrc = [ var AIimgSrc = [
message_Path + "model/histoire/histoire.1024/texture_00.png", message_Path + "model/histoire/histoire.1024/texture_00.png",
+1 -1
View File
@@ -50,4 +50,4 @@ Powered by [Jekyll](https://github.com/jekyll/jekyll)
本站转载的文章如无特别说明,均按原文章的协议执行 本站转载的文章如无特别说明,均按原文章的协议执行
## 打赏/赞助 Mayx ## 打赏/赞助 Mayx
![QRCode](/images/QRCode.png) ![QRCode](images/QRCode.png)
+7 -1
View File
@@ -173,5 +173,11 @@
"/2025/10/12/recover.html": "这篇文章讲述了作者通过GitHub的Fork特性找回一个被删除的Brainfuck可视化演示仓库的经历。由于原仓库和作者主页都已消失,作者推测GitHub在Fork时会共享对象库,只要有任意一个Fork仓库存在,GitHub就会保留所有对象,从而可以通过找到一个Fork仓库的最新提交Hash值来还原目标仓库。作者通过Linux内核仓库的Fork进行验证,随后在互联网档案馆上找到目标仓库的Fork以及其Hash值,最终通过Git命令将本地仓库的HEAD指针指向目标提交,成功恢复了该仓库的代码,并将其部署到自己的GitHub Pages上。最后,作者发现Software Heritage组织会保存所有代码,因此在遇到类似情况时可以直接通过该平台进行查找。", "/2025/10/12/recover.html": "这篇文章讲述了作者通过GitHub的Fork特性找回一个被删除的Brainfuck可视化演示仓库的经历。由于原仓库和作者主页都已消失,作者推测GitHub在Fork时会共享对象库,只要有任意一个Fork仓库存在,GitHub就会保留所有对象,从而可以通过找到一个Fork仓库的最新提交Hash值来还原目标仓库。作者通过Linux内核仓库的Fork进行验证,随后在互联网档案馆上找到目标仓库的Fork以及其Hash值,最终通过Git命令将本地仓库的HEAD指针指向目标提交,成功恢复了该仓库的代码,并将其部署到自己的GitHub Pages上。最后,作者发现Software Heritage组织会保存所有代码,因此在遇到类似情况时可以直接通过该平台进行查找。",
"/2025/11/01/mirrors.html": "这篇文章讲述了作者为了提高博客的可靠性,探索利用被滥用的Git平台进行博客镜像的想法和实践。作者发现一些Git实例存在大量空仓库和异常用户,怀疑是SEO公司滥用,因此决定利用这些平台进行博客镜像备份,以应对平台倒闭或数据丢失的风险。作者选择Gitea和Forgejo平台作为目标,编写脚本自动注册账号并导入博客仓库,实现了自动化镜像分发。作者也意识到此类平台的稳定性存在不确定性,并思考了“量”和“质”两种方式确保博客永恒性的优劣,最终认为建立一个活跃的、自动执行维护操作的网络可能更有效。文章最后展示了作者创建的Git镜像列表,并表达了对博客永恒性的思考。", "/2025/11/01/mirrors.html": "这篇文章讲述了作者为了提高博客的可靠性,探索利用被滥用的Git平台进行博客镜像的想法和实践。作者发现一些Git实例存在大量空仓库和异常用户,怀疑是SEO公司滥用,因此决定利用这些平台进行博客镜像备份,以应对平台倒闭或数据丢失的风险。作者选择Gitea和Forgejo平台作为目标,编写脚本自动注册账号并导入博客仓库,实现了自动化镜像分发。作者也意识到此类平台的稳定性存在不确定性,并思考了“量”和“质”两种方式确保博客永恒性的优劣,最终认为建立一个活跃的、自动执行维护操作的网络可能更有效。文章最后展示了作者创建的Git镜像列表,并表达了对博客永恒性的思考。",
"/2025/12/01/linux.html": "这篇文章介绍了在浏览器中运行Linux的各种方法,从最初的纯JS虚拟机JSLinux,到后来的WASM虚拟机如v86、WebVM、WebCM,再到容器化方案container2wasm,以及直接将Linux内核编译为WASM的方案。作者详细对比了这些方案的优缺点,包括性能、兼容性、功能和开发难度。文章还提到了模仿Linux环境的WebContainers和JupyterLite,并最终认为虚拟机方案更靠谱,但对WASM的未来充满期待。作者最后表示,博客上添加类似功能的计划还在考虑中,目前主要分享了各种方法的探索过程。", "/2025/12/01/linux.html": "这篇文章介绍了在浏览器中运行Linux的各种方法,从最初的纯JS虚拟机JSLinux,到后来的WASM虚拟机如v86、WebVM、WebCM,再到容器化方案container2wasm,以及直接将Linux内核编译为WASM的方案。作者详细对比了这些方案的优缺点,包括性能、兼容性、功能和开发难度。文章还提到了模仿Linux环境的WebContainers和JupyterLite,并最终认为虚拟机方案更靠谱,但对WASM的未来充满期待。作者最后表示,博客上添加类似功能的计划还在考虑中,目前主要分享了各种方法的探索过程。",
"/2026/01/01/summary.html": "这篇文章介绍了作者对2025年的年终总结,主要表达了对自身状态的担忧和对未来的不确定感。作者认为自己在记忆和思考能力方面有所下滑,稳定性较低,且未能抓住资产保值的机会。同时,文章也记录了AI技术的飞速发展,以及自己博客内容与时代脱节的现象。尽管对未来感到迷茫,作者仍然抱有一丝希望,期望在2026年做出正确的选择,避免陷入危险。" "/2026/01/01/summary.html": "这篇文章介绍了作者对2025年的年终总结,主要表达了对自身状态的担忧和对未来的不确定感。作者认为自己在记忆和思考能力方面有所下滑,稳定性较低,且未能抓住资产保值的机会。同时,文章也记录了AI技术的飞速发展,以及自己博客内容与时代脱节的现象。尽管对未来感到迷茫,作者仍然抱有一丝希望,期望在2026年做出正确的选择,避免陷入危险。",
"/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/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/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,节约了大量硬盘空间。",
"/2026/07/01/vibe-coding.html": "这篇文章介绍了作者使用AI Agent进行Vibe Coding的体验。作者通过AI Agent生成代码,实现了博客的PJAX功能和一个立直麻将Wordle小游戏。在使用AI Agent的过程中,作者发现它能够理解整个项目的代码,并且能够根据需求进行修改和优化。然而,作者也遇到了一些问题,例如生成的代码质量不高,需要手动优化和调试。\n\n作者首先使用AI Agent为博客添加了PJAX功能,实现了无刷新加载页面。虽然生成的代码质量不高,但作者还是成功地实现了该功能。接着,作者使用AI Agent生成了一个立直麻将Wordle小游戏,并对其进行了优化和修改。作者还遇到了一些技术问题,例如字体兼容性和役种计算问题,但最终都通过AI Agent解决了。\n\n通过这次体验,作者认为Vibe Coding的体验相当不错,但也存在一些问题。完全由AI生成的代码可能会出现问题,需要手动优化和调试。然而,如果能够正确地使用AI Agent,也可以实现高质量的代码。作者还提到,有时候自己调查和研究比问AI更有效,可以避免浪费时间和精力。"
} }
+7 -4
View File
@@ -2,10 +2,9 @@ title,link,feed_url,description
花火学园,https://www.sayhanabi.net/,,和谐融洽的ACG交流以及资源聚集地 花火学园,https://www.sayhanabi.net/,,和谐融洽的ACG交流以及资源聚集地
资源统筹局,https://gkdworld.com/,,统筹保管用户分享的资源 资源统筹局,https://gkdworld.com/,,统筹保管用户分享的资源
贫困的蚊子,https://mozz.ie/,https://mozz.ie/index.xml, 贫困的蚊子,https://mozz.ie/,https://mozz.ie/index.xml,
极客兔兔,https://geektutu.com/,https://geektutu.com/atom.xml,致力于分享有趣的技术实践 极客兔兔,https://geektutu.com/,https://geektutu.com/feed.xml,致力于分享有趣的技术实践
维基萌,https://www.wikimoe.com/,https://www.wikimoe.com/rss,萌即是正义!一名热爱acg的前端设计师的小站! 维基萌,https://www.wikimoe.com/,https://www.wikimoe.com/rss,萌即是正义!一名热爱acg的前端设计师的小站!
7gugu's blog,https://www.7gugu.com/,https://7gugu.com/index.php/feed/,"一个用来存放我爱好的地方,编程,摄影之类的空间" 7gugu's blog,https://www.7gugu.com/,https://7gugu.com/index.php/feed/,"一个用来存放我爱好的地方,编程,摄影之类的空间"
云游君,https://www.yunyoujun.cn/,https://www.yunyoujun.cn/atom.xml,希望能成为一个有趣的人。
Kingfish404,https://blog.kingfish404.cn/,https://blog.kingfish404.cn/index.xml,"Stay curious,stay naive. WUT. Jin Yu's Blog" Kingfish404,https://blog.kingfish404.cn/,https://blog.kingfish404.cn/index.xml,"Stay curious,stay naive. WUT. Jin Yu's Blog"
FKUN,https://blog.fkun.tech/,https://blog.fkun.tech/feed/, FKUN,https://blog.fkun.tech/,https://blog.fkun.tech/feed/,
Sinofine,https://sinofine.me/,https://sinofine.me/atom.xml, Sinofine,https://sinofine.me/,https://sinofine.me/atom.xml,
@@ -16,8 +15,12 @@ Vullfin的博客,https://blog.vull.top/,https://blog.vull.top/atom.xml,Vullfin's
陈陈菌博客,https://blog.glumi.cn/,https://blog.glumi.cn/rss.xml,计算机业余爱好者。 陈陈菌博客,https://blog.glumi.cn/,https://blog.glumi.cn/rss.xml,计算机业余爱好者。
彬红茶日记,https://note.redcha.cn/,https://note.redcha.cn/rss.xml,我的个人日记! 彬红茶日记,https://note.redcha.cn/,https://note.redcha.cn/rss.xml,我的个人日记!
Lanke's blog,https://blog.blueke.top/,https://blog.blueke.top/rss.xml,请为一切不真实之物骄傲,因为我们高于这个世界! Lanke's blog,https://blog.blueke.top/,https://blog.blueke.top/rss.xml,请为一切不真实之物骄傲,因为我们高于这个世界!
时光流·言,https://www.hansjack.com/,https://www.hansjack.com/feed/,个人博客,持续分享网站部署实战经验、精选书评解读和生活观察手记。 这里提供可复用的技术教程、深度阅读指南和真实生活洞察,与技术爱好者一起进步...... 寒士杰克,https://www.hansjack.com/,https://www.hansjack.com/feed/,喜欢捣鼓,不断进步!
Pinpe 的云端,https://pinpe.top/,https://pinpe.top/rss.xml,一个属于自己的云朵。 Pinpe 的云端,https://pinpe.top/,https://pinpe.top/rss.xml,一个属于自己的云朵。
Chise Hachiroku,https://chise.hachiroku.com/zh/,https://chise.hachiroku.com/zh/feed/,向明日的辉迹,干杯! Chise Hachiroku,https://chise.hachiroku.com/zh/,https://chise.hachiroku.com/zh/feed/,向明日的辉迹,干杯!
映屿,https://www.glowisle.me/,https://www.glowisle.me/atom.xml,关于互联网、书籍、生活琐事以及那些一闪而过的念头 映屿,https://blog.verdant.ee/,https://blog.verdant.ee/atom.xml,关于互联网、书籍、生活琐事以及那些一闪而过的念头
Restent's Notebook,https://blog.gxres.net/,https://blog.gxres.net/atom.xml,不前沿技术分享 Restent's Notebook,https://blog.gxres.net/,https://blog.gxres.net/atom.xml,不前沿技术分享
RavelloH's Blog,https://ravelloh.com,https://ravelloh.com/feed.xml,Beginning of meditation.
初然忆,https://www.imcry.vip,https://www.imcry.vip/index.xml,初心如初见,然忆似流年。
姓王者,https://xingwangzhe.fun/,https://xingwangzhe.fun/rss.xml,探索、学习、进步、创造无限可能!
EXYONE@BLOG:~$,https://exyon.ee,https://exyon.ee/feed.xml,一隅藏天地,流水遇知音。
1 title link feed_url description
2 花火学园 https://www.sayhanabi.net/ 和谐融洽的ACG交流以及资源聚集地
3 资源统筹局 https://gkdworld.com/ 统筹保管用户分享的资源
4 贫困的蚊子 https://mozz.ie/ https://mozz.ie/index.xml
5 极客兔兔 https://geektutu.com/ https://geektutu.com/atom.xml https://geektutu.com/feed.xml 致力于分享有趣的技术实践
6 维基萌 https://www.wikimoe.com/ https://www.wikimoe.com/rss 萌即是正义!一名热爱acg的前端设计师的小站!
7 7gugu's blog https://www.7gugu.com/ https://7gugu.com/index.php/feed/ 一个用来存放我爱好的地方,编程,摄影之类的空间
云游君 https://www.yunyoujun.cn/ https://www.yunyoujun.cn/atom.xml 希望能成为一个有趣的人。
8 Kingfish404 https://blog.kingfish404.cn/ https://blog.kingfish404.cn/index.xml Stay curious,stay naive. WUT. Jin Yu's Blog
9 FKUN https://blog.fkun.tech/ https://blog.fkun.tech/feed/
10 Sinofine https://sinofine.me/ https://sinofine.me/atom.xml
15 陈陈菌博客 https://blog.glumi.cn/ https://blog.glumi.cn/rss.xml 计算机业余爱好者。
16 彬红茶日记 https://note.redcha.cn/ https://note.redcha.cn/rss.xml 我的个人日记!
17 Lanke's blog https://blog.blueke.top/ https://blog.blueke.top/rss.xml 请为一切不真实之物骄傲,因为我们高于这个世界!
18 时光流·言 寒士杰克 https://www.hansjack.com/ https://www.hansjack.com/feed/ 个人博客,持续分享网站部署实战经验、精选书评解读和生活观察手记。 这里提供可复用的技术教程、深度阅读指南和真实生活洞察,与技术爱好者一起进步...... 喜欢捣鼓,不断进步!
19 Pinpe 的云端 https://pinpe.top/ https://pinpe.top/rss.xml 一个属于自己的云朵。
20 Chise Hachiroku https://chise.hachiroku.com/zh/ https://chise.hachiroku.com/zh/feed/ 向明日的辉迹,干杯!
21 映屿 https://www.glowisle.me/ https://blog.verdant.ee/ https://www.glowisle.me/atom.xml https://blog.verdant.ee/atom.xml 关于互联网、书籍、生活琐事以及那些一闪而过的念头
22 Restent's Notebook https://blog.gxres.net/ https://blog.gxres.net/atom.xml 不前沿技术分享
23 RavelloH's Blog https://ravelloh.com https://ravelloh.com/feed.xml Beginning of meditation.
24 初然忆 https://www.imcry.vip https://www.imcry.vip/index.xml 初心如初见,然忆似流年。
25 姓王者 https://xingwangzhe.fun/ https://xingwangzhe.fun/rss.xml 探索、学习、进步、创造无限可能!
26 EXYONE@BLOG:~$ https://exyon.ee https://exyon.ee/feed.xml 一隅藏天地,流水遇知音。
+291 -510
View File
File diff suppressed because it is too large Load Diff
+18 -3
View File
@@ -1,6 +1,8 @@
proxies: proxies:
- https://blog.mayx.workers.dev/ - https://blog.mayx.workers.dev/
- https://mayx.deno.dev/ - https://mayx.deno.dev/
- https://mayx.val.run/
- https://mayx.azion.app/
- https://yuki.gear.host/ - https://yuki.gear.host/
- https://mayx.global.ssl.fastly.net/ - https://mayx.global.ssl.fastly.net/
mirrors: mirrors:
@@ -11,12 +13,18 @@ mirrors:
- https://mayx.frama.io/ - https://mayx.frama.io/
- https://mayx.surge.sh/ - https://mayx.surge.sh/
- https://mayx.pages.gay/ - https://mayx.pages.gay/
- https://mayx.gitpage.si/
- https://mayx.serv00.net/ - https://mayx.serv00.net/
- https://mayx.vercel.app/ - https://mayx.vercel.app/
- https://mayx-blog.pgs.sh/
- https://mayx.netlify.app/ - https://mayx.netlify.app/
- https://mayx.pixie.homes/ - https://mayx.gitnet.page/
- https://mayx.stormkit.dev/
- https://mayx.grebedoc.dev/
- https://mabbs.kinsta.page/ - https://mabbs.kinsta.page/
- https://mayx.codeberg.page/ - https://mayx.codeberg.page/
- https://mayx.tildepages.org/
- https://mayx.pandastack.app/
- https://mayx.pages.lain.la/ - https://mayx.pages.lain.la/
- https://mayx.4everland.app/ - https://mayx.4everland.app/
- https://mayx.readthedocs.io/ - https://mayx.readthedocs.io/
@@ -24,8 +32,10 @@ mirrors:
- https://unmayx.bitbucket.io/ - https://unmayx.bitbucket.io/
- https://mayx.pages.debian.net/ - https://mayx.pages.debian.net/
- https://mayx.dappling.network/ - https://mayx.dappling.network/
- https://mayx-blog.statichost.eu/ - https://mayx-blog.statichost.page/
- https://mabbs-blog.static.hf.space/ - https://mabbs-blog.static.hf.space/
- http://mayx.gitlink.net/
- https://mayx.pixie.homes/
repos: repos:
- https://github.com/Mabbs/mabbs.github.io - https://github.com/Mabbs/mabbs.github.io
- https://gitlab.com/mayx/mayx.gitlab.io - https://gitlab.com/mayx/mayx.gitlab.io
@@ -34,21 +44,27 @@ repos:
- https://codeberg.org/mayx/blog - https://codeberg.org/mayx/blog
- https://pagure.io/mayx - https://pagure.io/mayx
- https://git.gay/mayx/mayx - https://git.gay/mayx/mayx
- https://repo.or.cz/mayx.git
- https://gitea.com/mayx/mayx - https://gitea.com/mayx/mayx
- https://gitgud.io/mayx/mayx - https://gitgud.io/mayx/mayx
- https://git.sr.ht/~mayx/mayx - https://git.sr.ht/~mayx/mayx
- https://worktree.ca/mayx/blog
- https://git.launchpad.net/mayx - https://git.launchpad.net/mayx
- https://gin.g-node.org/mayx/blog - https://gin.g-node.org/mayx/blog
- https://tildeforge.dev/mayx/blog
- https://git.disroot.org/mayx/mayx - https://git.disroot.org/mayx/mayx
- https://bitbucket.org/unmayx/mayx - https://bitbucket.org/unmayx/mayx
- https://sourcecraft.dev/mayx/mayx - https://sourcecraft.dev/mayx/mayx
- https://code.forgejo.org/mayx/blog
- https://gitflic.ru/project/mayx/blog - https://gitflic.ru/project/mayx/blog
- https://rocketgit.com/user/mayx/blog/
- https://tangled.org/mayx.tngl.sh/blog/ - https://tangled.org/mayx.tngl.sh/blog/
- https://gitee.com/mabbs/mabbs - https://gitee.com/mabbs/mabbs
- https://cnb.cool/unmayx/mayx - https://cnb.cool/unmayx/mayx
- https://atomgit.com/mayx/blog - https://atomgit.com/mayx/blog
- https://sourceforge.net/projects/mayx/ - https://sourceforge.net/projects/mayx/
- https://dev.azure.com/unmayx/_git/Mayx - https://dev.azure.com/unmayx/_git/Mayx
- https://www.gitlink.org.cn/mayx/mayx.gitlink.net
static: static:
- https://mayx.nekoweb.org/ - https://mayx.nekoweb.org/
- https://mayx.neocities.org/ - https://mayx.neocities.org/
@@ -62,4 +78,3 @@ others:
- https://mayx.home.blog/ - https://mayx.home.blog/
- https://unmayx.medium.com/ - https://unmayx.medium.com/
- https://mayx.cnblogs.com/ - https://mayx.cnblogs.com/
- https://mayx.xlog.app/
+20 -5
View File
@@ -9,6 +9,7 @@ layout: xslt_container
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
{% seo %} {% seo %}
{% if page.robots %}<meta name="robots" content="{{ page.robots }}" />{% endif %}
{% unless site.github %}<link rel="canonical" href="https://mabbs.github.io{{ page.url }}" />{% endunless %} {% unless site.github %}<link rel="canonical" href="https://mabbs.github.io{{ page.url }}" />{% endunless %}
{% feed_meta %} {% feed_meta %}
<link rel="alternate" type="application/rss+xml" title="{{ site.title }}(RSS)" href="{{ "/rss.xml" | absolute_url }}" /> <link rel="alternate" type="application/rss+xml" title="{{ site.title }}(RSS)" href="{{ "/rss.xml" | absolute_url }}" />
@@ -16,6 +17,8 @@ layout: xslt_container
<link rel="stylesheet" href="/assets/css/style.css?v={{ site.time | date: "%s" }}" /> <link rel="stylesheet" href="/assets/css/style.css?v={{ site.time | date: "%s" }}" />
<!--[if !IE]> --> <!--[if !IE]> -->
<link rel="stylesheet" href="/Live2dHistoire/live2d/css/live2d.css" /> <link rel="stylesheet" href="/Live2dHistoire/live2d/css/live2d.css" />
<link rel="stylesheet" href="/assets/css/gitalk.css" />
<script src="/assets/js/gitalk.min.js"></script>
<!-- <![endif]--> <!-- <![endif]-->
<link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="{{ site.title }}" /> <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="{{ site.title }}" />
<link rel="webmention" href="https://webmention.io/mabbs.github.io/webmention" /> <link rel="webmention" href="https://webmention.io/mabbs.github.io/webmention" />
@@ -24,6 +27,7 @@ layout: xslt_container
<link rel="prefetch" href="https://www.blogsclub.org/badge/mabbs.github.io" as="image" /> <link rel="prefetch" href="https://www.blogsclub.org/badge/mabbs.github.io" as="image" />
<link rel="blogroll" type="text/xml" href="/blogroll.opml" /> <link rel="blogroll" type="text/xml" href="/blogroll.opml" />
<link rel="me" href="https://github.com/Mabbs" /> <link rel="me" href="https://github.com/Mabbs" />
<link type="text/plain" rel="author" href="/humans.txt" />
<script src="/assets/js/jquery.min.js"></script> <script src="/assets/js/jquery.min.js"></script>
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script>
@@ -33,6 +37,15 @@ layout: xslt_container
<script> <script>
var lastUpdated = new Date("{{ site.time | date_to_rfc822 }}"); var lastUpdated = new Date("{{ site.time | date_to_rfc822 }}");
var BlogAPI = "https://summary.mayx.eu.org"; var BlogAPI = "https://summary.mayx.eu.org";
var GitalkConfig = {
clientID: '36557aec4c3cb04f7ac6',
clientSecret: 'ac32993299751cb5a9ba81cf2b171cca65879cdb',
repo: 'mabbs.github.io',
owner: 'Mabbs',
admin: ['Mabbs'],
distractionFreeMode: false,
proxy: 'https://cors-anywhere.mayx.eu.org/?https://github.com/login/oauth/access_token'
};
</script> </script>
<script src="/assets/js/main.js"></script> <script src="/assets/js/main.js"></script>
<!--[if !IE]> --> <!--[if !IE]> -->
@@ -58,13 +71,13 @@ layout: xslt_container
<h1><a class="u-url u-uid p-name" rel="me" href="{{ "/" | relative_url }}">{{ site.title | default: site.github.repository_name }}</a></h1> <h1><a class="u-url u-uid p-name" rel="me" href="{{ "/" | relative_url }}">{{ site.title | default: site.github.repository_name }}</a></h1>
{% if site.logo %} {% if site.logo %}
<img src="{{ site.logo }}" fetchpriority="high" class="u-photo" alt="Logo" style="width: 90%; max-width: 300px; max-height: 300px;" /> <img src="{{ site.logo }}" fetchpriority="high" class="u-photo" alt="Logo" style="width: 90%; max-width: 300px; max-height: 300px; border-radius: 25%;" />
{% endif %} {% endif %}
<p class="p-note">{{ site.description | default: site.github.project_tagline }}</p> <p class="p-note">{{ site.description | default: site.github.project_tagline }}</p>
<form action="/search.html"> <form id="search-input-all" action="/search.html">
<input type="text" name="keyword" id="search-input-all" placeholder="Search blog posts.." />&#160;<input type="submit" value="搜索" /> <input type="text" name="keyword" placeholder="Search blog posts.." />&#160;<input type="submit" value="搜索" />
</form> </form>
<br /> <br />
@@ -89,7 +102,7 @@ layout: xslt_container
{% endif %} {% endif %}
</ul> </ul>
</header> </header>
<section{% unless page.layout == "default" %} class="h-entry"{% endunless %}> <section id="pjax-container"{% unless page.layout == "default" %} class="h-entry"{% endunless %}>
{{ content }} {{ content }}
@@ -97,7 +110,7 @@ layout: xslt_container
{% include live2d.html %} {% include live2d.html %}
<footer> <footer>
<p> <p>
<small>Made with ❤ by Mayx<br />Last updated at {{ site.time | date: "%F %T" }}<br /> 总字数:{% include_cached word_count.html %} - 文章数:{{ site.posts.size }} - <a href="{{ site.feed.path | relative_url }}" >Atom</a> - <a href="{{ "/README.html" | relative_url }}" >About</a></small> <small>Made with ❤ by Mayx<br />Last updated at {{ site.time | date: "%F %T" }}<br /> 总字数:{% include_cached word_count.html %} - 文章数:{{ site.posts.size }} - <a href="/rss.xml">Feed</a> - <a href="{{ "/README.html" | relative_url }}" >About</a></small>
</p> </p>
</footer> </footer>
</div> </div>
@@ -106,6 +119,8 @@ layout: xslt_container
<script src="/assets/js/main_new.js"></script> <script src="/assets/js/main_new.js"></script>
<script src="/Live2dHistoire/live2d/js/live2d.js"></script> <script src="/Live2dHistoire/live2d/js/live2d.js"></script>
<script src="/Live2dHistoire/live2d/js/message.js"></script> <script src="/Live2dHistoire/live2d/js/message.js"></script>
<script src="/assets/js/jquery.pjax.min.js"></script>
<script src="/assets/js/pjax.js"></script>
<!-- <![endif]--> <!-- <![endif]-->
</body> </body>
</html> </html>
+4 -15
View File
@@ -83,7 +83,7 @@ layout: default
{% if page.layout == "encrypt" %} {{content}} {% else %} <main class="post-content e-content" role="main">{% capture a_post_content %}{% include anchor_headings.html html=content beforeHeading=true anchorBody="<svg class='octicon' viewBox='0 0 16 16' version='1.1' width='16' height='32' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>" %}{% endcapture %}{{ a_post_content | replace: '<br />', '</p><p>' }}</main> {% endif %} {% if page.layout == "encrypt" %} {{content}} {% else %} <main class="post-content e-content" role="main">{% capture a_post_content %}{% include anchor_headings.html html=content beforeHeading=true anchorBody="<svg class='octicon' viewBox='0 0 16 16' version='1.1' width='16' height='32' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>" %}{% endcapture %}{{ a_post_content | replace: '<br />', '</p><p>' }}</main> {% endif %}
{% if page.tags %} {% if page.tags %}
<small style="display: block">tags: {% for tag in page.tags %}<a rel="category tag" class="p-category" href="/search.html?keyword={{ tag | url_encode | replace: '+', '%20' }}"><em>{{ tag }}</em></a>{% unless forloop.last %} - {% endunless %}{% endfor %} <span style="float: right;"><a href="{% if site.github %}{{ site.github.repository_url }}{% else %}https://gitlab.com/mayx/mayx.gitlab.io{% endif %}/tree/master/{{ page.path }}">查看原始文件</a></span></small> <small style="display: block">tags: {% for tag in page.tags %}<a rel="category tag" class="p-category" href="/search.html?keyword={{ tag | uri_escape }}"><em>{{ tag }}</em></a>{% unless forloop.last %} - {% endunless %}{% endfor %} <span style="float: right;"><a href="{% if site.github %}{{ site.github.repository_url }}{% else %}https://gitlab.com/mayx/mayx.gitlab.io{% endif %}/tree/master/{{ page.path }}">查看原始文件</a></span></small>
{% endif %} {% endif %}
{% if page.layout != "encrypt" %} {% if page.layout != "encrypt" %}
<h4 style="border-bottom: 1px solid #e5e5e5;margin: 2em 0 5px;">推荐文章</h4> <h4 style="border-bottom: 1px solid #e5e5e5;margin: 2em 0 5px;">推荐文章</h4>
@@ -158,22 +158,11 @@ $.get(BlogAPI + "/suggest?id={{ page.url }}&update=" + lastUpdated.valueOf(), fu
</div> </div>
<!--[if !IE]> --> <!--[if !IE]> -->
<link rel="stylesheet" href="/assets/css/gitalk.css">
<script src="/assets/js/gitalk.min.js"></script>
<div id="gitalk-container"></div> <div id="gitalk-container" data-page-id="{{ page.id }}"></div>
<script> <script>
var gitalk = new Gitalk({ var gitalk = new Gitalk($.extend({ id: '{{ page.id }}' }, GitalkConfig));
clientID: '36557aec4c3cb04f7ac6', gitalk.render('gitalk-container');
clientSecret: 'ac32993299751cb5a9ba81cf2b171cca65879cdb',
repo: 'mabbs.github.io',
owner: 'Mabbs',
admin: ['Mabbs'],
id: '{{ page.id }}', // Ensure uniqueness and length less than 50
distractionFreeMode: false, // Facebook-like distraction free mode
proxy: "https://cors-anywhere.mayx.eu.org/?https://github.com/login/oauth/access_token"
})
gitalk.render('gitalk-container')
</script> </script>
<!-- <![endif]--> <!-- <![endif]-->
+1 -5
View File
@@ -1,11 +1,7 @@
{% if page.layout == "xslt" %}<?xml version="1.0" encoding="utf-8"?> {% if page.layout == "xslt" %}<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xml" href="/feed.xslt.xml"?> <?xml-stylesheet type="text/xml" href="/feed.xslt.xml"?>
<?xml-stylesheet type="text/css" href="/assets/css/xslt.css"?> <?xml-stylesheet type="text/css" href="/assets/css/xslt.css"?>
<xsl:stylesheet <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sm="http://www.sitemaps.org/schemas/sitemap/0.9">
version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sm="http://www.sitemaps.org/schemas/sitemap/0.9">
<xsl:output method="html" version="4.0" encoding="UTF-8" indent="yes" doctype-system="about:legacy-compat" /> <xsl:output method="html" version="4.0" encoding="UTF-8" indent="yes" doctype-system="about:legacy-compat" />
<xsl:template match="/"> <xsl:template match="/">
{{ content }} {{ content }}
+1 -1
View File
@@ -12,7 +12,7 @@ tags: [浏览器, Linux, 虚拟机, WASM]
# 在浏览器中运行Linux # 在浏览器中运行Linux
## 虚拟机方案 ## 虚拟机方案
### 纯JS虚拟机 ### 纯JS虚拟机
要说到在浏览器上运行Linux,最先想到的应该就是[Fabrice Bellard](https://bellard.org)大神写的[JSLinux](https://bellard.org/jslinux/)吧,这可能是第一个在浏览器中实现的虚拟机(毕竟是最强虚拟机QEMU的作者编写的)。现在他的个人主页中展示的这个版本是WASM版本,而他最早写的是纯JS实现的。那个JS实现的版本现在在GitHub上有一个[去混淆的版本](https://github.com/levskaya/jslinux-deobfuscated)可以用作学习和研究,于是我顺手Fork了一份在GitHub Pages上部署作为[演示](http://mabbs.github.io/jslinux/)。 要说到在浏览器上运行Linux,最先想到的应该就是[Fabrice Bellard](https://bellard.org)大神写的[JSLinux](https://bellard.org/jslinux/)吧,这可能是第一个在浏览器中实现的虚拟机(毕竟是最强虚拟机QEMU的作者编写的)。现在他的个人主页中展示的这个版本是WASM版本,而他最早写的是纯JS实现的。那个JS实现的版本现在在GitHub上有一个[去混淆的版本](https://github.com/levskaya/jslinux-deobfuscated)可以用作学习和研究,于是我顺手Fork了一份在GitHub Pages上部署作为[演示](https://mabbs.github.io/jslinux/)。
作为纯JS实现的x86虚拟机,性能估计是最差的,但相应的兼容性也最好,在Bellard当年写JSLinux的时候,还没有WASM这种东西呢,所以即使是在不支持WASM的IE11中,也可以正常运行。假如我想把它作为终端用在我的博客上,似乎也是个不错的选择,即使我完全看不懂代码,不知道如何实现JS和虚拟机的通信,它也预留了一个剪贴板设备,可以让我轻松地做到类似的事情,比如我在里面写个Bash脚本,通过它和外面的JS脚本联动来读取我的文章列表和内容,那也挺不错。 作为纯JS实现的x86虚拟机,性能估计是最差的,但相应的兼容性也最好,在Bellard当年写JSLinux的时候,还没有WASM这种东西呢,所以即使是在不支持WASM的IE11中,也可以正常运行。假如我想把它作为终端用在我的博客上,似乎也是个不错的选择,即使我完全看不懂代码,不知道如何实现JS和虚拟机的通信,它也预留了一个剪贴板设备,可以让我轻松地做到类似的事情,比如我在里面写个Bash脚本,通过它和外面的JS脚本联动来读取我的文章列表和内容,那也挺不错。
当然Bellard用纯JS编写虚拟机也不是独一份,他实现了x86的虚拟机,相应的也有人用纯JS实现了RISC-V的虚拟机,比如[ANGEL](https://github.com/riscv-software-src/riscv-angel),看起来挺不错,所以同样也顺手[搭了一份](https://mabbs.github.io/riscv-angel/)。只不过它似乎用了一些更先进的语法,至少IE11上不能运行。 当然Bellard用纯JS编写虚拟机也不是独一份,他实现了x86的虚拟机,相应的也有人用纯JS实现了RISC-V的虚拟机,比如[ANGEL](https://github.com/riscv-software-src/riscv-angel),看起来挺不错,所以同样也顺手[搭了一份](https://mabbs.github.io/riscv-angel/)。只不过它似乎用了一些更先进的语法,至少IE11上不能运行。
另外还有一个比较知名的项目,叫做[jor1k](https://github.com/s-macke/jor1k),它模拟的是OpenRISC架构。只是这个架构目前已经过时,基本上没什么人用了,不过这里面还内置了几个演示的小游戏,看起来还挺有意思。 另外还有一个比较知名的项目,叫做[jor1k](https://github.com/s-macke/jor1k),它模拟的是OpenRISC架构。只是这个架构目前已经过时,基本上没什么人用了,不过这里面还内置了几个演示的小游戏,看起来还挺有意思。

Some files were not shown because too many files have changed in this diff Show More