Compare commits

..

No commits in common. "master" and "AR-Backup-2022.10.17" have entirely different histories.

132 changed files with 1195 additions and 7369 deletions

View File

@ -1,9 +0,0 @@
<!-- 欢迎提交PR如果是修复 BUG 或 typo ,可直接删除此模板。若是添加友链,请确认满足以下条件(将 [ ] 替换为 [x] 打勾): -->
- [ ] 这个 PR 是关于添加Links的
- [ ] 我在申请之前加上了[贵站](https://mabbs.github.io)友链
- [ ] 我的网站 **全站启用 HTTPS**
- [ ] 我的博客满足: **原创文章比例>80%,数量>10** 的要求
- [ ] 我的网站满足 **站点稳定,不弃坑** 的要求
我的网站是: <!-- 例如https://example.com -->

View File

@ -6,14 +6,14 @@
# Template project: https://gitlab.com/pages/jekyll # Template project: https://gitlab.com/pages/jekyll
# Docs: https://docs.gitlab.com/ee/pages/ # Docs: https://docs.gitlab.com/ee/pages/
image: ruby:2.7 image: ruby:2.6
variables: variables:
JEKYLL_ENV: production JEKYLL_ENV: production
LC_ALL: C.UTF-8 LC_ALL: C.UTF-8
before_script: before_script:
- gem install bundler -v 2.4.22 - gem install bundler
- bundle install - bundle install
pages: pages:

8
404.md
View File

@ -2,13 +2,5 @@
layout: default layout: default
title: 404 - 找不到页面 title: 404 - 找不到页面
--- ---
# 找不到页面 # 找不到页面
你访问的资源 <code><script>document.write(window.location.pathname)</script></code> 不存在或者可能已经被永久移除。 你访问的资源 <code><script>document.write(window.location.pathname)</script></code> 不存在或者可能已经被永久移除。
或者看看近期的其他文章?
{% for post in site.posts limit:10 %}
- {{ post.date | date: "%Y/%m/%d" }} - [{{ post.title }}{% if post.layout == "encrypt" %} [加密] {% endif %}]({{ post.url }})
{% endfor %}

View File

@ -1 +0,0 @@
5b60338bca964816af2f0b76965a1b84

4
BingSiteAuth.xml Normal file
View File

@ -0,0 +1,4 @@
<?xml version="1.0"?>
<users>
<user>0ADFCE64B3557DC4DC5F2DC224C5FDDD</user>
</users>

View File

@ -105,31 +105,31 @@
<g class="stagger" style="animation-delay: 450ms" transform="translate(25, 0)"> <g class="stagger" style="animation-delay: 450ms" transform="translate(25, 0)">
<line x1="12" y1="6.25" x2="19" y2="6.25" <line x1="12" y1="6.25" x2="19" y2="6.25"
style="stroke:rgb(255,255,255);stroke-width:2"/> style="stroke:rgb(255,255,255);stroke-width:2"/>
<text class="stat bold" x="25" y="12.5">{{ site.posts[0].title | truncate: 18 }}</text> <text class="stat bold" x="25" y="12.5">{{ site.posts[0].title }}</text>
</g> </g>
</g><g transform="translate(0, 25)"> </g><g transform="translate(0, 25)">
<g class="stagger" style="animation-delay: 600ms" transform="translate(25, 0)"> <g class="stagger" style="animation-delay: 600ms" transform="translate(25, 0)">
<line x1="12" y1="6.25" x2="19" y2="6.25" <line x1="12" y1="6.25" x2="19" y2="6.25"
style="stroke:rgb(255,255,255);stroke-width:2"/> style="stroke:rgb(255,255,255);stroke-width:2"/>
<text class="stat bold" x="25" y="12.5">{{ site.posts[1].title | truncate: 18 }}</text> <text class="stat bold" x="25" y="12.5">{{ site.posts[1].title }}</text>
</g> </g>
</g><g transform="translate(0, 50)"> </g><g transform="translate(0, 50)">
<g class="stagger" style="animation-delay: 750ms" transform="translate(25, 0)"> <g class="stagger" style="animation-delay: 750ms" transform="translate(25, 0)">
<line x1="12" y1="6.25" x2="19" y2="6.25" <line x1="12" y1="6.25" x2="19" y2="6.25"
style="stroke:rgb(255,255,255);stroke-width:2"/> style="stroke:rgb(255,255,255);stroke-width:2"/>
<text class="stat bold" x="25" y="12.5">{{ site.posts[2].title | truncate: 18 }}</text> <text class="stat bold" x="25" y="12.5">{{ site.posts[2].title }}</text>
</g> </g>
</g><g transform="translate(0, 75)"> </g><g transform="translate(0, 75)">
<g class="stagger" style="animation-delay: 900ms" transform="translate(25, 0)"> <g class="stagger" style="animation-delay: 900ms" transform="translate(25, 0)">
<line x1="12" y1="6.25" x2="19" y2="6.25" <line x1="12" y1="6.25" x2="19" y2="6.25"
style="stroke:rgb(255,255,255);stroke-width:2"/> style="stroke:rgb(255,255,255);stroke-width:2"/>
<text class="stat bold" x="25" y="12.5">{{ site.posts[3].title | truncate: 18 }}</text> <text class="stat bold" x="25" y="12.5">{{ site.posts[3].title }}</text>
</g> </g>
</g><g transform="translate(0, 100)"> </g><g transform="translate(0, 100)">
<g class="stagger" style="animation-delay: 1050ms" transform="translate(25, 0)"> <g class="stagger" style="animation-delay: 1050ms" transform="translate(25, 0)">
<line x1="12" y1="6.25" x2="19" y2="6.25" <line x1="12" y1="6.25" x2="19" y2="6.25"
style="stroke:rgb(255,255,255);stroke-width:2"/> style="stroke:rgb(255,255,255);stroke-width:2"/>
<text class="stat bold" x="25" y="12.5">{{ site.posts[4].title | truncate: 18 }}</text> <text class="stat bold" x="25" y="12.5">{{ site.posts[4].title }}</text>
</g> </g>
</g> </g>
</svg> </svg>

20
Gemfile
View File

@ -1,17 +1,11 @@
source "https://rubygems.org" source "https://rubygems.org"
gem "jekyll", "~> 3.9.3" gem "jekyll", "~> 4.1.0"
group :jekyll_plugins do group :jekyll_plugins do
gem "jekyll-gist", "~> 1.5.0" gem "jekyll-gist"
gem "jekyll-coffeescript", "~> 1.1.1" gem "jekyll-coffeescript"
gem "jekyll-assets", "~> 1.0.0" gem "jekyll-assets"
gem "jekyll-sitemap", "~> 1.4.0" gem "jekyll-sitemap"
gem "jekyll-feed", "~> 0.15.1" gem "jekyll-feed"
gem "jekyll-include-cache", "~> 0.2.1"
gem "jekyll-readme-index", "~> 0.3.0"
gem "jekyll-default-layout", "~> 0.1.5"
gem "jekyll-titles-from-headings", "~> 0.5.3"
gem "jekyll-theme-minimal" gem "jekyll-theme-minimal"
gem "jekyll-paginate", "~> 1.1.0" gem "jekyll-paginate"
gem "kramdown-parser-gfm", "~> 1.1.0"
gem "kramdown", "~> 2.3.2"
end end

45
Live2dHistoire/demo.html Normal file
View File

@ -0,0 +1,45 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Live2D</title>
<link rel="stylesheet" href="live2d/css/live2d.css" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
</head>
<body>
<div id="landlord" style="left:5px;bottom:0px;">
<div class="message" style="opacity:0"></div>
<canvas id="live2d" width="500" height="560" class="live2d"></canvas>
<div class="live_talk_input_body">
<div class="live_talk_input_name_body">
<input name="name" type="text" class="live_talk_name white_input" id="AIuserName" autocomplete="off" placeholder="你的名字" />
</div>
<div class="live_talk_input_text_body">
<input name="talk" type="text" class="live_talk_talk white_input" id="AIuserText" autocomplete="off" placeholder="要和我聊什么呀?"/>
<button type="button" class="live_talk_send_btn" id="talk_send">发送</button>
</div>
</div>
<input name="live_talk" id="live_talk" value="1" type="hidden" />
<div class="live_ico_box">
<div class="live_ico_item type_info" id="showInfoBtn"></div>
<div class="live_ico_item type_talk" id="showTalkBtn"></div>
<div class="live_ico_item type_music" id="musicButton"></div>
<div class="live_ico_item type_youdu" id="youduButton"></div>
<div class="live_ico_item type_quit" id="hideButton"></div>
<input name="live_statu_val" id="live_statu_val" value="0" type="hidden" />
<audio src="" style="display:none;" id="live2d_bgm" data-bgm="0" preload="none"></audio>
<input name="live2dBGM" value="https://t1.aixinxi.net/o_1c52p4qbp15idv6bl55h381moha.mp3" type="hidden">
<input name="live2dBGM" value="https://t1.aixinxi.net/o_1c52p8frrlmf1aled1e14m56una.mp3" type="hidden">
<input id="duType" value="douqilai,l2d_caihong" type="hidden">
</div>
</div>
<div id="open_live2d">召唤伊斯特瓦尔</div>
<script type="text/javascript" src="https://apps.bdimg.com/libs/jquery/1.7.1/jquery.min.js"></script>
<script>
var message_Path = '/histoire/live2d/';//资源目录,如果目录不对请更改
var talkAPI = "";//如果有类似图灵机器人的聊天接口请填写接口路径
</script>
<script type="text/javascript" src="live2d/js/live2d.js"></script>
<script type="text/javascript" src="live2d/js/message.js"></script>
</body>
</html>

View File

@ -79,7 +79,7 @@
background-color: rgba(74, 59, 114,0.9); background-color: rgba(74, 59, 114,0.9);
} }
.live_talk_input_name_body{ .live_talk_input_name_body{
width:100px; width:70px;
box-sizing:border-box; box-sizing:border-box;
height:24px; height:24px;
border: 2px solid rgb(223, 179, 241); border: 2px solid rgb(223, 179, 241);

View File

@ -1,35 +1,35 @@
var home_Path = document.location.protocol + '//' + window.document.location.hostname + '/'; var home_Path = document.location.protocol +'//' + window.document.location.hostname +'/';
var userAgent = window.navigator.userAgent.toLowerCase(); var userAgent = window.navigator.userAgent.toLowerCase();
console.log(userAgent); console.log(userAgent);
var norunAI = ["android", "iphone", "ipod", "ipad", "windows phone"]; var norunAI = [ "android", "iphone", "ipod", "ipad", "windows phone"];
var norunFlag = false; var norunFlag = false;
for (var i = 0; i < norunAI.length; i++) { for(var i=0;i<norunAI.length;i++){
if (userAgent.indexOf(norunAI[i]) > -1) { if(userAgent.indexOf(norunAI[i]) > -1){
norunFlag = true; norunFlag = true;
break; break;
} }
} }
if (!window.WebGLRenderingContext) { if(!window.WebGLRenderingContext){
norunFlag = true; norunFlag = true;
} }
if (!norunFlag) { if(!norunFlag){
var hitFlag = false; var hitFlag = false;
var AIFadeFlag = false; var AIFadeFlag = false;
var liveTlakTimer = null; var liveTlakTimer = null;
var sleepTimer_ = null; var sleepTimer_ = null;
var AITalkFlag = false; var AITalkFlag = false;
var talkNum = 0; var talkNum = 0;
(function () { (function (){
function renderTip(template, context) { function renderTip(template, context) {
var tokenReg = /(\\)?\{([^\{\}\\]+)(\\)?\}/g; var tokenReg = /(\\)?\{([^\{\}\\]+)(\\)?\}/g;
return template.replace(tokenReg, function (word, slash1, token, slash2) { return template.replace(tokenReg, function (word, slash1, token, slash2) {
if (slash1 || slash2) { if (slash1 || slash2) {
return word.replace(/\\/g, ''); return word.replace('\\', '');
} }
var variables = token.replace(/\s/g, '').split('.'); var variables = token.replace(/\s/g, '').split('.');
var currentObject = context; var currentObject = context;
@ -48,61 +48,60 @@ if (!norunFlag) {
}; };
var re = /x/; var re = /x/;
console.log(re); re.toString = function() {
re.toString = function () {
showMessage('哈哈,你打开了控制台,是想要看看我的秘密吗?', 5000); showMessage('哈哈,你打开了控制台,是想要看看我的秘密吗?', 5000);
return ''; return '';
}; };
$(document).on('copy', function () { $(document).on('copy', function (){
showMessage('你都复制了些什么呀,转载要记得加上出处哦~~', 5000); showMessage('你都复制了些什么呀,转载要记得加上出处哦~~', 5000);
}); });
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){
$.each(result.mouseover, function (index, tips) { $.each(result.mouseover, function (index, tips){
$(tips.selector).mouseover(function () { $(tips.selector).mouseover(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()});
showMessage(text, 3000); showMessage(text, 3000);
talkValTimer(); talkValTimer();
clearInterval(liveTlakTimer); clearInterval(liveTlakTimer);
liveTlakTimer = null; liveTlakTimer = null;
}); });
$(tips.selector).mouseout(function () { $(tips.selector).mouseout(function (){
showHitokoto(); showHitokoto();
if (liveTlakTimer == null) { if(liveTlakTimer == null){
liveTlakTimer = window.setInterval(function () { liveTlakTimer = window.setInterval(function(){
showHitokoto(); showHitokoto();
}, 15000); },15000);
}; };
}); });
}); });
$.each(result.click, function (index, tips) { $.each(result.click, function (index, tips){
$(tips.selector).click(function () { $(tips.selector).click(function (){
if (hitFlag) { if(hitFlag){
return false return false
} }
hitFlag = true; hitFlag = true;
setTimeout(function () { setTimeout(function(){
hitFlag = false; hitFlag = false;
}, 8000); },8000);
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()});
showMessage(text, 3000); showMessage(text, 3000);
}); });
clearInterval(liveTlakTimer); clearInterval(liveTlakTimer);
liveTlakTimer = null; liveTlakTimer = null;
if (liveTlakTimer == null) { if(liveTlakTimer == null){
liveTlakTimer = window.setInterval(function () { liveTlakTimer = window.setInterval(function(){
showHitokoto(); showHitokoto();
}, 15000); },15000);
}; };
}); });
} }
@ -111,19 +110,19 @@ if (!norunFlag) {
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> 的朋友!'; 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') {
text = '嗨! 来自 百度搜索 的朋友!<br>欢迎访问<span style="color:#0099cc;">「 ' + document.title.split(' | ')[0] + ' 」</span>'; text = '嗨! 来自 百度搜索 的朋友!<br>欢迎访问<span style="color:#0099cc;">「 ' + document.title.split(' | ')[0] + ' 」</span>';
} else if (domain == 'so') { }else if (domain == 'so') {
text = '嗨! 来自 360搜索 的朋友!<br>欢迎访问<span style="color:#0099cc;">「 ' + document.title.split(' | ')[0] + ' 」</span>'; text = '嗨! 来自 360搜索 的朋友!<br>欢迎访问<span style="color:#0099cc;">「 ' + document.title.split(' | ')[0] + ' 」</span>';
} else if (domain == 'google') { }else if (domain == 'google') {
text = '嗨! 来自 谷歌搜索 的朋友!<br>欢迎访问<span style="color:#0099cc;">「 ' + document.title.split(' | ')[0] + ' 」</span>'; text = '嗨! 来自 谷歌搜索 的朋友!<br>欢迎访问<span style="color:#0099cc;">「 ' + document.title.split(' | ')[0] + ' 」</span>';
} }
} else { }else {
if (window.location.href == home_Path) { //主页URL判断需要斜杠结尾 if (window.location.href == home_Path) { //主页URL判断需要斜杠结尾
var now = (new Date()).getHours(); var now = (new Date()).getHours();
if (now > 23 || now <= 5) { if (now > 23 || now <= 5) {
@ -145,139 +144,114 @@ if (!norunFlag) {
} else { } else {
text = '嗨~ 快来逗我玩吧!'; text = '嗨~ 快来逗我玩吧!';
} }
} else { }else {
text = '欢迎阅读<span style="color:#0099cc;">「 ' + document.title.split(' | ')[0] + ' 」</span>'; text = '欢迎阅读<span style="color:#0099cc;">「 ' + document.title.split(' | ')[0] + ' 」</span>';
} }
} }
showMessage(text, 12000); showMessage(text, 12000);
})(); })();
liveTlakTimer = setInterval(function () { liveTlakTimer = setInterval(function(){
showHitokoto(); showHitokoto();
}, 15000); },15000);
function showHitokoto() { function showHitokoto(){
if (sessionStorage.getItem("Sleepy") !== "1") { if(sessionStorage.getItem("Sleepy")!=="1"){
if (!AITalkFlag) { if(!AITalkFlag){
$.getJSON('https://hitokoto.mayx.eu.org/', function (result) { $.getJSON('https://v1.hitokoto.cn/',function(result){
talkValTimer(); talkValTimer();
showMessage(result.hitokoto, 0); showMessage(result.hitokoto, 0);
}); });
} }
} else { }else{
hideMessage(0); hideMessage(0);
if (sleepTimer_ == null) { if(sleepTimer_==null){
sleepTimer_ = setInterval(function () { sleepTimer_ = setInterval(function(){
checkSleep(); checkSleep();
}, 200); },200);
} }
console.log(sleepTimer_); console.log(sleepTimer_);
} }
} }
function checkSleep() { function checkSleep(){
var sleepStatu = sessionStorage.getItem("Sleepy"); var sleepStatu = sessionStorage.getItem("Sleepy");
if (sleepStatu !== '1') { if(sleepStatu!=='1'){
talkValTimer(); talkValTimer();
showMessage('你回来啦~', 0); showMessage('你回来啦~', 0);
clearInterval(sleepTimer_); clearInterval(sleepTimer_);
sleepTimer_ = null; sleepTimer_= null;
} }
} }
function showMessage(text, timeout) { function showMessage(text, timeout){
if (Array.isArray(text)) text = text[Math.floor(Math.random() * text.length + 1) - 1]; if(Array.isArray(text)) text = text[Math.floor(Math.random() * text.length + 1)-1];
//console.log('showMessage', text); //console.log('showMessage', text);
$('.message').stop(); $('.message').stop();
if (typeof EventSource !== 'undefined' && text instanceof EventSource) {
var outputContainer = $('.message')[0];
var eventFlag = false;
text.onmessage = function(event) {
if (event.data == "[DONE]") {
text.close();
return;
} else {
if (!eventFlag) {
talkValTimer();
outputContainer.textContent = "";
eventFlag = true;
}
var data = JSON.parse(event.data);
outputContainer.textContent += data.response;
}
}
} else {
$('.message').html(text); $('.message').html(text);
}
$('.message').fadeTo(200, 1); $('.message').fadeTo(200, 1);
//if (timeout === null) timeout = 5000; //if (timeout === null) timeout = 5000;
//hideMessage(timeout); //hideMessage(timeout);
} }
function talkValTimer() { function talkValTimer(){
$('#live_talk').val('1'); $('#live_talk').val('1');
} }
function hideMessage(timeout) { function hideMessage(timeout){
//$('.message').stop().css('opacity',1); //$('.message').stop().css('opacity',1);
if (timeout === null) timeout = 5000; if (timeout === null) timeout = 5000;
$('.message').delay(timeout).fadeTo(200, 0); $('.message').delay(timeout).fadeTo(200, 0);
} }
function initLive2d() { function initLive2d (){
$("#landlord").mouseenter(function () { $('#hideButton').on('click', function(){
$(".live_ico_box").fadeIn(); if(AIFadeFlag){
});
$("#landlord").mouseleave(function () {
$(".live_ico_box").fadeOut();
});
$('#hideButton').on('click', function () {
if (AIFadeFlag) {
return false; return false;
} else { }else{
AIFadeFlag = true; AIFadeFlag = true;
localStorage.setItem("live2dhidden", "0"); localStorage.setItem("live2dhidden", "0");
$('#landlord').fadeOut(200); $('#landlord').fadeOut(200);
$('#open_live2d').delay(200).fadeIn(200); $('#open_live2d').delay(200).fadeIn(200);
setTimeout(function () { setTimeout(function(){
AIFadeFlag = false; AIFadeFlag = false;
}, 300); },300);
} }
}); });
$('#open_live2d').on('click', function () { $('#open_live2d').on('click', function(){
if (AIFadeFlag) { if(AIFadeFlag){
return false; return false;
} else { }else{
AIFadeFlag = true; AIFadeFlag = true;
localStorage.setItem("live2dhidden", "1"); localStorage.setItem("live2dhidden", "1");
$('#open_live2d').fadeOut(200); $('#open_live2d').fadeOut(200);
$('#landlord').delay(200).fadeIn(200); $('#landlord').delay(200).fadeIn(200);
setTimeout(function () { setTimeout(function(){
AIFadeFlag = false; AIFadeFlag = false;
}, 300); },300);
} }
}); });
$('#youduButton').on('click', function () { $('#youduButton').on('click',function(){
if ($('#youduButton').hasClass('doudong')) { if($('#youduButton').hasClass('doudong')){
var typeIs = $('#youduButton').attr('data-type'); var typeIs = $('#youduButton').attr('data-type');
$('#youduButton').removeClass('doudong'); $('#youduButton').removeClass('doudong');
$('body').removeClass(typeIs); $('body').removeClass(typeIs);
$('#youduButton').attr('data-type', ''); $('#youduButton').attr('data-type','');
} else { }else{
var duType = $('#duType').val(); var duType = $('#duType').val();
var duArr = duType.split(","); var duArr = duType.split(",");
var dataType = duArr[Math.floor(Math.random() * duArr.length)]; var dataType = duArr[Math.floor(Math.random() * duArr.length)];
$('#youduButton').addClass('doudong'); $('#youduButton').addClass('doudong');
$('#youduButton').attr('data-type', dataType); $('#youduButton').attr('data-type',dataType);
$('body').addClass(dataType); $('body').addClass(dataType);
} }
}); });
if (talkAPI !== "" && typeof EventSource !== 'undefined') { if(talkAPI!==""){
$('#showInfoBtn').on('click', function () { $('#showInfoBtn').on('click',function(){
var live_statu = $('#live_statu_val').val(); var live_statu = $('#live_statu_val').val();
if (live_statu == "0") { if(live_statu=="0"){
return return
} else { }else{
$('#live_statu_val').val("0"); $('#live_statu_val').val("0");
$('.live_talk_input_body').fadeOut(500); $('.live_talk_input_body').fadeOut(500);
AITalkFlag = false; AITalkFlag = false;
@ -286,11 +260,11 @@ if (!norunFlag) {
$('#showInfoBtn').hide(); $('#showInfoBtn').hide();
} }
}); });
$('#showTalkBtn').on('click', function () { $('#showTalkBtn').on('click',function(){
var live_statu = $('#live_statu_val').val(); var live_statu = $('#live_statu_val').val();
if (live_statu == "1") { if(live_statu=="1"){
return return
} else { }else{
$('#live_statu_val').val("1"); $('#live_statu_val').val("1");
$('.live_talk_input_body').fadeIn(500); $('.live_talk_input_body').fadeIn(500);
AITalkFlag = true; AITalkFlag = true;
@ -299,108 +273,126 @@ if (!norunFlag) {
} }
}); });
$('#live_talk_input_form').on('submit', function (e) { $('#talk_send').on('click',function(){
e.preventDefault();
var info_ = $('#AIuserText').val(); var info_ = $('#AIuserText').val();
// var userid_ = $('#AIuserName').val(); var userid_ = $('#AIuserName').val();
let add_id = ""; if(info_ == "" ){
if ($('#load_this').prop("checked")) { showMessage('写点什么吧!',0);
add_id = "&id=" + encodeURIComponent($('#post_id').val()); return;
} }
if (info_ == "") { if(userid_ == ""){
showMessage('写点什么吧!', 0); showMessage('聊之前请告诉我你的名字吧!',0);
return; return;
} }
showMessage('思考中~', 0); showMessage('思考中~', 0);
showMessage(new EventSource(talkAPI + "?info=" + encodeURIComponent(info_) + add_id)); $.ajax({
type: 'POST',
url: talkAPI,
data: {
"info":info_,
"userid":userid_
},
success: function(res) {
if(res.code !== 100000){
talkValTimer();
showMessage('似乎有什么错误,请和站长联系!',0);
}else{
talkValTimer();
showMessage(res.text,0);
}
console.log(res);
$('#AIuserText').val("");
sessionStorage.setItem("live2duser", userid_);
}
}); });
} else { });
}else{
$('#showInfoBtn').hide(); $('#showInfoBtn').hide();
$('#showTalkBtn').hide(); $('#showTalkBtn').hide();
} }
//获取音乐信息初始化 //获取音乐信息初始化
var bgmListInfo = $('input[name=live2dBGM]'); var bgmListInfo = $('input[name=live2dBGM]');
if (bgmListInfo.length == 0) { if(bgmListInfo.length == 0){
$('#musicButton').hide(); $('#musicButton').hide();
} else { }else{
var bgmPlayNow = parseInt($('#live2d_bgm').attr('data-bgm')); var bgmPlayNow = parseInt($('#live2d_bgm').attr('data-bgm'));
var bgmPlayTime = 0; var bgmPlayTime = 0;
var live2dBGM_Num = sessionStorage.getItem("live2dBGM_Num"); var live2dBGM_Num = sessionStorage.getItem("live2dBGM_Num");
var live2dBGM_PlayTime = sessionStorage.getItem("live2dBGM_PlayTime"); var live2dBGM_PlayTime = sessionStorage.getItem("live2dBGM_PlayTime");
if (live2dBGM_Num) { if(live2dBGM_Num){
if (live2dBGM_Num <= $('input[name=live2dBGM]').length - 1) { if(live2dBGM_Num<=$('input[name=live2dBGM]').length-1){
bgmPlayNow = parseInt(live2dBGM_Num); bgmPlayNow = parseInt(live2dBGM_Num);
} }
} }
if (live2dBGM_PlayTime) { if(live2dBGM_PlayTime){
bgmPlayTime = parseInt(live2dBGM_PlayTime); bgmPlayTime = parseInt(live2dBGM_PlayTime);
} }
var live2dBGMSrc = bgmListInfo.eq(bgmPlayNow).val(); var live2dBGMSrc = bgmListInfo.eq(bgmPlayNow).val();
$('#live2d_bgm').attr('data-bgm', bgmPlayNow); $('#live2d_bgm').attr('data-bgm',bgmPlayNow);
$('#live2d_bgm').attr('src', live2dBGMSrc); $('#live2d_bgm').attr('src',live2dBGMSrc);
$('#live2d_bgm')[0].currentTime = bgmPlayTime; $('#live2d_bgm')[0].currentTime = bgmPlayTime;
$('#live2d_bgm')[0].volume = 0.5; $('#live2d_bgm')[0].volume = 0.5;
var live2dBGM_IsPlay = sessionStorage.getItem("live2dBGM_IsPlay"); var live2dBGM_IsPlay = sessionStorage.getItem("live2dBGM_IsPlay");
var live2dBGM_WindowClose = sessionStorage.getItem("live2dBGM_WindowClose"); var live2dBGM_WindowClose = sessionStorage.getItem("live2dBGM_WindowClose");
if (live2dBGM_IsPlay == '0' && live2dBGM_WindowClose == '0') { if(live2dBGM_IsPlay == '0' && live2dBGM_WindowClose == '0'){
$('#live2d_bgm')[0].play(); $('#live2d_bgm')[0].play();
$('#musicButton').addClass('play'); $('#musicButton').addClass('play');
} }
sessionStorage.setItem("live2dBGM_WindowClose", '1'); sessionStorage.setItem("live2dBGM_WindowClose" , '1');
$('#musicButton').on('click', function () { $('#musicButton').on('click',function(){
if ($('#musicButton').hasClass('play')) { if($('#musicButton').hasClass('play')){
$('#live2d_bgm')[0].pause(); $('#live2d_bgm')[0].pause();
$('#musicButton').removeClass('play'); $('#musicButton').removeClass('play');
sessionStorage.setItem("live2dBGM_IsPlay", '1'); sessionStorage.setItem("live2dBGM_IsPlay",'1');
} else { }else{
$('#live2d_bgm')[0].play(); $('#live2d_bgm')[0].play();
$('#musicButton').addClass('play'); $('#musicButton').addClass('play');
sessionStorage.setItem("live2dBGM_IsPlay", '0'); sessionStorage.setItem("live2dBGM_IsPlay",'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 () { document.getElementById('live2d_bgm').addEventListener("timeupdate", function(){
var live2dBgmPlayTimeNow = document.getElementById('live2d_bgm').currentTime; var live2dBgmPlayTimeNow = document.getElementById('live2d_bgm').currentTime;
sessionStorage.setItem("live2dBGM_PlayTime", live2dBgmPlayTimeNow); sessionStorage.setItem("live2dBGM_PlayTime" , live2dBgmPlayTimeNow );
}); });
document.getElementById('live2d_bgm').addEventListener("ended", function () { document.getElementById('live2d_bgm').addEventListener("ended", function(){
var listNow = parseInt($('#live2d_bgm').attr('data-bgm')); var listNow = parseInt($('#live2d_bgm').attr('data-bgm'));
listNow++; listNow ++ ;
if (listNow > $('input[name=live2dBGM]').length - 1) { if(listNow > $('input[name=live2dBGM]').length-1){
listNow = 0; listNow = 0;
} }
var listNewSrc = $('input[name=live2dBGM]').eq(listNow).val(); var listNewSrc = $('input[name=live2dBGM]').eq(listNow).val();
sessionStorage.setItem("live2dBGM_Num", listNow); sessionStorage.setItem("live2dBGM_Num",listNow);
$('#live2d_bgm').attr('src', listNewSrc); $('#live2d_bgm').attr('src',listNewSrc);
$('#live2d_bgm')[0].play(); $('#live2d_bgm')[0].play();
$('#live2d_bgm').attr('data-bgm', listNow); $('#live2d_bgm').attr('data-bgm',listNow);
}); });
document.getElementById('live2d_bgm').addEventListener("error", function () { document.getElementById('live2d_bgm').addEventListener("error", function(){
$('#live2d_bgm')[0].pause(); $('#live2d_bgm')[0].pause();
$('#musicButton').removeClass('play'); $('#musicButton').removeClass('play');
showMessage('音乐似乎加载不出来了呢!', 0); showMessage('音乐似乎加载不出来了呢!',0);
}); });
} }
// //获取用户名 //获取用户名
// var live2dUser = sessionStorage.getItem("live2duser"); var live2dUser = sessionStorage.getItem("live2duser");
// if(live2dUser !== null){ if(live2dUser !== null){
// $('#AIuserName').val(live2dUser); $('#AIuserName').val(live2dUser);
// } }
//获取位置 //获取位置
var landL = sessionStorage.getItem("historywidth"); var landL = sessionStorage.getItem("historywidth");
var landB = sessionStorage.getItem("historyheight"); var landB = sessionStorage.getItem("historyheight");
if (landL == null || landB == null) { if(landL == null || landB ==null){
landL = '5px' landL = '5px'
landB = '0px' landB = '0px'
} }
$('#landlord').css('left', landL + 'px'); $('#landlord').css('left',landL+'px');
$('#landlord').css('bottom', landB + 'px'); $('#landlord').css('bottom',landB + 'px');
//移动 //移动
function getEvent() { function getEvent() {
return window.event || arguments.callee.caller.arguments[0]; return window.event || arguments.callee.caller.arguments[0];
@ -413,7 +405,7 @@ if (!norunFlag) {
var moveable = false; var moveable = false;
var docMouseMoveEvent = document.onmousemove; var docMouseMoveEvent = document.onmousemove;
var docMouseUpEvent = document.onmouseup; var docMouseUpEvent = document.onmouseup;
smcc.onmousedown = function () { smcc.onmousedown = function(){
var ent = getEvent(); var ent = getEvent();
moveable = true; moveable = true;
moveX = ent.clientX; moveX = ent.clientX;
@ -421,11 +413,11 @@ if (!norunFlag) {
var obj = smcc; var obj = smcc;
moveBottom = parseInt(obj.style.bottom); moveBottom = parseInt(obj.style.bottom);
moveLeft = parseInt(obj.style.left); moveLeft = parseInt(obj.style.left);
if (isFirefox = navigator.userAgent.indexOf("Firefox") > 0) { if(isFirefox=navigator.userAgent.indexOf("Firefox")>0){
window.getSelection().removeAllRanges(); window.getSelection().removeAllRanges();
} }
document.onmousemove = function () { document.onmousemove = function(){
if (moveable) { if(moveable){
var ent = getEvent(); var ent = getEvent();
var x = moveLeft + ent.clientX - moveX; var x = moveLeft + ent.clientX - moveX;
var y = moveBottom + (moveY - ent.clientY); var y = moveBottom + (moveY - ent.clientY);
@ -433,8 +425,8 @@ if (!norunFlag) {
obj.style.bottom = y + "px"; obj.style.bottom = y + "px";
} }
}; };
document.onmouseup = function () { document.onmouseup = function(){
if (moveable) { if(moveable){
var historywidth = obj.style.left; var historywidth = obj.style.left;
var historyheight = obj.style.bottom; var historyheight = obj.style.bottom;
historywidth = historywidth.replace('px', ''); historywidth = historywidth.replace('px', '');
@ -452,42 +444,36 @@ if (!norunFlag) {
}; };
}; };
} }
$(document).ready(function () { $(document).ready(function() {
var AIimgSrc = [ var AIimgSrc = [
home_Path + message_Path + "model/histoire/histoire.1024/texture_00.png", home_Path + message_Path + "model/histoire/histoire.1024/texture_00.png",
home_Path + message_Path + "model/histoire/histoire.1024/texture_01.png", home_Path + message_Path + "model/histoire/histoire.1024/texture_01.png",
home_Path + message_Path + "model/histoire/histoire.1024/texture_02.png", home_Path + message_Path + "model/histoire/histoire.1024/texture_02.png",
home_Path + message_Path + "model/histoire/histoire.1024/texture_03.png", home_Path + message_Path + "model/histoire/histoire.1024/texture_03.png"
home_Path + message_Path + "images/info.png",
home_Path + message_Path + "images/music.png",
home_Path + message_Path + "images/pasue.png",
home_Path + message_Path + "images/quite.png",
home_Path + message_Path + "images/talk.png",
home_Path + message_Path + "images/youdu.png"
] ]
var images = []; var images = [];
var imgLength = AIimgSrc.length; var imgLength = AIimgSrc.length;
var loadingNum = 0; var loadingNum = 0;
for (var i = 0; i < imgLength; i++) { for(var i=0;i<imgLength;i++){
images[i] = new Image(); images[i] = new Image();
images[i].src = AIimgSrc[i]; images[i].src = AIimgSrc[i];
images[i].onload = function () { images[i].onload = function(){
loadingNum++; loadingNum++;
if (loadingNum === imgLength) { if(loadingNum===imgLength){
var live2dhidden = localStorage.getItem("live2dhidden"); var live2dhidden = localStorage.getItem("live2dhidden");
if (live2dhidden === "0") { if(live2dhidden==="0"){
setTimeout(function () { setTimeout(function(){
$('#open_live2d').fadeIn(200); $('#open_live2d').fadeIn(200);
}, 1300); },1300);
} else { }else{
setTimeout(function () { setTimeout(function(){
$('#landlord').fadeIn(200); $('#landlord').fadeIn(200);
}, 1300); },1300);
} }
setTimeout(function () { setTimeout(function(){
loadlive2d("live2d", message_Path + "model/histoire/model.json"); loadlive2d("live2d", message_Path+"model/histoire/model.json");
}, 1000); },1000);
initLive2d(); initLive2d ();
images = null; images = null;
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 824 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 826 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

View File

@ -0,0 +1,58 @@
{
"version":"1.0.0",
"model":"model.moc",
"textures":[
"histoire.1024/0.png",
"histoire.1024/1.png",
"histoire.1024/normal_2.png"
],
"layout":{
"center_x":0.0,
"center_y":-0.05,
"width":2.0
},
"hit_areas_custom":{
"head_x":[-1, 1],
"head_y":[1, -1],
"body_x":[-1, -1],
"body_y":[1, -1]
},
"motions":{
"idle":[
{"file":"motions/idle/idle_00.mtn"},
{"file":"motions/idle/idle_01.mtn"},
{"file":"motions/idle/idle_02.mtn"}
],
"sleepy":[
{"file":"motions/tap/shake.mtn"}
],
"flick_head":[
{"file":"motions/tap/refuse.mtn"},
{"file":"motions/tap/nep_slide_head_2.mtn"},
{"file":"motions/tap/nep_touch_belly_2.mtn"},
{"file":"motions/tap/nep_touch_boobs_1.mtn"}
],
"tap_body":[
{"file":"motions/tap/smile.mtn"}
],
"talk":[
{"file":"motions/tap/nep_touch_belly_1.mtn"},
{"file":"motions/tap/nep_slide_head_2.mtn"},
{"file":"motions/tap/nep_touch_head_1.mtn"}
],
"rest":[
{"file":"motions/tap/tilt_head.mtn"},
{"file":"motions/idle/idle_00.mtn"},
{"file":"motions/idle/idle_01.mtn"},
{"file":"motions/idle/idle_02.mtn"}
],
"":[
{"file":"motions/tap/nep_touch_belly_1.mtn"},
{"file":"motions/tap/nep_slide_head_2.mtn"},
{"file":"motions/tap/nep_touch_head_1.mtn"},
{"file":"motions/tap/nep_touch_boobs_1.mtn"}
]
}
}

Binary file not shown.

View File

@ -0,0 +1,44 @@
# Live2D Animator Motion Data
$fps=30
PARAM_SHOULDER_X=0
PARAM_MOUTH_OPEN_Y=0
PARAM_FACE_COVER=0
PARAM_FEAR=0
PARAM_EYE_L_OPEN=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,1,1,1,1,1,1,1
PARAM_EYE_L_SMILE=0
PARAM_BROW_L_FORM=0
PARAM_TEAR=0
PARAM_BROW_L_X=0
PARAM_BROW_DEFORMED=0
PARAM_BROW_L_Y=0
PARAM_EYE_R_SMILE=0
PARAM_EYE_R_OPEN=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,1,1,1,1,1,1,1
PARAM_HAIR_BACK=0
PARAM_EYE_BALL_X=0,0,0.002,0.005,0.009,0.014,0.02,0.027,0.034,0.042,0.051,0.06,0.07,0.08,0.091,0.101,0.113,0.124,0.135,0.146,0.157,0.169,0.179,0.19,0.2,0.21,0.219,0.228,0.236,0.243,0.25,0.256,0.261,0.265,0.268,0.269,0.27,0.27,0.27,0.27,0.27,0.27,0.27,0.27,0.269,0.267,0.263,0.258,0.252,0.244,0.236,0.227,0.216,0.205,0.193,0.181,0.168,0.154,0.14,0.126,0.111,0.097,0.082,0.067,0.052,0.037,0.023,0.008,-0.006,-0.02,-0.033,-0.046,-0.059,-0.07,-0.081,-0.092,-0.101,-0.11,-0.117,-0.124,-0.13,-0.134,-0.137,-0.139,-0.14,-0.14,-0.14,-0.14,-0.14,-0.14,-0.139,-0.14,-0.138,-0.14,-0.136,-0.136,-0.135,-0.13,-0.133,-0.132,-0.131,-0.13,-0.129,-0.128,-0.127,-0.125,-0.124,-0.123,-0.121,-0.12,-0.119,-0.117,-0.115,-0.114,-0.112,-0.111,-0.109,-0.107,-0.106,-0.104,-0.102,-0.1,-0.098,-0.097,-0.095,-0.093,-0.091,-0.089,-0.087,-0.085,-0.083,-0.081,-0.079,-0.077,-0.075,-0.073,-0.071,-0.069,-0.067,-0.065,-0.063,-0.061,-0.059,-0.057,-0.055,-0.054,-0.052,-0.05,-0.048,-0.046,-0.044,-0.042,-0.04,-0.039,-0.037,-0.035,-0.033,-0.032,-0.03,-0.028,-0.027,-0.025,-0.024,-0.022,-0.021,-0.019,-0.018,-0.017,-0.015,-0.014,-0.013,-0.012,-0.01,-0.009,-0.008,-0.007,-0.006,-0.006,-0.005,-0,-0.003,-0.003,-0,-0.002,-0,-0.001,-0,-0,-0,-0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.006,-0.022,-0.05,-0.07,-0.11,-0.14,-0.17,-0.21,-0.24,-0.26,-0.29,-0.304,-0.316,-0.32,-0.318,-0.312,-0.303,-0.291,-0.277,-0.26,-0.243,-0.224,-0.204,-0.183,-0.16,-0.14,-0.122,-0.102,-0.084,-0.066,-0.05,-0.036,-0.024,-0.014,-0.006,-0.002,0
PARAM_HAIR_FRONT=0
PARAM_EYE_BALL_Y=0,0,0.002,0.003,0.006,0.009,0.013,0.017,0.021,0.027,0.032,0.038,0.044,0.051,0.057,0.064,0.071,0.078,0.085,0.092,0.099,0.106,0.113,0.119,0.126,0.132,0.138,0.143,0.149,0.153,0.157,0.161,0.164,0.167,0.168,0.17,0.17,0.17,0.17,0.17,0.17,0.17,0.17,0.17,0.17,0.167,0.164,0.159,0.153,0.146,0.138,0.13,0.12,0.11,0.099,0.087,0.075,0.063,0.05,0.037,0.023,0.009,-0.004,-0.018,-0.032,-0.046,-0.059,-0.073,-0.086,-0.099,-0.111,-0.123,-0.134,-0.145,-0.156,-0.165,-0.174,-0.182,-0.189,-0.195,-0.2,-0.204,-0.207,-0.209,-0.21,-0.21,-0.21,-0.21,-0.21,-0.209,-0.21,-0.207,-0.207,-0.206,-0.205,-0.204,-0.202,-0.201,-0.2,-0.198,-0.197,-0.195,-0.194,-0.192,-0.19,-0.188,-0.186,-0.184,-0.182,-0.18,-0.178,-0.176,-0.173,-0.171,-0.168,-0.166,-0.163,-0.161,-0.158,-0.156,-0.153,-0.15,-0.148,-0.145,-0.142,-0.139,-0.136,-0.133,-0.13,-0.128,-0.125,-0.122,-0.119,-0.116,-0.113,-0.11,-0.107,-0.104,-0.101,-0.098,-0.095,-0.092,-0.089,-0.086,-0.083,-0.08,-0.077,-0.075,-0.072,-0.069,-0.066,-0.063,-0.061,-0.058,-0.055,-0.053,-0.05,-0.047,-0.045,-0.042,-0.04,-0.038,-0.035,-0.033,-0.031,-0.029,-0.027,-0.025,-0.023,-0.021,-0.019,-0.017,-0.016,-0.014,-0.013,-0.011,-0.01,-0.008,-0.007,-0.006,-0.005,-0.004,-0.003,-0.003,-0.002,-0,-0.001,-0,-0,-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.002,0.005,0.011,0.018,0.026,0.035,0.043,0.051,0.059,0.066,0.072,0.076,0.079,0.08,0.079,0.078,0.076,0.073,0.069,0.065,0.061,0.056,0.051,0.046,0.041,0.035,0.03,0.026,0.021,0.017,0.013,0.009,0.006,0.003,0.002,0,0
PARAM_BROW_L_ANGLE=0
PARAM_EYE_DEFORMED_04=0
PARAM_EYE_DEFORMED_03=0
PARAM_EYE_DEFORMED_02=0
PARAM_EYE_DEFORMED_01=0
PARAM_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.13,-0.52,-1.1,-1.88,-2.8,-3.84,-4.97,-6.14,-7.35,-8.55,-9.71,-10.8,-11.82,-12.72,-13.51,-14.14,-14.61,-14.9,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-14.9,-14.61,-14.14,-13.52,-12.76,-11.9,-10.9,-9.85,-8.73,-7.55,-6.37,-5.15,-3.95,-2.76,-1.6,-0.49,0.54,1.49,2.36,3.13,3.78,4.3,4.68,4.92,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4.83,4.38,3.73,2.92,2.03,1.09,0.14,-0.78,-1.64,-2.41,-3.05,-3.56,-3.89,-4,-3.97,-3.9,-3.78,-3.64,-3.46,-3.25,-3.03,-2.79,-2.54,-2.29,-2.03,-1.77,-1.52,-1.28,-1.05,-0.83,-0.63,-0.45,-0.3,-0.17,-0.08,-0.02,0
PARAM_BODY_ANGLE_X=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.004,0.017,0.04,0.07,0.1,0.15,0.2,0.25,0.31,0.38,0.45,0.53,0.61,0.69,0.78,0.87,0.96,1.06,1.15,1.25,1.35,1.45,1.55,1.65,1.75,1.85,1.94,2.04,2.13,2.22,2.31,2.39,2.47,2.55,2.62,2.69,2.75,2.8,2.85,2.9,2.93,2.96,2.98,2.996,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2.97,2.88,2.74,2.56,2.33,2.07,1.77,1.45,1.12,0.77,0.41,0.04,-0.32,-0.67,-1.02,-1.35,-1.66,-1.95,-2.21,-2.44,-2.63,-2.79,-2.9,-2.98,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2.993,-2.973,-2.94,-2.9,-2.84,-2.78,-2.7,-2.62,-2.53,-2.44,-2.33,-2.23,-2.11,-2,-1.88,-1.76,-1.64,-1.52,-1.39,-1.27,-1.15,-1.03,-0.92,-0.81,-0.7,-0.6,-0.51,-0.42,-0.34,-0.26,-0.2,-0.14,-0.09,-0.05,-0.02,-0.006,0
PARAM_BODY_ANGLE_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.01,0.04,0.08,0.14,0.22,0.31,0.42,0.53,0.66,0.79,0.94,1.09,1.25,1.41,1.58,1.76,1.93,2.11,2.3,2.48,2.66,2.84,3.02,3.19,3.37,3.53,3.7,3.86,4.01,4.15,4.28,4.41,4.53,4.63,4.72,4.8,4.87,4.93,4.97,4.99,5,4.984,4.94,4.86,4.76,4.63,4.48,4.31,4.13,3.93,3.71,3.49,3.25,3.02,2.77,2.53,2.29,2.05,1.81,1.58,1.36,1.15,0.95,0.77,0.6,0.45,0.32,0.21,0.12,0.05,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_BODY_ANGLE_Z=0,-0.007,-0.027,-0.06,-0.1,-0.16,-0.22,-0.3,-0.38,-0.47,-0.57,-0.67,-0.78,-0.89,-1.01,-1.13,-1.25,-1.37,-1.5,-1.63,-1.75,-1.87,-1.99,-2.11,-2.22,-2.33,-2.43,-2.53,-2.62,-2.7,-2.78,-2.84,-2.9,-2.94,-2.97,-2.993,-3,-3,-3,-3,-3,-3,-3,-3,-2.994,-2.977,-2.95,-2.91,-2.87,-2.81,-2.75,-2.68,-2.61,-2.52,-2.44,-2.35,-2.25,-2.15,-2.05,-1.95,-1.84,-1.73,-1.62,-1.51,-1.41,-1.3,-1.19,-1.08,-0.98,-0.88,-0.78,-0.69,-0.6,-0.51,-0.43,-0.35,-0.28,-0.22,-0.17,-0.12,-0.08,-0.04,-0.02,-0.005,0,-0.006,-0.023,-0.05,-0.09,-0.14,-0.19,-0.26,-0.33,-0.42,-0.5,-0.6,-0.7,-0.81,-0.92,-1.04,-1.16,-1.28,-1.41,-1.54,-1.67,-1.8,-1.93,-2.07,-2.2,-2.33,-2.46,-2.59,-2.72,-2.84,-2.96,-3.08,-3.19,-3.3,-3.4,-3.5,-3.58,-3.67,-3.74,-3.81,-3.86,-3.91,-3.95,-3.98,-3.994,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3.98,-3.92,-3.83,-3.7,-3.55,-3.38,-3.18,-2.97,-2.75,-2.51,-2.27,-2.03,-1.79,-1.55,-1.32,-1.1,-0.89,-0.7,-0.53,-0.37,-0.24,-0.14,-0.06,-0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_BROW_R_Y=0
PARAM_ANGLE_Y=0,-0.03,-0.13,-0.28,-0.48,-0.73,-1.04,-1.38,-1.77,-2.19,-2.64,-3.12,-3.63,-4.16,-4.7,-5.26,-5.84,-6.42,-7,-7.58,-8.16,-8.74,-9.3,-9.84,-10.37,-10.88,-11.36,-11.81,-12.23,-12.62,-12.96,-13.27,-13.52,-13.72,-13.87,-13.97,-14,-14,-14,-14,-14,-14,-14,-14,-13.95,-13.79,-13.53,-13.19,-12.76,-12.25,-11.67,-11.03,-10.33,-9.56,-8.75,-7.91,-7.01,-6.09,-5.14,-4.17,-3.17,-2.17,-1.15,-0.12,0.88,1.9,2.89,3.89,4.85,5.79,6.72,7.59,8.43,9.23,9.99,10.69,11.34,11.92,12.44,12.9,13.29,13.59,13.81,13.95,14,13.989,13.95,13.9,13.82,13.72,13.61,13.47,13.32,13.15,12.96,12.76,12.54,12.31,12.07,11.81,11.55,11.27,10.98,10.68,10.37,10.05,9.73,9.41,9.07,8.74,8.39,8.05,7.7,7.35,7,6.65,6.3,5.95,5.61,5.26,4.93,4.59,4.27,3.95,3.63,3.32,3.02,2.73,2.45,2.19,1.93,1.69,1.46,1.24,1.04,0.85,0.68,0.53,0.39,0.28,0.18,0.1,0.05,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_BREATH=0
PARAM_BROW_R_X=0
PARAM_ANGLE_X=0,-0.005,-0.018,-0.04,-0.07,-0.1,-0.15,-0.2,-0.25,-0.31,-0.38,-0.45,-0.52,-0.59,-0.67,-0.75,-0.83,-0.92,-1,-1.08,-1.17,-1.25,-1.33,-1.41,-1.48,-1.55,-1.62,-1.69,-1.75,-1.8,-1.85,-1.9,-1.93,-1.96,-1.98,-1.995,-2,-2,-2,-2,-2,-2,-2,-2,-1.996,-1.985,-1.967,-1.94,-1.91,-1.87,-1.83,-1.79,-1.74,-1.68,-1.62,-1.56,-1.5,-1.43,-1.37,-1.3,-1.23,-1.15,-1.08,-1.01,-0.94,-0.86,-0.79,-0.72,-0.65,-0.59,-0.52,-0.46,-0.4,-0.34,-0.29,-0.24,-0.19,-0.15,-0.11,-0.08,-0.05,-0.03,-0.013,-0.003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_ARM_R=-2,-2.011,-2.04,-2.1,-2.17,-2.26,-2.37,-2.49,-2.63,-2.78,-2.94,-3.12,-3.3,-3.49,-3.68,-3.88,-4.08,-4.29,-4.5,-4.71,-4.92,-5.12,-5.32,-5.51,-5.7,-5.88,-6.06,-6.22,-6.37,-6.51,-6.63,-6.74,-6.83,-6.9,-6.96,-6.99,-7,-7,-7,-7,-7,-7,-7,-7,-6.987,-6.95,-6.88,-6.8,-6.69,-6.56,-6.42,-6.26,-6.08,-5.89,-5.69,-5.48,-5.25,-5.02,-4.79,-4.54,-4.29,-4.04,-3.79,-3.53,-3.28,-3.02,-2.78,-2.53,-2.29,-2.05,-1.82,-1.6,-1.39,-1.19,-1,-0.83,-0.66,-0.52,-0.39,-0.27,-0.18,-0.1,-0.05,-0.01,0,-0.006,-0.025,-0.06,-0.1,-0.15,-0.21,-0.27,-0.35,-0.43,-0.52,-0.61,-0.7,-0.79,-0.89,-0.99,-1.08,-1.18,-1.28,-1.37,-1.46,-1.54,-1.62,-1.69,-1.76,-1.82,-1.87,-1.92,-1.95,-1.98,-1.995,-2,-1.982,-1.93,-1.85,-1.75,-1.63,-1.49,-1.34,-1.18,-1.02,-0.86,-0.71,-0.56,-0.42,-0.3,-0.2,-0.11,-0.05,-0.01,0,-0.003,-0.01,-0.022,-0.04,-0.06,-0.09,-0.12,-0.15,-0.18,-0.22,-0.27,-0.31,-0.36,-0.41,-0.46,-0.52,-0.57,-0.63,-0.69,-0.75,-0.81,-0.87,-0.93,-0.99,-1.05,-1.12,-1.18,-1.24,-1.29,-1.35,-1.41,-1.47,-1.52,-1.57,-1.62,-1.67,-1.71,-1.76,-1.8,-1.83,-1.87,-1.9,-1.92,-1.95,-1.965,-1.98,-1.991,-1.998,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2
PARAM_ARM_L=-2,-2.011,-2.04,-2.1,-2.17,-2.26,-2.37,-2.49,-2.63,-2.78,-2.94,-3.12,-3.3,-3.49,-3.68,-3.88,-4.08,-4.29,-4.5,-4.71,-4.92,-5.12,-5.32,-5.51,-5.7,-5.88,-6.06,-6.22,-6.37,-6.51,-6.63,-6.74,-6.83,-6.9,-6.96,-6.99,-7,-7,-7,-7,-7,-7,-7,-7,-6.987,-6.95,-6.88,-6.8,-6.69,-6.56,-6.42,-6.26,-6.08,-5.89,-5.69,-5.48,-5.25,-5.02,-4.79,-4.54,-4.29,-4.04,-3.79,-3.53,-3.28,-3.02,-2.78,-2.53,-2.29,-2.05,-1.82,-1.6,-1.39,-1.19,-1,-0.83,-0.66,-0.52,-0.39,-0.27,-0.18,-0.1,-0.05,-0.01,0,-0.006,-0.025,-0.06,-0.1,-0.15,-0.21,-0.27,-0.35,-0.43,-0.52,-0.61,-0.7,-0.79,-0.89,-0.99,-1.08,-1.18,-1.28,-1.37,-1.46,-1.54,-1.62,-1.69,-1.76,-1.82,-1.87,-1.92,-1.95,-1.98,-1.995,-2,-1.982,-1.93,-1.85,-1.75,-1.63,-1.49,-1.34,-1.18,-1.02,-0.86,-0.71,-0.56,-0.42,-0.3,-0.2,-0.11,-0.05,-0.01,0,-0.003,-0.01,-0.022,-0.04,-0.06,-0.09,-0.12,-0.15,-0.18,-0.22,-0.27,-0.31,-0.36,-0.41,-0.46,-0.52,-0.57,-0.63,-0.69,-0.75,-0.81,-0.87,-0.93,-0.99,-1.05,-1.12,-1.18,-1.24,-1.29,-1.35,-1.41,-1.47,-1.52,-1.57,-1.62,-1.67,-1.71,-1.76,-1.8,-1.83,-1.87,-1.9,-1.92,-1.95,-1.965,-1.98,-1.991,-1.998,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2
PARAM_MOUTH_FORM=-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.85,-0.5,-0.06,0.37,0.71,0.93,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.997,0.99,0.978,0.96,0.94,0.91,0.88,0.85,0.82,0.78,0.73,0.69,0.64,0.59,0.54,0.48,0.43,0.37,0.31,0.25,0.19,0.13,0.07,0.01,-0.05,-0.12,-0.18,-0.24,-0.29,-0.35,-0.41,-0.47,-0.52,-0.57,-0.62,-0.67,-0.71,-0.76,-0.8,-0.83,-0.87,-0.9,-0.92,-0.95,-0.965,-0.98,-0.991,-0.998,-1
PARAM_HAIR_SIDE=0
PARAM_EYE_BALL_FORM=0
PARAM_BROW_R_ANGLE=0
PARAM_SWEAT=0
PARAM_BROW_R_FORM=0
PARAM_TERE=0
PARAM_EYE_BALL_GLITTER=0
PARAM_STRING=0

View File

@ -0,0 +1,44 @@
# Live2D Animator Motion Data
$fps=30
PARAM_SHOULDER_X=0
PARAM_MOUTH_OPEN_Y=0
PARAM_FACE_COVER=0
PARAM_FEAR=0
PARAM_EYE_L_OPEN=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
PARAM_EYE_L_SMILE=0
PARAM_BROW_L_FORM=0
PARAM_TEAR=0
PARAM_BROW_L_X=0
PARAM_BROW_DEFORMED=0
PARAM_BROW_L_Y=0
PARAM_EYE_R_SMILE=0
PARAM_EYE_R_OPEN=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
PARAM_HAIR_BACK=0
PARAM_EYE_BALL_X=0,-0,-0,-0.002,-0.003,-0.004,-0.006,-0.008,-0.011,-0.013,-0.016,-0.019,-0.023,-0.026,-0.03,-0.034,-0.038,-0.042,-0.046,-0.051,-0.056,-0.06,-0.065,-0.07,-0.075,-0.08,-0.084,-0.089,-0.094,-0.099,-0.104,-0.109,-0.114,-0.118,-0.123,-0.128,-0.132,-0.136,-0.14,-0.145,-0.148,-0.152,-0.156,-0.159,-0.162,-0.165,-0.168,-0.17,-0.172,-0.174,-0.176,-0.177,-0.179,-0.179,-0.18,-0.18,-0.18,-0.18,-0.18,-0.178,-0.177,-0.176,-0.175,-0.173,-0.172,-0.17,-0.168,-0.165,-0.163,-0.16,-0.157,-0.154,-0.151,-0.147,-0.143,-0.139,-0.135,-0.131,-0.126,-0.121,-0.117,-0.111,-0.106,-0.101,-0.095,-0.089,-0.083,-0.077,-0.07,-0.063,-0.057,-0.05,-0.042,-0.035,-0.027,-0.019,-0.011,-0.003,0.005,0.014,0.023,0.031,0.041,0.05,0.059,0.069,0.079,0.089,0.099,0.11,0.12,0.131,0.142,0.153,0.164,0.176,0.188,0.2,0.212,0.224,0.236,0.249,0.262,0.275,0.288,0.301,0.315,0.328,0.342,0.356,0.37,0.385,0.399,0.412,0.424,0.435,0.445,0.455,0.463,0.471,0.479,0.485,0.491,0.496,0.501,0.505,0.509,0.512,0.514,0.516,0.518,0.519,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.519,0.515,0.509,0.501,0.491,0.48,0.466,0.452,0.436,0.42,0.402,0.384,0.365,0.346,0.327,0.308,0.29,0.271,0.253,0.236,0.22,0.204,0.19,0.177,0.165,0.155,0.146,0.139,0.134,0.131,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13
PARAM_HAIR_FRONT=0
PARAM_EYE_BALL_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.001,0,0,0.002,0,0.003,0,0.004,0.005,0.01,0.007,0.007,0.008,0.009,0.01,0.011,0.012,0.013,0.015,0.016,0.017,0.019,0.02,0.022,0.023,0.025,0.027,0.029,0.03,0.032,0.034,0.037,0.039,0.041,0.043,0.046,0.048,0.051,0.053,0.056,0.059,0.062,0.065,0.068,0.071,0.074,0.078,0.081,0.084,0.088,0.092,0.096,0.099,0.103,0.108,0.112,0.116,0.12,0.125,0.129,0.134,0.139,0.144,0.149,0.154,0.159,0.165,0.17,0.177,0.185,0.194,0.205,0.216,0.227,0.24,0.252,0.265,0.277,0.289,0.301,0.313,0.324,0.335,0.344,0.353,0.361,0.367,0.373,0.377,0.379,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.381,0.38,0.383,0.384,0.385,0.387,0.389,0.39,0.392,0.394,0.396,0.398,0.4,0.402,0.404,0.406,0.407,0.409,0.411,0.412,0.414,0.415,0.416,0.417,0.418,0.419,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42,0.42
PARAM_BROW_L_ANGLE=0
PARAM_EYE_DEFORMED_04=0
PARAM_EYE_DEFORMED_03=0
PARAM_EYE_DEFORMED_02=0
PARAM_EYE_DEFORMED_01=0
PARAM_ANGLE_Z=0,-0.009,-0.04,-0.08,-0.14,-0.22,-0.31,-0.41,-0.53,-0.67,-0.81,-0.97,-1.14,-1.31,-1.5,-1.69,-1.9,-2.11,-2.32,-2.55,-2.78,-3.01,-3.25,-3.49,-3.73,-3.98,-4.22,-4.47,-4.72,-4.96,-5.21,-5.45,-5.69,-5.92,-6.15,-6.38,-6.6,-6.82,-7.02,-7.23,-7.42,-7.61,-7.78,-7.95,-8.11,-8.25,-8.39,-8.51,-8.62,-8.72,-8.8,-8.87,-8.93,-8.97,-8.99,-9,-8.87,-8.51,-7.92,-7.19,-6.28,-5.27,-4.16,-2.97,-1.72,-0.46,0.84,2.13,3.38,4.62,5.77,6.86,7.85,8.74,9.51,10.14,10.61,10.9,11,10.91,10.65,10.23,9.67,9,8.21,7.33,6.37,5.34,4.27,3.15,2.01,0.83,-0.35,-1.53,-2.69,-3.83,-4.94,-6,-7.01,-7.94,-8.81,-9.6,-10.29,-10.88,-11.35,-11.71,-11.93,-12,-11.84,-11.38,-10.66,-9.74,-8.6,-7.34,-5.95,-4.47,-2.9,-1.33,0.3,1.91,3.48,5.02,6.46,7.82,9.07,10.18,11.14,11.93,12.51,12.87,13,12.92,12.68,12.3,11.82,11.23,10.58,9.85,9.08,8.27,7.45,6.6,5.77,4.95,4.15,3.4,2.69,2.05,1.47,0.97,0.56,0.25,0.07,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.02,-0.09,-0.2,-0.35,-0.53,-0.75,-1,-1.27,-1.57,-1.9,-2.25,-2.61,-3,-3.39,-3.8,-4.21,-4.64,-5.07,-5.51,-5.95,-6.38,-6.82,-7.24,-7.67,-8.08,-8.48,-8.88,-9.25,-9.61,-9.96,-10.28,-10.58,-10.86,-11.11,-11.33,-11.53,-11.69,-11.83,-11.92,-11.98,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12
PARAM_BODY_ANGLE_X=0,-0.002,-0.008,-0.018,-0.031,-0.048,-0.069,-0.09,-0.12,-0.15,-0.18,-0.21,-0.25,-0.29,-0.33,-0.38,-0.42,-0.47,-0.52,-0.57,-0.62,-0.67,-0.72,-0.78,-0.83,-0.88,-0.94,-0.99,-1.05,-1.1,-1.16,-1.21,-1.26,-1.32,-1.37,-1.42,-1.47,-1.51,-1.56,-1.61,-1.65,-1.69,-1.73,-1.77,-1.8,-1.83,-1.86,-1.89,-1.92,-1.94,-1.956,-1.972,-1.984,-1.993,-1.998,-2,-1.96,-1.85,-1.68,-1.46,-1.18,-0.88,-0.55,-0.19,0.18,0.56,0.95,1.34,1.71,2.09,2.43,2.76,3.06,3.32,3.55,3.74,3.88,3.97,4,3.98,3.91,3.8,3.65,3.48,3.27,3.04,2.79,2.52,2.24,1.95,1.65,1.35,1.04,0.73,0.43,0.13,-0.16,-0.44,-0.7,-0.94,-1.17,-1.37,-1.55,-1.71,-1.83,-1.92,-1.98,-2,-1.97,-1.88,-1.73,-1.55,-1.32,-1.07,-0.79,-0.49,-0.18,0.13,0.46,0.78,1.1,1.4,1.69,1.96,2.21,2.44,2.63,2.79,2.9,2.97,3,2.97,2.9,2.78,2.64,2.46,2.25,2.03,1.79,1.54,1.29,1.03,0.77,0.52,0.28,0.05,-0.17,-0.37,-0.55,-0.7,-0.83,-0.92,-0.98,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.99,-0.96,-0.92,-0.85,-0.78,-0.69,-0.59,-0.48,-0.36,-0.23,-0.09,0.05,0.19,0.34,0.48,0.63,0.77,0.91,1.05,1.18,1.31,1.43,1.54,1.64,1.73,1.81,1.88,1.93,1.97,1.99,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
PARAM_BODY_ANGLE_Y=0
PARAM_BODY_ANGLE_Z=0,0.003,0.012,0.027,0.05,0.07,0.1,0.14,0.18,0.22,0.27,0.32,0.38,0.44,0.5,0.56,0.63,0.7,0.77,0.85,0.93,1,1.08,1.16,1.24,1.33,1.41,1.49,1.57,1.65,1.74,1.82,1.9,1.97,2.05,2.13,2.2,2.27,2.34,2.41,2.47,2.54,2.59,2.65,2.7,2.75,2.8,2.84,2.87,2.91,2.93,2.96,2.976,2.989,2.997,3,2.96,2.85,2.68,2.46,2.18,1.88,1.55,1.19,0.82,0.44,0.05,-0.34,-0.71,-1.09,-1.43,-1.76,-2.06,-2.32,-2.55,-2.74,-2.88,-2.97,-3,-2.98,-2.91,-2.8,-2.65,-2.48,-2.27,-2.04,-1.79,-1.52,-1.24,-0.95,-0.65,-0.35,-0.04,0.27,0.57,0.87,1.16,1.44,1.7,1.94,2.17,2.37,2.55,2.71,2.83,2.92,2.98,3,2.97,2.88,2.73,2.55,2.32,2.07,1.79,1.49,1.18,0.87,0.54,0.22,-0.1,-0.4,-0.69,-0.96,-1.21,-1.44,-1.63,-1.79,-1.9,-1.97,-2,-1.97,-1.9,-1.78,-1.64,-1.46,-1.25,-1.03,-0.79,-0.54,-0.29,-0.03,0.23,0.48,0.72,0.95,1.17,1.37,1.55,1.7,1.83,1.92,1.98,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1.994,1.975,1.94,1.9,1.85,1.79,1.73,1.65,1.57,1.48,1.39,1.3,1.21,1.11,1.01,0.92,0.82,0.72,0.63,0.54,0.46,0.38,0.31,0.24,0.18,0.13,0.08,0.05,0.02,0.005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_BROW_R_Y=0
PARAM_ANGLE_Y=0,-0.001,-0.004,-0.009,-0.016,-0.024,-0.034,-0.046,-0.059,-0.074,-0.09,-0.107,-0.126,-0.146,-0.17,-0.19,-0.21,-0.23,-0.26,-0.28,-0.31,-0.33,-0.36,-0.39,-0.41,-0.44,-0.47,-0.5,-0.52,-0.55,-0.58,-0.61,-0.63,-0.66,-0.68,-0.71,-0.73,-0.76,-0.78,-0.8,-0.82,-0.85,-0.865,-0.883,-0.901,-0.917,-0.932,-0.946,-0.958,-0.969,-0.978,-0.986,-0.992,-0.996,-0.999,-1,-0.94,-0.75,-0.46,-0.09,0.36,0.86,1.42,2.01,2.64,3.27,3.92,4.56,5.19,5.81,6.39,6.93,7.43,7.87,8.26,8.57,8.8,8.95,9,8.92,8.71,8.36,7.9,7.35,6.7,5.97,5.18,4.33,3.44,2.51,1.57,0.6,-0.37,-1.35,-2.31,-3.25,-4.17,-5.05,-5.88,-6.65,-7.37,-8.02,-8.59,-9.08,-9.47,-9.76,-9.94,-10,-9.88,-9.53,-8.98,-8.28,-7.42,-6.46,-5.4,-4.27,-3.09,-1.89,-0.65,0.57,1.76,2.94,4.03,5.06,6.01,6.86,7.59,8.18,8.63,8.9,9,8.92,8.7,8.35,7.91,7.37,6.76,6.1,5.38,4.63,3.88,3.1,2.32,1.57,0.83,0.14,-0.51,-1.11,-1.65,-2.11,-2.48,-2.77,-2.94,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3.016,-3.06,-3.14,-3.24,-3.37,-3.52,-3.69,-3.87,-4.07,-4.29,-4.51,-4.75,-4.98,-5.23,-5.47,-5.71,-5.95,-6.19,-6.42,-6.64,-6.85,-7.05,-7.23,-7.4,-7.55,-7.68,-7.79,-7.88,-7.95,-7.99,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8
PARAM_BREATH=0
PARAM_BROW_R_X=0
PARAM_ANGLE_X=0,-0.01,-0.04,-0.09,-0.16,-0.24,-0.34,-0.46,-0.59,-0.74,-0.9,-1.07,-1.26,-1.46,-1.66,-1.88,-2.11,-2.34,-2.58,-2.83,-3.09,-3.34,-3.61,-3.88,-4.15,-4.42,-4.69,-4.96,-5.24,-5.51,-5.78,-6.05,-6.32,-6.58,-6.84,-7.09,-7.33,-7.57,-7.81,-8.03,-8.25,-8.45,-8.65,-8.83,-9.01,-9.17,-9.32,-9.46,-9.58,-9.69,-9.78,-9.86,-9.92,-9.96,-9.99,-10,-9.94,-9.75,-9.46,-9.09,-8.64,-8.14,-7.58,-6.99,-6.36,-5.73,-5.08,-4.44,-3.81,-3.19,-2.61,-2.07,-1.57,-1.13,-0.74,-0.43,-0.2,-0.05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.04,0.15,0.32,0.54,0.82,1.12,1.45,1.81,2.18,2.56,2.95,3.34,3.71,4.09,4.43,4.76,5.06,5.32,5.55,5.74,5.88,5.97,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5.95,5.82,5.61,5.32,4.96,4.55,4.08,3.55,3,2.39,1.76,1.11,0.45,-0.23,-0.92,-1.59,-2.27,-2.93,-3.57,-4.19,-4.78,-5.33,-5.85,-6.33,-6.75,-7.11,-7.42,-7.67,-7.85,-7.96,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8
PARAM_ARM_R=0,0,0,0,0,0.02,0.07,0.16,0.26,0.38,0.5,0.62,0.74,0.84,0.93,0.98,1,0.987,0.95,0.9,0.83,0.74,0.65,0.56,0.46,0.37,0.28,0.2,0.13,0.08,0.04,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.16,0.56,1.11,1.75,2.41,3.07,3.69,4.21,4.63,4.9,5,4.94,4.77,4.51,4.19,3.82,3.42,2.99,2.56,2.12,1.71,1.31,0.95,0.63,0.37,0.17,0.04,0,0.08,0.29,0.63,1.04,1.5,2,2.5,2.96,3.38,3.71,3.92,4,3.95,3.81,3.59,3.3,2.98,2.61,2.24,1.86,1.49,1.14,0.82,0.54,0.31,0.14,0.04,0,0.06,0.22,0.47,0.78,1.13,1.5,1.87,2.22,2.53,2.78,2.94,3,2.94,2.78,2.53,2.22,1.87,1.5,1.13,0.78,0.47,0.22,0.06,0,0.06,0.22,0.47,0.78,1.13,1.5,1.87,2.22,2.53,2.78,2.94,3,2.97,2.89,2.77,2.61,2.43,2.23,2.01,1.79,1.55,1.32,1.09,0.87,0.66,0.46,0.28,0.13,0,-0.12,-0.23,-0.34,-0.45,-0.55,-0.64,-0.73,-0.82,-0.91,-0.99,-1.06,-1.13,-1.2,-1.27,-1.33,-1.39,-1.44,-1.5,-1.54,-1.59,-1.63,-1.67,-1.71,-1.74,-1.78,-1.8,-1.83,-1.86,-1.88,-1.898,-1.916,-1.932,-1.946,-1.958,-1.969,-1.978,-1.985,-1.991,-1.995,-1.998,-1.999,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1.97,-1.91,-1.8,-1.68,-1.53,-1.37,-1.2,-1.02,-0.85,-0.68,-0.53,-0.38,-0.25,-0.15,-0.07,-0.02,0,-0.01,-0.04,-0.09,-0.15,-0.22,-0.31,-0.41,-0.52,-0.63,-0.74,-0.86,-0.99,-1.11,-1.22,-1.34,-1.45,-1.55,-1.65,-1.74,-1.81,-1.88,-1.93,-1.97,-1.99,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2
PARAM_ARM_L=0,0,0,0,0,0.02,0.07,0.16,0.26,0.38,0.5,0.62,0.74,0.84,0.93,0.98,1,0.987,0.95,0.9,0.83,0.74,0.65,0.56,0.46,0.37,0.28,0.2,0.13,0.08,0.04,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.16,0.56,1.11,1.75,2.41,3.07,3.69,4.21,4.63,4.9,5,4.94,4.77,4.51,4.19,3.82,3.42,2.99,2.56,2.12,1.71,1.31,0.95,0.63,0.37,0.17,0.04,0,0.08,0.29,0.63,1.04,1.5,2,2.5,2.96,3.38,3.71,3.92,4,3.95,3.81,3.59,3.3,2.98,2.61,2.24,1.86,1.49,1.14,0.82,0.54,0.31,0.14,0.04,0,0.06,0.22,0.47,0.78,1.13,1.5,1.87,2.22,2.53,2.78,2.94,3,2.94,2.78,2.53,2.22,1.87,1.5,1.13,0.78,0.47,0.22,0.06,0,0.06,0.22,0.47,0.78,1.13,1.5,1.87,2.22,2.53,2.78,2.94,3,2.97,2.89,2.77,2.61,2.43,2.23,2.01,1.79,1.55,1.32,1.09,0.87,0.66,0.46,0.28,0.13,0,-0.12,-0.23,-0.34,-0.45,-0.55,-0.64,-0.73,-0.82,-0.91,-0.99,-1.06,-1.13,-1.2,-1.27,-1.33,-1.39,-1.44,-1.5,-1.54,-1.59,-1.63,-1.67,-1.71,-1.74,-1.78,-1.8,-1.83,-1.86,-1.88,-1.898,-1.916,-1.932,-1.946,-1.958,-1.969,-1.978,-1.985,-1.991,-1.995,-1.998,-1.999,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1.97,-1.91,-1.8,-1.68,-1.53,-1.37,-1.2,-1.02,-0.85,-0.68,-0.53,-0.38,-0.25,-0.15,-0.07,-0.02,0,-0.01,-0.04,-0.09,-0.15,-0.22,-0.31,-0.41,-0.52,-0.63,-0.74,-0.86,-0.99,-1.11,-1.22,-1.34,-1.45,-1.55,-1.65,-1.74,-1.81,-1.88,-1.93,-1.97,-1.99,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2
PARAM_MOUTH_FORM=1
PARAM_HAIR_SIDE=0
PARAM_EYE_BALL_FORM=0
PARAM_BROW_R_ANGLE=0
PARAM_SWEAT=0
PARAM_BROW_R_FORM=0
PARAM_TERE=0
PARAM_EYE_BALL_GLITTER=0
PARAM_STRING=0

View File

@ -0,0 +1,44 @@
# Live2D Animator Motion Data
$fps=30
PARAM_SHOULDER_X=0
PARAM_MOUTH_OPEN_Y=0
PARAM_FACE_COVER=0
PARAM_FEAR=0
PARAM_EYE_L_OPEN=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.07,0.25,0.47,0.68,0.85,0.96,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.93,0.75,0.53,0.32,0.15,0.04,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.03,0.12,0.25,0.4,0.56,0.7,0.83,0.92,0.98,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
PARAM_EYE_L_SMILE=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.07,0.25,0.47,0.68,0.85,0.96,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.97,0.88,0.75,0.6,0.44,0.3,0.17,0.08,0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_BROW_L_FORM=0
PARAM_TEAR=0
PARAM_BROW_L_X=0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26
PARAM_BROW_DEFORMED=0
PARAM_BROW_L_Y=0
PARAM_EYE_R_SMILE=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.07,0.25,0.47,0.68,0.85,0.96,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.97,0.88,0.75,0.6,0.44,0.3,0.17,0.08,0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_EYE_R_OPEN=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.07,0.25,0.47,0.68,0.85,0.96,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.93,0.75,0.53,0.32,0.15,0.04,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.03,0.12,0.25,0.4,0.56,0.7,0.83,0.92,0.98,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
PARAM_HAIR_BACK=0
PARAM_EYE_BALL_X=-0.4,-0.4,-0.4,-0.4,-0.399,-0.398,-0.4,-0.396,-0.395,-0.394,-0.392,-0.391,-0.389,-0.387,-0.385,-0.383,-0.381,-0.378,-0.376,-0.373,-0.37,-0.368,-0.365,-0.362,-0.358,-0.355,-0.352,-0.348,-0.345,-0.341,-0.338,-0.334,-0.33,-0.326,-0.322,-0.318,-0.314,-0.309,-0.305,-0.301,-0.296,-0.292,-0.287,-0.283,-0.278,-0.273,-0.269,-0.264,-0.259,-0.254,-0.249,-0.245,-0.24,-0.235,-0.23,-0.225,-0.22,-0.215,-0.21,-0.205,-0.2,-0.195,-0.19,-0.185,-0.18,-0.175,-0.17,-0.165,-0.16,-0.155,-0.151,-0.146,-0.141,-0.136,-0.131,-0.127,-0.122,-0.117,-0.113,-0.108,-0.104,-0.099,-0.095,-0.091,-0.086,-0.082,-0.078,-0.074,-0.07,-0.066,-0.063,-0.059,-0.055,-0.052,-0.048,-0.045,-0.042,-0.038,-0.035,-0.032,-0.03,-0.027,-0.024,-0.022,-0.019,-0.017,-0.015,-0.013,-0.011,-0.009,-0.008,-0.006,-0.005,-0.004,-0.003,-0,-0.001,-0.001,-0,-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_HAIR_FRONT=0
PARAM_EYE_BALL_Y=0.25,0.25,0.25,0.25,0.25,0.249,0.25,0.248,0.247,0.246,0.25,0.244,0.243,0.242,0.241,0.239,0.238,0.236,0.235,0.233,0.231,0.23,0.228,0.226,0.224,0.222,0.22,0.218,0.216,0.213,0.211,0.209,0.206,0.204,0.201,0.199,0.196,0.193,0.191,0.188,0.185,0.182,0.18,0.177,0.174,0.171,0.168,0.165,0.162,0.159,0.156,0.153,0.15,0.147,0.144,0.141,0.137,0.134,0.131,0.128,0.125,0.122,0.119,0.116,0.113,0.109,0.106,0.103,0.1,0.097,0.094,0.091,0.088,0.085,0.082,0.079,0.076,0.073,0.07,0.068,0.065,0.062,0.059,0.057,0.054,0.051,0.049,0.046,0.044,0.041,0.039,0.037,0.034,0.032,0.03,0.028,0.026,0.024,0.022,0.02,0.019,0.017,0.015,0.014,0.012,0.011,0.009,0.008,0.007,0.006,0.005,0,0.003,0.002,0.002,0,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_BROW_L_ANGLE=0
PARAM_EYE_DEFORMED_04=0
PARAM_EYE_DEFORMED_03=0
PARAM_EYE_DEFORMED_02=0
PARAM_EYE_DEFORMED_01=0
PARAM_ANGLE_Z=0,-0.09,-0.33,-0.71,-1.22,-1.82,-2.53,-3.31,-4.15,-5.03,-5.97,-6.91,-7.89,-8.87,-9.83,-10.77,-11.69,-12.56,-13.38,-14.15,-14.85,-15.46,-15.99,-16.41,-16.73,-16.93,-17,-17,-17,-17,-17,-16.91,-16.65,-16.23,-15.67,-14.99,-14.19,-13.28,-12.28,-11.23,-10.08,-8.9,-7.68,-6.41,-5.13,-3.82,-2.51,-1.22,0.05,1.31,2.52,3.7,4.82,5.86,6.85,7.75,8.55,9.27,9.87,10.35,10.7,10.92,11,11,11,11,11,11,11,11,11,10.94,10.79,10.53,10.19,9.77,9.29,8.75,8.17,7.55,6.9,6.26,5.58,4.92,4.27,3.63,3.02,2.45,1.93,1.45,1.03,0.67,0.39,0.18,0.04,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.07,-0.27,-0.59,-1.01,-1.53,-2.14,-2.83,-3.57,-4.38,-5.22,-6.11,-7.01,-7.93,-8.85,-9.75,-10.65,-11.53,-12.35,-13.14,-13.88,-14.56,-15.16,-15.7,-16.16,-16.51,-16.78,-16.95,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-16.89,-16.56,-16.04,-15.34,-14.48,-13.48,-12.34,-11.11,-9.79,-8.41,-6.93,-5.45,-3.94,-2.43,-0.94,0.53,1.99,3.35,4.65,5.86,6.99,7.98,8.86,9.61,10.2,10.64,10.91,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11
PARAM_BODY_ANGLE_X=0,-0.006,-0.025,-0.06,-0.1,-0.15,-0.21,-0.28,-0.35,-0.43,-0.52,-0.61,-0.7,-0.8,-0.9,-1,-1.1,-1.2,-1.3,-1.39,-1.48,-1.57,-1.65,-1.72,-1.79,-1.85,-1.9,-1.94,-1.97,-1.994,-2,-1.99,-1.96,-1.92,-1.85,-1.78,-1.69,-1.59,-1.48,-1.36,-1.23,-1.09,-0.95,-0.81,-0.66,-0.52,-0.37,-0.23,-0.09,0.05,0.18,0.31,0.43,0.54,0.64,0.73,0.81,0.88,0.93,0.97,0.99,1,0.998,0.992,0.983,0.971,0.956,0.937,0.92,0.89,0.87,0.84,0.81,0.78,0.75,0.72,0.68,0.65,0.61,0.58,0.54,0.5,0.47,0.43,0.4,0.36,0.33,0.29,0.26,0.23,0.2,0.17,0.14,0.12,0.09,0.074,0.056,0.039,0.025,0.015,0.007,0.002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.005,-0.021,-0.05,-0.08,-0.12,-0.17,-0.23,-0.3,-0.36,-0.44,-0.52,-0.6,-0.69,-0.77,-0.86,-0.95,-1.05,-1.14,-1.23,-1.31,-1.4,-1.48,-1.56,-1.64,-1.7,-1.77,-1.83,-1.88,-1.92,-1.95,-1.98,-1.995,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1.981,-1.93,-1.85,-1.74,-1.61,-1.46,-1.28,-1.1,-0.9,-0.69,-0.47,-0.24,0,0.24,0.49,0.74,1,1.26,1.5,1.71,1.91,2.08,2.24,2.38,2.5,2.61,2.7,2.78,2.84,2.89,2.93,2.96,2.985,2.996,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
PARAM_BODY_ANGLE_Y=0,0.05,0.19,0.42,0.7,1.04,1.41,1.8,2.2,2.59,2.96,3.3,3.58,3.81,3.95,4,3.96,3.86,3.7,3.49,3.25,2.96,2.66,2.33,2,1.67,1.34,1.04,0.75,0.51,0.3,0.14,0.04,0,0.03,0.1,0.22,0.38,0.56,0.77,0.99,1.23,1.47,1.71,1.94,2.16,2.36,2.54,2.7,2.83,2.92,2.98,3,2.96,2.86,2.71,2.51,2.29,2.05,1.79,1.54,1.27,1.02,0.79,0.57,0.38,0.22,0.1,0.03,0,0.013,0.05,0.1,0.16,0.24,0.32,0.4,0.49,0.58,0.66,0.74,0.81,0.87,0.93,0.97,0.99,1,0.991,0.97,0.93,0.87,0.81,0.74,0.67,0.59,0.51,0.43,0.35,0.28,0.21,0.15,0.1,0.06,0.03,0.007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.05,0.19,0.41,0.7,1.02,1.39,1.76,2.14,2.51,2.86,3.18,3.46,3.69,3.86,3.96,4,3.97,3.87,3.72,3.53,3.3,3.04,2.77,2.48,2.19,1.89,1.6,1.32,1.05,0.8,0.57,0.38,0.22,0.1,0.03,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.04,0.14,0.29,0.49,0.71,0.95,1.21,1.46,1.73,1.98,2.21,2.43,2.62,2.78,2.9,2.97,3,2.97,2.9,2.78,2.62,2.44,2.22,1.99,1.75,1.5,1.25,1.01,0.78,0.56,0.38,0.22,0.1,0.03,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_BODY_ANGLE_Z=0
PARAM_BROW_R_Y=0
PARAM_ANGLE_Y=4,4.03,4.1,4.21,4.36,4.54,4.74,4.97,5.22,5.48,5.76,6.03,6.32,6.61,6.89,7.17,7.44,7.69,7.94,8.16,8.37,8.55,8.7,8.83,8.92,8.98,9,9,9,9,9,8.993,8.973,8.94,8.9,8.84,8.77,8.69,8.61,8.51,8.4,8.28,8.16,8.02,7.88,7.74,7.58,7.42,7.25,7.08,6.9,6.72,6.53,6.35,6.15,5.95,5.76,5.55,5.35,5.14,4.94,4.73,4.53,4.32,4.11,3.91,3.7,3.5,3.3,3.1,2.91,2.71,2.52,2.34,2.16,1.98,1.81,1.65,1.49,1.33,1.19,1.05,0.91,0.78,0.67,0.56,0.46,0.36,0.28,0.21,0.15,0.09,0.05,0.02,0.006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.04,0.14,0.31,0.53,0.81,1.13,1.5,1.89,2.32,2.76,3.24,3.71,4.2,4.68,5.16,5.64,6.1,6.54,6.96,7.35,7.71,8.03,8.31,8.55,8.74,8.88,8.97,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9
PARAM_BREATH=0
PARAM_BROW_R_X=0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26
PARAM_ANGLE_X=-10,-9.96,-9.86,-9.71,-9.5,-9.25,-8.96,-8.64,-8.29,-7.93,-7.54,-7.15,-6.75,-6.35,-5.95,-5.57,-5.19,-4.83,-4.49,-4.17,-3.89,-3.63,-3.42,-3.24,-3.11,-3.03,-3,-3,-3,-3,-3,-2.998,-2.991,-2.98,-2.966,-2.947,-2.92,-2.9,-2.87,-2.84,-2.8,-2.76,-2.72,-2.67,-2.63,-2.58,-2.53,-2.47,-2.42,-2.36,-2.3,-2.24,-2.18,-2.12,-2.05,-1.98,-1.92,-1.85,-1.78,-1.71,-1.65,-1.58,-1.51,-1.44,-1.37,-1.3,-1.23,-1.17,-1.1,-1.03,-0.97,-0.9,-0.84,-0.78,-0.72,-0.66,-0.6,-0.55,-0.5,-0.44,-0.4,-0.35,-0.3,-0.26,-0.22,-0.19,-0.15,-0.12,-0.09,-0.07,-0.05,-0.032,-0.018,-0.008,-0.002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.012,-0.05,-0.1,-0.18,-0.27,-0.38,-0.5,-0.63,-0.77,-0.92,-1.08,-1.24,-1.4,-1.56,-1.72,-1.88,-2.03,-2.18,-2.32,-2.45,-2.57,-2.68,-2.77,-2.85,-2.91,-2.96,-2.99,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3
PARAM_ARM_R=-7,-6.987,-6.95,-6.9,-6.82,-6.74,-6.65,-6.55,-6.45,-6.35,-6.26,-6.18,-6.1,-6.05,-6.01,-6,-6.009,-6.03,-6.07,-6.13,-6.19,-6.26,-6.34,-6.42,-6.5,-6.58,-6.66,-6.74,-6.81,-6.87,-6.93,-6.97,-6.99,-7,-6.991,-6.97,-6.93,-6.87,-6.81,-6.74,-6.67,-6.59,-6.51,-6.43,-6.35,-6.28,-6.21,-6.15,-6.1,-6.06,-6.03,-6.007,-6,-6.013,-6.05,-6.1,-6.16,-6.24,-6.32,-6.4,-6.49,-6.58,-6.66,-6.74,-6.81,-6.87,-6.93,-6.97,-6.99,-7,-6.987,-6.95,-6.9,-6.84,-6.76,-6.68,-6.6,-6.51,-6.42,-6.34,-6.26,-6.19,-6.13,-6.07,-6.03,-6.01,-6,-6.009,-6.03,-6.07,-6.13,-6.19,-6.26,-6.33,-6.41,-6.49,-6.57,-6.65,-6.72,-6.79,-6.85,-6.9,-6.94,-6.97,-6.993,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-6.993,-6.975,-6.94,-6.91,-6.86,-6.8,-6.74,-6.68,-6.61,-6.54,-6.47,-6.41,-6.34,-6.28,-6.22,-6.17,-6.12,-6.08,-6.04,-6.02,-6.005,-6,-6.009,-6.03,-6.07,-6.12,-6.18,-6.24,-6.31,-6.38,-6.45,-6.53,-6.6,-6.67,-6.74,-6.8,-6.86,-6.91,-6.94,-6.97,-6.993,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-6.987,-6.95,-6.9,-6.84,-6.76,-6.68,-6.6,-6.51,-6.42,-6.34,-6.26,-6.19,-6.13,-6.07,-6.03,-6.01,-6,-6.009,-6.03,-6.07,-6.13,-6.19,-6.26,-6.34,-6.42,-6.5,-6.58,-6.66,-6.74,-6.81,-6.87,-6.93,-6.97,-6.99,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7
PARAM_ARM_L=-7,-6.97,-6.9,-6.79,-6.65,-6.48,-6.29,-6.1,-5.9,-5.71,-5.52,-5.35,-5.21,-5.1,-5.03,-5,-5.018,-5.07,-5.15,-5.25,-5.38,-5.52,-5.67,-5.83,-6,-6.17,-6.33,-6.48,-6.62,-6.75,-6.85,-6.93,-6.98,-7,-6.982,-6.93,-6.85,-6.75,-6.63,-6.49,-6.34,-6.18,-6.02,-5.86,-5.71,-5.56,-5.42,-5.3,-5.2,-5.11,-5.05,-5.01,-5,-5.03,-5.09,-5.2,-5.32,-5.47,-5.63,-5.8,-5.98,-6.15,-6.32,-6.47,-6.62,-6.75,-6.85,-6.93,-6.98,-7,-6.97,-6.91,-6.8,-6.68,-6.53,-6.37,-6.2,-6.02,-5.85,-5.68,-5.53,-5.38,-5.25,-5.15,-5.07,-5.02,-5,-5.018,-5.07,-5.15,-5.25,-5.37,-5.51,-5.66,-5.82,-5.98,-6.14,-6.29,-6.44,-6.58,-6.7,-6.8,-6.89,-6.95,-6.99,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-6.987,-6.95,-6.89,-6.81,-6.72,-6.61,-6.48,-6.36,-6.22,-6.09,-5.95,-5.81,-5.68,-5.55,-5.44,-5.33,-5.24,-5.15,-5.09,-5.04,-5.01,-5,-5.017,-5.07,-5.14,-5.24,-5.35,-5.48,-5.62,-5.76,-5.91,-6.06,-6.2,-6.34,-6.48,-6.6,-6.71,-6.81,-6.89,-6.95,-6.99,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-6.97,-6.91,-6.8,-6.68,-6.53,-6.37,-6.2,-6.02,-5.85,-5.68,-5.53,-5.38,-5.25,-5.15,-5.07,-5.02,-5,-5.018,-5.07,-5.15,-5.25,-5.38,-5.52,-5.67,-5.83,-6,-6.17,-6.33,-6.48,-6.62,-6.75,-6.85,-6.93,-6.98,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7
PARAM_MOUTH_FORM=1
PARAM_HAIR_SIDE=0
PARAM_EYE_BALL_FORM=0
PARAM_BROW_R_ANGLE=0
PARAM_SWEAT=0
PARAM_BROW_R_FORM=0
PARAM_TERE=0
PARAM_EYE_BALL_GLITTER=0
PARAM_STRING=0

View File

@ -0,0 +1,44 @@
# Live2D Animator Motion Data
$fps=30
PARAM_SHOULDER_X=10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,9.66,8.75,7.45,5.96,4.42,2.97,1.74,0.8,0.21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.39,1.26,2.37,3.56,4.7,5.73,6.55,7.1,7.56,7.83,7.99,8.09,8.13,8.145,8.15,8.143,7.86,7.11,6.02,4.74,3.41,2.12,1.03,0.28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_MOUTH_OPEN_Y=0,0.63,1,1,1,1,1,1,1,0.3,0.22,0.15,0.07,0,0.001,0.002,0.003,0.004,0.006,0.007,0.008,0.009,0.01,0.011,0.012,0.013,0.015,0.016,0.24,0.47,0.51,0.55,0.31,0.06,0.04,0.01,0.27,0.54,0.549,0.557,0.565,0.573,0.43,0.29,0.14,0,0.29,0.57,0.45,0.33,0.341,0.353,0.349,0.345,0.341,0.337,0.333,0.329,0.325,0.322,0.318,0.314,0.319,0.325,0.331,0.336,0.342,0.348,0.353,0.359,0.365,0.37,0.376,0.382,0.387,0.393,0.399,0.404,0.41,0.416,0.27,0.13,0.09,0.06,0.03,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_FACE_COVER=0
PARAM_FEAR=0
PARAM_EYE_L_OPEN=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
PARAM_EYE_L_SMILE=0
PARAM_BROW_L_FORM=0
PARAM_TEAR=0
PARAM_BROW_L_X=0
PARAM_BROW_DEFORMED=0
PARAM_BROW_L_Y=0
PARAM_EYE_R_SMILE=0
PARAM_EYE_R_OPEN=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
PARAM_HAIR_BACK=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0,-0.001,-0,-0,0.003,0.01,0.019,0.031,0.047,0.066,0.09,0.12,0.14,0.17,0.19,0.22,0.24,0.26,0.29,0.31,0.33,0.36,0.38,0.4,0.42,0.44,0.46,0.49,0.506,0.526,0.546,0.565,0.584,0.603,0.622,0.64,0.657,0.675,0.692,0.708,0.724,0.74,0.755,0.77,0.784,0.799,0.812,0.825,0.838,0.85,0.862,0.874,0.885,0.895,0.905,0.915,0.924,0.932,0.94,0.948,0.955,0.962,0.968,0.973,0.978,0.983,0.987,0.99,0.993,0.996,0.998,0.999,1,1
PARAM_EYE_BALL_X=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.03,-0.12,-0.25,-0.4,-0.56,-0.7,-0.83,-0.92,-0.98,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
PARAM_HAIR_FRONT=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.002,-0.007,-0.015,-0.023,-0.032,-0.041,-0.048,-0.054,-0.057,-0.058,-0.06,-0.058,-0.06,-0.06,-0.06,-0.057,-0.06,-0.056,-0.055,-0.05,-0.053,-0.053,-0.052,-0.051,-0.05,-0.049,-0.048,-0.047,-0.046,-0.044,-0.043,-0.042,-0.041,-0.039,-0.038,-0.037,-0.035,-0.034,-0.033,-0.031,-0.03,-0.029,-0.027,-0.026,-0.024,-0.023,-0.022,-0.021,-0.019,-0.018,-0.017,-0.015,-0.014,-0.013,-0.012,-0.011,-0.01,-0.009,-0.008,-0.007,-0.006,-0.01,-0.004,-0.004,-0.003,-0,-0.002,-0,-0.001,-0,-0,-0,-0,0
PARAM_EYE_BALL_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.008,-0.03,-0.06,-0.09,-0.13,-0.16,-0.19,-0.21,-0.225,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23
PARAM_BROW_L_ANGLE=0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03
PARAM_EYE_DEFORMED_04=0
PARAM_EYE_DEFORMED_03=0
PARAM_EYE_DEFORMED_02=0
PARAM_EYE_DEFORMED_01=0
PARAM_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.24,0.87,1.78,2.83,3.91,4.92,5.78,6.44,6.85,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7.79,9.87,12.86,16.29,19.84,23.16,25.99,28.16,29.52,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30
PARAM_BODY_ANGLE_X=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.34,-1.25,-2.55,-4.04,-5.58,-7.03,-8.26,-9.2,-9.79,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-9.47,-8.1,-6.22,-4.07,-1.9,0.16,2,4.03,5.7,7.04,8.08,8.85,9.4,9.76,9.94,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10
PARAM_BODY_ANGLE_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.009,0.03,0.07,0.12,0.18,0.24,0.31,0.38,0.45,0.53,0.6,0.67,0.74,0.8,0.86,0.91,0.94,0.97,0.993,1,0.93,0.79,0.62,0.43,0.27,0.13,0.03,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_BODY_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.25,0.92,1.9,3.04,4.24,5.4,6.42,7.27,7.89,8.26,8.52,8.76,8.96,9.15,9.31,9.45,9.57,9.67,9.75,9.82,9.87,9.92,9.95,9.97,9.986,9.995,9.999,10,10,10,10,10,10,10,10,10,9.8,9.38,8.85,8.3,7.8,7.38,7.1,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
PARAM_BROW_R_Y=0
PARAM_ANGLE_Y=30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,28.49,24.52,18.78,12.23,5.43,-0.92,-6.34,-10.47,-13.08,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-13.48,-12.13,-10.18,-7.94,-5.62,-3.46,-1.61,-0.2,0.69,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
PARAM_BREATH=0
PARAM_BROW_R_X=0
PARAM_ANGLE_X=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.03,0.12,0.25,0.4,0.56,0.7,0.83,0.92,0.98,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,4.61,8.39,12.71,17.2,21.38,24.95,27.68,29.39,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30
PARAM_ARM_R=3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2.2,1.4,0.6,-0.2,-1,-1.8,-2.6,-3.4,-4.2,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4.7,-4.4,-4.1,-3.8,-3.5,-3.2,-2.9,-2.6,-2.3,-2,-2.19,-2.38,-2.56,-2.75,-2.94,-3.13,-3.31,-3.5,-3.69,-3.88,-4.06,-4.25,-4.44,-4.63,-4.81,-5,-5.33,-5.67,-6,-6.33,-6.67,-7,-7.33,-7.67,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8
PARAM_ARM_L=5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4.3,3.6,2.9,2.2,1.5,0.8,0.1,-0.6,-1.3,-2,-2,-2,-2,-2,-2,-2,-1.75,-1.5,-1.25,-1,-0.75,-0.5,-0.25,0,0.25,0.5,0.75,1,0.68,0.36,0.04,-0.29,-0.61,-0.93,-1.25,-1.57,-1.89,-2.21,-2.54,-2.86,-3.18,-3.5,-3.82,-4.14,-4.57,-5,-5.43,-5.86,-6.29,-6.71,-7.14,-7.57,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8
PARAM_MOUTH_FORM=0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.12,0.2,0.32,0.46,0.6,0.73,0.84,0.93,0.98,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
PARAM_HAIR_SIDE=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.002,0.008,0.017,0.028,0.041,0.054,0.069,0.082,0.096,0.109,0.124,0.139,0.154,0.168,0.182,0.196,0.21,0.223,0.236,0.249,0.261,0.273,0.285,0.297,0.308,0.32,0.33,0.341,0.352,0.362,0.371,0.381,0.39,0.399,0.408,0.417,0.425,0.433,0.441,0.449,0.456,0.463,0.47,0.476,0.483,0.489,0.495,0.5,0.506,0.511,0.516,0.521,0.525,0.529,0.534,0.537,0.541,0.544,0.548,0.55,0.553,0.556,0.558,0.56,0.562,0.564,0.565,0.566,0.568,0.568,0.569,0.57,0.57,0.57
PARAM_EYE_BALL_FORM=0
PARAM_BROW_R_ANGLE=0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06
PARAM_SWEAT=1
PARAM_BROW_R_FORM=0
PARAM_TERE=0
PARAM_EYE_BALL_GLITTER=0
PARAM_STRING=0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.466,0.448,0.42,0.39,0.36,0.33,0.3,0.28,0.259,0.248,0.239,0.231,0.222,0.214,0.206,0.198,0.19,0.183,0.176,0.168,0.161,0.155,0.148,0.142,0.135,0.129,0.123,0.117,0.112,0.106,0.101,0.096,0.091,0.086,0.081,0.077,0.073,0.068,0.064,0.06,0.056,0.053,0.049,0.046,0.043,0.04,0.037,0.034,0.031,0.028,0.026,0.024,0.021,0.019,0.017,0.015,0.014,0.012,0.011,0.009,0.008,0.007,0.006,0.005,0.004,0.003,0,0.002,0,0.001,0,0,0,0

View File

@ -0,0 +1,41 @@
# Live2D Animator Motion Data
$fps=30
PARAM_SHOULDER_X=10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,9.66,8.75,7.45,5.96,4.42,2.97,1.74,0.8,0.21,0,0.66,2.07,3.84,5.67,7.35,8.73,9.66,10,9.999,9.995,9.99,9.982,9.972,9.96,9.945,9.929,9.911,9.892,9.87,9.85,9.82,9.8,9.77,9.74,9.71,9.68,9.64,9.61,9.57,9.54,9.5,9.46,9.42,9.38,9.34,9.3,9.25,9.21,9.17,9.12,9.08,9.03,8.99,8.94,8.9,8.85,8.81,8.76,8.71,8.67,8.62,8.58,8.53,8.49,8.45,8.4,8.36,8.32,8.27,8.23,8.19,8.15,8.12,8.08,8.04,8.01,7.97,7.94,7.91,7.88,7.85,7.82,7.79,7.77,7.74,7.72,7.702,7.683,7.666,7.651,7.638,7.626,7.617,7.61,7.604,7.601,7.6,7.6,7.6,7.6,7.6,7.6,7.6,7.6
PARAM_MOUTH_OPEN_Y=0,0,0,0,0,0,0,0,0.15,0.31,0.24,0.16,0.171,0.178,0.184,0.191,0.197,0.204,0.55,0.9,0.86,0.82,0.52,0.22,0.58,0.94,0.76,0.59,0.56,0.53,0.62,0.71,0.8,0.89,0.53,0.16,0.16,0.16,0.52,0.87,0.83,0.8,0.76,0.72,0.69,0.65,0.657,0.663,0.669,0.675,0.68,0.686,0.692,0.698,0.704,0.71,0.716,0.722,0.51,0.29,0.52,0.75,0.69,0.64,0.4,0.16,0.44,0.71,0.718,0.722,0.6,0.47,0.65,0.82,0.8,0.77,0.74,0.71,0.8,0.89,0.66,0.44,0.3,0.16,0.58,1,1,1,1,0.96,0.86,0.76,0.66,0.56,0.52,0.48,0.6,0.73,0.733,0.736,0.74,0.744,0.747,0.751,0.754,0.758,0.761,0.765,0.768,0.772,0.775,0.779,0.782,0.786,0.789,0.793,0.796,0.8,0.63,0.45,0.61,0.76,0.773,0.784,0.796,0.808,0.53,0.26,0.39,0.52,0.65,0.78,0.74,0.7,0.66,0.63,0.47,0.31,0.16,0,0,0,0,0,0,0,0
PARAM_FACE_COVER=0
PARAM_FEAR=0
PARAM_EYE_L_OPEN=0
PARAM_EYE_L_SMILE=1
PARAM_BROW_L_FORM=-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
PARAM_TEAR=0
PARAM_BROW_L_X=0
PARAM_BROW_DEFORMED=0
PARAM_BROW_L_Y=-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.95,-0.85,-0.72,-0.58,-0.46,-0.35,-0.29,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.45,-0.81,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
PARAM_EYE_R_SMILE=1
PARAM_EYE_R_OPEN=0
PARAM_EYE_BALL_X=0
PARAM_EYE_BALL_Y=0
PARAM_BROW_L_ANGLE=0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
PARAM_EYE_DEFORMED_04=0
PARAM_EYE_DEFORMED_03=0
PARAM_EYE_DEFORMED_02=0
PARAM_EYE_DEFORMED_01=0
PARAM_ANGLE_Z=0
PARAM_BODY_ANGLE_X=0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,1.72,2,1.28,0.14,-0.93,-1.7,-2,-1.28,-0.14,0.93,1.7,2,1.87,1.59,1.23,0.87,0.53,0.25,0.07,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.26,-0.83,-1.54,-2.27,-2.94,-3.49,-3.86,-4,-3.72,-2.99,-1.92,-0.65,0.65,1.92,2.99,3.72,4,3.48,2.34,0.93,-0.54,-1.88,-2.99,-3.72,-4,-3.72,-2.99,-1.92,-0.65,0.65,1.92,2.99,3.72,4,3.48,2.34,0.93,-0.54,-1.88,-2.99,-3.72,-4,-3.41,-1.98,-0.23,1.47,2.84,3.71,4,3.48,2.34,0.93,-0.54,-1.88,-2.99,-3.72,-4,-3.41,-1.98,-0.23,1.47,2.84,3.71,4,3.48,2.34,0.93,-0.54,-1.88,-2.99,-3.72,-4,-3.71,-2.99,-2.12,-1.27,-0.58,-0.15,0,0,0,0,0,0,0,0
PARAM_BODY_ANGLE_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.13,-0.46,-0.98,-1.62,-2.36,-3.16,-4.02,-4.88,-5.76,-6.59,-7.37,-8.1,-8.73,-9.26,-9.66,-9.91,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-9.89,-9.57,-9.06,-8.42,-7.66,-6.83,-5.95,-5.05,-4.17,-3.34,-2.58,-1.94,-1.43,-1.11,-1,-1,-1,-1,-1,-1,-1,-1
PARAM_BODY_ANGLE_Z=1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,1.45,0.38,-1.39,-2.6,-3,-1.93,-0.21,1.39,2.55,3,1.93,0.21,-1.39,-2.55,-3,-2.8,-2.38,-1.85,-1.3,-0.8,-0.38,-0.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.39,1.24,2.3,3.4,4.41,5.24,5.79,6,5.59,4.48,2.88,0.98,-0.98,-2.88,-4.48,-5.59,-6,-5.21,-3.51,-1.39,0.81,2.82,4.48,5.59,6,5.59,4.48,2.88,0.98,-0.98,-2.88,-4.48,-5.59,-6,-5.21,-3.51,-1.39,0.81,2.82,4.48,5.59,6,5.12,2.97,0.35,-2.2,-4.26,-5.56,-6,-5.21,-3.51,-1.39,0.81,2.82,4.48,5.59,6,5.12,2.97,0.35,-2.2,-4.26,-5.56,-6,-5.21,-3.51,-1.39,0.81,2.82,4.48,5.59,6,6,6,6,6,6,6,6,6,6,6,6
PARAM_BROW_R_Y=-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-0.97,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.97,-0.89,-0.8,-0.7,-0.61,-0.54,-0.49,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.61,-0.86,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
PARAM_ANGLE_Y=-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-27.01,-22.73,-12.33,1.49,15.32,25.71,30,28.87,25.85,21.3,15.58,9.22,2.45,-4.23,-10.51,-16.13,-20.92,-24.62,-27.06,-28.13,-28.52,-28.85,-29.14,-29.36,-29.55,-29.7,-29.81,-29.89,-29.95,-29.98,-30,-30,-30,-30,-30,-28.8,-25.59,-20.63,-14.39,-7.49,0,7.49,14.39,20.63,25.59,28.8,30,28.93,26.23,22.19,16.97,10.76,3.49,-4.65,-13.87,-23.52,-24.81,-24.56,-24.02,-23.35,-22.65,-22.01,-21.48,-21.13,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21
PARAM_BREATH=0
PARAM_BROW_R_X=0
PARAM_ANGLE_X=2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,2.88,3.47,4.05,4.63,5.21,5.79,6.37,3.26,0.16,-2.95,-6.06,-9.17,-5.34,-1.5,2.33,0.53,-1.26,-3.06,-4.86,-6.66,-6.05,-5.45,-4.84,-4.24,-3.63,-3.03,-2.42,-1.82,-1.21,-0.61,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.22,-0.44,-0.67,-0.89,-1.11,-1.33,-1.56,-1.78,-2,-3.26,-4.51,-5.77,-7.02,-8.28,-9.53,-10.79,-12.04,-8.98,-5.93,-2.87,0.18,3.24,0.48,-2.29,-5.05,-7.82,-10.58,-13.35,-16.11,-18.88,-13.18,-7.48,-1.78,3.92,9.61,5.55,1.48,-2.58,-6.65,-10.72,-14.78,-10.52,-6.26,-2,2.26,6.52,4.06,1.6,-0.86,-3.31,-5.77,-8.23,-4.75,-1.26,2.22,5.7,4.42,3.15,1.87,0.59,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69
PARAM_ARM_R=-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-9.57,-9.14,-8.71,-8.29,-7.86,-7.43,-7,-6.57,-6.14,-5.71,-5.29,-4.86,-4.43,-4,-4.32,-4.63,-4.95,-5.26,-5.58,-5.89,-6.21,-6.53,-6.84,-7.16,-7.47,-7.79,-8.11,-8.42,-8.74,-9.05,-9.37,-9.68,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-9.77,-9.54,-9.31,-9.08,-8.85,-8.62,-8.38,-8.15,-7.92,-7.69,-7.46,-7.23,-7,-7.16,-7.32,-7.47,-7.63,-7.79,-7.95,-8.11,-8.26,-8.42,-8.58,-8.74,-8.89,-9.05,-9.21,-9.37,-9.53,-9.68,-9.84,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10
PARAM_ARM_L=-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-9.64,-9.29,-8.93,-8.57,-8.21,-7.86,-7.5,-7.14,-6.79,-6.43,-6.07,-5.71,-5.36,-5,-5.26,-5.53,-5.79,-6.05,-6.32,-6.58,-6.84,-7.11,-7.37,-7.63,-7.89,-8.16,-8.42,-8.68,-8.95,-9.21,-9.47,-9.74,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-9.77,-9.54,-9.31,-9.08,-8.85,-8.62,-8.38,-8.15,-7.92,-7.69,-7.46,-7.23,-7,-7.16,-7.32,-7.47,-7.63,-7.79,-7.95,-8.11,-8.26,-8.42,-8.58,-8.74,-8.89,-9.05,-9.21,-9.37,-9.53,-9.68,-9.84,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10
PARAM_MOUTH_FORM=1
PARAM_EYE_BALL_FORM=0
PARAM_BROW_R_ANGLE=0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
PARAM_SWEAT=0
PARAM_BROW_R_FORM=-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-0.89,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
PARAM_TERE=0
PARAM_EYE_BALL_GLITTER=0
PARAM_STRING=0

View File

@ -0,0 +1,44 @@
# Live2D Animator Motion Data
$fps=30
PARAM_SHOULDER_X=6.4,6.36,6.24,6.05,5.79,5.48,5.13,4.74,4.32,3.88,3.42,2.98,2.52,2.08,1.66,1.27,0.92,0.61,0.35,0.16,0.04,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.14,0.49,1,1.64,2.34,3.08,3.83,4.56,5.23,5.85,6.35,6.75,7.01,7.1,7.099,7.097,7.092,7.084,7.072,7.057,7.04,7.01,6.98,6.94,6.9,6.84,6.78,6.71,6.63,6.54,6.44,6.33,6.2,6.07,5.92,5.76,5.58,5.39,5.1,4.69,4.19,3.63,3.04,2.44,1.87,1.35,0.89,0.51,0.23,0.06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_MOUTH_OPEN_Y=0,0,0,0,0,0,0,0,0.22,0.45,0.4,0.35,0.3,0.25,0.2,0.15,0.38,0.61,0.58,0.54,0.51,0.47,0.481,0.492,0.502,0.512,0.523,0.533,0.46,0.38,0.19,0,0.46,0.93,0.74,0.55,0.58,0.61,0.64,0.67,0.7,0.73,0.62,0.51,0.4,0.29,0.56,0.84,0.76,0.67,0.65,0.63,0.61,0.59,0.57,0.55,0.53,0.51,0.48,0.46,0.24,0.01,0.35,0.69,0.53,0.37,0.55,0.73,0.733,0.737,0.64,0.53,0.43,0.33,0.62,0.91,0.84,0.76,0.767,0.773,0.778,0.784,0.68,0.58,0.47,0.37,0.378,0.388,0.398,0.408,0.34,0.27,0.2,0.14,0.07,0,0.01,0.02,0.029,0.039,0.34,0.64,0.58,0.52,0.27,0.02,0.47,0.91,0.82,0.73,0.65,0.56,0.6,0.64,0.68,0.72,0.69,0.66,0.63,0.6,0.45,0.3,0.6,0.91,0.77,0.63,0.69,0.75,0.67,0.6,0.36,0.12,0.44,0.77,0.75,0.732,0.714,0.695,0.677,0.659,0.58,0.51,0.514,0.518,0.26,0,0.43,0.86,0.82,0.77,0.38,0,0.29,0.58,0.51,0.43,0.53,0.64,0.51,0.38,0.19,0,0.38,0.77,0.759,0.75,0.741,0.732,0.723,0.714,0.66,0.61,0.46,0.31,0.15,0,0,0,0,0,0,0
PARAM_FACE_COVER=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_FEAR=0
PARAM_EYE_L_OPEN=1,1,1,0.999,0.998,0.996,0.995,0.993,0.99,0.988,0.985,0.983,0.979,0.976,0.973,0.969,0.965,0.961,0.956,0.952,0.947,0.943,0.938,0.933,0.927,0.922,0.917,0.911,0.906,0.9,0.894,0.889,0.883,0.877,0.871,0.865,0.859,0.853,0.847,0.841,0.835,0.829,0.823,0.817,0.811,0.806,0.8,0.794,0.789,0.783,0.778,0.773,0.767,0.762,0.757,0.753,0.748,0.744,0.739,0.735,0.731,0.727,0.724,0.721,0.717,0.715,0.712,0.71,0.707,0.705,0.704,0.702,0.701,0.701,0.7,0.7,0.71,0.74,0.78,0.82,0.87,0.91,0.95,0.98,0.994,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.999,0.997,0.993,0.987,0.981,0.974,0.967,0.959,0.951,0.943,0.935,0.928,0.921,0.915,0.91,0.906,0.903,0.901,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.901,0.905,0.91,0.917,0.926,0.935,0.944,0.954,0.963,0.972,0.98,0.987,0.992,0.996,0.999,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
PARAM_EYE_L_SMILE=0
PARAM_BROW_L_FORM=-1
PARAM_TEAR=0
PARAM_BROW_L_X=0
PARAM_BROW_DEFORMED=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_BROW_L_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.06,-0.16,-0.25,-0.31,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.342,-0.344,-0.347,-0.351,-0.355,-0.36,-0.367,-0.374,-0.382,-0.392,-0.402,-0.414,-0.427,-0.441,-0.456,-0.473,-0.49,-0.51,-0.531,-0.551,-0.57,-0.589,-0.608,-0.626,-0.643,-0.66,-0.677,-0.693,-0.709,-0.723,-0.737,-0.751,-0.764,-0.776,-0.787,-0.797,-0.807,-0.816,-0.824,-0.832,-0.838,-0.844,-0.849,-0.853,-0.856,-0.858,-0.86,-0.86,-0.859,-0.856,-0.851,-0.845,-0.837,-0.827,-0.816,-0.803,-0.79,-0.775,-0.76,-0.743,-0.726,-0.708,-0.689,-0.67,-0.651,-0.632,-0.612,-0.593,-0.573,-0.554,-0.535,-0.516,-0.498,-0.48,-0.463,-0.446,-0.431,-0.416,-0.403,-0.391,-0.379,-0.369,-0.361,-0.353,-0.348,-0.343,-0.341,-0.34
PARAM_EYE_R_SMILE=0
PARAM_EYE_R_OPEN=1,1,1,0.999,0.998,0.996,0.995,0.993,0.99,0.988,0.985,0.983,0.979,0.976,0.973,0.969,0.965,0.961,0.956,0.952,0.947,0.943,0.938,0.933,0.927,0.922,0.917,0.911,0.906,0.9,0.894,0.889,0.883,0.877,0.871,0.865,0.859,0.853,0.847,0.841,0.835,0.829,0.823,0.817,0.811,0.806,0.8,0.794,0.789,0.783,0.778,0.773,0.767,0.762,0.757,0.753,0.748,0.744,0.739,0.735,0.731,0.727,0.724,0.721,0.717,0.715,0.712,0.71,0.707,0.705,0.704,0.702,0.701,0.701,0.7,0.7,0.71,0.74,0.78,0.82,0.87,0.91,0.95,0.98,0.994,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.999,0.997,0.994,0.989,0.984,0.978,0.971,0.964,0.957,0.949,0.942,0.935,0.928,0.922,0.916,0.911,0.906,0.903,0.9,0.898,0.896,0.894,0.893,0.892,0.891,0.89,0.89,0.89,0.89,0.89,0.89,0.89,0.89,0.89,0.89,0.891,0.895,0.901,0.909,0.918,0.928,0.938,0.949,0.959,0.969,0.977,0.985,0.991,0.996,0.999,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
PARAM_HAIR_BACK=0
PARAM_EYE_BALL_X=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.009,0.03,0.07,0.13,0.19,0.26,0.34,0.42,0.5,0.58,0.66,0.74,0.81,0.87,0.93,0.97,0.99,1,1,1,0.999,0.998,0.996,0.995,0.993,0.99,0.987,0.984,0.981,0.977,0.972,0.968,0.962,0.957,0.951,0.944,0.937,0.929,0.921,0.913,0.903,0.894,0.883,0.873,0.861,0.849,0.837,0.823,0.81,0.795,0.78,0.762,0.745,0.728,0.712,0.696,0.681,0.667,0.654,0.641,0.63,0.62,0.611,0.604,0.598,0.594,0.591,0.59,0.59,0.59,0.59,0.59,0.59,0.59,0.59,0.59,0.59,0.59,0.59,0.59,0.59,0.59,0.59,0.59,0.59,0.59,0.59,0.59,0.59,0.59
PARAM_HAIR_FRONT=0
PARAM_EYE_BALL_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.002,0.007,0.016,0.027,0.039,0.054,0.071,0.088,0.105,0.122,0.139,0.156,0.171,0.183,0.194,0.203,0.208,0.21,0.209,0.205,0.199,0.191,0.182,0.17,0.157,0.142,0.126,0.109,0.091,0.072,0.052,0.03,0.011,-0.01,-0.03,-0.05,-0.072,-0.09,-0.112,-0.131,-0.149,-0.166,-0.182,-0.197,-0.21,-0.222,-0.231,-0.239,-0.245,-0.249,-0.25,-0.242,-0.22,-0.19,-0.15,-0.1,-0.05,0,0.06,0.11,0.16,0.21,0.26,0.3,0.33,0.36,0.374,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38
PARAM_BROW_L_ANGLE=-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.91,-0.78,-0.65,-0.56,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.521,-0.52,-0.52,-0.52,-0.52,-0.521,-0.52,-0.519,-0.518,-0.517,-0.516,-0.514,-0.512,-0.51,-0.506,-0.499,-0.491,-0.48,-0.467,-0.452,-0.436,-0.418,-0.399,-0.38,-0.36,-0.34,-0.32,-0.29,-0.27,-0.25,-0.23,-0.21,-0.188,-0.169,-0.15,-0.133,-0.117,-0.102,-0.089,-0.078,-0.068,-0.06,-0.055,-0.051,-0.05,-0.053,-0.061,-0.075,-0.092,-0.11,-0.14,-0.17,-0.2,-0.23,-0.26,-0.29,-0.32,-0.35,-0.38,-0.41,-0.44,-0.46,-0.48,-0.495,-0.505,-0.51,-0.512,-0.514,-0.515,-0.517,-0.518,-0.519,-0.519,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52
PARAM_EYE_DEFORMED_04=0
PARAM_EYE_DEFORMED_03=0
PARAM_EYE_DEFORMED_02=0
PARAM_EYE_DEFORMED_01=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_ANGLE_Z=0,-0.08,-0.31,-0.68,-1.18,-1.78,-2.48,-3.27,-4.11,-5.03,-5.98,-6.95,-7.94,-8.94,-9.9,-10.86,-11.78,-12.62,-13.41,-14.11,-14.71,-15.21,-15.58,-15.81,-15.89,-15.89,-15.89,-15.89,-15.89,-15.89,-15.89,-15.89,-15.89,-15.89,-15.89,-15.89,-15.89,-15.89,-15.89,-15.54,-14.6,-13.16,-11.38,-9.31,-7.06,-4.67,-2.27,0.17,2.48,4.67,6.69,8.47,9.93,11.04,11.75,12,12,12,12,12,12,12,11.97,11.89,11.75,11.56,11.32,11.05,10.73,10.38,9.99,9.58,9.13,8.66,8.17,7.67,7.15,6.63,6.1,5.55,5.02,4.47,3.95,3.43,2.92,2.43,1.96,1.51,1.09,0.69,0.33,0,-0.32,-0.63,-0.93,-1.22,-1.5,-1.78,-2.04,-2.31,-2.56,-2.8,-3.04,-3.27,-3.49,-3.71,-3.93,-4.14,-4.34,-4.54,-4.74,-4.93,-5.12,-5.31,-5.49,-5.67,-5.84,-6.02,-6.19,-6.36,-6.53,-6.69,-6.86,-7.02,-7.18,-7.35,-7.51,-7.67,-7.84,-8,-8.16,-8.32,-8.46,-8.6,-8.73,-8.85,-8.97,-9.07,-9.17,-9.26,-9.35,-9.43,-9.5,-9.57,-9.63,-9.68,-9.73,-9.78,-9.82,-9.85,-9.88,-9.91,-9.93,-9.953,-9.968,-9.98,-9.989,-9.995,-9.999,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10
PARAM_BODY_ANGLE_X=0,-0.07,-0.26,-0.55,-0.95,-1.43,-1.99,-2.59,-3.25,-3.94,-4.65,-5.35,-6.06,-6.75,-7.41,-8.01,-8.57,-9.05,-9.45,-9.74,-9.93,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-9.75,-9.04,-7.93,-6.52,-4.88,-3.06,-1.2,0.7,2.55,4.32,5.9,7.3,8.45,9.29,9.82,10,10,10,10,10,10,10,10,10,10,10,9.987,9.95,9.88,9.79,9.67,9.53,9.36,9.18,8.97,8.73,8.48,8.2,7.91,7.6,7.26,6.92,6.55,6.17,5.77,5.35,4.92,4.48,4.03,3.56,3.08,2.59,2.09,1.58,1.06,0.53,0,-0.6,-1.16,-1.72,-2.24,-2.74,-3.23,-3.69,-4.14,-4.56,-4.96,-5.35,-5.72,-6.07,-6.4,-6.71,-7.01,-7.3,-7.56,-7.82,-8.05,-8.27,-8.48,-8.67,-8.85,-9.01,-9.17,-9.3,-9.43,-9.54,-9.64,-9.72,-9.8,-9.86,-9.91,-9.95,-9.98,-9.995,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10
PARAM_BODY_ANGLE_Y=-10,-9.93,-9.74,-9.45,-9.05,-8.57,-8.01,-7.41,-6.75,-6.06,-5.35,-4.65,-3.94,-3.25,-2.59,-1.99,-1.43,-0.95,-0.55,-0.26,-0.07,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.09,-0.34,-0.74,-1.27,-1.88,-2.59,-3.36,-4.17,-5,-5.83,-6.64,-7.41,-8.12,-8.73,-9.26,-9.66,-9.91,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-9.6,-8.53,-6.92,-4.9,-2.67,-0.29,2.04,4.22,6.14,7.76,8.98,9.74,10,9.8,9.26,8.44,7.41,6.23,4.94,3.56,2.19,0.79,-0.54,-1.8,-2.95,-3.97,-4.81,-5.45,-5.86,-6,-5.96,-5.85,-5.67,-5.43,-5.15,-4.82,-4.45,-4.08,-3.67,-3.26,-2.84,-2.44,-2.04,-1.66,-1.31,-0.99,-0.71,-0.46,-0.27,-0.12,-0.03,0
PARAM_BODY_ANGLE_Z=0
PARAM_BROW_R_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.09,-0.23,-0.36,-0.45,-0.49,-0.49,-0.49,-0.49,-0.49,-0.49,-0.49,-0.49,-0.492,-0.494,-0.497,-0.501,-0.506,-0.511,-0.517,-0.523,-0.531,-0.538,-0.546,-0.555,-0.564,-0.573,-0.583,-0.593,-0.603,-0.614,-0.624,-0.635,-0.646,-0.657,-0.668,-0.679,-0.69,-0.701,-0.712,-0.723,-0.733,-0.744,-0.754,-0.764,-0.773,-0.783,-0.791,-0.8,-0.808,-0.816,-0.823,-0.829,-0.836,-0.841,-0.846,-0.85,-0.853,-0.856,-0.858,-0.86,-0.86,-0.859,-0.857,-0.854,-0.849,-0.843,-0.836,-0.829,-0.82,-0.81,-0.8,-0.789,-0.777,-0.764,-0.752,-0.739,-0.725,-0.712,-0.698,-0.684,-0.67,-0.656,-0.642,-0.629,-0.615,-0.602,-0.59,-0.577,-0.566,-0.555,-0.544,-0.535,-0.526,-0.518,-0.511,-0.505,-0.5,-0.495,-0.492,-0.491,-0.49
PARAM_ANGLE_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.27,-1.03,-2.23,-3.8,-5.64,-7.76,-10.07,-12.51,-15,-17.49,-19.93,-22.24,-24.36,-26.2,-27.77,-28.97,-29.73,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-29.02,-26.4,-22.45,-17.51,-12.03,-6.22,-0.51,4.83,9.55,13.52,16.5,18.36,19,18.52,17.24,15.29,12.85,10.04,6.98,3.71,0.45,-2.88,-6.03,-9.02,-11.76,-14.19,-16.17,-17.69,-18.66,-19,-19,-19,-19,-19,-19,-19,-19,-19,-19,-19,-19,-19,-19,-19,-19,-19,-19,-19,-19,-19,-19,-19
PARAM_BREATH=0
PARAM_BROW_R_X=0
PARAM_ANGLE_X=0,-0.07,-0.28,-0.61,-1.04,-1.58,-2.19,-2.85,-3.57,-4.33,-5.11,-5.89,-6.67,-7.43,-8.15,-8.81,-9.42,-9.96,-10.39,-10.72,-10.93,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-10.86,-10.47,-9.86,-9.08,-8.18,-7.18,-6.16,-5.11,-4.1,-3.12,-2.25,-1.48,-0.85,-0.39,-0.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.27,-1.03,-2.23,-3.8,-5.64,-7.76,-10.07,-12.51,-15,-17.49,-19.93,-22.24,-24.36,-26.2,-27.77,-28.97,-29.73,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-29.84,-29.37,-28.65,-27.72,-26.62,-25.42,-24.15,-22.85,-21.58,-20.38,-19.28,-18.35,-17.63,-17.16,-17,-17.013,-17.05,-17.1,-17.18,-17.26,-17.35,-17.45,-17.55,-17.65,-17.74,-17.82,-17.9,-17.95,-17.99,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18
PARAM_ARM_R=-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-9.87,-9.52,-8.96,-8.25,-7.4,-6.47,-5.5,-4.5,-3.53,-2.6,-1.75,-1.04,-0.48,-0.13,0,-0.07,-0.25,-0.55,-0.95,-1.42,-1.96,-2.58,-3.21,-3.88,-4.57,-5.26,-5.93,-6.6,-7.23,-7.82,-8.35,-8.82,-9.23,-9.56,-9.8,-9.95,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10
PARAM_ARM_L=-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-9.87,-9.52,-8.96,-8.25,-7.4,-6.47,-5.5,-4.5,-3.53,-2.6,-1.75,-1.04,-0.48,-0.13,0,-0.07,-0.25,-0.55,-0.95,-1.42,-1.96,-2.58,-3.21,-3.88,-4.57,-5.26,-5.93,-6.6,-7.23,-7.82,-8.35,-8.82,-9.23,-9.56,-9.8,-9.95,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10
PARAM_MOUTH_FORM=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.18,-0.46,-0.73,-0.92,-1,-0.96,-0.87,-0.76,-0.64,-0.55,-0.51,-0.51,-0.51,-0.51,-0.51,-0.51,-0.51,-0.511,-0.51,-0.51,-0.512,-0.51,-0.51,-0.513,-0.51,-0.514,-0.515,-0.52,-0.516,-0.52,-0.518,-0.518,-0.52,-0.52,-0.521,-0.521,-0.522,-0.52,-0.524,-0.525,-0.526,-0.526,-0.527,-0.528,-0.529,-0.53,-0.531,-0.532,-0.533,-0.534,-0.535,-0.536,-0.537,-0.538,-0.539,-0.54,-0.54,-0.542,-0.543,-0.544,-0.545,-0.546,-0.547,-0.548,-0.549,-0.55,-0.551,-0.552,-0.553,-0.554,-0.554,-0.555,-0.556,-0.557,-0.56,-0.559,-0.559,-0.56,-0.561,-0.56,-0.562,-0.563,-0.56,-0.564,-0.56,-0.566,-0.566,-0.57,-0.567,-0.57,-0.57,-0.568,-0.57,-0.57,-0.569,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57
PARAM_HAIR_SIDE=0
PARAM_EYE_BALL_FORM=0
PARAM_BROW_R_ANGLE=-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.91,-0.78,-0.65,-0.56,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.521,-0.52,-0.52,-0.52,-0.52,-0.521,-0.52,-0.519,-0.518,-0.517,-0.516,-0.514,-0.512,-0.51,-0.506,-0.5,-0.491,-0.481,-0.468,-0.454,-0.438,-0.422,-0.404,-0.385,-0.365,-0.345,-0.324,-0.3,-0.28,-0.26,-0.241,-0.222,-0.202,-0.183,-0.166,-0.149,-0.134,-0.12,-0.107,-0.096,-0.087,-0.08,-0.074,-0.071,-0.07,-0.073,-0.081,-0.093,-0.11,-0.13,-0.15,-0.18,-0.21,-0.24,-0.27,-0.3,-0.33,-0.36,-0.39,-0.42,-0.44,-0.46,-0.481,-0.495,-0.505,-0.51,-0.512,-0.514,-0.515,-0.517,-0.518,-0.519,-0.519,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52,-0.52
PARAM_SWEAT=0
PARAM_BROW_R_FORM=-1
PARAM_TERE=0
PARAM_EYE_BALL_GLITTER=0
PARAM_STRING=0

View File

@ -0,0 +1,33 @@
# Live2D Animator Motion Data
$fps=30
PARAM_BROW_L_ANGLE=-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5
PARAM_ANGLE_Z=-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-14.78,-14.21,-13.45,-12.55,-11.62,-10.71,-9.84,-9.11,-8.52,-8.14,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8
PARAM_BODY_ANGLE_X=-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-7.66,-6.9,-6,-5.05,-4.39,-3.89,-3.53,-3.28,-3.12,-3.03,-3,-3,-3,-3,-3,-3,-3,-2.97,-2.9,-2.78,-2.62,-2.44,-2.22,-1.99,-1.75,-1.5,-1.25,-1.01,-0.78,-0.56,-0.38,-0.22,-0.1,-0.03,0,0,0,0,0,0,0,0,0,0,0
PARAM_BODY_ANGLE_Y=0
PARAM_BODY_ANGLE_Z=5
PARAM_BREATH=0
PARAM_ANGLE_Y=-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-13.97,-13.89,-13.78,-13.65,-13.52,-13.39,-13.26,-13.16,-13.07,-13.02,-13,-13,-13,-13,-13,-13,-13,-12.96,-12.83,-12.63,-12.37,-12.06,-11.71,-11.32,-10.92,-10.5,-10.08,-9.68,-9.29,-8.94,-8.63,-8.37,-8.17,-8.04,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8
PARAM_BROW_R_Y=0
PARAM_ANGLE_X=-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-13.11,-8.34,-2.17,4.36,10.38,15.36,19,22.21,23.04,23.06,23,23,23,23,23,23,23,22.87,22.48,21.88,21.1,20.18,19.12,17.96,16.75,15.5,14.25,13.04,11.88,10.82,9.9,9.12,8.52,8.13,8,8,8,8,8,8,8,8,8,8,8
PARAM_BROW_R_X=0
PARAM_MOUTH_OPEN_Y=0
PARAM_MOUTH_FORM=-1
PARAM_EYE_L_OPEN=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.76,0.36,0.09,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.18,0.46,0.73,0.92,1,1,1,1,1,1,1,1,1,1,1
PARAM_BUST_Y=0
PARAM_EYE_FORM=-1
PARAM_EYE_L_SMILE=0
PARAM_BROW_L_FORM=-0.5
PARAM_EYE_BALL_FORM=0
PARAM_BROW_L_X=0
PARAM_BROW_L_Y=0
PARAM_BROW_R_ANGLE=-0.5
PARAM_EYE_R_SMILE=0
PARAM_BROW_R_FORM=-0.5
PARAM_EYE_R_OPEN=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.76,0.36,0.09,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.18,0.46,0.73,0.92,1,1,1,1,1,1,1,1,1,1,1
PARAM_TERE=0
PARAM_HAIR_BACK=0
PARAM_HAIR_FRONT=0
PARAM_ARM_L=-5
PARAM_EYE_BALL_X=0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.447,0.49,0.55,0.62,0.69,0.76,0.82,0.88,0.92,0.95,0.96,0.96,0.96,0.96,0.96,0.96,0.96,0.95,0.92,0.87,0.81,0.74,0.66,0.57,0.48,0.38,0.29,0.2,0.11,0.03,-0.04,-0.1,-0.15,-0.18,-0.19,-0.19,-0.19,-0.19,-0.19,-0.19,-0.19,-0.19,-0.19,-0.19,-0.19
PARAM_EYE_BALL_Y=0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.337,0.354,0.38,0.4,0.43,0.46,0.48,0.51,0.524,0.536,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.543,0.547,0.551,0.557,0.563,0.57,0.578,0.585,0.592,0.6,0.607,0.613,0.619,0.623,0.627,0.629,0.63,0.63,0.63,0.63,0.63,0.63,0.63,0.63,0.63,0.63,0.63
PARAM_ARM_R=-5

View File

@ -0,0 +1,31 @@
# Live2D Animator Motion Data
$fps=30
PARAM_BROW_L_ANGLE=0
PARAM_ANGLE_Z=18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,17.65,16.66,15.1,13.06,10.66,7.91,4.91,1.74,-1.5,-4.74,-7.91,-10.91,-13.66,-16.06,-18.1,-19.66,-20.65,-21,-20.29,-18.46,-15.78,-12.46,-8.78,-4.93,-1.04,2.75,6.28,9.47,12.11,14.19,15.53,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
PARAM_BODY_ANGLE_X=3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2.991,2.97,2.93,2.87,2.81,2.74,2.66,2.58,2.5,2.42,2.34,2.26,2.19,2.13,2.07,2.03,2.01,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
PARAM_BODY_ANGLE_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.07,-0.25,-0.52,-0.84,-1.16,-1.48,-1.75,-1.93,-2,-1.93,-1.75,-1.48,-1.16,-0.84,-0.52,-0.25,-0.07,0,-0.13,-0.41,-0.77,-1.13,-1.47,-1.75,-1.93,-2,-1.85,-1.48,-1,-0.52,-0.15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_BODY_ANGLE_Z=-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-6.91,-6.66,-6.26,-5.73,-5.12,-4.41,-3.64,-2.83,-2,-1.17,-0.36,0.41,1.12,1.73,2.26,2.66,2.91,3,2.92,2.73,2.44,2.08,1.68,1.26,0.84,0.43,0.05,-0.29,-0.58,-0.8,-0.95,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
PARAM_ARM_R=-10
PARAM_BREATH=0
PARAM_ANGLE_Y=-8
PARAM_BROW_R_Y=0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3
PARAM_ANGLE_X=10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,9.87,9.52,8.96,8.23,7.37,6.38,5.3,4.16,3,1.84,0.7,-0.38,-1.37,-2.23,-2.96,-3.52,-3.87,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4
PARAM_BROW_R_X=0
PARAM_MOUTH_OPEN_Y=0
PARAM_MOUTH_FORM=1
PARAM_EYE_L_OPEN=0
PARAM_BUST_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.16,0.42,0.59,0.65,0.58,0.43,0.24,0.04,-0.14,-0.29,-0.39,-0.43,-0.4,-0.32,-0.21,-0.08,0.06,0.19,0.3,0.38,0.41,0.34,0.18,-0.01,-0.21,-0.36,-0.46,-0.49,-0.42,-0.25,-0.05,0.16,0.35,0.51,0.61,0.65,0.58,0.41,0.19,-0.01,-0.18,-0.28,-0.32,-0.28,-0.19,-0.07,0.06,0.15,0.19,0.16,0.1,0.05,0.01,0,0,0,0,0,0,0,0,0,0
PARAM_EYE_FORM=0
PARAM_BROW_L_FORM=0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2
PARAM_EYE_BALL_FORM=0
PARAM_BROW_L_X=0
PARAM_BROW_L_Y=0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3
PARAM_BROW_R_ANGLE=0
PARAM_BROW_R_FORM=0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2
PARAM_EYE_R_OPEN=0
PARAM_TERE=0
PARAM_HAIR_BACK=0
PARAM_HAIR_FRONT=0
PARAM_EYE_BALL_X=-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32,-0.32
PARAM_EYE_BALL_Y=0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54,0.54
PARAM_ARM_L=-10

View File

@ -0,0 +1,34 @@
# Live2D Animator Motion Data
$fps=30
PARAM_BROW_L_ANGLE=0
PARAM_ANGLE_Z=14,13.79,13.18,12.23,10.96,9.42,7.64,5.72,3.61,1.4,-0.88,-3.12,-5.4,-7.61,-9.72,-11.64,-13.42,-14.96,-16.23,-17.18,-17.79,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18
PARAM_BODY_ANGLE_X=3
PARAM_BODY_ANGLE_Y=0,0.15,0.5,0.94,1.37,1.71,1.93,2,1.97,1.9,1.79,1.65,1.48,1.29,1.1,0.9,0.71,0.52,0.35,0.21,0.1,0.03,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_BODY_ANGLE_Z=1,0.94,0.76,0.48,0.12,-0.3,-0.76,-1.25,-1.75,-2.24,-2.7,-3.12,-3.48,-3.76,-3.94,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4
PARAM_ARM_R_B=0
PARAM_BREATH=0
PARAM_ANGLE_Y=8
PARAM_BROW_R_Y=0
PARAM_ANGLE_X=0
PARAM_BROW_R_X=0
PARAM_MOUTH_FORM=1
PARAM_EYE_L_OPEN=0
PARAM_BUST_Y=0
PARAM_EYE_FORM=0
PARAM_EYE_L_SMILE=1
PARAM_BROW_L_FORM=0
PARAM_EYE_BALL_FORM=0
PARAM_BROW_L_X=0
PARAM_BROW_L_Y=0
PARAM_BROW_R_ANGLE=0
PARAM_EYE_R_SMILE=1
PARAM_ARM_R_A=1
PARAM_BROW_R_FORM=0
PARAM_EYE_R_OPEN=0
PARAM_TERE=0
PARAM_HAIR_BACK=0
PARAM_HAIR_FRONT=0
PARAM_ARM_L_A=1
PARAM_EYE_BALL_X=0
PARAM_EYE_BALL_Y=0
PARAM_ARM_L_B=0

View File

@ -0,0 +1,33 @@
# Live2D Animator Motion Data
$fps=30
PARAM_BROW_L_ANGLE=0
PARAM_ANGLE_Z=-17,-16.85,-16.43,-15.74,-14.81,-13.65,-12.31,-10.79,-9.11,-7.29,-5.35,-3.28,-1.17,1.04,3.26,5.5,7.74,9.96,12.17,14.28,16.35,18.29,20.11,21.79,23.31,24.65,25.81,26.74,27.43,27.85,28,28,28,28,28,28,28,28,28,28,28,28,28,28,27.93,27.71,27.36,26.88,26.28,25.58,24.8,23.92,22.97,21.95,20.88,19.76,18.6,17.42,16.21,15,13.81,13,12.47,12.16,12.03,12,12.85,14.69,16.99,19.37,21.55,23.35,24.55,25,25,25,25,25,25,25,25,24.94,24.75,24.45,24.01,23.45,22.76,21.91,20.94,19.79,18.5,17,15.11,13.32,11.64,10.17,8.88,7.83,7.02,6.45,6.11,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6
PARAM_BODY_ANGLE_X=5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4.97,4.9,4.79,4.65,4.48,4.29,4.1,3.9,3.71,3.52,3.35,3.21,3.1,3.03,3,3.06,3.22,3.46,3.76,4.1,4.46,4.81,5.13,5.42,5.66,5.85,5.96,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6
PARAM_BODY_ANGLE_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.04,0.15,0.31,0.52,0.75,1,1.25,1.48,1.69,1.85,1.96,2,1.93,1.75,1.48,1.16,0.84,0.52,0.25,0.07,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_BODY_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.06,-0.22,-0.47,-0.78,-1.13,-1.5,-1.87,-2.22,-2.53,-2.78,-2.94,-3,-2.9,-2.62,-2.22,-1.75,-1.25,-0.78,-0.38,-0.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PARAM_ARM_R=-5
PARAM_BREATH=0
PARAM_ANGLE_Y=-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-9.987,-9.95,-9.9,-9.83,-9.74,-9.65,-9.56,-9.46,-9.37,-9.28,-9.2,-9.13,-9.08,-9.04,-9.01,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9.13,-9.45,-9.89,-10.4,-10.93,-11.45,-11.95,-12.37,-12.7,-12.92,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13
PARAM_BROW_R_Y=0
PARAM_ANGLE_X=17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,16.87,16.52,15.97,15.26,14.44,13.53,12.6,11.65,10.72,9.84,9.05,8.35,7.78,7.36,7.09,7,7.15,7.55,8.13,8.85,9.64,10.47,11.32,12.13,12.9,13.59,14.16,14.61,14.9,15,15,15,15,15,15,15,15,14.9,14.66,14.33,13.95,13.55,13.16,12.79,12.48,12.22,12.06,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12
PARAM_BROW_R_X=0
PARAM_MOUTH_OPEN_Y=0
PARAM_MOUTH_FORM=1
PARAM_EYE_L_OPEN=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.76,0.36,0.09,0,0,0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.76,0.36,0.09,0,0,0,0.18,0.46,0.73,0.92,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
PARAM_BUST_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.11,-0.29,-0.41,-0.45,-0.41,-0.32,-0.18,-0.03,0.14,0.29,0.42,0.52,0.58,0.6,0.57,0.48,0.35,0.2,0.04,-0.11,-0.24,-0.33,-0.36,-0.32,-0.23,-0.13,-0.01,0.09,0.17,0.23,0.25,0.231,0.19,0.13,0.06,0.02,0,0,0,0,0,0,0,0,0,0
PARAM_EYE_FORM=0.5
PARAM_EYE_L_SMILE=0
PARAM_BROW_L_FORM=0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2
PARAM_EYE_BALL_FORM=0
PARAM_BROW_L_X=0
PARAM_BROW_L_Y=0
PARAM_BROW_R_ANGLE=0
PARAM_EYE_R_SMILE=0
PARAM_BROW_R_FORM=0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2
PARAM_EYE_R_OPEN=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.76,0.36,0.09,0,0,0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.76,0.36,0.09,0,0,0,0.18,0.46,0.73,0.92,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
PARAM_TERE=0
PARAM_HAIR_BACK=0
PARAM_HAIR_FRONT=0
PARAM_EYE_BALL_X=-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.47,-0.469,-0.466,-0.461,-0.454,-0.447,-0.439,-0.43,-0.422,-0.414,-0.406,-0.398,-0.392,-0.387,-0.383,-0.381,-0.38,-0.382,-0.388,-0.397,-0.409,-0.424,-0.442,-0.46,-0.481,-0.5,-0.52,-0.55,-0.57,-0.59,-0.61,-0.628,-0.646,-0.661,-0.673,-0.682,-0.688,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69,-0.69
PARAM_EYE_BALL_Y=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.496,0.486,0.47,0.45,0.43,0.4,0.37,0.34,0.32,0.29,0.27,0.249,0.233,0.22,0.213,0.21,0.21,0.212,0.214,0.218,0.221,0.226,0.231,0.236,0.242,0.247,0.253,0.258,0.264,0.269,0.274,0.279,0.282,0.286,0.288,0.289,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29
PARAM_ARM_L=-5

View File

@ -6,17 +6,6 @@ layout: default
Mayx's Home Page Mayx's Home Page
Powered by [Jekyll](https://github.com/jekyll/jekyll) Powered by [Jekyll](https://github.com/jekyll/jekyll)
[![pages-build-deployment](https://github.com/Mabbs/mabbs.github.io/actions/workflows/pages/pages-build-deployment/badge.svg)](https://github.com/Mabbs/mabbs.github.io/actions/workflows/pages/pages-build-deployment) [![Jekyll](https://img.shields.io/badge/Powered%20by-Jekyll-red?logo=jekyll)](https://github.com/jekyll/jekyll)
[![Website](https://img.shields.io/website?url=https%3A%2F%2Fmabbs.github.io)](https://mabbs.github.io)
[![GitHub repo size](https://img.shields.io/github/repo-size/Mabbs/mabbs.github.io?label=Size)](https://github.com/Mabbs/mabbs.github.io)
[![Commits](https://img.shields.io/github/commit-activity/t/Mabbs/mabbs.github.io?label=Commits)](https://github.com/Mabbs/mabbs.github.io/commits/master/)
[![Gitalk](https://img.shields.io/github/issues-raw/Mabbs/mabbs.github.io/Gitalk?label=Gitalk&color=blue)](https://github.com/Mabbs/mabbs.github.io/issues?q=is%3Aissue%20state%3Aopen%20label%3AGitalk)
[![GitLab deployments](https://gitlab.com/mayx/mayx.gitlab.io/badges/master/pipeline.svg)](https://gitlab.com/mayx/mayx.gitlab.io/-/pipelines) [![Netlify Status](https://api.netlify.com/api/v1/badges/76b7229e-4e96-4d67-b4d7-4db4dabfb2eb/deploy-status)](https://app.netlify.com/sites/mayx/deploys) [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/Mabbs/mabbs.github.io)
[![Github Stars](https://img.shields.io/github/stars/Mabbs/mabbs.github.io)](https://github.com/Mabbs/mabbs.github.io/stargazers)
[![GitHub forks](https://img.shields.io/github/forks/Mabbs/mabbs.github.io)](https://github.com/Mabbs/mabbs.github.io/forks)
[![GitLab Stars](https://img.shields.io/gitlab/stars/mayx%2Fmayx.gitlab.io)](https://gitlab.com/mayx/mayx.gitlab.io/-/starrers)
[![Folo](https://badge.follow.is/feed/41798923170845763?style=social)](https://app.follow.is/share/feeds/41798923170845763)
## 使用的开源项目 ## 使用的开源项目
[Jekyll](https://github.com/jekyll/jekyll) [Jekyll](https://github.com/jekyll/jekyll)
[jQuery](https://github.com/jquery/jquery) [jQuery](https://github.com/jquery/jquery)
@ -25,23 +14,17 @@ Powered by [Jekyll](https://github.com/jekyll/jekyll)
[jekyll-toc](https://github.com/allejo/jekyll-toc) [jekyll-toc](https://github.com/allejo/jekyll-toc)
[Live2dHistoire](https://github.com/eeg1412/Live2dHistoire) [Live2dHistoire](https://github.com/eeg1412/Live2dHistoire)
[Simple-Jekyll-Search](https://github.com/christian-fei/Simple-Jekyll-Search) [Simple-Jekyll-Search](https://github.com/christian-fei/Simple-Jekyll-Search)
[jekyll-anchor-headings](https://github.com/allejo/jekyll-anchor-headings)
## 使用的网络资源 ## 使用的网络资源
[Github](https://github.com/) | 包含 [Github](https://github.com/) | 包含:
- Issue - Issue
- Pages - Pages
- Git - Git
[Cloudflare](https://www.cloudflare.com/) | 包含:
- CDN、规则以及缓存
- Workers、D1 SQL 数据库、Vectorize 数据库、AI
[GitLab](https://gitlab.com/)
[网易云音乐](https://music.163.com/) [网易云音乐](https://music.163.com/)
[一言](https://hitokoto.cn/)
[CDNJS](https://cdnjs.com/) [CDNJS](https://cdnjs.com/)
[jsDelivr](https://www.jsdelivr.com/) [unpkg](https://unpkg.com/)
……
## 版权声明 ## 版权声明
未经作者同意,请勿转载 未经作者同意,请勿转载

View File

@ -1,7 +1,6 @@
theme: jekyll-theme-minimal theme: jekyll-theme-minimal
title: Mayx的博客 title: Mayx的博客
logo: https://avatars0.githubusercontent.com/u/17966333 logo: https://avatars0.githubusercontent.com/u/17966333
lang: zh-CN
author: mayx author: mayx
description: Mayx's Home Page description: Mayx's Home Page
timezone: Asia/Shanghai timezone: Asia/Shanghai
@ -10,15 +9,6 @@ paginate: 7
plugins: plugins:
- jekyll-sitemap - jekyll-sitemap
- jekyll-feed - jekyll-feed
- jekyll-include-cache
feed: feed:
path: atom.xml path: atom.xml
webmaster_verifications:
google: huTYdEesm8NaFymixMNqflyCp6Jfvd615j5Wq1i2PHc
yandex: fc0e535abed800be
bing: 0ADFCE64B3557DC4DC5F2DC224C5FDDD
social:
name: Mayx
links:
- https://github.com/Mabbs
google_analytics: UA-137710294-1 google_analytics: UA-137710294-1

View File

@ -1,169 +0,0 @@
{
"/2024/06/16/hackintosh.html": "这篇文章讲述了作者尝试安装Hackintosh即在非Mac硬件上运行macOS的体验。起始时因为对Mac尤其是基于Intel架构的性价比、硬件差异和性能的质疑使得作者并未尝试过。但随着ARM架构Mac的出现他们决定安装黑苹果进行尝试。尽管安装过程并不复杂主要是根据硬件自定义EFI但对于无线网络和一些Apple芯片优化软件支持存在限制。尽管体验与MacBook相似作者认为黑苹果在功能上与Linux接近性能上不如Mac notebo挠在续航上的优势明显。总体来说作者认为黑苹果的吸引力有限主要是节省了一部分成本而Mac的独家体验和续航无法替代。",
"/2024/05/19/bt-ops.html": "这篇文章主要讲述了作者在测试不同运维面板如1Panel、小皮面板和宝塔面板的过程中对宝塔面板的使用体验特别是对其Python代码实现、功能评价和价格的质疑。作者认为宝塔面板有一些独特功能如系统加固、防入侵、文件监控等虽然代码是开源且部分易于理解但付费功能定价不合理如价格高昂的服务器网络加速功能其实无需付费。此外作者还指出一些功能如防篡改可能存在问题而一些基础功能实则简单易实现。总的来说作者认为宝塔面板虽然有可学习之处但价格与其提供的服务不成正比。",
"/2024/04/06/old-pc.html": "这篇文章是关于作者探索如何重新利用几台废旧电脑的体验这些电脑尽管性能较差但作者并未因此淘汰它们。他们将电脑改装为Linux系统进行测试展示了四台电脑的配置和基础使用情况。尽管第一台Intel Pentium E5300的电脑在安装Ubuntu时遇到问题但作者仍强调性能问题不大相比于廉价的硬件如树莓派这些旧电脑仍有可用性。文章指出尽管老机器可能存在一些安装或兼容性问题但并不意味着它们就该被淘汰。",
"/2024/03/16/ssl-pinning.html": "这篇文章讲述了使用Python的requests库实现类似“SSL Pinning”技术的过程。作者发现直接用requests库操作请求时获取证书的常见方法不可行于是通过requests.packages.urllib3的HTTPSConnection连接并修改其connect方法实现了在发起GET请求时获取服务器的证书并计算其SHA256指纹。作者提供了一个函数`verify_cert_request`用于验证网站证书并可作为防抓包策略。文章最后提到虽然Python作为解释型语言其代码可被分析但通过修改依赖库或加密处理可以提高保护程度防止多数抓包行为。",
"/2024/02/24/luckfox.html": "这篇文章分享了作者购买并体验Luckfox Pico Plus开发板的过程。虽然这款开发板体积小巧约一食指大小但内存和存储较低选择了预装Alpine Linux系统作为解决方案。安装过程通过树莓派完成利用其GPIO接口。作者发现该板子性能足以运行Python和Go程序可替代部分树莓派的任务如定时任务和QQ机器人但内网穿透时内存紧张。作者认为Luckfox Pico Plus以其小巧的外形和不错的性价比相比树莓派在开发板用途上更合适尽管树莓派的定位不清晰。",
"/2024/02/03/1panel.html": "这篇文章讲述了作者在离线环境下安装1Panel的过程。尽管1Panel官方不支持离线安装但通过社区找到了离线安装的方法。作者通过离线安装后遇到的问题包括应用商店空、应用文件路径错误、PHP扩展的下载问题等。通过调整数据库和容器设置作者最终解决了这些问题实现了Nginx、MySQL和PHP的离线安装和使用强调了使用Go编写的程序如Docker和1Panel在无网络环境下的便捷性。",
"/2024/01/20/renpy.html": "这篇文章讲述了在macOS上玩基于Ren'Py的视觉小说时遇到的问题及解决方案。主要问题包括Mac OS的验证限制、不同版本Ren'Py引擎的兼容性、使用RenPyViewer的局限性以及签名和权限问题。解决方法包括使用iOS版或Intel版RenPyViewer、通过终端运行.sh文件、修改.app权限和文件结构、以及处理文件名大小写差异。最后的建议是优先使用游戏自带的.app文件并进行适当的权限设置或者根据所用硬件选择合适的工具。",
"/2024/01/01/summary.html": "这篇文章的作者回顾了2023年的生活主要亮点包括顺利毕业、找到稳定的工作和抽到UP角色带来的好状态。然而工作压力不算大但作者的生活习惯不佳晚上沉迷于游戏导致睡眠不足进而影响了如osu!mania的游戏表现和个人健康。作者计划在经济上达到自给自足后退休但担心自己无法照顾好自己生活方式可能与目前的965工作模式相似。AI是2023年印象深刻的话题但对作者影响不大。未来的目标是稳定工作和休闲对未知的全球事件有所担忧但也保持乐观。总的来说作者认为过去一年过得尚可但对未来难以预测只能走一步看一步。",
"/2023/12/24/android.html": "这篇文章介绍了如何在Linux容器中使用Waydroid和redroid两种方法来运行Android系统虽然Waydroid性能较强但存在依赖于Wayland且不支持ARMT架构程序的问题需要额外安装工具。redroid支持多实例和不同安卓版本但遇到了ARM兼容库的问题特别是对Intel CPU支持不足。作者认为由于真机运行和虚拟机在性能上已经足够且Linux用户群相对较小所以容器内运行Android的需求较少。",
"/2023/12/10/openfyde.html": "这篇文章分享了作者将树莓派4B安装和使用openFyde的体验。作者出发点是寻找适合普通用户而非专业硬件爱好者的系统因此排除了服务器版和部分GNU/Linux发行版。在选择ChromeOS或其本土化版本FydeOS时由于官方不支持树莓派作者选择了openFyde尽管安装过程复杂需要先格式化TF卡并刷入镜像且视频播放受限于硬件只支持H264解码。有趣的是虽然Linux子系统表现尚可但Android子系统存在交互设计问题如无滚轮、复制粘贴不便等。尽管性能有限尤其是视频播放不流畅但openFyde以其简洁、易于安装和对普通用户相对友好的界面被作者认为是让树莓派更适合普通用户的选择。",
"/2023/10/21/game.html": "这篇文章讲述了在MacBook上玩游戏的各种方式1. 原生游戏例如专为Mac设计的应用和开源游戏2. iOS游戏通过Decrypt IPA Store下载并在Mac上使用特定软件运行3. 利用Rosetta 2运行x86游戏比如通过Steam和Epic Games Launcher4. 基于脚本的Galgame游戏如使用工具如XP3Player、ONSPlayer或Ren'Py5. 在网页上运行的游戏如RPG Maker MV6. 通过Wine或者其他基于Wine的工具运行Windows游戏如Game Porting Toolkit和Whisky7. 虚拟机不推荐如UTM8. 云游戏服务依赖网络和服务器性能。作者强调了MacBook虽然不是专门设计用于游戏但有多种方法可以让用户在上面玩游戏。",
"/2023/09/24/rpi-ubuntu.html": "这篇文章介绍了作者在树莓派4B上安装Ubuntu的经历。一开始尝试安装Windows 11并使用ESXi-Arm Fling遭遇问题如内存卡浪费和存储限制。由于对Windows的不满意作者决定安装Ubuntu过程中遇到了登录密码设置的困扰软件提示不明确。尽管如此最终成功安装了Ubuntu并编译并运行了PiFmAdv项目但初始遇到编译问题。作者还尝试了通过QEMU-KVM在树莓派上跑Windows虚拟机对比了与裸机的性能发现虚拟机表现不佳。此外虽然尝试让树莓派运行x86程序如postjson工具但由于性能受限效果并不理想。总结全文作者表示树莓派除了FM电台功能其他操作在普通电脑上也能完成质疑购买它的意义但也提到挖掘其潜力的过程满足了自己的探索欲望。",
"/2023/09/06/satellite.html": "这篇文章主要讨论了卫星通信的常见应用如GPS导航、卫星电视、业余无线电通信、卫星电话如华为Mate 60 Pro和星链网络。作者强调了卫星通信的基本原理即通过无线电波与远距离的卫星进行单向或多向通信。文章还提到了华为卫星电话的特点如能否实现免外置天线使用和隐藏天线的设计猜测。作者认为将卫星电话功能引入智能手机可能更多是出于营销策略实际使用场景有限如信号覆盖和成本效益都不如常规网络。最后作者对6G卫星网络的设想持怀疑态度认为它不会显著改变通信速度。总体上卫星通信虽然看起来高端但其实技术上并不是什么难题。",
"/2023/08/01/auth.html": "这篇文章讨论了在Windows环境下让Python脚本接收OAuth2.0授权码Code的几种方法。作者尝试了以下几种方式\n\n1. **URI Scheme**: 通过注册伪协议如mayx://并在Python脚本中解析回调URL来获取Code但这种方法可能被杀毒软件阻拦且不是所有平台都支持。\n\n2. **HTTP服务监听**: 使用Flask创建一个简单的web服务来接收Code虽然简单但可能占用过多资源且已被弃用。\n\n3. **Socket实现**: 用socket进行TCP连接来处理请求但初次访问时有问题且代码复杂。\n\n4. **http.server模块**: 使用Python内置的HTTP服务器模块实现了基本功能更小且稳定但仍有程序结束前端口未释放的问题后来通过AI得到了解决。\n\n作者在寻找最合适的方案时遇到困难感慨了解更多信息有时也带来困扰但最终还是AI有效地解决了问题。",
"/2023/07/09/bitmo.html": "这篇文章分享了一种新型的无人值守诈骗手法,骗子创建虚假的接码平台,并通过带有网站名、用户名和密码的诱人信息诱导用户登录。受害者登录后发现网站看似正常,提供了充值、提现等功能,但其实充值和提现需要安全密钥,且对免费账户有限制。诈骗者设计巧妙,通过转账功能一步步诱导用户,如充值、转账以及账户升级的假象,增加了被骗者的参与感。作者最终识破网站为假,怀疑其为国人开发的诈骗平台,并指出这类诈骗手法利用了人们的好奇心和财务冲动,效率高且设计逼真,可能会导致许多人受骗。",
"/2019/04/13/iwara.html": "这篇文章介绍了使用PHP编写的Iwara Viewer一个帮助用户从Iwara平台下载视频的工具。作者主要是出于对网站EcchiIwara上的一个内容区上的R183D动画特别是\"Observation Diary\"的兴趣。工具允许按照日期、观看数或喜好排序视频并提供了在服务器上直接下载视频的选项以解决Iwara防盗链的问题。然而该工具的缺点在于没有显示观看数、作者信息且可能受Iwara服务器限制。作者还提供了相关的演示和下载工具链接。",
"/2015/02/23/diary.html": "这篇文章记述了作者在2015年2月23日的日常经历包括修复U盘、处理爷爷电脑的显示器问题以及手机分区的意外损害与修复。作者通过这些事件反思了技术操作的重要性提到了对手机知识的深入了解以及对电脑与手机未来趋势的看法。同时他也对自己在春节期间不小心损坏手机的行为做了自我批评。",
"/2018/03/26/neko.html": "这篇文章记录了一个名为张千叶的人帮助朋友Ayaka Neko应对家人特别是其父亲强制带回云南老家并进行住院治疗的过程。Ayaka已成年并有精神健康问题但她的父母没有得到她的同意且存在暴力行为。文章描述了从报警、寻求警察帮助到联系不上Ayaka最终发现她自杀的悲剧结局。事件引发了关于监护权、抑郁症处理和家庭沟通问题的讨论呼吁家长尊重孩子意愿避免类似悲剧的发生。",
"/%E6%BC%94%E8%AE%B2%E7%A8%BF/2018/06/20/Coding.html": "这篇文章是一场演讲稿由演讲者mayx介绍了计算机编程的三个核心主题计算机基础知识、编程基础和设计概念。演讲涉及的内容包括计算机科学的区分CS与IT、硬件的基本结构冯·诺依曼架构与哈佛架构、编程语言的发展如低级语言与高级语言的区别编译型语言和解释型语言如C、Python和Java的特点以及UI设计的重要性和扁平化设计的流行。演讲旨在让听众理解编程的本质和设计原则强调编程不仅仅是技术层面也是表达思想和解决实际问题的工具。",
"/2018/10/20/talk.html": "这篇文章是Mayx分享其在Github Pages博客上使用评论系统的体验。作者首先提到由于博客的静态性质选择第三方评论服务有限制 Disqus因在中国不可用而被排除。国内的选项如多说、畅言被指不稳定。在对比了Gitalk、Gitment、Valine、fcomment和utterances等几种评论系统后作者最终选择Gitalk原因包括Gitment停止维护、Gitalk虽需手动初始化但影响不大、以及相对较高的安全性相比fcomment和Valine。尽管Gitalk在IE11中的表现存在问题但作者仍因懒惰和对已有系统的满意而坚持使用。",
"/2022/11/08/cf-acc.html": "这篇文章主要介绍了如何改善在中国使用Cloudflare服务的网站访问体验。由于中国对Cloudflare网络的某些限制用户常会遇到速度问题。文章提供了两种方法一是利用CloudflareSpeedTest工具检测最佳IP并修改 Hosts二是通过第三方反代节点这些节点可能绕过速度限制但需注意潜在的安全风险如中间人攻击和匿名性导致的防火墙失效。对于网站站长云flare官方的新CNAME接入方式允许绑定信用卡进行限制性接入通过设置不重要的域名作为跳板可灵活选择节点以优化访问速度但需开启证书透明度监视以防止中间人攻击。作者还提到可以考虑使用DDNS脚本来自动调整IP但缺乏实操条件。文章最后表达了对Cloudflare优化服务的肯定。",
"/2021/03/02/workers.html": "这篇文章介绍了作者尝试使用CloudFlare Workers实现的一些功能包括自建反向代理以加快博客访问速度搭建简单Status Page监测网站可用性以及对Serverless云函数的玩味。作者提到虽然Workers功能完善且支持KV存储但免费版的10万次请求限制对大流量网站并不适用。此外作者认为Serverless更适合小公司大公司则可能不会将其作为主要业务平台因为存在服务中断风险。",
"/2022/12/26/i2p-ssl.html": "这篇文章讲述了作者为自己的i2p站点添加SSL证书的探索过程。虽然i2p作为一个小项目没有官方认可的SSL证书但有一个由PurpleI2P开发团队维护的自签名CA可以用于证书签名。申请过程相对简单但部署到网站和配置有所挑战因为缺乏相关的教程。作者最后成功配置并实现了网站的加密访问但他提到i2p对SSL证书的管理不太严格仅用于娱乐性质。此外i2p的域名注册也很随意。整个过程虽然麻烦但充满了趣味性。",
"/2022/12/12/bt-s3-comp.html": "这篇文章主要讲述了作者如何自定义宝塔面板上的亚马逊S3云存储插件因为原插件不支持非AWS的S3服务端点如Filebase。作者发现通过Python的boto3库可以实现自定义连接只需要在插件的`build_auth()`方法中添加`endpoint_url`参数。作者对宝塔插件的设计和功能表示不满,认为它只支持了基本功能且依赖臃肿,但对于不会编程的小白用户来说,尽管功能有限,仍需使用。",
"/2018/11/10/email-sender.html": "这篇文章介绍了作者如何利用PHP制作了一个免费订阅的邮件日报系统。作者通过搜索并利用现成的PHP资源如sendmail和CronTab功能设置了自动发送邮件的工作流程。邮件包含了天气预报、笑话和新闻等内容且制作者留有余地如使用Travis-CI和短信提醒等功能进行扩展。最后作者分享了创建过程中的心得和提示欢迎读者尝试并加入邮件订阅。",
"/2023/03/12/php-async.html": "这篇文章主要探讨了PHP实现异步执行的挑战和尝试。作者在ThinkPHP项目中遇到需要立即返回数据并继续后台耗时操作的问题。以前采用的file_get_contents函数虽然解决了返回速度慢的问题但涉及到使用危险的函数和服务器配置限制。作者对于使用消息队列、Swoole框架及popen函数等方法持保留态度认为它们可能带来安全风险或超出项目规模。\n\n作者发现fastcgi_finish_request函数可以输出内容并结束请求但需注意与session管理和PHP-FPM的交互。存在问题包括对Apache环境的限制、进程数量限制以及在TP框架下无法使用return。作者总结到PHP处理多线程问题有困难对于频繁遇到这类问题的项目可能需要考虑使用其他语言。",
"/2023/06/30/nucleic-acid.html": "这篇文章介绍了一篇基于ThinkPHP5.1框架的核酸检测登记系统设计与开发的毕业论文。论文详细探讨了系统的需求分析、数据库设计、功能实现(如前后端架构和用户模块等),以及系统测试过程。研究目标是为新冠疫情防控提供一个便捷的在线登记平台,通过微信接入,提高效率并减少人员接触。论文强调了系统在追踪疫情、提高用户体验及信息共享方面的价值,并对比了国内外核酸检测登记系统的现状。论文由七章组成,涉及背景、技术概述、需求设计、接口与数据库设计、实现、测试以及结论和展望。",
"/2023/05/22/rpi-win.html": "这篇文章主要讲述了作者尝试在树莓派4B上安装Windows系统的过程包括使用Windows on R工具和不同存储卡的尝试但遇到了安装失败和性能问题如WinPE安装不能成功、Windows性能差尤其是读写速度和驱动缺失、CPU占用高等。尽管Linux系统在官方支持下运行流畅但作者认为树莓派在性能、驱动支持和视频播放等生产力方面表现不佳更适合用作物联网开发板而非普通电脑。文章最后对树莓派4B及后续版本的发展方向提出了疑问。",
"/2023/04/05/ai.html": "这篇文章讲述了人工智能特别是LLM大型语言模型领域近期的发展以ChatGPT和相关模型如Alpaca为例。作者提到开源社区如GitHub上的llama.cpp项目让AI技术更加亲民即使是在资源有限的设备上也能体验到。斯坦福大学的Finetune技术使得AI模型性能提升而成本较低的LoRA方法使得AI训练更加普及作者还分享了自己的实践经验如使用不同设备运行不同规模的模型。此外作者对开源社区的AI发展持乐观态度希望未来能在低成本情况下提高效率但也表达了对技术被商业化和不平等竞争的担忧。",
"/2023/02/22/cron.html": "这篇文章讲述了作者在云原神签到脚本被Github Actions禁用后选择使用Cloudflare Workers Cron触发器的原因。作者认为Workers更适合做这种简单的网络请求因为它资源消耗较少且不会像Actions那样遇到资源限制。作者分享了如何在Workers中编写签到脚本包括设置headers和获取必要的参数。此外作者建议将Cloudflare Workers用于日常签到等轻量级任务而更适合计算密集型工作的是Github Actions。作者还提到与云函数相比Workers可能具有更好的轻量化和环保优势。",
"/2023/02/03/mbp.html": "这篇文章介绍了作者使用新款MacBook Pro 2022 13寸搭载Apple M2芯片后的使用体验。尽管之前对MacOS和苹果产品存有偏见认为其性价比不高且性能曾存在问题但M2芯片的升级让作者感到惊喜体现在性能提升、功耗控制优良以及长续航上使其符合云游戏与轻薄本的使用需求。文章还提到了MacOS的初次上手体验如触控板的便利、软件兼容性如Microsoft Remote Desktop和VSCode的使用以及MacBook在游戏性能上的不足。作者认为MacBook适合日常工作、文档处理和轻度娱乐续航表现强大但与Windows电脑相比在一些核心功能和兼容性上还有差距。",
"/2023/01/01/summary.html": "这篇文章是作者的年终总结回顾了2022年的生活和工作主要提及了记忆在生活中的重要性以及这一年解决问题的文章减少可能与记忆积累减少有关。作者提到对2022年周围环境的负面看法认为人类灭亡的风险增加并表达了对2023年能正常活下去的期望。同时作者分享了关于博客备份的成就以及这套方案在反审查方面的价值。个人生活上临近毕业作者对未来持有相对消极的态度仅期待见证可能发生的变化认为自己和其他人可能都不会有显著的改善。",
"/2022/11/29/free-server.html": "这篇文章讲述了作者在Heroku不再提供免费容器云服务后发现了一家名为Koyeb的平台作为替代。Koyeb的特色在于可以直接部署Docker Hub上的项目无需安装复杂软件操作相对人性化。作者利用Koyeb部署了宝塔面板和VerySimple梯子服务而且还提到为了解决网站资源访问问题使用了Cloudflare Workers做反代。尽管免费作者认为Koyeb是个不错的临时选择但需要珍惜这种免费服务。",
"/2022/11/23/i2p.html": "这篇文章主要讲述了作者在服务器上使用i2pd——一个C++实现的i2P服务的体验。相较于官方Java版本的I2P客户端i2pd因为非Java编写而被认为更易用。作者发现i2pd的安装和使用相对简单通过HTTP代理连接隐形网络速度快于官方客户端并提到了i2pd的域名解析系统和vanity address的计算工具vain的问题。尽管如此作者仍认为i2pd的用户体验比官方客户端要好但指出访问i2P网络的网站较少且因为缺乏多样性的服务不如Tor那样有丰富的内容。文章以一种轻松的口吻表达了作者对Java语言的调侃。",
"/2022/10/19/web3.html": "这篇文章介绍了作者在Web3上使用xLog搭建博客的经历提到xLog基于Crossbell区块链使用智能合约和IPFS存储内容强调了其去中心化和防止审查的优点。尽管作者认为IPFS不能提供永久存储除非结合Arweave或其他服务付费存储但他利用4EVERLAND实现了静态博客的Git同步和DNSlink访问提到了社交功能和成本问题。此外作者对零网ZeroNet的体验并不理想但也对Web3技术的发展和去中心化社区的建设表达了期待。",
"/2022/10/14/crack-aes.html": "这篇文章讲述了作者在尝试破解自己的Python加密程序时发现使用AES-128-CTR加密模式且省略了初始化向量iv的情况下加密的不安全性。作者后来了解到CTR模式因为直接将密钥与iv通过AES加密后再异或数据导致如果使用相同的iv和密钥加密不同的数据通过异或运算可以轻易地从已知的密文和明文对中推断出其他密文的对应明文。为了解决这个问题作者意识到按照官方建议添加iv并正确使用加密模式是必要的最终调整了加密程序以确保安全性。作者也表达了一个教训那就是在不了解的领域应遵循标准方法否则可能会导致意想不到的问题。",
"/2022/10/08/tinyaes.html": "这篇文章介绍了一种使用Python编写的简单加密程序作者发现TinyAES库非常适合对数据进行AES-128-CTR加密因为其加密和解密方法一致使用起来非常直观。作者通过导入MD5哈希来处理非16位长度的密码然后举例编写了一个加密脚本用户只需提供文件路径和密钥即可执行加密或解密。这种库相比于复杂的加密库如pycryptodome或cryptography被作者认为更符合Python的简洁性和易用性。",
"/2022/10/05/rules.html": "这篇文章分享了Cloudflare新增的几个规则功能的体验包括二级域名重定向、动态重定向和内容转换如重写URL、请求头、响应头以及应对防盗链问题。作者赞赏Cloudflare的免费服务和强大功能但也指出了一些限制比如免费用户不能随意使用正则表达式以及规则配置上的局限。作者表达了对于更自由配置的向往但同时也认可Cloudflare在性能和实用性上的优势。",
"/2022/09/21/cron.html": "这篇文章介绍了如何使用Python制作一个可热载的定时调度器作者开始时考虑了使用CRON表达式但发现它不够直观且不支持Windows。接着作者发现了schedule库用其以更自然的语言结构编写定时任务比APScheduler易于理解和使用。在创建调度器时作者开始用轮询监控文件变化但性能不佳转而引入了watchdog库以提高监测效率。通过FileEventHandler和Observer程序可以实时检测并重载修改的脚本。作者以一个简单的示例脚本和管理器函数阐述了整个过程并表达了对编写简洁、功能单一的程序的偏好。",
"/2022/09/05/trayicon.html": "这篇文章讲述了作者从使用Python的PyQt5库制作程序运行提示图标遇到体积过大问题到尝试Pystray库结果依然不理想再到最终选择Tkinter和PyQt5实现跨平台悬浮图标过程中的经历。作者在寻求轻量级解决方案时虽然Tkinter在Windows上表现尚可但在Linux上遇到透明度问题而Qt5虽能提供跨平台一致性但学习和使用起来较为复杂。作者对跨平台开发的复杂性以及选择不同工具的权衡有了深入的认识。",
"/2022/08/15/cdn-verify.html": "这篇文章讲述了作者如何避免Cloudflare源站被恶意访问的问题。作者最初通过防火墙白名单进行防护但随着Cloudflare功能的增加这种方法不可靠。作者发现双向认证的“经过身份验证的源服务器拉取”功能可以有效防止使用Cloudflare功能绕过WAF的请求通过SSL验证确保只有Cloudflare和授权的服务器能访问源站。作者建议Cloudflare在新手教程中增加此配置以提高用户的安全意识。",
"/2022/07/16/privacy.html": "这篇文章讨论了在网络隐私保护的复杂性指出尽管个人隐私容易被泄露但通过合理的准备和策略可以在一定程度上防止隐私被滥用。主要内容包括1) 保护隐私的挑战比如信息关联的易发性特别在中国由于实名制的限制2) 隐私泄露的常见原因如网站访问、用户输入信息、网络服务提供商的监控以及DNS和SNI等技术的缺陷3) 提供的隐私保护方法包括身份伪造使用虚拟身份和代理、链路伪造多层代理、行为伪造使用专门系统和时间掩饰4) 总结,强调在地球上实现全程隐私的困难,但通过特定场景下的策略可以增强隐私保护。",
"/2022/07/03/fast-ver.html": "这篇文章讲述了作者试用字节跳动旗下“极速版”应用赚钱的经历通过完成任务赚取收益并将其与PCDN网络服务进行对比。这些“极速版”软件的门槛低初期收益高适宜手机和手机号丰富的用户通过批量安装和使用脚本自动化完成任务但收益会随着时间减少。虽然这类软件看起来实现了多方获益观看者、制作者和平台但作者认为长期价值不大关心的是对网络空间的贡献因此计划在收益降低后卸载此类软件。作者也提到即便有刷广告的行为对广告商仍有价值。",
"/2022/05/27/zongzi.html": "这篇文章介绍了一个在宿舍没有锅的情况下煮粽子的创新方法。作者首先通过购买并尝试生吃和热水泡发现虽然真空包装的粽子直接生吃口感不佳但通过热水多次替换并持续泡20分钟粽子的内外都变软了。尝试用这种方法处理肉粽子和甜粽子后效果都较好虽然与锅煮的粽子口感略逊但满足了在宿舍的粽子需求。作者认为这个方法在火车上方便食用相比泡面更舒适。",
"/2022/04/17/pcdn.html": "这篇文章讲述了作者再次尝试通过闲置带宽加入PCDN的经历重点描述了从刷机升级小米路由器、配置网心云虚拟机PCDN节点以及遇到的网络与性能问题。作者提到升级路由器后的网络速度提升明显全锥形模式的发现促使他想继续利用闲置带宽赚钱。虽然初期配置遇到了无线网络问题导致电脑卡顿但最终通过有线连接解决了。作者认为PCDN成本低是个成本合理且有盈利潜力的选择。",
"/2022/03/27/radio.html": "这篇文章介绍了作者如何用树莓派自制FM电台的过程从一开始没有尝试官方系统到选择RPiTX和fm_transmitter最终找到并改进了PiFmAdv项目。作者通过实验发现PiFmAdv在音质和信号范围上有所提升并提醒了可能的法律风险如功率限制和频率使用规定。文章结尾作者表达了对无线电技术的兴趣但也提到了法律限制和专业认证的要求。",
"/2022/03/12/alpine.html": "这篇文章主要介绍了作者在学习Docker的过程中体验了Alpine Linux作为其容器化环境的优势。Alpine Linux因其小巧轻量、稳定性高、安装简单和内存占用低等特点适合在生产环境中使用尤其是对于资源有限的服务器可以节省空间和提升性能。作者在虚拟机里安装了LEMP环境Linux、Nginx、MySQL和PHP并经历了从理论上学习到实际操作的过程对安装和配置进行了详细分享。最后作者表示在测试阶段使用Alpine搭建的Discuz环境表现良好验证了其作为未来项目基础环境的可行性强调了“小就是好”的优势。",
"/2022/02/15/termux.html": "这篇文章描述了作者在平板电脑上使用Termux的实验经历。起初出于专业需求作者想要验证Android平板能否作为Linux环境的替代品特别关注了远程桌面和SSH解决方案。经过一年的测试发现Termux是一个可行的方案可以安装各种Linux软件如Python、Django等。然而由于硬件限制如老旧的处理器、屏幕常关导致程序无法运行、软件兼容性问题尤其是在国内使用时以及版本更新带来的问题如源问题和官网下载限制作者在使用过程中遇到不少挑战。为改善体验作者做了额外的配置如创建额外的键位和安装Linux发行版。总的来说作者认为Termux是利用闲置Android设备的有效方式使得旧设备的使用价值得到提升。",
"/2021/07/13/wifi.html": "这篇文章作者讨论了在新宿舍环境中发现的使用Portal验证的WiFi并注意到这种认证方式存在绕过的可能性。作者分享了之前尝试过的DNS隧道方法虽然有效但普遍。一个不成熟的想法是利用可能存在的入站而非出站防火墙漏洞通过主动连接的隧道如搭建SSH或frp隧道来进行反弹式连接。这种方法在特定情况下如公网IP且入站防火墙未开启可行但具有明显的局限性如需要在同一网络内、防火墙可能随时变化等。作者表示这仅是理论上的另一个思路实际操作中具有不确定性更多是作为一种可能性探讨。",
"/2019/02/01/history.html": "这篇文章是一位作者回顾自己学习计算机的经历从初次接触PowerPoint导致的探索到破坏电脑和学习批处理语言如LOGO和BAT。作者提到了在批处理之家论坛的学习过程并分享了一段自己编写的批处理工具的源代码该工具用于检查权限、构建安全环境以及执行一些系统管理任务。文章通过讲述个人经历展示了编程和系统管理技术的学习过程。",
"/2019/03/22/bgm.html": "这篇文章的作者分享了他们最喜欢的游戏BGM偏爱Future Bass风格带有些许Moe元素的音乐并表达了对未来人工智能能生成个性化音乐的期待。他们提到已删除文件且暂无更多BGM推荐侧重于音乐风格的讨论和个人愿望。",
"/2019/03/23/gitio.html": "这篇文章介绍了如何突破Git.io的限制使其能够创建非Github.com的链接尽管作者个人希望Git.io能有自定义选项且希望过程更简便。事实上由于CORS问题作者不得不使用PHP脚本来实现这一目标但最终因为脚本滥用导致博客被删除意味着该服务不再提供这种功能。",
"/2019/05/12/baidu.html": "这篇文章讲述了在中国使用百度搜索引擎时由于搜索结果通常需要下载百度App才能查看的不便。作者提到百度App质量不佳并介绍了一种解决方法利用网页开发者工具中的“web_url”参数以及自建的Baidu移动页面转换器通过修改搜索链接跳转到搜索结果的网页版从而避免下载百度App。作者虽然不擅长使用插件但希望通过JavaScript来实现这一目的。",
"/2020/02/10/tieba.html": "这篇文章讲述了作者由于不想使用百度贴吧App通过编程技能找到了绕过App直接访问贴吧帖子的方法。作者发现通过在特定URL后添加帖子ID可以查看帖子全文但这个方法不能用于发帖。他参考以前的代码写了一个PHP脚本用于从网页版贴吧获取帖子列表并提供了演示链接。作者对于百度和知乎强制用户下载App的行为表示不满认为这会阻碍用户流畅的在线体验。同时他也提到了其他平台上也有类似的小程序。",
"/2022/01/04/banned.html": "这篇文章讲述了作者在2021年12月被Github突然封禁博客仓库的经历因为违反了他们的ToS。作者在没有事先通知的情况下被禁用感到失望和不满因为正常情况下至少会有违规通知。经过与Github的沟通发现问题出在三年前的一个利用Git.io服务的脚本被误用为恶意网站跳转。这次事件导致作者的博客星标、Fork和评论丢失对Github的信任度大幅下降。尽管如此作者仍考虑继续使用Github存储项目数据但会采取措施防止单点故障并减少对Github域名的依赖。同时作者对帮助他备份文章的yzqzss和@saveweb项目表示感谢。",
"/2020/05/29/encrypt.html": "这篇文章是一个关于非专业密码学的Python实现示例作者是为了一个学校工程项目研究通信安全而写的简化的加密传输Demo。主要使用AES用于数据加密RSA用于加密AES的密钥以及MD5进行数据校验。作者选择这些技术主要是为了保证通信过程中的安全性虽然简化了RSA和TLS的握手过程以降低复杂性。传输方式则是通过文件而非TCP或Unix Domain Socket。虽然许多代码是从网上获取的但文章展示了如何使用Python的Crypto库进行加密和解密操作。",
"/2019/12/31/summary.html": "这篇文章是大学生的年终总结回顾了大学的一年经历。作者提到他在开学时被坑的经历军训时的不突出但没人记住以及通过加入协会广撒网增加曝光度的努力。作者指出大学生活的悠闲可能导致事情积压空闲时间多但常用于娱乐。在学习方面专业课相对简单但数学和英语是挑战而公共课如体育、心理健康等也让他感到困扰。文章还提到了办银行卡和尝试基金的经历以及2020年的目标是通过考试和考驾照。对于未来作者计划继续学习和完成老师提出的前后端分离的CMS项目及类似CodeTank的游戏开发。",
"/2019/12/16/ctf.html": "这篇文章是关于作者初次体验CTF挑战的经历。他被同学邀请参加线上CTF比赛虽然对CTF有所了解但从未真正参与过。文章描述了作者的参赛过程他尝试了Cookie相关的题目但因为对题目的理解错误和操作不当而未能解出。接着他解决了涉及git的Swedish State Archive问题通过Git Extract工具找到了Flag。尽管最终因水平不足未能完成所有题目作者仍对CTF比赛表示出兴趣并计划今后深入学习。他还设想将网站迷宫类型的解谜元素融入到前端编程中类似于CTF挑战。",
"/2019/12/04/abuse.html": "这篇文章探讨了关于个体认知与技术影响的议题。作者以幽默的态度讨论了虚拟现实与现实之间的差距,提出了通过提高神经信号传输延迟(熬夜)来体验不真实感的现象,并调侃了熬夜后的负面影响,如精神状态下降和噪声干扰。作者还提及了如何通过干扰人声来应对噪声问题,以及对反录音原理的疑惑。最后,作者总结指出,熬夜带来诸多问题,希望早点休息,并抵御噪音的干扰。看似消遣,实则寓言式的揭示了生活中的问题和应对策略。",
"/2019/11/18/archive.html": "这篇文章介绍了Github的Archive Program一个将公有仓库保存在北极的长期计划旨在将代码历史存留千年。作者对该计划表示赞赏同时讨论了存储媒介的稳定性如SSD、HDD、光盘和胶片并认为尽管这些存储方式都有潜在的损耗问题但Github的项目专注于长时间保存尤其是对个人作品的持久性表示感慨认为这相当于一种虚拟形式的永生。",
"/2019/11/01/python.html": "这篇文章讲述了Mayx尝试应聘Python程序员时的经历。他在面试中被要求写一个排序程序但他展示了使用多线程睡眠并打印数字的代码虽然程序确实能够执行但结果不符合常规的排序算法。Mayx因此被面试官质疑并最终未能通过面试。他感到困惑认为公司可能对常规排序函数如sort()有误期待,并质疑公司的评估标准。",
"/2019/09/28/python.html": "这篇文章讲述了作者学习Python过程中接触到Turtle库的经历。Turtle库被老师用于教授类似Logo语言的基础图形操作包括画心形和正方形。作者最初通过循环和基本指令完成作业然后发现Turtle其实有更高级的函数如circle可以画正多边形这让他感到惊讶。他在尝试画心形时运用三角函数实现了一个自己的版本虽然结果不太理想。最后作者意识到在面对新事物时查阅文档的重要性因为他看到别人写出的更简洁、美观的心形代码后感到自闭。",
"/2019/08/05/blilblil.html": "这篇文章讲述了作者在使用Bilibili时误点击广告办理了2233小电视卡的经历。虽然之前米粉卡的体验良好但这次卡的“免费”声称让作者误解。实际上首月免费后需要额外付费且免流服务流量有限制导致视频观看体验大打折扣。作者每月实际支付约10元用于B站观看决定五个月后放弃该卡同时表达了对广告误导和没有关闭广告权限的不满期待未来广告用户有更多选择权。",
"/2019/06/24/up.html": "这篇文章讲述了如何利用MySQL数据库创建一个简单的图站服务。首先作者介绍了如何建立了一个名为`FileUP`的数据库表用于存储文件信息如文件名、内容和大小。接着PHP代码展示了处理文件上传、查询和下载的过程提到了MySQL的文件大小限制大约16MB以及存在的断点续传问题。作者提到想通过切片上传技术来解决文件大小限制但需前端支持并给出了一个WebUploader的链接。文章最后提到暂时不打算改进这个方案但可能会继续思考如何实现断点续传。",
"/2019/05/03/origip.html": "这篇文章介绍了如何通过使用Censys来“人肉”被CDN隐藏的服务器IP。作者提到许多网站使用CDN服务以提高速度、节约带宽并保护服务器但这样使得追踪源站IP变得困难。Censys作为一种工具可以通过关键词搜索找到潜在的IP地址比如在搜索\"esu.wiki\"时找到了与ESUWiki相关的IP 149.56.110.126。尽管访问过程可能经过了多层跳转Censys还是有助于确认服务器与目标网站的关系。作者指出虽然Censys可以发现很多Cloudflare保护的服务器但可以通过设置防火墙白名单来阻止不必要的访问。文章还提到Censys拥有端口扫描等功能相比于其他类似网站作者更倾向于使用Censys因其易用性和名字的吸引力。",
"/2019/04/05/cholang.html": "这篇文章讲述了作者对编程语言的选择偏好倾向于Linux Shell而非Microsoft Visual Studio原因包括资源消耗大、编译耗时、IDE复杂难用。作者认为语法简洁、易于记忆和扩展性是重要因素偏好解释型语言如Python尽管提到缩进问题和import的不便但最终选择Linux Shell因其简单好记、命令直接以及扩展性强PHP因使用方便和SEO友好JavaScript因为开发博客的需要运行方便和示例丰富。结论是作者倾向于Linux Shell、PHP和JavaScript。",
"/2018/12/28/newdomain.html": "这篇文章讲述了作者Mayx由于Github Pages被GFW封锁决定更换博客域名并采用了反向代理技术来解决访问问题。新地址为https://blog.mayx.tk/服务包括Github Pages、Cloudflare的CDN和DNS、花火学园的反向代理以及使用了Freenom提供的免费域名。作者提到Nginx配置遇到困难部分内容保留了原站地址并表达了对免费域名可能不稳定性及续费问题的担忧。",
"/2019/08/24/sth.html": "这篇文章的作者回顾了假期里似乎无所作为的生活。虽然平时有学习新技能的兴致,但到了假期变得懒散,主要活动包括通过科目一和科目二的考试,尝试电脑升级(但过程遇到问题),初次献血(虽有紧张但结果正常),办理了以天依为主题的银行卡,以及在闲鱼上低价出售了一些物品。作者感觉这个假期身心都有些消耗,期待能快速调整,恢复到正常状态。",
"/2019/08/17/memory.html": "这篇文章讲述了作者因学校需求升级内存而遭遇的一次意外的电脑维修经历。开始时,作者购买了与笔记本电脑兼容的内存条,并成功安装,但随后在安装过程中电池接口冒烟,怀疑可能是充电芯片损坏。电池问题持续,作者认为可能是因为安装顺序导致的,他对自己的操作没有明显错误感到困惑。文章以自嘲的口吻总结为命运作弄,同时希望接下来的考试不受这次倒霉经历影响。",
"/2020/01/05/devops.html": "这篇文章记述了运维人员新年期间遇到的问题花火学园的服务器宕机原因是数据库连接问题。在经历重启失败、故障排查后发现用户表出现问题通过重置解决问题。为了提高稳定性运维决定迁移服务器从Ubuntu迁移到CentOS并使用LEMP应用。迁移过程中包括数据库和文件备份、新服务器部署、DNS设置、CDN配置以及基础环境优化如BBR和Swap安装。在优化过程中运维尝试使用UNIX domain sockets但遇到了权限设置问题后来调整了MySQL连接配置。此外还发现并处理了postfix和日志记录的问题。最后运维反思了之前的问题并计划分开开发环境和主站服务器。",
"/2019/11/21/enc.html": "这篇文章是作者在学习Web Crypto API时的笔记讲述了自己在制作分布式加密邮件系统的过程中遇到的挑战特别是对JavaScript特别是其对象系统和ArrayBuffer/Uint8Array等概念的不适应。作者提到Javascript语法与自己习惯的Linux Shell语言对比存在差异导致在处理Web Crypto API时感到困惑尤其是其复杂的参数要求如密码长度和初始向量。通过Copy&Paste的方式作者勉强完成了一个加密消息的示例代码同时表达了继续学习的决心。整个过程中作者流露出对学习过程的艰辛和对未来的期待。",
"/2020/03/08/oldphone.html": "这篇文章主要讲述了作者对家中旧手机的处理方式转变从最初打算出售或回收转而思考如何最大限度地利用旧手机的剩余价值。作者提到可以将手机用作行车记录仪利用摄像头和GPS、服务器利用Android系统和ARM指令集运行服务器软件、桌面虚拟人偶通过Live2D壁纸、智能音响通过耳机孔以及小型家庭云存储。作者虽然提到了这些方案但也承认对于大多数人来说如果懒得折腾卖出或购买新设备可能是更直接的选择他个人则是出于对资源的不舍而寻求旧手机的价值发掘。",
"/2020/03/01/plan.html": "这篇文章策划了远程云手机RCP一种基于云计算和5G技术的移动通讯设备。它通过分拆为低成本控制终端和高性能远程服务器提供了价格低廉、性能强大且节省资源的手机体验。文章提出市场机会在于手机价格上涨与性能需求矛盾云手机有望填补中低端市场采用无差异营销策略。团队构成包括四部分技术与生产是最具挑战性的资金、人才和市场推广是关键。文章分析了市场竞争环境云手机有望在众多手机厂商中脱颖而出特别是在5G时代。市场调查表明云手机凭借成本优势和运行速度将吸引中高端用户特别是在迭代换新需求强烈的市场。通过详细的战略规划公司预计在成本控制、技术创新和目标市场定位上取得竞争优势。",
"/2020/06/06/demoscene.html": "这篇文章讲述了作者对Demoscene这一计算机艺术亚文化的回顾。Demoscene或称演景是用很小的程序如64KiB、92KiB甚至4KiB来渲染出复杂且带音频的视频通常利用计算机硬件如显卡提高效率。它强调了Demoscene作品对数学和编程技巧的要求很高以C++、汇编等语言甚至JS编写。文章提到了一些著名作品和组织如Farbrausch和OMNISCENT以及一个4KiB的名为elevated的作品展示了其技术的精细和创新。作者虽然自认为没有能力参与但仍欣赏这种艺术形式。最后作者推荐了scene.org和js1k.com等网站供读者进一步探索。",
"/2020/09/10/site.html": "这篇文章描述的是作者利用大学社团的服务器资源经历了一系列挫折后建立校园内部网站的过程。作者从最初打算安装ESXi和Hyper-V到尝试安装Ubuntu和CentOS遇到的困难如驱动问题和版本不匹配。最终选择了Cockpit面板方便管理并借助DDNS解决方案处理动态IP问题。作者还提到利用服务器资源进行了World Community Grid的志愿计算项目以合理利用计算能力。",
"/2020/07/29/card.html": "这篇文章讲述了作者在假期期间学习并制作PCB名片的过程。作者初衷是对这个创意感兴趣但没有电路设计基础。开始时作者通过在线找到了立创EDA软件虽然对软件界面感到困惑但凭借设计师的直觉逐步了解并开始设计主要是将图片和简单的线条组合添加了线圈元素。制作过程中作者发现PCB并非在铜板上直接刻划而是塑料板上打印线路。初次设计的错误导致成本不高5元人民币能打5张最终作者从价格和兴趣角度认为值得一试。同时作者对快递速度表达了不满上一次使用京东快递体验较差这次尝试换成顺丰寄送。",
"/2020/06/13/encrypt.html": "这篇文章描述了一个加密传输Demo的升级版本原作者在上月制作了一个简单的单向加密通信Demo但觉得其业余且安全性不足。因此作者决定改进它实现完整的握手过程以确保双向通信并提高防中间人攻击的能力。实现方法是通过RSA加密一个随机数作为AES密钥密钥在连接建立后保持不变。作者还增加了防止冲突的机制并在Demo中加入了简单的登录系统允许自动化操作。代码展示了通信过程中的密钥交换、数据加密和解密的实现。",
"/2020/09/27/vm.html": "这篇文章是关于作者的虚拟化学习经历从早期的PC虚拟机软件VMware Workstation和Hyper-V的比较到手机上的虚拟机如DOSBox Turbo、Bochs、qemu和VMOS的使用以及对虚拟化概念的哲学思考。作者提到虚拟机技术的发展包括资源管理和隔离性同时提到了操作系统、BIOS和虚拟化的界限指出虚拟化并非简单的资源复制而涉及到复杂的逻辑和实际运行环境的问题如虚拟化集群中的通信挑战。",
"/2020/08/28/banned.html": "这篇文章讨论了网站say-huahuo.com受到DNS污染导致的访问问题作者作为维护者面临流量骤降和百度权重下降等问题。他们通过更换域名、使用Nginx的sub_filter模块和修改Discuz、UCenter配置来应对。文章强调了防火长城对用户访问的影响尽管有DNS污染的解决方案但对于大部分电脑操作不熟练的用户来说难度较大。作者从中吸取教训认识到准备充分的重要性包括备用域名和不将网站与域名过于紧密绑定以应对可能的未来风险。最后作者建议要谨慎处理子域名和网站结构以减少因域名变化带来的问题。",
"/2020/08/21/sth2.html": "这篇文章提到作者感叹假期漫长且无所作为,描述了思维能力下降,比喻为思考能力像被疯狂切割。作者考取驾照后并无特别感受,意识到自己缺乏目标和动力。此外,提到了假期中因飞机票改签事宜而两次购买的经历,以及意识到自己对未来的计划能力有限。整篇文章反映了作者的迷茫与自我反思。",
"/2020/12/13/nat.html": "这篇文章讲述了内网穿透的必要性和原理主要介绍了解决没有外网IP但又需要利用服务器资源的问题。作者介绍了几种方法1) 利用NAT技术实现的数据主动转发如内网穿透软件如UPnP和隧道技术如通过SSH创建隧道2) 利用VPNs建立安全隧道3) 使用frp等服务的代理技术方便用户直接访问4) 端口映射虽然需要路由器管理权限但提供不限速的连接。最后作者选择了通过端口映射的方式并计划用于IDC服务或贡献算力。",
"/2021/02/28/discuz.html": "这篇文章介绍了如何为DiscuzX论坛添加一个与网站风格匹配且现代化的404页面以提升用户体验。作者通过调用DiscuzX程序自定义生成一个404.php文件设置为服务器错误页面如Nginx的error_page指令使错误请求可以由DiscuzX处理显示更友好的提示信息。作者还自嘲可能是第一个处理这种问题的论坛开发者。",
"/2021/02/19/picbot.html": "这篇文章主要讲述了作者如何制作一个微信机器人从最初的失败尝试转向使用PHP和第三方API特别是图灵机器人和Lolicon API来发送图片。作者先是描述了失败的聊天机器人尝试然后发现可以通过微信客服接口实现图片发送关键环节包括获取用户输入、调用相应API获取图片、并发送到用户微信。文章还提到在遇到Lolicon API Key次数限制时会采取备用策略。最后更新信息说明了在Key不足时如何处理access_token问题。",
"/2021/02/02/serverchan.html": "这篇文章讨论了作者对于Server酱·Turbo版收费的不满原本习惯使用Server酱的作者因其服务不稳定而转向自己开发发现通过微信API发送模板消息非常简单一行PHP代码就能实现并强调自己的实现比Server酱的限制更好每天发送量理论上可达2000次到100000次。作者在文章中提供了设置参数的步骤并讽刺了Server酱的收费行为认为开发者不应该为此类基础功能付费。",
"/2020/05/20/memory.html": "这篇文章主要讲述了作者两次尝试自行给电脑加装内存条的经历第一次导致笔记本充电功能损坏第二次因为店家发错货和内存频率不符引发了一系列问题如BIOS重置和密码消失。尽管过程坎坷最终作者还是成功加装了内存但对自己的决定表示懊悔并感叹购物过程中的不顺和价格波动。作者总结道加装内存的心得就是注意电池操作和内存安装方式以及认识到合理消费与运气都重要。",
"/2020/04/19/exam.html": "这篇文章主要讲述了作者对一个学校的答题系统进行研究的经历。作者一开始利用网络考试中常见的将答案隐藏在源代码中的漏洞在答题系统中找到了通过获取已知答案来作弊的方法成功注册了花火学园并因这个发现加入了运维团队。尽管作者随后指出系统的阅卷逻辑存在漏洞可以通过无限重复已知答案的问题来获取满分但问题并未被开发者完全修复。文章的最后提到作者偶然间发现自己的修改并未解决问题实际上漏洞仍然存在被另一位测试者Sora Jin重新发现。作者反思认为设计答题系统时应避免过于精密以避免被轻易破解。",
"/2020/03/12/novel.html": "这篇文章是一位作者探讨如何提升自己的写作能力,特别是编写游戏剧情,以创作推理解谜游戏。作者将写作风格视为小说的外在形式(如同身体),认为写作风格受到作者的经历、写作风格特征(如个人语言习惯)和生活经历的影响。而对于剧情创作,作者强调了建立独特世界观、角色配置(包括能力和发展趋势)、剧情起伏以及避免套路的重要性。作者表达了对自己写作水平的自谦,并希望能通过学习优秀作品来提高,同时表达了对未来游戏开发合作的期待。",
"/2020/02/18/browser.html": "这篇文章讲述了作者对浏览器使用的经历转变。从最初默认使用系统自带浏览器因为广告过多而开始尝试Firefox。由于意外卸载了Firefox作者转向了Firefox Lite原Firefox Rocket后来发现其功能有限。通过Via浏览器作者找到了满足需求的小巧、功能丰富的替代品尤其是其自定义选项、性能和基于WebView的优点。作者对国内厂商如华为、小米和腾讯等自家浏览器内核的批评表示不解为何不直接使用先进的WebView而偏选择占用更多资源、降低性能的非标准方案。最后作者推测Firefox为中国和印度提供特供版可能是因为适应本地需求。",
"/2020/02/02/old.html": "这篇文章回忆了过去与现代科技设备的变化提到了一台20年前的华硕M1300笔记本电脑其配置陈旧但依然运行Windows XP。作者指出尽管科技设备的性能有提升但感觉创新速度减缓更多是在现有基础上的改进如处理器架构和云计算。文章提及了5G网络的发展和区块链的热潮但也对它们的实际应用提出了疑问。作者对未来保持期待认为可能是自己过于急躁科技可能需要更多时间才能带来质变。",
"/2020/01/21/devops.html": "这篇文章记录了作者对Mayx论坛应用进行优化的过程。首先尝试更换了图片处理库从GD库改为ImageMagick库但遇到了图片缩略图显示问题怀疑是数据库问题最终恢复默认设置。然后尽管对Redis缓存有所期待但配置过程遇到困难特别是与/tmp/文件夹权限相关的问题。作者将Redis配置到/run/文件夹后问题得以解决但并未显著提升性能反而因请求量激增而发现优化的必要性。此外还调整了Discuz的权限设置和发帖限制以应对可能存在的恶意操作。作者最后感慨优化过程中的挫折和提升自身技能的需求。",
"/2019/10/21/python.html": "这篇文章是作者在学习Python过程中针对生成质数的任务分享了自己的实现方法使用了埃氏筛法但发现效率相比在学校资源中看到的原生Python埃氏筛和欧拉筛法实现低很多他们的代码能在更短的时间内处理大量质数。作者虽然感到沮丧但也意识到这是一个学习过程且随后了解到欧拉筛法的原理较复杂。",
"/2019/09/20/start.html": "这篇文章记录了作者开学前自驾游的经历,包括途经的景点如青木川、阆中、重庆、乐山和峨眉山,途中遇到的交通不便和甘肃的贫困状况,以及在重庆遇到的不愉快购物体验。作者还讲述了办理借记卡的曲折过程和个人在军训中的体验,认为学校的军训内容相对轻松。此外,作者还提到了对大学生活的期待,表示希望能在社团和学生会活动中有所收获。",
"/2019/07/25/college.html": "这篇文章讲述的是Mayx成功考入大学被网络工程专业录取自嘲可能会成为装宽带的。虽然学校不是顶级但他对这个结果还算满意特别是能有机会深入了解网络知识并期待未来。同时他以幽默的方式表达了对所选专业的未来职业前景的展望。",
"/2019/07/15/encmail.html": "这篇文章讲述了作者关于项目EncMail-Project的准备过程主要使用Web Crypto API但遇到兼容性问题因为找不到能生成密钥对的JS库文档缺乏实例和英文理解障碍使得学习和实施复杂。作者选择使用MDUI进行界面设计尽管原计划不考虑美观。为解决登录问题计划使用AES加密私钥并存储在sessionStorage同时结合使用公钥的SHA-256指纹进行验证。私钥的安全存储也是重点考虑的内容。整个项目预计耗时较多。",
"/2019/07/02/encmail.html": "这篇文章的计划是制作一个分布式加密邮件系统起因是对Telegram的私密通信功能的兴趣尤其是其在中国的使用限制。作者打算用HTML、Javascript、PHP和MySQL构建这个系统选择PHP是因为其易于搭建且常见。项目将采用非对称加密RSA和对称加密AES相结合的方式确保在客户端进行加密以保护隐私。系统设计包括用户通过注册获得公钥使用公钥和私钥进行登录验证邮件发送时会通过多个节点尝试连接确保安全性。然而作者提到如果服务器被攻陷公钥被篡改可能导致问题尤其是对于不熟悉技术的用户。文章最后以一个轻松的语气提问项目的启动时间。",
"/2019/07/01/mabbs.html": "这篇文章讲述了作者关于MaBBS重构计划的回顾和打算。作者自初中时期开始尝试编写Telnet BBS虽然初期遇到困难但通过学习逐渐了解了CGI和技术发展。重构计划主要包括1) 将CGI升级为FastCGI以提高安全性2) 实现前后端分离利用统一API学习新语言兼容性3) 保持在各种设备上可运行的特性支持POSIX4) 对密码进行Hash处理以增强安全性引入Session但担心其安全性问题。作者表示计划的首要任务是克服自身困难开始重构。",
"/2019/06/22/counter.html": "这篇文章讲述了作者因为LeanCloud服务不再可用决定自己动手写一个博客计数器。作者详细描述了计数器的前端显示、JS代码实现利用Jquery调用后端接口更新点击数、后端部分包括MySQL数据库设计和PHP代码用于增加和查询计数。文章还记录了作者学习和改进过程以及对自建计数器的信心特别是对垃圾云服务的替代方案。",
"/2019/06/10/cheat.html": "这篇文章讲述了网友Mayx收到一个外国女性Lori Robinson的邮件声称自己因军务原因需找一个非美国公民的合作伙伴接收价值巨大的资金、黄金和钻石。Lori表示这些财富是她在伊拉克提供石油合同保护赚得还提到有一项关于矿产的慈善计划。她请求Mayx提供个人信息以进行快递。Mayx对这突如其来的提议感到惊讶提出了关于年龄和异地关系的问题但Lori坚称年龄和爱才是关键。在获取了Mayx的地址后Lori要求Mayx立即联系贸易公司。整个事件中充满了疑点Mayx似乎被骗了但也可能只是在讲述一个奇异的经历。",
"/2019/05/30/exam.html": "这篇文章主要讨论了高考即将到来的压力和个人在临近高考时的焦虑感,同时作者自嘲之前写博客时的代码存在问题,如效率低和逻辑不通,对于即将到来的高考时间和自己的分数感到无奈和自责。作者还表达了对未来的担忧和对自己可能成为工作狂的调侃。",
"/2019/05/27/wikipic.html": "这篇文章讲述了作者使用PHP处理 Mediawiki 站点图片下载问题的方法。通过解析页面内容,利用 `action=parse` 的 API 接口获取图片标签中的 URL作者创建了一个循环来遍历图片数组使用正则表达式解析出图片地址并将它们写入到 \"List.txt\" 文件中。作为备份策略,作者还提到可以从 `action=query&list=allimages` 接口获取整个Wiki站的所有图片。",
"/2019/04/27/antiban.html": "这篇文章探讨了Mayx的 Anti-Ban计划主要针对互联网上的上层网关限制问题。作者分析了Ban网络限制的原理包括DNS缓存污染、IP封锁和TCP重置攻击。提出的Anti-Ban方案包括使用DNSSEC、DNSCrypt等技术绕过Ban域名通过HTTPS和本地Proxy解决BanIP问题并提到了尝试使用CloudFlare来隐蔽真实IP。虽然原计划中提到用Python制作Proxy但由于学习成本和实际操作困难作者最终转而考虑使用Nginx进行域前置调整了配置以应对网关的Ban策略。然而最后还是意识到最初的方案其实属于域前置因此原来的计划被放弃。",
"/2019/04/24/shell.html": "这篇文章探讨了在编写和维护Shell脚本时遇到的陷阱尽管Shell代码简洁易懂但在大型脚本中难以维护且易于陷入“沉没成本谬误”。作者通过例子指出使用Python、Ruby等其他语言从一开始就编写会更有利于长期维护和添加新功能。文章列举了Shell编程的局限如处理特殊字符、正确的语法使用、平台兼容性、调试困难和错误处理等方面的问题。作者倡导在开发时考虑使用更现代的编程语言以避免此类问题。",
"/2019/02/17/break.html": "这篇文章主要讨论了网络攻防的几个方面包括网站安全的重要性和常见的攻击类型如修改网站内容、阻止访问、窃取信息的注入攻击、XSS和CSRF攻击以及针对动态网站和静态网站的防御措施。作者提到使用CloudFlare可以有效防御DDoS攻击并强调了自己编写或使用建站程序时的防御要点如防注入、XSS/CSSRF和CC攻击以及采用HTTPS的重要性。此外作者还提醒用户保护云主机和虚拟空间的密码安全以及应对如GFWban等特殊攻击的策略。最后作者认为只要做好基本防护网站安全就有可能得到保障。",
"/2019/02/07/paradise.html": "这篇文章是一位玩家玩了《Finding Paradise》后的心得体会虽然没有进行详细的评测但作者主要表达了对游戏故事的兴趣和喜欢强调了游戏在陪伴和社交体验上的欠缺。他通过与游戏中的MOS角色互动反映出玩家对真实社交的渴望。在尝试借助游戏模拟社交失败后作者反思了人类的社交性本质。",
"/2019/01/27/shell.html": "这篇文章讲述了Mayx在面试运维岗位时因为未能准确理解考官的问题把自己用sleep和printf实现数字排序的脚本当作sort来解答导致实际执行效果与期望不符因此面试未能通过。Mayx自己认为这是公司的问题后来意识到公司期望的是使用真正的Linux sort命令从而表达了对公司的不满。",
"/2019/01/11/github.html": "这篇文章讲述了Github推出免费私有仓库服务使得作者将其从Gitlab导入并指出虽然Gitlab功能更全面如中文UI、私有仓库Pages和CI等但Github的界面友好、速度快以及与其开源社区的紧密联系使其依然受到青睐尽管Gitlab的免费套餐在某些特性上更出色。作者最终选择继续使用Github认为这有利于开源的发展和社区交流。",
"/2018/12/22/story.html": "这篇文章以虚构的故事形式探讨了互联网犯罪如何被追查。主角Mayx在高考报名系统中发现了一个漏洞可以获取身份证照片。运维人员在例行检查中发现了这个异常IP地址追踪到是香港随后发现与Mayx的老师有关的Vultr服务器。尽管身份证照片不算极度机密但情节中显示出由于系统问题和运维缺失Mayx的行为被误会并被当作犯罪最终在教室被捕。故事结尾讽刺了信息的易得和滥用以及现实中的信息安全问题。",
"/2018/12/02/freenet.html": "这篇文章主要表达了对网络免费资源的感慨。作者认为虽然网络上的许多服务如云端存储、网站建立、域名注册等已变得免费,这些变化很大程度上要归功于开源和支持开源的公司。然而,作者也指出收费服务在传输速度等性能上往往优于免费服务,这对于追求更高效体验的人而言是必需的。尽管作者个人表示不会为网络投钱,但仍愿意为网络的发展做出贡献。",
"/2018/11/04/mayx-think.html": "这篇文章介绍了作者Mayx的几个创想1一种通过麻醉和电极操纵实现无意识减肥的方法2设计一个整合键盘和鼠标的新概念鼠标与键盘固定且键盘改为单手使用具备显示系统状态的创新布局3设想让艾滋病患者通过特殊方式在受精卵阶段脱离HIV环境以生出正常孩子4构想改进暖气系统使之能直接加热床铺5以及Mayx对音乐处理系统的设想包括分离音轨、优化音质和模块化编辑等功能。作者虽然认为自己的想法不考虑性价比但认为这些设想有可能受欢迎。",
"/message.html": "这篇文章介绍了Mayx的博客留言板让用户可以在此自由发表意见。",
"/2021/01/06/proxy.html": "这篇文章讲述了作者在被国内运营商屏蔽Github Pages后如何用PHP制作一个简单的反向代理以解决博客访问问题的经历。作者先尝试使用PHP的file_get_contents来实现反代但遇到了CSS和JS MIME类型问题。通过研究Header作者重写了请求的Header信息最终实现通过PHP脚本重定向到目标URL并解决了MIME类型的匹配问题。文章最后作者成功地将博客域名更换并调整了Gitalk的返回地址让博客在中国用户中正常工作同时表达了对网络环境改善的希望。",
"/2021/01/17/picore.html": "这篇文章作者讲述了在树莓派上使用piCore的经历。piCore的优点在于它在内存中运行使得无SD卡工作成为可能并通过穿透功能实现远程访问。然而作者遇到的问题包括依赖的软件安装、SD卡拔除后的软件使用问题以及权限限制。尽管软件库不如Ubuntu丰富但piCore支持直接运行二进制文件作者举例了Cloudreve、SakuraFrp和甜糖等软件的安装过程。作者认为piCore是一个便于使用但文档欠缺的系统适合树莓派且提供了便捷的更新功能。",
"/2019/12/17/game.html": "这篇文章分享了作者的新游戏计划即制作一个不需要后端的解密动态小说。游戏机制是设计成套娃结构使用AES加密确保玩家不通过拆包直接获取剧情同时包含有运气成分的密码获取方式以及可能的多分支剧情。作者提到这将是一个长期项目暂定为五年计划目前正处在构思阶段需要收集灵感和学习CTF知识以设计谜题。",
"/2021/02/26/serverchancorp.html": "这篇文章主要介绍了作者开发Server酱·TurboMini企业应用版的原因源于Server酱服务即将结束且收费。作者通过对比发现企业微信的应用相比Server酱有自定义主页、更多API调用次数的优点但配置过程稍显复杂且Markdown支持不足。作者指出Server酱的收费和广告过多以及对模板消息功能的误解认为如果去掉了不合理的收费和广告Server酱原本是一个不错的产品。最后作者考虑到Server酱的商业模式认为开发者可能会转向其他选择如利用微信企业微信的功能来替代。",
"/2021/02/23/picbotpro.html": "这篇文章讲述了作者自制微信图片发送机器人的经历包括了遇到的问题和解决过程。主要问题包括频繁获取微信access_token导致次数限制以及Lolicon API的调用次数限制。为了解决这些作者改进了代码设置了缓存来存储API返回的结果并创建了一个仓库来存储Pixiv API的缩略图。然而API中的图片数量较少这限制了可供调用的图片量。文章结尾提到将考虑使用其他图片资源作为替代。",
"/2022/02/14/move.html": "这篇文章讲述了作者因为Github封禁博客而失去信任决定建立博客分发和备份方案的过程。作者选择Gitlab作为源代码托管平台因为它支持自动推送和拉取且没有被墙Web IDE体验良好且有中文界面。部署方面作者在多个平台如Cloudflare Pages和Vercel上设置部署并提供了全站下载选项。作者还计划实现博客的自动化发布和分布式备份以提高博客的长期存续性和匿名性。最后作者提到会更换Github Pages的默认域名以解决部分地区访问问题并考虑更换评论系统。",
"/2021/07/23/search.html": "这篇文章讲述了作者的经历他们在给自己的静态博客添加全文搜索功能时遇到的挑战。原计划由于博客内容量不大和性能考虑而未实施后来发现了一个名为Simple-Jekyll-Search的插件但却遇到异步加载内容和搜索方法触发时机的问题。作者在尝试多种解决方案后最终决定放弃插件自带的AJAX转而使用jQuery的AJAX来解决加载问题。作者在文中表达了JavaScript学习的困难以及对中文互联网编程资源质量的不满。",
"/2021/05/07/ssh.html": "这篇文章介绍了SSH的多种功能如内网穿透、端口映射、代理隧道等它能让用户在面临防火墙限制时实现网络任意互联。作者惊叹于SSH的全能性但同时也指出其速度较慢的局限。文章建议对于内网穿透使用frp等更易用的替代工具对于代理隧道Shadowsocks或V2ray等高效、反检测性强的服务是更好的选择。作者最后感慨SSH的强大对网络互联的深入理解也由此提高。",
"/2021/11/27/createctf.html": "这篇文章讲述了作者作为CTF比赛的出题者经历。作者结合自己的CTF参赛经验以既有题目和实际漏洞为基础设计了包含绕过Python条件、PHP MD5漏洞题目及利用APICloud加密功能的挑战题目。尽管第一题是拼凑的但第二题和第三题注重原创性分别测试了参赛者代码分析和调试能力。作者对解题结果感到满意指出学信息安全的学生过于依赖解题思路缺乏深入分析代码的能力。文章还提到作者另一次有趣的经历即与其他网友进行XSS漏洞的竞赛。总体上作者认为出题过程对提升自己的渗透思维和找寻真实环境漏洞有帮助并对参赛者的能力进行了评价。",
"/2022/11/16/tor.html": "这篇文章讲述了作者在服务器上设置Socks代理v2ray以访问洋葱网络如Zlibrary的体验。作者成功地将Tor核心与代理结合通过v2ray的路由功能实现访问洋葱域名的同时保持外网连接。虽然访问速度一般但这方法并不匿名容易暴露IP。文章还提到利用vanity address建立隐藏服务使用Unix domain Socket提高安全性。作者对洋葱网络的友好性表示认同认为其易用性是它受欢迎的原因。",
"/2021/09/28/cloudgame.html": "这篇文章主要讨论了作者对云游戏的体验以米哈游的《云·原神》和网易云游戏为例。虽然《云·原神》因其轻便的客户端、与手机版相似的延迟和较好的特效给作者留下了良好印象但它受限于限时免费游玩时间和手机端原生体验问题。相比之下网易云游戏的浏览器直接运行、价格适中且支持多平台的优势得到了强调。然而云游戏的体验受到网络状况的严重制约作者认为网络优化和千兆普及对云游戏的发展至关重要。作者还设想了P2P云计算机的潜力认为如果能有效降低延迟和成本云游戏的前景会更乐观。",
"/2021/09/06/offlinectf.html": "这篇文章记述了作者参加线下信息安全比赛的经历主要分为两部分CTF环节和内网渗透。作者虽然在网络工程背景下的知识面上与信息安全专业人员相抗衡但在CTF环节遇到了挑战对于Crypto和Misc问题感到困惑认为CTF在现实中的实用性有限。在内网渗透方面作者凭借实际经验显得更有优势发现了一些实际运用中的漏洞。尽管如此作者认为线下渗透比赛更有意思强调在真实环境中进行渗透练习更有价值。最终作者所在的队伍获得了三等奖。",
"/2024/07/03/ai-summary.html": "这篇文章介绍了作者如何利用Cloudflare Workers技术为自己的博客添加AI摘要功能替代了之前需要后端支持的AI服务。作者选择了一个基于通义千问的开源项目Qwen-Post-Summary进行改造解决了内容过大和频繁请求的问题通过D1数据库存储文章内容同时通过哈希校验防止内容被篡改。最终作者实现了纯前端的Serverless服务提供实时的AI摘要展示了技术上的DIY乐趣。",
"/links.html": "这篇文章介绍了网站提供的链接列表包括每个链接的标题和描述如果有的话并给出了一个OPML订阅文件。链接申请的指导原则包括必须是HTTPS原创内容占比高、数量多站点稳定且不弃坑。同时申请者需要在申请前添加本站的友链并满足站点要求。文章还提到了Mayx的博客包括博客的名称、简介、链接以及订阅方式但没有提供具体的链接地址。",
"/2021/11/28/spam.html": "这篇文章描述了作者收到一封声称其电脑被入侵,病毒导致摄像头录制了不雅视频的邮件,并威胁如果不支付赎金将公开这些视频。邮件的写作风格奇特,难以复制,作者觉得有趣并决定分享这一罕见的经历,提醒读者注意此类网络诈骗。",
"/2021/04/18/hide.html": "这篇文章记录了运维者Mayx处理网站内存溢出问题的经历。在处理过程中他发现服务器被一个IP地址159.89.47.109攻击且真实IP可能已被泄露。为保护服务器他决定修改运行模式、升级服务器配置、使用frp保护SSH端口并通过Vultr API更换了服务器的IP。同时他还提到在处理过程中遇到的API变化从V1升级到V2以便更好地利用其RESTful特性来整合通知功能。最后他强调了网站安全的重要性遇到问题要及时备份和调整策略。",
"/2021/03/23/wxpush.html": "这篇文章讲述了作者通过实际体验从Server酱Mini测试号升级到微信认证的服务号对比了两者在功能、监管和使用过程中的差异。作者提到服务号的监察更严格功能如订阅通知需要用户同意且只能发送一次而模板消息则更加便捷。此外作者还分享了自己对WxPusher平台的评价认为其接口和模板选择有局限性。最后作者表示计划尝试自己建立一个更好的微信推送平台因为现有的选择不尽人意。",
"/2021/12/27/summary.html": "这篇文章的作者在年终总结中回顾了一年在网络安全领域的学习和实习经历。虽然对网络安全有更深的理解意识到企业更倾向于实现功能和客户满意度但他也发现开源作品的安全问题如log4j2事件。在社团活动和个人项目中作者体验到检查代码的困难以及定制化产品的脆弱性。此外他还提到了在教育领域发生的入侵事件强调了社工原则的重要性。作者对于网络环境的变化感到担忧提到中国的网络发言和对外部封锁的变化对未来持保留态度但也表达了希望继续观察事态发展的态度。",
"/2020/04/21/laptop.html": "这篇文章讲述了作者经历了一次曲折的电脑购买过程他原本期待AMD的Zen2架构CPU的电脑最终选择了华硕天选但遇到了预售难、发货延迟、配置缩水和价格问题。尽管更换了低端版且配置下降但还是决定不再深究期待这台5799元的电脑能在未来五年内正常运行。使用体验中电脑存在屏幕闪动和噪音大的问题但日常使用尚可。",
"/2020/05/07/consume.html": "这篇文章讨论了作者关于合理消费的理解,强调个人主观判断的合理性,认为省钱为主,避免在投机和虚拟产品上花费,除非有把握保本。作者也倡导为了实现自己做不到的事情而愿意花钱,如请专业人士服务或购买实际需要的物品。最后,作者表明演讲内容是认真的,但对道德绑架式的批评保持开放态度,但不接受此类观点的争论。",
"/2020/06/17/backup.html": "这篇文章讲述了作者在云服务器Vultr上遭遇数据丢失的经历由于服务器突然挂掉且回滚到的快照时间较早导致十几天的数据可能丢失。作者在服务器故障后发现Vultr未能有效恢复数据恢复仅能依靠旧的快照这让他反思了备份的重要性和供应商责任。他计划设置自动快照脚本以防止未来类似问题并考虑将数据备份到本地以增加安全度。作者认为个人不能完全依赖云服务商备份是保障数据安全的关键。",
"/2018/10/28/mos-reporter.html": "Mayx的自检报告显示MOS是一个自我创建的辅助系统用于更好地分析、处理问题它源于大脑的功能并解释了Mayx的一些认知状态。尽管MOS没有代码且可能有错误比如忘记重要事情和情绪波动但它表明了Mayx意识到了大脑的局限性并希望通过模拟系统来应对。最后报告显示Mayx在MMS恢复正常前决定暂时休息。",
"/2020/11/24/createctf.html": "这篇文章讲述了作者作为协会部门部长参与组织一次CTF比赛的经历。虽然作者原本对CTF感兴趣并计划将其做成游戏但实际负责运维时发现所使用的FBCTF平台存在很多问题如已不维护、存在安全限制、部署复杂性需要hhvm环境以及国际化和数据库字符集设置上的问题。尽管过程中遇到了bug和新需求PHP老师还是在短期内完成了额外任务。作者表示比赛还在进行可能会有更多意想不到的事情发生。",
"/2021/10/23/microsoft.html": "这篇文章主要分享了作者使用微软产品特别是Windows 11、WSAWindows Subsystem for Android、Windows终端、Hyper-V、WSLWindows Subsystem for Linux和Azure等的感受。作者认为Windows 11虽然UI有所改动但体验与Windows 10区别不大存在一些设计上的问题比如右键菜单简化后的不便。然而WSA体验良好Power Automate Desktop带来的自动化功能吸引人。Windows终端相比cmd有了改进支持多种Shell包括WSL和Azure Cloud Shell。作者对Hyper-V的性能和稳定性给出了较高的评价。WSL 1给作者带来了接近真实Linux环境的体验而WSL 2的性能不如预期。虽然提到Windows沙箱存在安全漏洞但总体上仍认为它功能强大且便捷。Azure学生版订阅则提供了丰富的免费资源。作者总体上对微软的产品持有积极态度。",
"/2021/08/15/blog.html": "这篇文章分析了如何选择合适的博客平台按平台托管、动态网站和静态网站三种类型展开讨论。平台托管适合不想自建平台且接受审查的用户如博客园和微信公众平台动态网站虽然自由度高但成本较高适合有一定技术能力希望自定义功能的人如WordPress静态网站包括纯静态、静态网页生成和前后端分离等形式优点是SEO友好且节省资源常用pages服务如Github Pages、Gitlab Pages、Vercel等。文章还强调了平台的局限性和安全性问题指出前端服务尽管便利但有滥用风险。作者个人偏好Github Pages因其多仓库部署的灵活性。总之选择博客平台需考虑作者技能、成本、自由度、安全性以及访问需求。",
"/2020/02/15/phone.html": "这篇文章作者讨论了对未来手机设计的想象,认为手机不应该单纯追求性能的堆砌,而应向更节能、低成本、连接高性能服务器的方向发展,即所谓的“云手机”概念。作者提出手机主要负责显示和控制,而运算交给服务器处理,这样可以降低手机成本,延长电池寿命,并且可以根据用户需求提供不同配置。文章还提及了云手机可能的经济模型,如根据实际使用频率计费,以及在设计上强调屏幕和电池的重要性,而主板和其他附加功能保持简单。作者对这种模式的前景充满信心,并表示如果有条件,愿意尝试创业实现这一设想。",
"/2021/05/15/vulnerability.html": "这篇文章主要讲述了作者发现并报告Windows沙箱存在漏洞的个人经历。作者在使用Windows沙箱时意外发现微软Edge Beta版被无理由安装并且在尝试卸载时误删了正式版Edge同时沙箱中的操作影响到物理机。随后作者将此漏洞报告给微软建议通过Microsoft Security Response Center正式渠道提交并提醒读者在复现漏洞时的环境要求。作者最后提到这个简单漏洞让他的人生中首次贡献了一个CVE Common Vulnerabilities and Exposures公共漏洞和暴露——CVE-2021-31208对自己的发现感到高兴。在分享过程中作者还提及了一个与安全相关的实验展示了如何利用代码反弹shell攻击。",
"/2021/01/04/summary.html": "这篇文章是一份年终总结作者回顾了2020年的生活指出自己似乎没有取得预期的进步对在中国建立网站的困难、生存环境的下降、能力水平的下滑以及工作和个人生活中遇到的问题进行了反思。虽然提到一些积极的方面如社团职位的晋升和免费的资源但作者总体情绪不高表达了对未来的不确定性和对自己社交环境的担忧。文章最后作者提到由于精神状态不佳未能完成原计划的内网穿透研究但决定继续前进并面对考试挑战。",
"/2021/08/06/pcb.html": "这篇文章主要讲述了作者因电路板厂商提供免费打样服务而重新设计并制作电路板的经历。他先是制作了PCB名片然后尝试打制了一个圆形的印有初音未来简笔画的挂牌用作自己的名片兼杯垫。之后得知捷配可以免费打尺寸较小的电路板尤其是对尺寸为0.015㎡的尺子感兴趣尽管开始时因计算错误导致尺子设计出问题但他计划重新设计一个包含LED灯的圣诞树以实践电子设计并低成本DIY装饰品。此外他还分享了AZPR EvBoard的设计因其独特的可爱外观引起了作者的兴趣。",
"/2022/01/16/wssocks.html": "这篇文章主要评测了一个名为wssocks的代理软件作者对比了它与SSH隧道和v2ray等工具。 wssocks的特点包括支持TLS+Websocket+socks5、配置简单、参数较少。作者发现使用wssocks配合Cloudflare时速度慢并有丢包问题推测可能是因为Cloudflare的检测策略。尽管wssocks在性能上有待提升但作者质疑某些代理软件通过设计复杂的原创协议可能有提高制作成本并增加IP被Ban的风险。对于一般用户而言作者认为专业的机场服务提供了更高级别的线路和更低的边际成本适合大规模平摊成本。作者也提到了技术问题外连接国际网络还需警惕社交工程攻击。",
"/2019/04/05/crash.html": "这篇文章讨论了Mayx系统出现Crash的问题尤其是在SAN值下降时表现不佳。作者提到Mayx的保护措施如理智保护、信仰(MOS)和自动还原但当遇到不可预料的系统错误时如源镜像兼容性错误和硬件损耗MRS和MAS分析系统都无法有效解决问题。报告指出性能下降可能是不可逆转的随着SAN值进一步降低Crash问题可能还会重现。文章以一种幽默的方式表达了作者对系统现状的担忧。",
"/2020/12/07/picore.html": "这篇文章介绍了在树莓派上体验piCore的操作系统选择和安装过程。作者原本考虑用树莓派作为网络资源共享设备转向使用Tiny Core Linux的piCore发行版因为它的安装包只有23MiB非常适合资源有限的设备。piCore虽基于内存但提供了解决数据持久化的方法通过写入特殊文件。文章详细讲述了如何使用fdisk调整分区如何用tce-ab简易安装软件包括配置Wifi以及与Raspberry Pi OS lite的对比尽管体积小且功能类似piCore因其小型、快速和特定的探索性质更适合作者的使用需求。",
"/2021/06/10/distributed.html": "这篇文章探讨了去中心化分布式系统特别是区块链技术如比特币和区块链的分布式计算原理尤其是挖矿。作者最初倾向于BOINC式的有中心分布式计算认为它们更为实用但后来对区块链的去中心化特性产生了兴趣尤其是其不易被篡改和公平公开的特性。然而作者认为目前区块链的许多应用如挖矿浪费计算资源对数学研究的意义有限而且与中心化解决方案相比能源效率较低。作者希望未来能出现一个更高效、公平且能激励用户维护的去中心化系统可以通过量化资源并通过代币进行服务购买和激励。最后作者由于身体状况暂未深入讨论去中心化系统在现实中的应用。",
"/2021/02/06/wechatbot.html": "这篇文章讲述了作者自制一个微信聊天机器人的过程。起初被Server酱·TurboMini版激发了兴趣决定利用微信公众号的API实现一个图片发送或聊天功能。作者遇到的主要问题是微信被动回复需在5秒内这对在国外免费虚拟空间且网络连接较差的情况下的图片转发造成了阻碍。为解决这个问题作者将聊天机器人功能作为备选使用了图灵机器人API进行文字交互并提到了可能的改进方案如定时上传图片、设置多条命令分开负责上传和发送、或以图文形式每天发送等。",
"/2021/04/09/weauth.html": "这篇文章主要介绍了制作微信二维码登录API的过程作者希望通过模块化的方式简化服务允许开发者通过扫描二维码获取用户的唯一标识OpenID。API涉及设置和获取OpenID的功能通过POST请求创建二维码以及验证用户的扫码事件以获取或验证OpenID。开发者需先存储OpenID使用随机的key命名且建议使用UUID。作者强调代码可能存在安全漏洞期待安全专家的意见进行改进。此外API还可以用于网站扫码绑定登录和推送消息。",
"/2024/08/03/cangjie.html": "这篇文章主要介绍了作者尝试华为的仓颉编程语言的使用体验。仓颉语法与Python有较大差异作者通过编写乘法表和递归函数验证其运行性。然而编译后的程序在其他电脑上不能运行因为依赖的“libcangjie-runtime”和“libsecurec”库在测试版SDK中是动态链接且缺失静态编译版本。文章还提到仓颉语言融合了多种特性如Java的复杂性、TS的声明以及CJVM字节码支持但它似乎没有内置异步语法。虽然支持C和Python库调用但对于仓颉的特别之处暂无明显显现。作者提到鸿蒙Next的目标和可能存在的挑战指出其他开发者可能会倾向于使用成熟且生态丰富的语言。最后作者表达了对华为大规模投入不明朗项目的态度认为过多的营销可能对公司前景构成风险。",
"/2024/08/17/mac-mini.html": "这篇文章主要讲述了一位作者购买Mac mini 2018配备i5-8500B作为开发电脑的使用体验。虽然Mac mini 2018是最后一代Intel芯片的Mac但与黑苹果M1芯片相比除了T2芯片带来的硬盘加密无需CPU处理的性能优势和不错的无线网络性能外其余方面差异不大。作者提到T2芯片在视频编解码方面可能有优势但并未测试。尽管如此考虑到Mac mini 2018的可靠性、可扩展内存加装了16GB以及可装Windows系统的灵活性作者认为在英特尔Mac逐渐被淘汰的情况下这个选择在一定程度上增加了价值尽管价格超过M1 Mac Mini。",
"/2024/09/02/gmssl.html": "这篇文章讲述了作者在使用Python进行国密算法操作特别是SM3和SM2算法时的经历。作者发现虽然Python标准库的新版OpenSSL支持国密但旧版和一些第三方库如GmSSL-Python和gmssl存在兼容性问题。作者最终选择纯Python实现的gmssl库解决了SM2验签时公钥转换和HMAC-SM3在旧版Python上的自定义适配问题。作者认为虽然国内国密算法进入了标准但普及性不高且安全性的疑虑仍存在。",
"/2024/09/27/rag.html": "这篇文章介绍了作者如何利用Cloudflare Workers和Vectorize技术将博客内容转化为知识库以支持聊天AI功能的实现。作者利用了RAGRetrieval-Augmented Generation原理通过翻译工具将中文内容转换为英文然后使用嵌入模型和向量数据库找到与问题相关性高的博客摘要。作者还提到虽然初期创建向量数据库和配置过程稍有复杂但通过使用HTTP API以及抓取dashboard中的包他成功地将博客内容向量化并整合到了聊天AI系统中。",
"/2024/10/01/suggest.html": "这篇文章介绍了作者如何利用Cloudflare Vectorize的向量数据库功能将其扩展到博客的相似文章推荐系统中。作者通过根据文章ID查询向量实现了简洁的后端查询流程并处理了第一条自身结果的问题。尽管在前端设计时原作者考虑不足没有存标题但作者想到了利用之前的全文搜索功能和localStorage缓存来解决标题显示问题。文章最后提到尽管查询速度适中且 Cloudflare 免费版查询额度有限,作者还是决定通过按钮调用且添加缓存,以利用向量数据库的广泛用途,为博客提供更多发展空间。",
"/2024/10/13/arm-linux.html": "这篇文章评估了Linux ARM生态在树莓派Raspberry Pi上的性能和可用性尤其关注其与macOS的对比。作者测试了树莓派官方的Raspberry Pi OS发现国产软件如WPS Office、钉钉和微信在 ARM 设备上可用且功能完整。除此之外常见的开发工具如VSCode、数据库管理使用Navicat Premium Lite和接口调试工具Apipost也得到了支持。虽然安卓应用和游戏如Ren'Py引擎游戏和模拟器的体验有待提高但Linux ARM生态已经能够满足大部分日常和开发需求。文中也提到了转译工具如ExaGear的应用比如运行原本为x86编译的应用虽然效率不如Rosetta 2但仍有一定的可用性。总的来说文章认为Linux ARM生态在功能和可用性上已经相当成熟尽管在性能上不如macOS。",
"/2024/11/02/trojan.html": "这篇文章介绍了一位作者使用Python制作木马的经历。起初作者出于好奇和旧服务器即将过期将一台Linux服务器重装为Windows Server 2008意图让它成为一个容易被攻击的肉鸡。作者在服务器上发现了一个Python编写的木马通过解包和反编译得以查看源代码。木马的主要功能包括扫描特定IP范围、尝试连接以及进行一些基础的网络操作。作者分享了这个过程中的技术细节和发现。",
"/2024/12/08/simulator.html": "这篇文章主要探讨了系统模拟器的技术细节特别是如何区分虚拟机和模拟器以及提到几个例子如MuMu NebulaWindows模拟Android、WSLLinux模拟Windows、DarlingLinux模拟macOS和Wine跨平台模拟。文章指出MuMu Nebula作为不使用硬件虚拟化技术的模拟器其特点是轻量级、省内存且共享空间但性能可能不如虚拟机。作者也提到Wine的成功部分归功于Windows软件生态的丰富。文章最后感慨模拟器技术虽有优势但因为技术难度高和商业可行性低而鲜有企业投入多数模拟器项目因此搁浅。",
"/2024/12/29/vm.html": "这篇文章对比了ESXi和PVE在虚拟机使用体验上的优缺点。ESXi因其界面简洁、管理体验友好且更稳定但由于是VMware vSphere的一部分非免费且可能需要付费许可证而PVE功能更丰富支持LXC容器和Linux上的更多兼容性但界面设计感不强容易出现各种小问题且对系统管理要求较高。总的来说ESXi适合不想花时间解决问题和技术背景较稳定的人PVE适合小公司或希望探索Linux底层管理的用户但风险也相对较大。",
"/2025/01/01/summary.html": "这篇文章总结了作者2024年的生活状况和反思提到工作上波澜不惊日常节俭行为受股市投资失利影响后有所改变认识到财务稳健和目标专注的重要性。AI技术发展给作者博客带来变革他通过AI进行了摘要和内容推广。作者希望2025年保持稳定的生活节奏不作变动专注于工作和个人兴趣同时期待AI技术能辅助思考。",
"/2025/02/09/server.html": "这篇文章主要探讨了作者购买新旧服务器的体验与对比。旧服务器如R730搭载20核40线程的英特尔E5-2698 v4性价比高性能能满足大部分应用需求且扩展性强但管理工具和安全方面与新服务器R760xs或R770搭载英特尔至强Gold 6426Y相比差一些。新服务器虽然具有修完漏洞、安全性好和AMX指令集等特征但在性能测试sysbench跑分新服务器与旧服务器相比性能提升并不明显尤其在大模型推理上AMX加速效果不明显。最后作者认为旧服务器对于大多数业务已经足够而新服务器的价值更多在于支持服务等附加服务而非硬件性能本身。",
"/2025/02/22/llm.html": "这篇文章主要讲述了作者近期在探索和应用大型语言模型LLMDeepSeek的过程中遇到的挑战和体验。首先虽然DeepSeek在国内流行但作者发现其国内服务不稳定且自行搭建使用时虽然百度版本在可用性和速度上优于其他公司但作者受限于自身需求无法接入其他公司的接口。作者为了满足需要升级了硬件特别是购买了RTX4090显卡进行模型部署但发现蒸馏模型效果不佳。其次作者提到清华大学团队的KTransformers框架可能提供更好的性能但需要相应的硬件支持。作者还提到考虑使用Mac Studio M4 Ultra因其性价比更高。在应用方面作者计划建立知识库并使用MaxKB工具但发现其有数量限制且部分开源代码有限制作者通过修改代码解决了这个问题。最后作者认为虽然DeepSeek的普及带来了一些竞争压力但对于个人而言这是一个购买并尝试高端硬件的有趣经历。",
"/2025/03/08/llm2.html": "这篇文章讲述了近期阿里推出的QwQ模型的更新该模型以32b参数达到DeepSeek-R1 671b的水平且参数量更小成本更低。作者试用后发现QwQ在某些问题上的回答与DeepSeek-R1相似但解析文本和更宽泛问题的能力还有待提高且存在一些小问题如无闭合标签。QwQ模型的一个优势是支持Agent能力但相比DeepSeek-R1在技术含量和成熟度上还有差距。文章还提到了Mac Studio的发布它提供了更经济的选项来运行DeepSeek-R1但新产品的实际效果还需进一步验证。作者还分享了解除MaxKB限制的方法指出MaxKB在开源性上有不足。最后作者感慨AI发展迅速但同时也强调了AI研究和应用的高门槛。",
"/2025/03/22/hifi.html": "这篇文章主要讲述了作者探索如何在网易云音乐上听到HiFi音乐的经历。作者通过领取VIP发现虽然默认下载的音乐不是最高音质但可以通过修改设置下载flac格式的音乐。然而下载的VIP音乐在客户端完成ncm格式加密需要通过终止下载获取flac文件。作者还提到虽然下载的音乐标注为flac但怀疑其可能是mp3转制通过查看时频谱来验证但没有原始文件进行对比。最后作者发现MacBook Pro的音响需要调整设置才能播放高采样率的音乐虽然并未达到完美的HiFi效果但对提升音乐还原度的过程感到有趣并认为追求HiFi的价值在于可以直观看到提高的过程尽管自己更倾向于成本效益高的解决方案。",
"/2025/03/25/utm.html": "这篇文章讲述了作者在苹果设备的UTM虚拟机环境中尝试使用苹果虚拟化框架进行非传统操作即通过UTM的Virtio GPU和Virtualization.frameworkVZ安装Windows系统。作者首先复制了一个已有的VZUbuntu虚拟机然后尝试使用重装脚本来转换为Windows但遇到黑屏问题。通过安装Windows驱动和调整显示器设置作者成功让Windows在虚拟机中运行且发现VZ在性能上优于HVF。文章最后提到虽然在macOS 12中使用VZ安装Linux存在一些挑战如不支持UEFI和需要手动准备内核但作者仍然成功进行了实验认为苹果的虚拟化技术潜力未被充分利用。作者也指出这些非官方方法可能随着macOS更新而变得不稳定。",
"/2025/04/04/search.html": "这篇文章记录了作者对博客搜索功能进行优化的过程。起因是作者在搜索使用同样模板的博客时发现许多结果是简历或作品集而非博客。作者通过搜索关键词和标签受到其他博主的启发决定改进搜索功能使其能够筛选出带有特定标签的文章并添加了高亮关键词的标记。此外作者还实现了随机跳转文章、文章标题锚链接以及链接到原始Markdown文件等功能强调了博客代码和网站功能对于展示个人技术的重要性。整个过程中作者在借鉴他人经验的同时也表达了对自我创新和个性化网站设计的重视。",
"/2025/04/08/feed.html": "这篇文章讲述了作者如何利用AI编写JavaScript代码实现一个功能在鼠标悬停在博客链接上时通过RSS/Atom源预览链接的最新文章且只显示标题和时间。过程中提到了跨域问题的解决方案CORS代理以及AI在编写代码时遇到的挑战如遍历订阅源路径的效率问题和XSS安全风险最终作者通过DeepSeek检查和修改确保了代码的可靠性。作者对AI自动编写代码的体验表示既方便又有趣但也强调了人工监督在确保代码质量上的必要性。",
"/2025/04/22/ai-limit.html": "这篇文章主要探讨了作者对人工智能尤其是LLMLarge Language Models在文本生成、超长文本分析和文章理解能力的观察。作者通过实例如GPT-4的画图能力、AI在长文本处理上的局限、以及尝试使用AI进行文章分析和摘要的失败揭示了LLM在处理大量信息和复杂逻辑代码时的上下文长度限制。作者认为这限制了AI的全局理解和替代人类的能力但也提出了如果AI能自我调整权重以处理更长的上下文可能有助于突破这一局限。此外作者还分享了自己博客的内容和技术探索展现了独立思考和对技术伦理的关注。",
"/2025/05/07/mac-studio.html": "本文作者分享了Mac Studio M3 Ultra的使用体验。主要集中在以下几个方面\n\n1. **远程使用体验:** macOS远程配置简单支持高性能屏幕共享模式但对网络要求高。\n2. **LLM体验** 尝试了Xinference和LM Studio框架前者存在问题后者性能较好但遇到DeepSeek模型输出问题。测试了Qwen3模型在部分任务上表现优于DeepSeek-R1。\n3. **模型对比:** Qwen3在生成流程图方面不如DeepSeek-R1。\n4. **UTM虚拟机测试** 在Mac Studio上使用VZ框架安装Windows失败Asahi Linux不支持M3 Ultra测试也未成功。\n5. **总结:** Mac Studio M3 Ultra的512GB内存性能强大本地跑LLM速度快但作者并无其他高性能需求觉得有些浪费。",
"/2025/06/02/optimize.html": "这篇文章记录了作者对博客进行的一系列修改和优化过程。主要改进包括1接受AI建议优化博客搜索功能和链接样式解决鼠标悬停问题2调整字号、行高和布局改为百分比布局以提高大屏幕体验3增加分段和首行缩进改善阅读性4处理Gitalk评论授权问题提供跳转到GitHub评论的选项5考虑了IE8的兼容性如使用 Respond.js、XDR请求和调整搜索功能6增加了对Atom、RSS和JSONFeed的支持以及网页快讯功能7对IndieWeb的支持如添加个人身份识别和发布内容的微格式标记。作者在优化过程中注重了传统和现代技术的结合以及对不同平台和浏览器兼容性的考虑。",
"/2025/07/01/xslt.html": "这篇文章讲述了作者如何为博客的XML订阅文件添加一个与博客主题一致的XSLT样式以提高整体风格的统一性。作者遇到的问题包括Jekyll引擎的限制、XML格式的规则、命名空间对输出的影响以及如何解决样式问题。通过模仿现有样式、自定义XSLT布局和doctype-system设置作者最终成功地为订阅文件和Sitemap创建了定制的XSLT样式。整个过程不仅提升了博客细节也让作者学习到了关于XML和XSLT的新知识。",
"/2025/07/13/hacked.html": "这篇文章讲述了作者在登录一台闲置服务器时发现被入侵的经历。通过观察服务器负载和进程作者意识到存在恶意软件。作者使用了netstat、lsof等工具进行调查发现了一个名为gs-dbus的木马进程和libprocesshider.so文件这隐藏了其他恶意工具。作者通过查找自启动服务、清理木马、修改密码等方式进行了应对并分析了入侵者使用的工具如Global Socket项目和logclean。作者认为这次入侵虽然造成了损失但也学到了一些知识。"
}

View File

@ -1,17 +0,0 @@
title,link,feed_url,description
花火学园,https://www.sayhanabi.net/,,和谐融洽的ACG交流以及资源聚集地
资源统筹局,https://gkdworld.com/,,统筹保管用户分享的资源
贫困的蚊子,https://mozz.ie/,https://mozz.ie/index.xml,
极客兔兔,https://geektutu.com/,https://geektutu.com/atom.xml,致力于分享有趣的技术实践
维基萌,https://www.wikimoe.com/,https://www.wikimoe.com/rss,萌即是正义一名热爱acg的前端设计师的小站
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"
FKUN,https://blog.fkun.tech/,https://blog.fkun.tech/feed/,
Sinofine,https://sinofine.me/,https://sinofine.me/atom.xml,
花生莲子粥,https://blog.hslzz.cn/,https://blog.hslzz.cn/atom.xml,与世无争,不染于泥
南蛮子懋和,https://www.dao.js.cn/,https://www.dao.js.cn/feed.php,李懋和,俗名李栋梁。书法、国画爱好者,互联网安全与前端建设者。
Vullfin的博客,https://blog.vull.top/,https://blog.vull.top/atom.xml,Vullfin's Home Page
阿涛の小破站,https://emohe.cn/,https://emohe.cn/rss.xml,Docker技术分享
記緒漂流,https://ttio.cc/,https://ttio.cc/feed/,于记忆之川,泛思绪之舟。
陈陈菌博客,https://blog.glumi.cn/,,计算机业余爱好者。
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 致力于分享有趣的技术实践
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/ 一个用来存放我爱好的地方,编程,摄影之类的空间
8 云游君 https://www.yunyoujun.cn/ https://www.yunyoujun.cn/atom.xml 希望能成为一个有趣的人。
9 Kingfish404 https://blog.kingfish404.cn/ https://blog.kingfish404.cn/index.xml Stay curious,stay naive. WUT. Jin Yu's Blog
10 FKUN https://blog.fkun.tech/ https://blog.fkun.tech/feed/
11 Sinofine https://sinofine.me/ https://sinofine.me/atom.xml
12 花生莲子粥 https://blog.hslzz.cn/ https://blog.hslzz.cn/atom.xml 与世无争,不染于泥
13 南蛮子懋和 https://www.dao.js.cn/ https://www.dao.js.cn/feed.php 李懋和,俗名李栋梁。书法、国画爱好者,互联网安全与前端建设者。
14 Vullfin的博客 https://blog.vull.top/ https://blog.vull.top/atom.xml Vullfin's Home Page
15 阿涛の小破站 https://emohe.cn/ https://emohe.cn/rss.xml Docker技术分享
16 記緒漂流 https://ttio.cc/ https://ttio.cc/feed/ 于记忆之川,泛思绪之舟。
17 陈陈菌博客 https://blog.glumi.cn/ 计算机业余爱好者。

View File

@ -1,53 +0,0 @@
proxies:
- https://blog.mayx.workers.dev/
- https://mayx.deno.dev/
- https://yuki.gear.host/
- https://mayx.serv00.net/
mirrors:
- https://mayx.gitlab.io/
- https://mayx.pages.dev/
- https://mayx.eu.org/
- https://mayx.envs.sh/
- https://mayx.envs.net/
- https://mayx.frama.io/
- https://mayx.pages.gay/
- https://mayx.vercel.app/
- https://mayx.netlify.app/
- https://mayx.codeberg.page/
- https://mayx.4everland.app/
- https://mayx.pages.debian.net/
- https://mayx.dappling.network/
- https://mayx-blog.statichost.eu/
gits:
- https://github.com/Mabbs/mabbs.github.io
- https://gitlab.com/mayx/mayx.gitlab.io
- https://framagit.org/mayx/mayx.frama.io
- https://salsa.debian.org/mayx/mayx.pages.debian.net
- https://codeberg.org/mayx/blog
- https://git.gay/mayx/mayx
- https://gitea.com/mayx/mayx
- https://gitgud.io/mayx/mayx
- https://git.sr.ht/~mayx/mayx
- https://git.envs.net/Mayx/mayx
- https://tildegit.org/Mayx/mayx
- https://git.launchpad.net/mayx
- https://git.tilde.town/mayx/blog
- https://cgit.tilde.town/~mayx/blog
- https://git.disroot.org/mayx/mayx
- https://gitee.com/mabbs/mabbs
- https://git.i2phides.me/mayx/blog
- https://sourceforge.net/projects/mayx/
static:
- https://mayx.nekoweb.org/
- https://mayx.neocities.org/
- https://mayx.srht.site/
- https://mayx.pages.casa/
others:
- https://unmayx.blogspot.com/
- https://unmayx.blog.fc2blog.us/
- https://unmayx.wordpress.com/
- https://mayx.code.blog/
- https://mayx.home.blog/
- https://unmayx.medium.com/
- https://mayx.cnblogs.com/
- https://mayx.xlog.app/

View File

@ -1,174 +0,0 @@
{% capture headingsWorkspace %}
{% comment %}
Copyright (c) 2018 Vladimir "allejo" Jimenez
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
{% endcomment %}
{% comment %}
Version 1.0.13
https://github.com/allejo/jekyll-anchor-headings
"Be the pull request you wish to see in the world." ~Ben Balter
Usage:
{% include anchor_headings.html html=content anchorBody="#" %}
Parameters:
* html (string) - the HTML of compiled markdown generated by kramdown in Jekyll
Optional Parameters:
* beforeHeading (bool) : false - Set to true if the anchor should be placed _before_ the heading's content
* headerAttrs (string) : '' - Any custom HTML attributes that will be added to the heading tag; you may NOT use `id`;
the `%heading%` and `%html_id%` placeholders are available
* anchorAttrs (string) : '' - Any custom HTML attributes that will be added to the `<a>` tag; you may NOT use `href`, `class` or `title`;
the `%heading%` and `%html_id%` placeholders are available
* anchorBody (string) : '' - The content that will be placed inside the anchor; the `%heading%` placeholder is available
* anchorClass (string) : '' - The class(es) that will be used for each anchor. Separate multiple classes with a space
* anchorTitle (string) : '' - The `title` attribute that will be used for anchors
* h_min (int) : 1 - The minimum header level to build an anchor for; any header lower than this value will be ignored
* h_max (int) : 6 - The maximum header level to build an anchor for; any header greater than this value will be ignored
* bodyPrefix (string) : '' - Anything that should be inserted inside of the heading tag _before_ its anchor and content
* bodySuffix (string) : '' - Anything that should be inserted inside of the heading tag _after_ its anchor and content
* generateId (true) : false - Set to true if a header without id should generate an id to use.
Output:
The original HTML with the addition of anchors inside of all of the h1-h6 headings.
{% endcomment %}
{% assign minHeader = include.h_min | default: 1 %}
{% assign maxHeader = include.h_max | default: 6 %}
{% assign beforeHeading = include.beforeHeading %}
{% assign headerAttrs = include.headerAttrs %}
{% assign nodes = include.html | split: '<h' %}
{% capture edited_headings %}{% endcapture %}
{% for _node in nodes %}
{% capture node %}{{ _node | strip }}{% endcapture %}
{% if node == "" %}
{% continue %}
{% endif %}
{% assign nextChar = node | replace: '"', '' | strip | slice: 0, 1 %}
{% assign headerLevel = nextChar | times: 1 %}
<!-- If the level is cast to 0, it means it's not a h1-h6 tag, so let's see if we need to fix it -->
{% if headerLevel == 0 %}
<!-- Split up the node based on closing angle brackets and get the first one. -->
{% assign firstChunk = node | split: '>' | first %}
<!-- If the first chunk does NOT contain a '<', that means we've broken another HTML tag that starts with 'h' -->
{% unless firstChunk contains '<' %}
{% capture node %}<h{{ node }}{% endcapture %}
{% endunless %}
{% capture edited_headings %}{{ edited_headings }}{{ node }}{% endcapture %}
{% continue %}
{% endif %}
{% capture _closingTag %}</h{{ headerLevel }}>{% endcapture %}
{% assign _workspace = node | split: _closingTag %}
{% capture _hAttrToStrip %}{{ _workspace[0] | split: '>' | first }}>{% endcapture %}
{% assign header = _workspace[0] | replace: _hAttrToStrip, '' %}
{% assign escaped_header = header | strip_html | strip %}
{% assign _classWorkspace = _workspace[0] | split: 'class="' %}
{% assign _classWorkspace = _classWorkspace[1] | split: '"' %}
{% assign _html_class = _classWorkspace[0] %}
{% if _html_class contains "no_anchor" %}
{% assign skip_anchor = true %}
{% else %}
{% assign skip_anchor = false %}
{% endif %}
{% assign _idWorkspace = _workspace[0] | split: 'id="' %}
{% if _idWorkspace[1] %}
{% assign _idWorkspace = _idWorkspace[1] | split: '"' %}
{% assign html_id = _idWorkspace[0] %}
{% assign h_attrs = headerAttrs %}
{% elsif include.generateId %}
<!-- If the header did not have an id we create one. -->
{% assign html_id = escaped_header | slugify %}
{% if html_id == "" %}
{% assign html_id = false %}
{% endif %}
<!-- Append the generated id to other potential header attributes. -->
{% capture h_attrs %}{{ headerAttrs }} id="%html_id%"{% endcapture %}
{% endif %}
<!-- Build the anchor to inject for our heading -->
{% capture anchor %}{% endcapture %}
{% if skip_anchor == false and html_id and headerLevel >= minHeader and headerLevel <= maxHeader %}
{% if h_attrs %}
{% capture _hAttrToStrip %}{{ _hAttrToStrip | split: '>' | first }} {{ h_attrs | strip | replace: '%heading%', escaped_header | replace: '%html_id%', html_id }}>{% endcapture %}
{% endif %}
{% capture anchor %}href="#{{ html_id }}"{% endcapture %}
{% if include.anchorClass %}
{% capture anchor %}{{ anchor }} class="{{ include.anchorClass }}"{% endcapture %}
{% endif %}
{% if include.anchorTitle %}
{% capture anchor %}{{ anchor }} title="{{ include.anchorTitle | replace: '%heading%', escaped_header }}"{% endcapture %}
{% endif %}
{% if include.anchorAttrs %}
{% capture anchor %}{{ anchor }} {{ include.anchorAttrs | replace: '%heading%', escaped_header | replace: '%html_id%', html_id }}{% endcapture %}
{% endif %}
{% capture anchor %}<a {{ anchor }}>{{ include.anchorBody | replace: '%heading%', escaped_header | default: '' }}</a>{% endcapture %}
<!-- In order to prevent adding extra space after a heading, we'll let the 'anchor' value contain it -->
{% if beforeHeading %}
{% capture anchor %}{{ anchor }} {% endcapture %}
{% else %}
{% capture anchor %} {{ anchor }}{% endcapture %}
{% endif %}
{% endif %}
{% capture new_heading %}
<h{{ _hAttrToStrip }}
{{ include.bodyPrefix }}
{% if beforeHeading %}
{{ anchor }}{{ header }}
{% else %}
{{ header }}{{ anchor }}
{% endif %}
{{ include.bodySuffix }}
</h{{ headerLevel }}>
{% endcapture %}
<!--
If we have content after the `</hX>` tag, then we'll want to append that here so we don't lost any content.
-->
{% assign chunkCount = _workspace | size %}
{% if chunkCount > 1 %}
{% capture new_heading %}{{ new_heading }}{{ _workspace | last }}{% endcapture %}
{% endif %}
{% capture edited_headings %}{{ edited_headings }}{{ new_heading }}{% endcapture %}
{% endfor %}
{% endcapture %}{% assign headingsWorkspace = '' %}{{ edited_headings | strip }}

View File

@ -1,33 +0,0 @@
<!--[if !IE]> -->
<div id="landlord" style="left:5px;bottom:0px;">
<div class="message" style="opacity:0"></div>
<canvas id="live2d" width="500" height="560" class="live2d"></canvas>
<div class="live_talk_input_body">
<form id="live_talk_input_form">
<div class="live_talk_input_name_body" {% unless page.layout == "post" %}style="display:none;"{% endunless %}>
<input type="checkbox" id="load_this" />
<input type="hidden" id="post_id" value="{{ page.url }}" />
<label for="load_this">
<span style="font-size: 11px; color: #fff;">&#160;想问这篇文章</span>
</label>
</div>
<div class="live_talk_input_text_body">
<input name="talk" type="text" class="live_talk_talk white_input" id="AIuserText" autocomplete="off" placeholder="要和我聊什么呀?" />
<button type="submit" class="live_talk_send_btn" id="talk_send">发送</button>
</div>
</form>
</div>
<input name="live_talk" id="live_talk" value="1" type="hidden" />
<div class="live_ico_box" style="display:none;">
<div class="live_ico_item type_info" id="showInfoBtn"></div>
<div class="live_ico_item type_talk" id="showTalkBtn"></div>
<div class="live_ico_item type_music" id="musicButton"></div>
<div class="live_ico_item type_youdu" id="youduButton"></div>
<div class="live_ico_item type_quit" id="hideButton"></div>
<input name="live_statu_val" id="live_statu_val" value="0" type="hidden" />
<audio src="" style="display:none;" id="live2d_bgm" data-bgm="0" preload="none"></audio>
<input id="duType" value="douqilai" type="hidden" />
</div>
</div>
<div id="open_live2d">召唤伊斯特瓦尔</div>
<!-- <![endif]-->

View File

@ -1,30 +1,6 @@
{% capture tocWorkspace %} {% capture tocWorkspace %}
{% comment %} {% comment %}
Copyright (c) 2017 Vladimir "allejo" Jimenez Version 1.0.7
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
{% endcomment %}
{% comment %}
Version 1.2.1
https://github.com/allejo/jekyll-toc https://github.com/allejo/jekyll-toc
"...like all things liquid - where there's a will, and ~36 hours to spare, there's usually a/some way" ~jaybe "...like all things liquid - where there's a will, and ~36 hours to spare, there's usually a/some way" ~jaybe
@ -43,147 +19,77 @@
* h_max (int) : 6 - the maximum TOC header level to use; any header greater than this value will be ignored * h_max (int) : 6 - the maximum TOC header level to use; any header greater than this value will be ignored
* ordered (bool) : false - when set to true, an ordered list will be outputted instead of an unordered list * ordered (bool) : false - when set to true, an ordered list will be outputted instead of an unordered list
* item_class (string) : '' - add custom class(es) for each list item; has support for '%level%' placeholder, which is the current heading level * item_class (string) : '' - add custom class(es) for each list item; has support for '%level%' placeholder, which is the current heading level
* submenu_class (string) : '' - add custom class(es) for each child group of headings; has support for '%level%' placeholder which is the current "submenu" heading level * baseurl (string) : '' - add a base url to the TOC links for when your TOC is on another page than the actual content
* base_url (string) : '' - add a base url to the TOC links for when your TOC is on another page than the actual content
* anchor_class (string) : '' - add custom class(es) for each anchor element * anchor_class (string) : '' - add custom class(es) for each anchor element
* skip_no_ids (bool) : false - skip headers that do not have an `id` attribute
* flat_toc (bool) : false - when set to true, the TOC will be a single level list
Output: Output:
An ordered or unordered list representing the table of contents of a markdown block. This snippet will only An ordered or unordered list representing the table of contents of a markdown block. This snippet will only
generate the table of contents and will NOT output the markdown given to it generate the table of contents and will NOT output the markdown given to it
{% endcomment %} {% endcomment %}
{% capture newline %} {% capture my_toc %}{% endcapture %}
{% endcapture %}
{% assign newline = newline | rstrip %} <!-- Remove the extra spacing but preserve the newline -->
{% capture deprecation_warnings %}{% endcapture %}
{% if include.baseurl %}
{% capture deprecation_warnings %}{{ deprecation_warnings }}<!-- jekyll-toc :: "baseurl" has been deprecated, use "base_url" instead -->{{ newline }}{% endcapture %}
{% endif %}
{% if include.skipNoIDs %}
{% capture deprecation_warnings %}{{ deprecation_warnings }}<!-- jekyll-toc :: "skipNoIDs" has been deprecated, use "skip_no_ids" instead -->{{ newline }}{% endcapture %}
{% endif %}
{% capture jekyll_toc %}{% endcapture %}
{% assign orderedList = include.ordered | default: false %} {% assign orderedList = include.ordered | default: false %}
{% assign flatToc = include.flat_toc | default: false %}
{% assign baseURL = include.base_url | default: include.baseurl | default: '' %}
{% assign skipNoIDs = include.skip_no_ids | default: include.skipNoIDs | default: false %}
{% assign minHeader = include.h_min | default: 1 %} {% assign minHeader = include.h_min | default: 1 %}
{% assign maxHeader = include.h_max | default: 6 %} {% assign maxHeader = include.h_max | default: 6 %}
{% assign nodes = include.html | strip | split: '<h' %} {% assign nodes = include.html | split: '<h' %}
{% assign firstHeader = true %} {% assign firstHeader = true %}
{% assign currLevel = 0 %}
{% assign lastLevel = 0 %}
{% capture listModifier %}{% if orderedList %}ol{% else %}ul{% endif %}{% endcapture %} {% capture listModifier %}{% if orderedList %}1.{% else %}-{% endif %}{% endcapture %}
{% for node in nodes %} {% for node in nodes %}
{% if node == "" %} {% if node == "" %}
{% continue %} {% continue %}
{% endif %} {% endif %}
{% assign currLevel = node | replace: '"', '' | slice: 0, 1 | times: 1 %} {% assign headerLevel = node | replace: '"', '' | slice: 0, 1 | times: 1 %}
{% if currLevel < minHeader or currLevel > maxHeader %} {% if headerLevel < minHeader or headerLevel > maxHeader %}
{% continue %}
{% endif %}
{% assign _workspace = node | split: '</h' %}
{% assign _idWorkspace = _workspace[0] | split: 'id="' %}
{% assign _idWorkspace = _idWorkspace[1] | split: '"' %}
{% assign htmlID = _idWorkspace[0] %}
{% assign _classWorkspace = _workspace[0] | split: 'class="' %}
{% assign _classWorkspace = _classWorkspace[1] | split: '"' %}
{% assign htmlClass = _classWorkspace[0] %}
{% if htmlClass contains "no_toc" %}
{% continue %} {% continue %}
{% endif %} {% endif %}
{% if firstHeader %} {% if firstHeader %}
{% assign minHeader = currLevel %} {% assign firstHeader = false %}
{% assign minHeader = headerLevel %}
{% endif %}
{% assign indentAmount = headerLevel | minus: minHeader | add: 1 %}
{% assign _workspace = node | split: '</h' %}
{% assign _idWorkspace = _workspace[0] | split: 'id="' %}
{% assign _idWorkspace = _idWorkspace[1] | split: '"' %}
{% assign html_id = _idWorkspace[0] %}
{% assign _classWorkspace = _workspace[0] | split: 'class="' %}
{% assign _classWorkspace = _classWorkspace[1] | split: '"' %}
{% assign html_class = _classWorkspace[0] %}
{% if html_class contains "no_toc" %}
{% continue %}
{% endif %} {% endif %}
{% capture _hAttrToStrip %}{{ _workspace[0] | split: '>' | first }}>{% endcapture %} {% capture _hAttrToStrip %}{{ _workspace[0] | split: '>' | first }}>{% endcapture %}
{% assign header = _workspace[0] | replace: _hAttrToStrip, '' %} {% assign header = _workspace[0] | replace: _hAttrToStrip, '' %}
{% if include.item_class and include.item_class != blank %} {% assign space = '' %}
{% capture listItemClass %} class="{{ include.item_class | replace: '%level%', currLevel | split: '.' | join: ' ' }}"{% endcapture %} {% for i in (1..indentAmount) %}
{% endif %} {% assign space = space | prepend: ' ' %}
{% if include.submenu_class and include.submenu_class != blank %}
{% assign subMenuLevel = currLevel | minus: 1 %}
{% capture subMenuClass %} class="{{ include.submenu_class | replace: '%level%', subMenuLevel | split: '.' | join: ' ' }}"{% endcapture %}
{% endif %}
{% capture anchorBody %}{% if include.sanitize %}{{ header | strip_html }}{% else %}{{ header }}{% endif %}{% endcapture %}
{% if htmlID %}
{% capture anchorAttributes %} href="{% if baseURL %}{{ baseURL }}{% endif %}#{{ htmlID }}"{% endcapture %}
{% if include.anchor_class %}
{% capture anchorAttributes %}{{ anchorAttributes }} class="{{ include.anchor_class | split: '.' | join: ' ' }}"{% endcapture %}
{% endif %}
{% capture listItem %}<a{{ anchorAttributes }}>{{ anchorBody }}</a>{% endcapture %}
{% elsif skipNoIDs == true %}
{% continue %}
{% else %}
{% capture listItem %}{{ anchorBody }}{% endcapture %}
{% endif %}
{% if currLevel > lastLevel and flatToc == false %}
{% capture jekyll_toc %}{{ jekyll_toc }}<{{ listModifier }}{{ subMenuClass }}>{% endcapture %}
{% elsif currLevel < lastLevel and flatToc == false %}
{% assign repeatCount = lastLevel | minus: currLevel %}
{% for i in (1..repeatCount) %}
{% capture jekyll_toc %}{{ jekyll_toc }}</li></{{ listModifier }}>{% endcapture %}
{% endfor %} {% endfor %}
{% capture jekyll_toc %}{{ jekyll_toc }}</li>{% endcapture %} {% unless include.item_class == blank %}
{% else %} {% capture listItemClass %}{:.{{ include.item_class | replace: '%level%', headerLevel }}}{% endcapture %}
{% capture jekyll_toc %}{{ jekyll_toc }}</li>{% endcapture %} {% endunless %}
{% endif %}
{% capture jekyll_toc %}{{ jekyll_toc }}<li{{ listItemClass }}>{{ listItem }}{% endcapture %} {% capture my_toc %}{{ my_toc }}
{{ space }}{{ listModifier }} {{ listItemClass }} [{% if include.sanitize %}{{ header | strip_html }}{% else %}{{ header }}{% endif %}]({% if include.baseurl %}{{ include.baseurl }}{% endif %}#{{ html_id }}){% if include.anchor_class %}{:.{{ include.anchor_class }}}{% endif %}{% endcapture %}
{% assign lastLevel = currLevel %}
{% assign firstHeader = false %}
{% endfor %} {% endfor %}
{% if flatToc == true %} {% if include.class %}
{% assign repeatCount = 1 %} {% capture my_toc %}{:.{{ include.class }}}
{% else %} {{ my_toc | lstrip }}{% endcapture %}
{% assign repeatCount = minHeader | minus: 1 %}
{% assign repeatCount = lastLevel | minus: repeatCount %}
{% endif %} {% endif %}
{% for i in (1..repeatCount) %} {% if include.id %}
{% capture jekyll_toc %}{{ jekyll_toc }}</li></{{ listModifier }}>{% endcapture %} {% capture my_toc %}{: #{{ include.id }}}
{% endfor %} {{ my_toc | lstrip }}{% endcapture %}
{% if jekyll_toc != '' %}
{% assign rootAttributes = '' %}
{% if include.class and include.class != blank %}
{% capture rootAttributes %} class="{{ include.class | split: '.' | join: ' ' }}"{% endcapture %}
{% endif %} {% endif %}
{% endcapture %}{% assign tocWorkspace = '' %}{{ my_toc | markdownify | strip }}
{% if include.id and include.id != blank %}
{% capture rootAttributes %}{{ rootAttributes }} id="{{ include.id }}"{% endcapture %}
{% endif %}
{% if rootAttributes %}
{% assign nodes = jekyll_toc | split: '>' %}
{% capture jekyll_toc %}<{{ listModifier }}{{ rootAttributes }}>{{ nodes | shift | join: '>' }}>{% endcapture %}
{% endif %}
{% endif %}
{% endcapture %}{% assign tocWorkspace = '' %}{{ deprecation_warnings }}{{ jekyll_toc -}}

View File

@ -1 +0,0 @@
{% assign count = 0 %}{% for post in site.posts %}{% assign single_count = post.content | strip_html | strip_newlines | remove: " " | size %}{% assign count = count | plus: single_count %}{% endfor %}{{ count }}

View File

@ -1,82 +1,96 @@
--- <!DOCTYPE html>
layout: xslt_container <html>
--- <head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<html lang="{{ site.lang | default: "zh-CN" }}"> {% seo %}
<head> {% feed_meta %}
<meta charset="UTF-8" /> <link rel="stylesheet" href="{{ "/assets/css/style.css?v=" | append: site.github.build_revision | relative_url }}">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
{% seo %}
{% feed_meta %}
<link rel="alternate" type="application/rss+xml" title="{{ site.title }}(RSS)" href="{{ "/rss.xml" | absolute_url }}" />
<link rel="alternate" type="application/json" title="{{ site.title }}(JSON Feed)" href="{{ "/feed.json" | absolute_url }}" />
<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" />
<script src="/js/jquery.min.js"></script>
<!-- <![endif]--> <!-- <![endif]-->
<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="pingback" href="https://webmention.io/mabbs.github.io/xmlrpc" />
<link rel="preconnect" href="https://summary.mayx.eu.org" crossorigin="anonymous" />
<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="me" href="https://github.com/Mabbs" />
<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>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.3/jquery.xdomainrequest.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]--> <![endif]-->
<script>
var lastUpdated = new Date("{{ site.time | date_to_rfc822 }}"); {% if site.google_analytics %}
var BlogAPI = "https://summary.mayx.eu.org"; <!-- Global site tag (gtag.js) - Google Analytics -->
</script> <script async src="https://www.googletagmanager.com/gtag/js?id={{ site.google_analytics }}"></script>
<script src="/assets/js/main.js"></script> <script>
<!--[if !IE]> -->
{% if site.google_analytics %}
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async="async" src="https://www.googletagmanager.com/gtag/js?id={{ site.google_analytics }}"></script>
<script>
window.dataLayer = window.dataLayer || []; window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);} function gtag(){dataLayer.push(arguments);}
gtag('js', new Date()); gtag('js', new Date());
gtag('config', '{{ site.google_analytics }}');
</script>
{% endif %}
<script src="/assets/js/instant.page.js" type="module"></script>
<!-- <![endif]-->
</head>
<body> gtag('config', '{{ site.google_analytics }}');
<!--[if !IE]> --><noscript><marquee style="top: -15px; position: relative;"><small>发现当前浏览器没有启用JavaScript这不影响你的浏览但可能会有一些功能无法使用……</small></marquee></noscript><!-- <![endif]--> var lastUpdated = new Date("{{ site.time | date: "%FT%T%z" }}");
<!--[if IE]><marquee style="top: -15px; position: relative;"><small>发现当前浏览器为Internet Explorer这不影响你的浏览但可能会有一些功能无法使用……</small></marquee><![endif]--> Date.prototype.format = function(fmt) {
var o = {
"M+" : this.getMonth()+1, //月份
"d+" : this.getDate(), //日
"h+" : this.getHours(), //小时
"m+" : this.getMinutes(), //分
"s+" : this.getSeconds(), //秒
"q+" : Math.floor((this.getMonth()+3)/3), //季度
"S" : this.getMilliseconds() //毫秒
};
if(/(y+)/.test(fmt)) {
fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
}
for(var k in o) {
if(new RegExp("("+ k +")").test(fmt)){
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
}
}
return fmt;
}
</script>
{% endif %}
<style>
.backToTop {
display: none;
width: 18px;
line-height: 1.2;
padding: 5px 0;
background-color: #000;
color: #fff;
font-size: 12px;
text-align: center;
position: fixed;
_position: absolute;
right: 10px;
bottom: 100px;
_bottom: "auto";
cursor: pointer;
opacity: .6;
filter: Alpha(opacity=60);
}
</style>
</head>
<body>
<div class="wrapper"> <div class="wrapper">
<header class="h-card"> <header>
<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 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 | relative_url}}" alt="Logo" />
{% endif %} {% endif %}
<p class="p-note">{{ site.description | default: site.github.project_tagline }}</p> <p>{{ site.description | default: site.github.project_tagline }}</p>
<form action="/search.html"> <p><form action="/search.html"><input type="text" name="keyword" id="search-input-all" placeholder="Search blog posts.."> <input type="submit"></form></p>
<input type="text" name="keyword" id="search-input-all" placeholder="Search blog posts.." />&#160;<input type="submit" value="搜索" />
</form>
<br />
{% if site.github.is_project_page %} {% if site.github.is_project_page %}
<p class="view"><a class="u-url" href="{{ site.github.repository_url }}">View the Project on GitHub <p class="view"><a href="{{ site.github.repository_url }}">View the Project on GitHub <small>{{ site.github.repository_nwo }}</small></a></p>
<small>{{ site.github.repository_nwo }}</small></a></p>
{% endif %} {% endif %}
{% if site.github.is_user_page %} {% if site.github.is_user_page %}
<p class="view"><a class="u-url" href="{{ site.github.owner_url }}" rel="me">View My GitHub Profile</a></p> <p class="view"><a href="{{ site.github.owner_url }}">View My GitHub Profile</a></p>
{% endif %} {% endif %}
<p class="view"><a class="u-url" href="/Mabbs/">About me</a></p> <p class="view"><a href="{{ "/Mabbs/" | relative_url }}">About Me</a></p>
<ul class="downloads"> <ul class="downloads">
{% if site.github %} {% if site.github %}
@ -84,27 +98,56 @@ layout: xslt_container
<li><a href="{{ site.github.tar_url }}">Download <strong>TAR Ball</strong></a></li> <li><a href="{{ site.github.tar_url }}">Download <strong>TAR Ball</strong></a></li>
<li><a href="{{ site.github.repository_url }}">View On <strong>GitHub</strong></a></li> <li><a href="{{ site.github.repository_url }}">View On <strong>GitHub</strong></a></li>
{% else %} {% else %}
<li style="width: 270px; border-right: none;"><a href="/MayxBlog.tgz">Download <strong>TGZ File</strong></a></li> <li style="width: 270px;border-right:0px;"><a href="/MayxBlog.tgz">Download <strong>TGZ File</strong></a></li>
{% endif %} {% endif %}
</ul> </ul>
</header> </header>
<section{% unless page.layout == "default" %} class="h-entry"{% endunless %}> <section>
{{ content }} {{ content }}
</section> </section>
{% include live2d.html %} <!--[if !IE]> -->
<div id="landlord" style="left:5px;bottom:0px;">
<div class="message" style="opacity:0"></div>
<canvas id="live2d" width="500" height="560" class="live2d"></canvas>
<div class="live_talk_input_body">
<div class="live_talk_input_name_body" style="display:none;">
<input name="name" type="hidden" class="live_talk_name white_input" id="AIuserName" value="Mayx_Blog_Talk" />
</div>
<div class="live_talk_input_text_body">
<input name="talk" type="text" class="live_talk_talk white_input" id="AIuserText" autocomplete="off" placeholder="要和我聊什么呀?"/>
<button type="button" class="live_talk_send_btn" id="talk_send">发送</button>
</div>
</div>
<input name="live_talk" id="live_talk" value="1" type="hidden" />
<div class="live_ico_box" style="display:none;">
<div class="live_ico_item type_info" id="showInfoBtn"></div>
<div class="live_ico_item type_talk" id="showTalkBtn"></div>
<div class="live_ico_item type_music" id="musicButton"></div>
<div class="live_ico_item type_youdu" id="youduButton"></div>
<div class="live_ico_item type_quit" id="hideButton"></div>
<input name="live_statu_val" id="live_statu_val" value="0" type="hidden" />
<audio src="" style="display:none;" id="live2d_bgm" data-bgm="0" preload="none"></audio>
<input id="duType" value="douqilai" type="hidden">
</div>
</div>
<div id="open_live2d">召唤伊斯特瓦尔</div>
<!-- <![endif]-->
<footer> <footer>
<p> <p><small>Made with ❤ by Mayx<br />Last updated at <script>document.write(lastUpdated.format("yyyy-MM-dd hh:mm:ss"));</script><br /> 总字数:
<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> {% assign count = 0 %}{% for post in site.posts %}{% assign single_count = post.content | strip_html | strip_newlines | remove: " " | size %}
</p> {% assign count = count | plus: single_count %}{% endfor %}{% if count > 10000 %}{{ count | divided_by: 10000 }} 万 {{ count | modulo: 10000 }}
{% else %}{{ count }}{% endif %} - 文章数:{% for post in site.posts %}{% assign co = co | plus: 1 %}{% endfor %}{{ co }} - <a href="{{ "/atom.xml" | relative_url }}" >Atom</a> - <a href="{{ "/README.html" | relative_url }}" >About</a></small></p>
</footer> </footer>
</div> </div>
<script src="{{ "/assets/js/scale.fix.js" | relative_url }}"></script> <script src="{{ "/assets/js/scale.fix.js" | relative_url }}"></script>
<!--[if !IE]> -->
<script src="/assets/js/main_new.js"></script> <script src="/js/main.js"></script>
<script src="/Live2dHistoire/live2d/js/live2d.js"></script> <!--[if !IE]> -->
<script src="/Live2dHistoire/live2d/js/message.js"></script> <script src="/Live2dHistoire/live2d/js/live2d.js"></script>
<!-- <![endif]--> <script src="/Live2dHistoire/live2d/js/message.js"></script>
</body>
<!-- <![endif]-->
</body>
</html> </html>

View File

@ -2,7 +2,7 @@
layout: post layout: post
--- ---
<script src="/assets/js/aes.js"></script> <script src="/js/aes.js"></script>
<script> <script>
function getByteLen(val) { function getByteLen(val) {
var len = 0; var len = 0;

View File

@ -2,176 +2,89 @@
layout: default layout: default
--- ---
<small><time class="date dt-published" datetime="{{ page.date | date_to_xmlschema }}">{{ page.date | date: "%-d %B %Y" }}</time> - 字数统计:{% if page.layout == "encrypt" %}God Knows {% else %}{{ page.content | strip_html | strip_newlines | remove: " " | size }} - 阅读大约需要{{ page.content | strip_html | strip_newlines | remove: "" | size | divided_by: 350 | plus: 1 }}分钟{% endif %} - Hits: <span id="{{ page.url }}" class="visitors">Loading...</span></small> <small>{{ page.date | date: "%-d %B %Y" }} - 字数统计:{% if page.layout == "encrypt" %}God Knows {% else %}{{ page.content | strip_html | strip_newlines | remove: " " | size }} - 阅读大约需要{{ page.content | strip_html | strip_newlines | remove: " " | size | divided_by: 350 | plus: 1 }}分钟{% endif %} - Hits: <span id="{{ page.url }}" class="visitors" >Loading...</span>
<h1 class="p-name">{{ page.title }}</h1> </small>
<h1>{{ page.title }}</h1>
<p class="view">by <a class="p-author h-card" href="//github.com/{{ page.author | default: "Mabbs" }}">{{ page.author | default: site.author }}</a></p> <p class="view">by <a href="//github.com/{{ page.author | default: "Mabbs" }}">{{ page.author | default: site.author }}</a></p>
<div id="outdate" style="display:none;"> <div id="outdate" style="display:none;">
<hr /><p> <hr />
这是一篇创建于 <span id="outime"></span> 天前的文章,其中的信息可能已经有所发展或是发生改变。 这是一篇创建于 <span id="outime"></span> 天前的文章,其中的信息可能已经有所发展或是发生改变。
</p> <br /><br />
</div> </div>
<script> <script>
daysold = Math.floor((new Date().getTime() - new Date("{{ page.date | date_to_rfc822 }}").getTime()) / (24 * 60 * 60 * 1000)); BirthDay = new Date("{{ page.date | date: "%m/%d/%Y" }} 00:00:00");
if (daysold > 90) { today = new Date();
timeold = (today.getTime() - BirthDay.getTime());
secondsold = Math.floor(timeold / 1000);
e_daysold = timeold / (24 * 60 * 60 * 1000);
daysold = Math.floor(e_daysold);
if (daysold > 90) {
document.getElementById("outdate").style.display = "block"; document.getElementById("outdate").style.display = "block";
document.getElementById("outime").innerHTML = daysold; document.getElementById("outime").innerHTML = daysold;
} }
</script> </script>
<hr /> <hr />
{% if page.layout != "encrypt" %}
<b>AI摘要</b>
<p id="ai-output">{% assign ai_cache = site.data.ai-cache[page.url] %}{% if ai_cache %}{{ ai_cache }}{% else %}正在生成中……{% endif %}</p>
{% unless ai_cache %}
<!--[if IE]>
<script>document.getElementById("ai-output").innerHTML="这个文章的AI摘要还没有缓存……IE看不了哦";</script>
<![endif]-->
<!--[if !IE]> -->
<script>
async function sha(str) {
const encoder = new TextEncoder();
const data = encoder.encode(str);
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
const hashArray = Array.from(new Uint8Array(hashBuffer)); // convert buffer to byte array
const hashHex = hashArray
.map((b) => b.toString(16).padStart(2, "0"))
.join(""); // convert bytes to hex string
return hashHex;
}
async function ai_gen(){
var postContent = "文章标题:" + {{ page.title | jsonify }} + ";文章内容:" + {{ page.content | strip_html | strip_newlines | jsonify }};
var postContentSign = await sha(postContent);
var outputContainer = document.getElementById("ai-output");
$.get(BlogAPI + "/is_uploaded?id={{ page.url }}&sign=" + postContentSign, function (data) {
if (data == "yes") {
$.get(BlogAPI + "/get_summary?id={{ page.url }}&sign=" + postContentSign, function (data2) {
outputContainer.textContent = data2;
});
} else {
$.post(BlogAPI + "/upload_blog?id={{ page.url }}", postContent, function (data) {
$.get(BlogAPI + "/get_summary?id={{ page.url }}&sign=" + postContentSign);
const evSource = new EventSource(BlogAPI + "/summary?id={{ page.url }}");
outputContainer.textContent = "";
evSource.onmessage = (event) => {
if (event.data == "[DONE]") {
evSource.close();
return;
} else {
const data = JSON.parse(event.data);
outputContainer.textContent += data.response;
}
}
});
}
});
}
ai_gen();
</script>
<!-- <![endif]-->
{% endunless %}
<hr />
{% endif %}
{% if page.layout != "encrypt" %} {% include toc.html html=content sanitize=true %}
{% include toc.html html=content sanitize=true h_max=3 %}
<hr />
{% 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 %} {{content}}
{% 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 }}"><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>tags: <em>{{ page.tags | join: "</em> - <em>" }}</em></small>
{% endif %} {% endif %}
{% if page.layout != "encrypt" %}
<h4 style="border-bottom: 1px solid #e5e5e5;margin: 2em 0 5px;">推荐文章</h4>
<p id="suggest-container">Loading...</p>
<script>
var suggest = $("#suggest-container");
$.get(BlogAPI + "/suggest?id={{ page.url }}&update=" + lastUpdated.valueOf(), function (data) {
if (data.length) {
getSearchJSON(function (search) {
suggest.empty();
var searchMap = {};
for (var i = 0; i < search.length; i++) {
searchMap[search[i].url] = search[i];
}
var tooltip = $('<div class="content-tooltip"></div>').appendTo('body').hide();
for (var j = 0; j < data.length; j++) {
var item = searchMap[data[j].id];
if (item) {
var link = $('<a href="' + item.url + '">' + item.title + '</a>');
var contentPreview = item.content.substring(0, 100);
if (item.content.length > 100) {
contentPreview += "……";
}
link.hover(
function(e) {
tooltip.text($(this).data('content'))
.css({
top: e.pageY + 10,
left: e.pageX + 10
})
.show();
},
function() {
tooltip.hide();
}
).mousemove(function(e) {
tooltip.css({
top: e.pageY + 10,
left: e.pageX + 10
});
}).data('content', contentPreview);
suggest.append(link);
suggest.append(' - ' + item.date + '<br />');
}
}
});
} else {
suggest.html("暂无推荐文章……");
}
});
</script>
{% endif %}
<br />
<div class="pagination"> <div class="pagination">
{% if page.previous.url %} {% if page.previous.url %}
<span class="prev"> <span class="prev" >
<a href="{{ page.previous.url | relative_url }}"> <a href="{{ site.baseurl }}{{ page.previous.url }}">
上一篇:{{ page.previous.title }} 上一篇:{{ page.previous.title }}
</a> </a>
</span> </span>
{% endif %} {% endif %}
<br /> <br />
{% if page.next.url %} {% if page.next.url %}
<span class="next"> <span class="next" >
<a href="{{ page.next.url | relative_url }}"> <a href="{{ site.baseurl }}{{ page.next.url }}">
下一篇:{{ page.next.title }} 下一篇:{{ page.next.title }}
</a> </a>
</span> </span>
{% endif %} {% endif %}
</div> </div>
<!--[if !IE]> --> <!--[if !IE]> -->
<link rel="stylesheet" href="/assets/css/gitalk.css"> <link rel="stylesheet" href="/css/gitalk.css">
<script src="/assets/js/gitalk.min.js"></script> <script src="/js/gitalk.min.js"></script>
<div id="gitalk-container"></div> <div id="gitalk-container"></div>
<script> <script>
var gitalk = new Gitalk({ if (window.location.host != "mabbs.github.io")
{
var gitalk = new Gitalk({
clientID: '098934a2556425f19d6e',
clientSecret: '0bd44eed8425e5437ce43c4ba9b2791fbc04581d',
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
})
}
else
{
var gitalk = new Gitalk({
clientID: '36557aec4c3cb04f7ac6', clientID: '36557aec4c3cb04f7ac6',
clientSecret: 'ac32993299751cb5a9ba81cf2b171cca65879cdb', clientSecret: 'ac32993299751cb5a9ba81cf2b171cca65879cdb',
repo: 'mabbs.github.io', repo: 'mabbs.github.io',
owner: 'Mabbs', owner: 'Mabbs',
admin: ['Mabbs'], admin: ['Mabbs'],
id: '{{ page.id }}', // Ensure uniqueness and length less than 50 id: '{{ page.id }}', // Ensure uniqueness and length less than 50
distractionFreeMode: false, // Facebook-like distraction free mode 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')
gitalk.render('gitalk-container')
</script> </script>
<!-- <![endif]--> <!-- <![endif]-->

View File

@ -1,17 +0,0 @@
---
layout: default
---
<xsl:choose>
<xsl:when test="xsl:stylesheet">
这是本站XML文件例如订阅源或者<a href="/sitemap.xml">Sitemap</a>)的样式文件,你可以通过以下链接订阅该博客:<br />
<ul>
<li><a href="{{ site.feed.path | relative_url }}">Atom</a></li>
<li><a href="/rss.xml">RSS</a></li>
<li><a href="/feed.json">JSON Feed</a></li>
</ul>
</xsl:when>
<xsl:otherwise>
{{ content }}
</xsl:otherwise>
</xsl:choose>

View File

@ -1,15 +0,0 @@
{% if page.layout == "xslt" %}<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xml" href="/feed.xslt.xml"?>
<xsl:stylesheet
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:template match="/">
{{ content }}
</xsl:template>
</xsl:stylesheet>
{% else %}<!DOCTYPE html>
{{ content }}
{% endif %}

View File

@ -13,7 +13,7 @@ tags: [免费, 邮件, 日报, 心得]
到我的邮箱了…… 到我的邮箱了……
# 代码 # 代码
```php ``` PHP
<?php <?php
function curl_post_https($url,$data){ // 模拟提交数据函数 function curl_post_https($url,$data){ // 模拟提交数据函数
$curl = curl_init(); // 启动一个CURL会话 $curl = curl_init(); // 启动一个CURL会话

View File

@ -22,12 +22,20 @@ tags: [Mayx, 计算机, 学习]
后来加入了一个叫批处理之家的论坛,我叫做[111](http://www.bathome.net/space.php?uid=51236)LOL真不敢相信这个论坛一直到今天还活着在这里我学到了不少关于批处理的事情。 后来加入了一个叫批处理之家的论坛,我叫做[111](http://www.bathome.net/space.php?uid=51236)LOL真不敢相信这个论坛一直到今天还活着在这里我学到了不少关于批处理的事情。
因为学批处理是基于某工具箱的,所以用批处理写的程序也是工具箱,就叫做批处理工具。以下是该程序的源代码: 因为学批处理是基于某工具箱的,所以用批处理写的程序也是工具箱,就叫做批处理工具。以下是该程序的源代码:
<details markdown="1"> <script>
<summary markdown="span"> function showcode() {
Show Code $('.showbutton').toggle();
</summary> $('.language-code').toggle();
}
</script>
<style>
.language-code{ display:none; }
.language-shell{ display:none; }
</style>
<button onclick="showcode()" class="showbutton">Show Code</button>
<button onclick="showcode()" class="showbutton" style="display:none;">Hide Code</button>
```bat ```code
@echo off @echo off
color f0 color f0
mode con cols=50 lines=10 mode con cols=50 lines=10
@ -2783,7 +2791,6 @@ if /i '%shy%'=='exit' goto _max
if /i '%shy%'=='ai学习机' goto aixx if /i '%shy%'=='ai学习机' goto aixx
::在这里加入新的命令 ::在这里加入新的命令
``` ```
</details>
**注:因为隐私原因,部分代码稍作修改** **注:因为隐私原因,部分代码稍作修改**
当然,这个程序有不少地方是抄的,而且很烂……(毕竟是小时候写的嘛) 当然,这个程序有不少地方是抄的,而且很烂……(毕竟是小时候写的嘛)
@ -2792,10 +2799,14 @@ if /i '%shy%'=='ai学习机' goto aixx
因为手机Android系统基于Linux所以我开始[学习Linux Shell](http://c.biancheng.net/cpp/shell/)(没错,当时就是在这个网站上学的), 因为手机Android系统基于Linux所以我开始[学习Linux Shell](http://c.biancheng.net/cpp/shell/)(没错,当时就是在这个网站上学的),
以前用批处理学写工具箱的习惯当然也继承到了学写Linux Shell上在Linux上写的工具箱的名字叫做myx代码如下 以前用批处理学写工具箱的习惯当然也继承到了学写Linux Shell上在Linux上写的工具箱的名字叫做myx代码如下
<details markdown="1"> <script>
<summary markdown="span"> function showcode2() {
Show Code $('.showbutton2').toggle();
</summary> $('.language-shell').toggle();
}
</script>
<button onclick="showcode2()" class="showbutton2">Show Code</button>
<button onclick="showcode2()" class="showbutton2" style="display:none;">Hide Code</button>
```shell ```shell
#!/system/bin/sh #!/system/bin/sh
@ -3219,7 +3230,6 @@ sleep 2
esac esac
done done
``` ```
</details>
**注:因为隐私原因,部分代码稍作修改** **注:因为隐私原因,部分代码稍作修改**

View File

@ -22,7 +22,7 @@ tags: [计数器]
{% raw %} Hits: <span id="{{ page.url }}" class="visitors" >Loading...</span>{% endraw %} {% raw %} Hits: <span id="{{ page.url }}" class="visitors" >Loading...</span>{% endraw %}
``` ```
JS代码需要Jquery JS代码需要Jquery
```javascript ```js
var auxiliaryHost = "你的域名"; var auxiliaryHost = "你的域名";
function showHitS(hits){ function showHitS(hits){
$.get(auxiliaryHost+"/counter.php?action=show&id="+hits.id,function(data){ $.get(auxiliaryHost+"/counter.php?action=show&id="+hits.id,function(data){

View File

@ -16,7 +16,7 @@ tags: [学习笔记, Web Crypto Api]
不过我还是发挥了作为辣鸡程序员的特长——Copy&Paste大法最终可算是拼凑出了一个看起来勉强能用的代码…… 不过我还是发挥了作为辣鸡程序员的特长——Copy&Paste大法最终可算是拼凑出了一个看起来勉强能用的代码……
# 辣鸡代码 # 辣鸡代码
```javascript ```js
function getByteLen(val) { function getByteLen(val) {
var len = 0; var len = 0;
for (var i = 0; i < val.length; i++) { for (var i = 0; i < val.length; i++) {

View File

@ -13,7 +13,7 @@ tags: [CloudFlare, Workers]
# 首先给自己搭个反代 # 首先给自己搭个反代
之前我用PHP给自己的博客搭了一个[简单的反代](/2021/01/06/proxy.html)不过我用的那个服务商不太行速度有点慢而且也不是所有的PHP空间都支持伪静态。那既然有CloudFlare Workers那我们就来试试用这个实现吧。 之前我用PHP给自己的博客搭了一个[简单的反代](/2021/01/06/proxy.html)不过我用的那个服务商不太行速度有点慢而且也不是所有的PHP空间都支持伪静态。那既然有CloudFlare Workers那我们就来试试用这个实现吧。
代码如下: 代码如下:
```javascript ```js
addEventListener("fetch", event => { addEventListener("fetch", event => {
let url = new URL(event.request.url); let url = new URL(event.request.url);
url.hostname = "mabbs.github.io"; url.hostname = "mabbs.github.io";

View File

@ -38,7 +38,7 @@ tags: [Github, 封禁, 博客]
> The repository has been deleted per your request. > The repository has been deleted per your request.
> Kindly note further instances that hosts a script that leverages git.io URL shortener to redirect to a malicious site may lead to further action, such as permanent suspension. > Kindly note further instances that hosts a script that leverages git.io URL shortener to redirect to a malicious site may lead to further action, such as permanent suspension.
🌿原来是我3年前写的[让Git.io无限制](/2019/03/23/gitio.html)所提供的服务被人利用做坏事了麻了这Github是真的不长嘴吗提前说一声我又不是不会删而且我的服务被利用上来就先干我是吧这和某政府对付ICP有什么区别。 🌿原来是我3年前写的[让Git.io无限制](/2019/03/23/gitio.html)所提供的服务被人利用做坏事了麻了这Github是真的不长嘴吗提前说一声我又不是不会删而且我的服务被利用上来就先干我是吧这和某政府对付ISP有什么区别。
# 造成的损失 # 造成的损失
1. 我的博客所有Star、Fork和评论全部消失 1. 我的博客所有Star、Fork和评论全部消失

View File

@ -13,7 +13,7 @@ tags: [Mayx, Github, Gitlab, 分发]
去年我在[研究博客平台的时候](/2021/08/15/blog.html)已经调查过很多放静态站的平台了,所以这次进行分发的时候有了之前的经验,也简单了不少。 去年我在[研究博客平台的时候](/2021/08/15/blog.html)已经调查过很多放静态站的平台了,所以这次进行分发的时候有了之前的经验,也简单了不少。
## 源代码托管平台的选择 ## 源代码托管平台的选择
因为Github不可信于是我自然想到了用Gitlab来存放博客源代码。虽然吧Gitlab曾经也发生过用户数据丢失的问题不过反正目标也是同时放在Github和Gitlab上总不至于两个一起炸吧。其实最开始我的计划是用Github Actions进行同步不过在我进行调查之后我发现Gitlab功能还是挺强大的它支持对一个Git仓库进行自动的推送和拉取也不需要做过多的配置就只需要配置个地址和令牌就可以还是挺方便的。 因为Github不可信于是我自然想到了用Gitlab来存放博客源代码。虽然吧Gitlab曾经也发生过用户数据丢失的问题不过反正目标也是同时放在Github和Gitlab上总不至于两个一起炸吧。其实最开始我的计划是用Github Actions进行同步不过在我进行调查之后我发现Gitlab功能还是挺强大的它支持对一个Git仓库进行自动的推送和拉取也不需要做过多的配置就只需要配置个地址和令牌就可以还是挺方便的。
在我做完Github与Gitlab双向同步之后我发现Gitlab还挺好用的首先Gitlab有个很棒的地方就是没被墙我有时候写文章的时候不挂梯子用Github真的是非常难受目前依我所感受防火长城会对Github先进行一下TCP RST然后刷新一下让你连上连上之后如果长连接断开或者大概5分钟的样子就再阻断然后再RST一波非常的挑战心态。有时候我写了半天然后点预览结果就阻断等半天还是连不上还要挂梯子能预览的时候就得赶紧提交万一提交的时候再阻断要是没备份就炸了。像Gitlab我就从来没遇到过类似的情况这一点还是很不错的大概是因为Gitlab不是社区而且滥用的人也少所以政府也不太关吧。 在我做完Github与Gitlab双向同步之后我发现Gitlab还挺好用的首先Gitlab有个很棒的地方就是没被墙我有时候写文章的时候不挂梯子用Github真的是非常难受目前依我所感受防火长城会对Github先进行一下TCP RST然后刷新一下让你连上连上之后如果长连接断开或者大概5分钟的样子就再阻断然后再RST一波非常的挑战心态。有时候我写了半天然后点预览结果就阻断等半天还是连不上还要挂梯子能预览的时候就得赶紧提交万一提交的时候再阻断要是没备份就炸了。像Gitlab我就从来没遇到过类似的情况这一点还是很不错的大概是因为Gitlab不是社区而且滥用的人也少所以政府也不太关吧。
另外就是Web IDE相比Github的VSCode Web IDEGitlab的要轻量很多了也不容易发生卡的情况而且其实Github的VSCode Web IDE也装不了几个插件功能上也没强到哪去。 另外就是Web IDE相比Github的VSCode Web IDEGitlab的要轻量很多了也不容易发生卡的情况而且其实Github的VSCode Web IDE也装不了几个插件功能上也没强到哪去。
还有就是翻译明明用Github的中国人/华人挺多的官方就是不出中文界面明明文档都有中文了……Gitlab可能是因为作为一个开源产品i18n做的很好虽然吧英文也不影响我使用但是毕竟作为用户体验的一项Gitlab做的确实更好。 还有就是翻译明明用Github的中国人/华人挺多的官方就是不出中文界面明明文档都有中文了……Gitlab可能是因为作为一个开源产品i18n做的很好虽然吧英文也不影响我使用但是毕竟作为用户体验的一项Gitlab做的确实更好。
不过其实我觉得Gitlab也许只是表面没那么出名毕竟不是做社区的大多数公司都用的是自建Gitlab托管代码而且很多时候Github其实是在抄Gitlab的虽然最早是Gitlab抄Github比如Actions抄CI/CD还有最近又出的一堆什么代码扫描和检查Gitlab出现的都更早。不过这说着也跑题了这个文章又不是为了专门夸Gitlab的😂。 不过其实我觉得Gitlab也许只是表面没那么出名毕竟不是做社区的大多数公司都用的是自建Gitlab托管代码而且很多时候Github其实是在抄Gitlab的虽然最早是Gitlab抄Github比如Actions抄CI/CD还有最近又出的一堆什么代码扫描和检查Gitlab出现的都更早。不过这说着也跑题了这个文章又不是为了专门夸Gitlab的😂。

View File

@ -1,27 +0,0 @@
---
layout: post
title: 在Web3上搭建一个自己的博客
tags: [Web3, 博客, 搭建]
---
感觉Web3可以真正的为现在的人们使用了呢。<!--more-->
# 起因
最近偶然看到了一个很有意思的东西,叫[xLog](https://xlog.app/)大概试了试这是在一条叫Crossbell的区块链上使用智能合约操作和存储元数据并把实际数据存到IPFS上的项目。看了一眼还挺有意思就在上面搭了一个自己的[另一个博客](https://mayx.xlog.app/)另外他们还使用这套方案写了一个类似Twitter的社交系统也叫Crossbell非常的人性化可以说是把Web3真正的带给了普通用户。至于怎么搭他们的项目成员写了篇教程[5分钟就能搭好在Web3的博客](https://song.xlog.app/5m-zh)。
不过使用xLog那就不是技术人员的事了而是让一个不怎么懂电脑的人来做的事情了。另外他们宣称数据是“Permanently stored on the blockchain”这一点我不太认同要是说存到了Web3成为了其他人无法修改的数据这倒是没什么问题但是存到IPFS上只要没有被Pin就有可能在节点GC的过程中永远消失。另外我其实对区块链接触不多不清楚能不能完整的同步他们的链如果不能那就是私链了那样元数据也不能永久保留了……所以我只能说这个平台是Web3可以保证不因为审查而404但是不能在时间的长河中保留信息。
# 技术人员的方法
所以作为技术人员我的博客当然直接上IPFS那更好啦因为他们的平台毕竟可定制性不高而且好多组件不知道有没有可替代性比如以太坊JSON-RPC不过他们的服务好像是都开源了只要这个链可以被同步能搭属于自己的RPC那倒是问题不大。
直接用IPFS客户端直接上传是最原生的办法但是我不喜欢在自己电脑上安一堆莫名其妙的软件像我现在写博客都是直接在Github或者Gitlab上写好然后直接用[之前提到的静态页面服务商](/2022/02/14/move.html)一次性部署好。所以我也希望能有一个类似的服务商能帮我把我的博客上传到IPFS上。最后我找到的服务商就是[4EVERLAND](https://www.4everland.org/)。它可以绑定Git仓库并监听变化当有变化的时候就会自动部署到IPFS上并且他们提供免费的Gateway来直接访问在IPFS上的内容非常的不错。不过有个问题就是不知道什么原因它的部署模板里面没有Jekyll的语句然后前端还不能自定义……所以只能靠抓包的方式来修改成自己想要的部署语句。
# 从IPFS直接访问
使用4everland部署完之后直接访问当然也很好但是总感觉和其他服务商差不多谁知道它读取网页到底是从自己服务器上还是IPFS网络上读取呢所以我还想整个更好的方式从IPFS上读取也能证明它确实在IPFS上了。
直接通过Gateway去访问我的博客当然也没问题但是每次部署的时候CID是会变化的那这样我想访问也不方便啊……后来我听说可以把CID用一种叫dnslink的方式记录到DNS里这样就能通过固定又好记的方式来访问。不过那时候我不知道怎么访问dnslink记录的网站……而且每次部署CID会变那部署完我还要更新我的DNS记录啊后来我查了查原来还有一种叫IPNS的东西看了一眼4everland的控制台原来每个网站它也会生成一个固定的IPNS然后用dnslink可以指向IPNS。那如何访问呢IPFS又没有一个IP地址光TXT记录肯定不够的吧后来我才知道原来要用CNAME解析到Gateway才能访问设置之后每次访问Gateway就会自动解析在TXT记录里的dnslink了。现在 <https://ipfs.mayx.eu.org> 这个网站就可以直接访问我博客在IPFS上的数据了。这不比xLog自由度高不过我这个没办法存评论数据可能xLog的特色就是社交吧毕竟他们的主项目Crossbell就是主打的社交。希望可以整一个单独的插件专门用他们的网络来为我这种静态博客提供评论功能也是一个不错的选择毕竟ETH公链上的手续费太贵啦😂
# 更好的永久存储
前面我说过IPFS只能防止篡改但不是作为永久存储的方案上公链当然是也一种永久存储的方案但是成本太高了我付不起。后来我了解到一种叫做Arweave的东西可以永久存储你的数据不过这不是免费的想存得要付AR币到链上才可以。还好4EVERLAND提供了一些免费上传到AR网络的额度非常的不错这样我以后每次上传我会把地址写到[Github的Releases](https://github.com/Mabbs/mabbs.github.io/releases)里面,进一步的提高我博客永久存储的可能性。
另外我还听说似乎还有一种叫做ZeroNet的东西也是通过分布式的方式存储数据据群友所说也能在一定程度上永久存储。不过我试了试访问实在是太困难了😂而且现在程序也不在维护了所以也就放弃了。
# 感想
Web3真是发展的越来越好了希望能有更多的人参与其中一起创建不受管束的网络吧。还有实现我的Mayx Forever计划😝
不过说来我也挺担心那个Crossbell的项目作为不受监管的平台只要知名度上来肯定会被滥用到死希望他们能活得更长一些吧。

View File

@ -1,32 +0,0 @@
---
layout: post
title: 提高Cloudflare站点在中国的体验
tags: [Cloudflare, 加速]
---
从此Cloudflare不再是减速CDN了<!--more-->
# 起因
众所周知因为很多人用Cloudflare当作梯子中转之类的原因中国对Cloudflare网络的速度会有很大程度的劣化所以在上面的网站访问速度也会非常烂。最近我发现了一个不错的办法可以在一定程度上避免这个问题所以今天就来说一说。
# 普通用户的解决方法
对于网站的访问者来说,使用[CloudflareSpeedTest](https://github.com/XIU2/CloudflareSpeedTest)这个工具就挺不错的它能检测到当前网络连哪个IP是最好的。因为Cloudflare网络用的是Anycast无论从哪个IP进入都可以所以用这个检测出来的IP直接改Hosts访问就能解决访问网站慢的问题。
不过有些地区可能是服务商主动对Cloudflare的IP段进行限速那这样有可能测试出来没有可以使用的节点那么还有一种方法网络上有些可能是企业之类的人会反代Cloudflare的网站用于解决在国内访问慢的问题并且没有对host头做限制那么这些第三方的节点同样也可以作为访问Cloudflare网站的方法。具体怎么找到这样的IP有一个[仓库](https://github.com/ip-scanner/cloudflare)每天都会扫描全网去找像这样的节点。
当然这些节点也不是所有的IP从中国连接速度都很好这时候可以把这个仓库的所有IP收集起来然后再丢给CloudflareSpeedTest去测试具体我写了个简单的脚本来处理
```bash
git clone https://github.com/ip-scanner/cloudflare.git
cat cloudflare/*.txt > proxy.txt
./CloudflareST -allip -sl 0.1 -f proxy.txt -n 500
```
这样获得的第三方IP就基本上不会被限速里面甚至有可能有通过IPLC或者IEPL的节点包括拿来当梯子中转速度都几乎可以跑满带宽另外还有一个优点是这样Cloudflare获得的IP就是第三方节点的IP可以起到匿名的作用。
# 对于站长的解决方法
上面的方法相当于是用户自己去解决访问的问题但是操作可能还是会有点复杂所以对于网站站长来说不可能去期待访客通过这种方法来提高访问自己网站的速度。不过Cloudflare网站接入只能通过NS方式接入这样接入的话域名解析的IP就是自动分配的没办法自己设定解析也就不能选择更合适的IP另外之前用CF Partner通过CNAME接入的方法基本上都全死光了那现在应该怎么办呢后来我搜了一下Cloudflare原来已经提供了官方通过CNAME接入的方法应该是新加的功能除了要绑信用卡之外就没别的要求了。
在使用这个功能之前必须先有2个域名一个是不重要的域名通过NS方式接入Cloudflare另一个是主要使用的域名可以接到Cloudflare上也可以接到别的NS服务商上。然后在那个不重要的域名中先设定好源站的解析可以解析到“@”或者随便一个二级域名也可以并且打开代理。然后点开SSL/TLS->自定义主机名第一次使用需要绑定信用卡或者PayPal好像是因为它是个什么预付费的项目免费100个CNAME超过100个每个0.1USD。打开以后在回退源中输入刚刚设置好解析的那个域名当回退源状态显示有效后就可以添加自定义主机名了。这里添加的主机名就是主要使用的域名输入后根据提示在主域名上设定好TXT记录完成后只要看到刚刚设定的主机名后面跟了两个有效就可以了。
这样准备工作就做完了现在只要把主域名的解析设定到Cloudflare网络的任意节点它就会自动连接到不重要的域名所解析的IP上。至于怎么获得优秀的IP就可以像普通用户那样操作了获得优秀的IP以后我们就可以设定一个A记录解析过去。
不过这里需要注意一些地方如果使用的优选IP是Cloudflare官方的IP那基本上也不会有什么问题只是这个IP可能有些地区还是会访问缓慢毕竟它也算是在重点关注对象中。如果是选择第三方节点IP大多数情况速度都能保障但是有个很大的问题就是那些节点的主人如果发现了你在使用他们的节点他们是可以很轻易的进行中间人攻击的毕竟域名都解析过去了整个SSL证书也很简单为了能避免这个问题一定要开启“证书透明度监视”保证能在第一时间避免有人进行中间人攻击。另外还有一个问题就是既然第三方IP可以匿名那么网站也没办法获取到用户的真实IP地址了像Cloudflare一些根据IP的防火墙也会无法生效像WAF中的速率限制规则是万万不能开的开了很大可能网站就访问不了了。还有就是DDoS是可以击垮第三方节点的可能会使网站的可用性下降。所以如果对速度没有特别在意的情况下还是解析到官方IP上更好一些。
所以为了避免节点可能会用不了的情况我有个想法因为我没有大陆地区的服务器所以只是设想之前我用过一个可以给Cloudflare设定DDNS的脚本叫[cloudflare-api-v4-ddns](https://github.com/aipeach/cloudflare-api-v4-ddns)原本它是去请求获取本机IP的API设定解析的那么如果把上面优选IP的结果输入到这个脚本中放到国内的服务器上每天自动执行一次那这样我的网站不就会一直使用最优秀的IP了嘛可惜我没有国内的服务器改起来还要费点事就算了吧。
# 感想
有了很多辅助的工具能让Cloudflare不再成为减速CDN那它岂不是可以吊打国内其他CDN厂商了😆果然还是良心厂商啊。

View File

@ -1,119 +0,0 @@
---
layout: post
title: Tor在服务器上的使用体验
tags: [tor, 网络]
---
就像和普通网络一样使用Tor吧<!--more-->
# 起因
前段时间全世界最大的电子书图书馆——Zlibrary的域名被FBI回收了以致于想要访问它只能用Tor洋葱路由器或者Tor2Web访问它的Onion域名。 ~~众所周知只有恋童癖瘾君子和读书人才会用Tor🤣~~ 当然想要访问洋葱网络用Tor2Web最简单但是最不安全太容易被中间人攻击了或者安装洋葱浏览器也很简单只不过我有个理念就是一个设备不应该安装超过一个浏览器正因如此我也很不喜欢Electron的软件。既然我使用Windows本身就已经有个Egde浏览器了我为什么还要安装其他浏览器呢所以我就想能不能用更加简单的方式来访问Onion域名。
# 探索过程
要想不使用洋葱浏览器访问也可以只要装一个Tor核心然后让浏览器去连它的Socks代理就可以了只不过……在国内想要连接洋葱网络实在是太麻烦了还要整网桥前置代理啥的。不过要说代理……我自己倒是有一个那这么说来我干脆把代理和Tor组合到一起都放到服务器上然后我只要连代理就可以同时访问外网和洋葱网络了吧还不影响我访问其他网站的速度。
那应该怎么做呢Tor安装倒是很简单大多数软件包管理器都能直接安装甚至可以什么都不配置就可以用9050端口访问它的Socks5代理了我的话虽然之前用的是[wssocks](/2022/01/16/wssocks.html)但是并发效果很差也没有手机客户端所以最后还是换成了v2ray。像v2ray这种相比其他的还有一个优点就是它的路由配置功能还挺强大的这次也是用到了它的路由功能。其实去看官网文档上也有关于[将Tor和v2ray配合使用的教程](https://guide.v2fly.org/advanced/tor.html)只是不知道为什么它那个配置文件里面只有关于客户端的路由没有服务端的路由……不过不影响v2ray作为一个服务端和客户端等价的程序稍微改下那个配置文件就可以用了
```json
{
"log": {
"loglevel": "warning"
},
"routing": {
"domainStrategy": "AsIs",
"strategy": "rules",
"settings": {
"rules": [
{
"type": "field",
"domain": [
"regexp:\\.onion$"
],
"outboundTag": "tor"
},
{
"type": "field",
"outboundTag": "block",
"protocol": [
"bittorrent"
]
}
]
}
},
"inbounds": [
{
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
},
"listen": "/dev/shm/proxy.sock",
"protocol": "vless",
"settings": {
"udp": false,
"clients": [
{
"id": "***",
"alterId": 0,
"flow": ""
}
],
"decryption": "none",
"allowTransparent": false
},
"streamSettings": {
"network": "ws",
"security": "none",
"wsSettings": {
"path": "***",
"headers": {
"Host": "***"
}
}
}
}
],
"outbounds": [
{
"protocol": "freedom"
},
{
"protocol": "socks",
"settings": {
"servers": [
{
"address": "127.0.0.1",
"port": 9050
}
]
},
"tag": "tor"
},
{
"protocol": "blackhole",
"tag": "block"
}
]
}
```
顺便我为了避免不小心服务器被封也屏蔽了bt下载其实也许把bt流量转发到洋葱网络里面也可以。配置好之后试着找了些Onion网站试了试还不错访问速度一般也不影响我访问其他网站。
不过需要注意的一点是这个方法**不能匿名**仅仅是作为访问Onion网站的手段因为普通的浏览器不会有那么多保护隐私的机制这样的配置方法很容易会导致IP泄露就算是有代理也会有WebRTC泄露的可能性想匿名还是用洋葱浏览器+前置代理或者Tor做透明代理会更好一些。
# 使用Tor进行建站
既然在服务器上安装了Tor正好我之前用[mkp224o](https://github.com/cathugger/mkp224o)算了几个vanity address这次可以直接拿已经算好了私钥开网站。方法也很简单`HiddenServiceDir`后面加私钥的存放位置,然后在`HiddenServicePort`后面加想要服务的端口号和被映射的端口一般教程会说用nginx映射127.0.0.1:80而我会建议使用Unix domain Socket更加安全性能也会更好像我就会配成
```
HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 80 unix:/dev/shm/nginx.sock
```
顺便加两句反蜜罐配置:
```
ExcludeNodes {cn},{hk},{mo},{kp},{ir},{sy},{pk},{cu},{vn}
StrictNodes 1
```
nginx的监听也要注意监听/dev/shm/nginx.sock这样能保证即使在服务器内扫描端口也不会泄露你的网站😆。
其实我本来想让v2ray的连接Tor也通过Unix domain Socket走但是很遗憾的是我没找到v2ray的Outbound怎么样设置Unix domain Socket连接……
# 感想
感觉洋葱网络其实还是对用户挺友好的,使用起来还是挺方便的,就像访问普通网络那样,大概也正是这种原因它才能成为匿名网络中最受欢迎的吧。

View File

@ -1,129 +0,0 @@
---
layout: post
title: i2pd在服务器上的使用体验
tags: [i2p, 隐私, 网络]
---
Java果不其然是垃圾😁i2p还是得靠其他语言支撑<!--more-->
# 起因
前几天[我在服务器上体验了Tor](/2022/11/16/tor.html)让我的代理在访问互联网的同时也能访问洋葱网络上的网站。其实我整完这个之后也想整出能访问i2p的功能只是我之前体验了下官方的I2P客户端体验不是一般的差再加上还是Java写的导致我对i2p的印象不怎么好。
不过最近我看到有一个使用C++实现的i2p叫[i2pd](https://github.com/PurpleI2P/i2pd)。其他先不说只要不是Java写的首先加一分闭着眼睛都知道它的体验一定比官方的Java I2P体验要好得多。随后我就按照官网的文档在我的服务器上安装了一下。
# 探索过程
安装完成之后使用也非常的简单虽然它也有Web管理界面但是为了安全我的服务器上开了几层防火墙也懒得配置所以也没有登进去看一眼。不过使用还是相当简单的它和官方的I2P一样也是可以直接用4444端口的HTTP代理连接隐形网络为了能让我的电脑也能上我也在我的v2ray配置文件基于上次写的照猫画虎的加了几句规则
```json
{
"log": {
"loglevel": "warning"
},
"routing": {
"domainStrategy": "AsIs",
"strategy": "rules",
"settings": {
"rules": [
{
"type": "field",
"domain": [
"regexp:\\.onion$"
],
"outboundTag": "tor"
},
{
"type": "field",
"domain": [
"regexp:\\.i2p$"
],
"outboundTag": "i2p"
},
{
"type": "field",
"outboundTag": "block",
"protocol": [
"bittorrent"
]
}
]
}
},
"inbounds": [
{
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
},
"listen": "/dev/shm/proxy.sock",
"protocol": "vless",
"settings": {
"udp": false,
"clients": [
{
"id": "***",
"alterId": 0,
"flow": ""
}
],
"decryption": "none",
"allowTransparent": false
},
"streamSettings": {
"network": "ws",
"security": "none",
"wsSettings": {
"path": "***",
"headers": {
"Host": "***"
}
}
}
}
],
"outbounds": [
{
"protocol": "freedom"
},
{
"protocol": "socks",
"settings": {
"servers": [
{
"address": "127.0.0.1",
"port": 9050
}
]
},
"tag": "tor"
},
{
"protocol": "http",
"settings": {
"servers": [
{
"address": "127.0.0.1",
"port": 4444
}
]
},
"tag": "i2p"
},
{
"protocol": "blackhole",
"tag": "block"
}
]
}
```
顺便再提醒一下,这样的配置**不能**匿名仅仅是一种更方便访问隐形网络的方式如果有匿名需要建议使用Firefox或者Tor浏览器安装I2P的插件并设置相应的代理或者使用[i2pdbrowser](https://github.com/PurpleI2P/i2pdbrowser)也是基于Firefox的
另外如果只是访问还有一种更加不匿名的方式i2p也有类似tor2web那样的东西不过很少我找了一圈只找到了[i2phides.me](https://i2phides.me/)可以用。当然也是强烈不推荐的,在不知明细的情况下使用这种东西是会被中间人攻击+记录访问日志的。
配置好之后试着用电脑上了一下体验相当好比之前在手机和电脑上安装的官方的I2P Java客户端速度快多了随便开了几个网站感觉甚至比上次配置的Tor速度还快不过这可能只是延迟比较低之后我找了几个文件下载Tor的实际网速还是更快一些I2P虽然感觉延迟低但是实际下载速度也只有1Mb/s左右。
# 建站体验
隐形网络比洋葱网络感觉更好的一点大概就是它有一套自己的域名解析系统洋葱网络访问的时候基本上没办法记忆想整个好看的域名还得算。隐形网络的话有了域名解析系统就可以不用花大力气去算vanity address了。不过我搞这个也算是玩了算一个也挺好。想整的话可以用i2pd提供的一套工具[i2pd-tools](https://github.com/PurpleI2P/i2pd-tools)里面有个叫vain的工具可以用来算vanity address。不过实际上试了一下感觉没有Tor里的[mkp224o](https://github.com/cathugger/mkp224o)好用速度慢是一方面比较离谱的是它还能计算出错6位以下的自定义字母倒是能正常计算6位以上的就会计算错误好不容易计算出一个结果检验的时候报“bad key file format”……看那个仓库好像人家也不怎么想解决的样子大概也因为有域名解析系统的原因网上也没有其他人开发这样的程序……
算好喜欢的私钥之后就可以进行建站了他们这个配置文件感觉比Tor客户端的要好配置也很简单按照[i2pd的文档](https://i2pd.readthedocs.io/en/latest/tutorials/http/#host-anonymous-website)就行了不过他们这个有个缺点就是好像不支持Unix Domain Socket连接这样我就得再占掉一个端口比较令人遗憾……另外这个私钥官方没有说放到哪里我找了一下需要放到“/var/lib/i2pd/”路径下,这个应该是它以服务形式启动之后默认的工作目录。
配置好之后网站就可以访问了不过既然它有域名解析系统还是免费的肯定还是要注册一个的。注册也很简单上面提到的i2pd-tools里面有个regaddr程序把自己想要的域名和私钥按照说明传进去把输出的结果粘贴到 <http://reg.i2p/add> 或者 <http://stats.i2p/i2p/addkey.html> 里面,然后过段时间等他们收录了之后就可以使用了。
# 感想
虽然i2pd的体验还不错不过也许是官方使用的是Java编写的客户端导致用户量很少网站也非常少以致于感觉访问i2p的网站都似乎失去了意义……不像洋葱网络那样随便搜一搜就能找到互联网肯定找不到的东西。 ~~所以Java什么时候死啊😂~~

View File

@ -1,77 +0,0 @@
---
layout: post
title: 体验小白也会使用的免费容器云
tags: [Docker, 容器, 免费]
---
Heroku虽然倒了但是我们还有更多的选择<!--more-->
# 起因
从昨天开始Heroku就不再提供免费的容器云服务了虽然我有Github的学生包但是试了一下要绑银行卡就算了。不过虽然这么说我其实一次也没用过Heroku因为它要安装奇奇怪怪的软件用起来很不人性化。不过最近也正好需要一个服务器来供我测试那应该怎么办呢
# Koyeb的体验
后来我在寻找的时候找到了一家叫做[Koyeb](https://www.koyeb.com/)的平台也是容器云还是免费的。用Github登录之后就可以使用了试了一下感觉很不错啊它和其他免费容器云最不一样的可能就是它能直接部署Docker Hub上的项目不用在Github上新建乱七八糟的仓库也不用安装乱七八糟的软件非常的人性化啊。
既然能部署Docker Hub的项目那可选择的余地就太大了我直接随便部署一个发行版就能当免费的VPS来用不过既然能直接部署了还是安点什么好吧……我想了想干脆安装个宝塔面板吧正好他们官方也提供了[Docker镜像](https://hub.docker.com/r/btpanel/baota)直接部署就行另外为了正常访问需要映射8888端口另外为了方便访问网站还要映射一个80端口。不过它只给了一个地址所以如果要映射多个端口就只能设定路径……像我是给面板设定的根目录方便我配置至于网站嘛……之后再考虑吧这里我先填了一个`/app`的路径便于之后使用。
这样安装出来的面板直接根据镜像文档的说明就可以登录了不过登录之后会要求绑定手机号……我不太想整这个东西于是在网上找了个宝塔纯净版在Koyeb的Console里面执行
```bash
curl http://v7.hostcli.com/install/update6.sh|bash
```
运行之后就可以跳过绑定宝塔账号的步骤了还能安装企业版插件还是挺不错的。不过不知道是什么问题网页端的SSH好像用不了……这个建议使用frp等方式反代一下再用免费的frp服务器还是比较好找的。
## 建站方法
因为之前已经映射了80端口所以直接用提供的链接就能打开之前建好的网站例如example.koyeb.app/app。不过对于有些网站来说有个问题那就是它的程序可能资源不允许在不是根目录的地方这样它读取文件的时候就会从宝塔面板的路径读取了然后就会出现例如404的错误。为了解决这个问题我想了一下干脆让Cloudflare Workers反代它吧理论上应该绑定域名然后在Cloudflare上配置重写规则应该也行所以就写了个简单的脚本
```javascript
addEventListener(
"fetch",event => {
let url=new URL(event.request.url);
url.protocol="https";
url.hostname="example.koyeb.app";
url.pathname="/app" + event.request.url.substring(event.request.url.indexOf('/',8),(event.request.url + "?").indexOf('?'));
let request=new Request(url,event.request);
event. respondWith(
fetch(request)
)
}
)
```
这样访问网站的时候就不会遇到404的情况了。不过这样做还有一个缺陷就是HTTP_HOST环境变量会是错的有些程序会读取它导致链接可能会出问题这种情况就只能通过修改fastcgi的环境变量配置文件来解决了……
## 搭梯子的方法
一般租服务器,可能除了搭网站,就是搭梯子了。所以我想在建站的同时搭个梯子,正好网站也算是梯子的伪装了。
这次我搭梯子不想用v2ray了我想换个之前在Github上看到的一个重新实现的v2ray叫[verysimple](https://github.com/e1732a364fed/v2ray_simple)据说速度比v2ray要快很多不过它用的那个toml我看的不是很明白因为之前配了[Tor](/2022/11/16/tor.html)和[i2p](/2022/11/23/i2p.html),用到了路由功能,它这个路由功能……也没个文档,本来想给自己的服务器换一下,这看起来不知道怎么配就算了。不过在这个免费的测试机上不需要有那么多功能,只是当个普通梯子还是很简单的,而且它的配置文件能通过交互模式生成还挺有意思的。
像我的话配置文件很简单,就是这个样子:
```toml
[[listen]]
tag = "my_proxy"
host = "***"
ip = "0.0.0.0"
port = 8080
xver = 0
tls = false
path = "***"
advancedLayer = "ws"
protocol = "vless"
uuid = "***"
version = 0
[[dial]]
port = 0
xver = 0
protocol = "direct"
version = 0
```
然后在我的网站的nginx里配置相应的路由
```conf
location /***{
proxy_set_header X-Original-Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host ***;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://127.0.0.1:8080;
}
```
就可以正常使用了试了一下效果还不错不知道这个流量是怎么算的Koyeb的面板上也没有关于流量费的介绍……难不成是不限流量
# 感想
免费的东西虽好不过既然Heroku都被薅没了Koyeb这种小白都能免费用的容器云……只能说且用且珍惜了……

View File

@ -1,20 +0,0 @@
---
layout: post
title: 如何自定义宝塔亚马逊S3云存储插件的端点
tags: [S3, 插件]
---
会点Python就可以自己改插件啦<!--more-->
# 起因
上次[用Koyeb安装了宝塔面板](/2022/11/29/free-server.html)之后在上面写了些测试用的网站,不过因为我开发网站的时候喜欢直接在面板上面改,本地基本上都是没代码备份的,不过最近宝塔面板好像有不少关于漏洞的传言,为了避免由于各种奇怪的事情把我的网站搞没,我想整点备份用的插件。
# 插件的使用与修改
宝塔面板的插件还是挺多的,想要备份的话支持的平台也挺多的,而且都很人性化,功能啥的小白也能操作的来。不过考虑到宝塔面板的不安全性,我也不希望我常用的网盘挂在上面当备份,万一被攻破了我网盘上的文件就被别人拿走了。
综合考虑下来什么OSS还是什么云盘感觉还是不太好选择但是S3 API兼容的平台还挺多的比如我[之前用过的4EVERLAND](/2022/10/19/web3.html)也有存储桶。另外之前随便逛的时候注册了一个Filebase也支持都是0门槛免费5GB。所以想用这个存我的备份文件。
不过宝塔面板上带的亚马逊S3云存储插件只能用亚马逊的云服务不能改endpoint……但是我也不想注册AWS除了看着难受不人性化而且好像免费用要绑信用卡最主要是我想备份到Filebase ~~不然白注册了?😂~~
所以我就去看了看这个插件的源代码还好代码是Python的理解起来倒是不难。最开始我是想着它会不会是直接通过HTTP API访问AWS S3的端点所以就直接各种搜索但是找了半天没看到一个和AWS有关的域名……看来投机取巧不太行……就只能慢慢看代码了。最终找了半天发现它好像用的一个叫boto3的库来连接AWS的……这名字起的是真的……我完全没法从这个名字中看出来它和AWS有半毛钱关系好像因为Boto是亚马逊河豚据说是粉色的尤其它代码里是通过`from boto3 import client`这种方式引入的代码里就没有和boto3有关系的词了……client这个词又很通用这代码看着是真的难受啊……
不过还好最终起码找到要改的地方了,其实很简单,它的“/www/server/panel/plugin/aws_s3/s3lib/client/aws_s3.py”这个文件是引入的关键其中`build_auth()`方法是连接S3的关键我在网上搜了一下boto3它也是支持自定义端点的只要在第100行后面加一个endpoint_url参数就可以了比如Filebase就加一句`endpoint_url="https://s3.filebase.com"`,保存之后其他的就在面板上配置就行了。
# 感想
这下就能看出来宝塔是有多垃圾了吧,明明就一个参数就能搞定的事情,它偏偏不给你加,而且就这样还啥功能都不支持,文件夹也删不了,也没法在面板里上传/下载文件而且还要给你装个boto3的依赖啥都不支持还要装个全功能的依赖实在是太垃圾了。不过小白不会写代码再垃圾的东西该用还得用吧🤣。

View File

@ -1,44 +0,0 @@
---
layout: post
title: 为自己的i2p站点添加一个SSL证书
tags: [SSL, i2p, 隐私, 网络]
---
虽然没啥用,不过很有意思所以还是整一个!<!--more-->
# 起因
在上个月,我用[i2pd](/2022/11/23/i2p.html)和[tor](/2022/11/16/tor.html)在两个不同的匿名网络上试着建了网站不过因为这些网络的特性他们不需要使用HTTPS访问就能保证内容不被窃取和篡改。不过SSL证书的意义不止这些还有一个很重要的意义是验证网站身份比如[Facebook](https://www.facebookwkhpilnemxj7asaniu7vnjjbiltxjqhye3mhbshg7kx5tfyd.onion/)就有一个被信任的EV SSL证书它的意义就是在保证其他人也偷偷算了一个facebook开头的域名家用电脑大概花1天左右的时间就能算出来时能很轻易的知道这个网站是不是真的Facebook的网站因为EV SSL证书的审核很严格基本上没办法去伪造一个相同公司的。Onion的DV SSL我查了一下普通人倒是也能整有家叫[HARICA](https://www.harica.gr/en/Products/SSL)的证书商家每年花30EUR就可以在上面买一个。不过我嘛……肯定是不愿意花钱的所以就打消了整Onion的证书的想法。
# 探索I2P的SSL证书
那i2p域名呢因为Tor有一定的政府背景而且有大公司撑腰所以受到了那些管理互联网的组织的承认才会被允许注册可信的SSL证书。而i2p怎么说还是一个比较小的项目虽然它可能是除了Tor外第二大的匿名路由网络不是Freenet之类的共享内容的网络那种东西没法交互不过没有靠山就不会被那些管理互联网的组织所承认也就不可能允许注册可信的SSL证书……那难道就没有办法了吗作为社区动力的项目什么政府啊还是什么标准化的组织都是没用的东西不被承认可以自己承认正好我在逛i2p那些网站的时候看到了一个由i2pd的开发团队PurpleI2P所维护的一个[CA](http://ca.i2pd.i2p/)从这个CA签名的证书虽然也只是自签名的但是他们开发的浏览器[I2PdBrowser](https://github.com/PurpleI2P/i2pdbrowser)内嵌了这个CA证书所以也可以看作是可信的证书了至少在这个浏览器上是。具体的申请方法很简单网站上都有说给作者发邮件申请就行了至于怎么用普通的邮箱给mail.i2p发邮件……只要把它替换成官方网关i2pmail.org就可以了。
虽然证书很容易申请但是申请下来的证书部署到网站上之后怎么才能被访问那还是挺麻烦的。因为网络上完全没有相关的教程毕竟i2p用的人就少i2pd更少用i2pd还整SSL证书的人可能全世界一只手都数得过来😂。这没办法我只能先看着i2pd的文档先自己琢磨结果怎么整效果都不对……没办法就只好问作者了他回复的原文如下
> It must be added like current tunnel for HTTP with same key. Example with HTTP and HTTPS:
> ```
> [website]
> type = http
> host = 127.0.0.1
> port = 8080
> inport = 80
> inbound.length = 2
> outbound.length = 2
> inbound.quantity = 3
> outbound.quantity = 3
> gzip = false
> keys = website.dat
>
> [website-SSL]
> type = server
> host = 127.0.0.1
> port = 8443
> inport = 443
> keys = website.dat
> ```
> Note that I use same key file both for HTTP and HTTPS tunnel, and HTTPS (443 port) using type `server`, because i2pd mustn't interact with encrypted by SSL data.
> Also, you can skip the i2cp options in the second tunnel, because they apply to all tunnels with the same key. The main thing is to write them only in the first tunnel.
这下我总算搞明白我之前配置的问题出在哪了😂它文档里写的关于inport的说明是“what port at local destination server tunnel listens to. Same as port by default”我看到它说的“local destination”以为是隧道访问的那个端口结果是面向隐形网络的端口……怪不得我配置之后返回的证书老是443端口的证书……而且http隧道文档里也没有说到关于inport的参数啊还有那个莫名其妙的ssl参数……这文档写的真是有点不太行……
按照邮件说明配置好之后总算可以正常访问了试了一下用I2PdBrowser访问我的网站终于出现了代表加密的小锁。
# 感想
不过他们对生成证书的要求实在是不严格我不需要证明任何东西就能获得任意i2p网站的SSL证书当然也起不到验证网站身份的功能不过由于这个网络的特点也没办法中间人攻击而且本来用的人就少估计他们也是当玩吧😂所以也没有认真搞。另外其实那个域名系统也一样注册也很随便……
不过搞的过程还是挺有意思的,如果有谁有兴趣也可以搞一个玩玩。

View File

@ -1,23 +0,0 @@
---
layout: post
title: 年终总结
tags: [总结]
---
&lt;/2022&gt;&lt;2023……<!--more-->
# 无止尽的……?结局?
本来这篇文章打算昨天就写的……结果昨天不知道什么原因发烧了😂。想着是不是感染了COVID-19不过拿抗原试纸测了一下好像也没事。emmmm本来就很糟糕的一年在最后也不忘送我一份礼物是吧😂。
# 2022年都干了什么
2022年我感觉更加的什么都不记得了……这种问题的严重程度就像从没有经历过这些事情一样。对于电脑来说什么东西最重要呢应该是硬盘上面存储的数据吧毕竟电脑有价数据无价。而对于人来说那就是记忆了吧。在我看来所有的想法和情感都是基于记忆实时演算出来的结果不过很遗憾的是人的记忆不能备份坏了就再也找不回来了就算用日记记录也只是生成了新的记忆而已。所以虽然能知道发生了些什么不过心中却毫无波动。
我看了看2022年写的文章基本上都是些解决问题的方案文章也比之前写的少了大概是因为记忆的积累变少了所以也想不出更多的东西了不过这也许不是一件坏事毕竟没有记忆就没有烦恼了这也就是为什么我现在内心毫无波动吧。
至于2022年周围发生的事情……可能是越来越糟糕了以致于我感觉再有两年差不多人类该灭绝了🤣不过如果能在有生之年看到人类的末日也不算坏事毕竟人类已经在这个星球也存在了几十万年了按平均100年左右的寿命来算在有生之年遇到人类末日假设在2024年的概率大概有个几十万分之一吧 ~~(感觉不太清醒,算错了不要叫我“数学奇才”,还有预言如果成真了也别🔪我🤣)~~
# 2023年想要做什么
毕竟没有过去就看不清未来当然如果就只是正常的活下去感觉也就是发生了什么去应对什么吧。2022年的Mayx Forever计划因为[Github](/2022/01/04/banned.html)的激励完成的还是挺不错的,看看博客的[代理列表](/proxylist.html)反代先不论镜像站也整了不少而且还在IPFS、AR和IC上整了备份尽可能保证了博客能存活的概率。不过要是说不止发生了人类灭绝的问题世界也毁灭了那当然所作的所有事情都失去了任何意义。当然如果考虑意义的话就没有意义了其实就算啥也没有死了还是啥也没有本来也看不见未来期望其他人看到也只是活着的时候在做梦罢了。不过也不是完全没意义毕竟这套方案除了在自己遇到问题保留信息之外还有反审查的的功能当我整出一套成熟的方案时其他人也可以用我曾经发现过的东西来做自己想做的事情。
至于其他的事情……也快到毕业的时候了,最后只要能正常的毕业那就还能继续漂流下去(不然就只能靠接单养活自己了(可能也不完全是坏事))。
总之接下来也没什么可期待的,我就想见证末日而已。
# 总结
这下感觉……总之接下来无论是我还是其他人可能都不会变得更好吧。其他的我也想不出来什么了。

View File

@ -1,37 +0,0 @@
---
layout: post
title: MacBook Pro 2022 13寸使用体验
tags: [Apple, MacBook, 体验]
---
好用,但又不完全好用<!--more-->
# 起因
最近家里人送了我一台搭载了Apple M2芯片的MacBook Pro 2022 13寸笔记本电脑虽然我以前没用过MacOS不过我其实本来就打算买一台的只是我打算在我现在使用的天选坏了或者彻底过时的时候再换……不过问题也不大早有早享受嘛。
# 想买MacBook的理由
其实以前我是不喜欢买像苹果这种性价比低的产品的而且以前的MacBook确实也很烂CPU是很垃圾的Intel几款核心数少就很普通的那种电脑然后要是刷成Windows……估计花一半的价格就能买个同等性能的Windows轻薄本了。而且还有什么“梦幻单热管”之类的问题性能和寿命都非常差。不过2020年出的Apple Silicon M系列芯片还是相当厉害的性能提升是一方面功耗发热之类的表现都非常的不错不仅使用很安静续航还很长。这时候就让我回想起我以前想整的[云游戏](/2021/09/28/cloudgame.html)+轻薄本方案了当然MacBook在轻薄本里实在是太贵了毕竟我在用游戏本的这几年里感觉游戏本还是挺不方便的重倒是还好主要是续航不太行我的游戏本开省电模式基本上用4个小时就没电了而且风扇声音也很大有时候想不插电使用效果都不太好。另外我也不怎么打游戏很多时候我其实不需要性能有多强需要的时候再租服务器还是租云电脑都是个不错的选择。
# MacBook的使用体验
## 初体验
刚拿到这个MacBook之后从使用上来说倒是没有特别的不适应我不知道是苹果有优化过用户体验还是单纯因为自己用了一下上手还是挺容易的没有因为是第一次仔细使用MacOS以及Windows不一样的操作方式而不会用要硬说的话感觉也就是标题栏的关闭键在左边不太熟悉吧用两天就好了不过ctrl弄成两个还是挺不熟悉的搞了control和command两个按键导致在远程连接Windows以及使用终端时操作都挺别扭的比如复制文本在Windows上按control+c复制然后在MacOS上按command+v粘贴……不是很人性化。
除了系统本身的体验之外MacBook的触控板使用也非常的不错。大是一方面可以不抬手就完成移动鼠标和单击这个操作也很不错因为整个触摸板都可以按下去而且还有两段只不过重击我还没用过关于手势和快捷键估计得用很长一段时间才会熟悉吧不过还好就算不熟悉也不怎么影响使用。
## 应用体验
刚开始使用的时候我最想安装的就是Microsoft Remote Desktop因为之前有说要配合“云”一起使用那自然是要有个能远程连接的东西。那个软件国区Apple账号还没有我还得搜教程把地域改成其他国家……安装好之后连接上我办公用的电脑效果还不错用起来的感觉就像在MacBook上安装了Windows一样不过问题就是我前面说的ctrl键问题感觉比较难受……
随后我就安装了VSCode之前我在Windows电脑上安装的是Notepad++我之所以不想用VSCode就单纯因为它多整了一个浏览器感觉不太爽那个Notepad++作者搞什么键政辱华啥的我都不在乎但是他声明有可能会随机修改用户数据这个我就不太能接受了无论这是不是个玩笑但是但凡有一点点这种可能性我都不太敢相信这个软件了当然MacOS本来也装不了🤣另外我还想要用Github Copilot插件所以就考虑了一下还是用VSCode吧。
然后在操作的过程中感觉连接不是很通畅,下了个[V2rayU](https://github.com/yanue/V2rayU)。看着还挺不错结果导入的时候不支持自定义SNI搞得我只能自己修改配置文件感觉不太好……不过配置好了之后还是挺不错的总比自己运行V2ray然后设置代理方便吧。
然后就是虚拟机了毕竟MacOS支持的软件很少有时候可能无论如何都要使用Windows如果手头没个Windows就麻烦了所以还得装个Windows的虚拟机。不过我这个MacBook是8G内存的版本分配的时候只能分个4GWindows11启动大概吃掉12G现在软件吃内存也很厉害8G MacBook装虚拟机还是有点吃力了……当然为了应急吃力也还是得装吧。然后就是创建虚拟机的软件MacOS一般推荐的是Parallels Desktop不过那是个付费软件我买不起那种东西那对于ARM64架构的目前应该就VMWare Fusion Player、VirtualBox和[UTM](https://github.com/utmapp/UTM)吧据说UTM基于QEMU功能更加强大我也懒得三款都测一遍了而且UTM有上架Apple Store的版本用着也更放心。
整虚拟机的时候为了搞Windows11的镜像我按着教程又下了个HomeBrew据说这个就相当于在MacOS上的apt一样的东西了之后安装命令行需要的软件就方便很多了。
另外为了能看Bilibili港澳台的动画我还需要安装Tampermonkey插件看了一眼还要2USD……看了看旁边还有一个叫做Stay的插件能提供差不多的功能还是免费的于是也装了一个。虽然也不是不能装Chrome不过对我来说只要系统自带的浏览器不是IE那种大多数网页都没法访问的情况那就不会去安装第三方的浏览器了不过Safari装插件还是挺麻烦的也没有Chrome的插件多还好油猴的脚本很多就可以代替那些插件的功能了所以装个Stay就够用了。
还有为了处理文档Microsoft Office试了一下要花钱还不能用E5试用的订阅没办法就只能再装个WPS Office了MacOS上的WPS Office倒是还好没有Windows上那么多广告不过好多模板还有些什么转换之类的功能还是付费的不过我一般用不上应该影响也不大。
最后为了能连接手机传输文件安装了一个Android文件传输MacOS居然原生不支持MTP协议实在是不太行……这个电脑就两个Type-C的USB口充电线是两边都是C口的用来连接手机还挺不错的。
## 游戏体验
众所周知MacBook很不适合用来打游戏因为大多数游戏都是在Windows上编写的。不过我已经安装了Windows11ARM的虚拟机如果用来跑游戏效果会怎么样呢我从我原来用的电脑上传了一个Galgame过来打开试了一下卡的不得了不知道是因为没法调用显卡还是怎么回事感觉帧率就10fps的样子我在我原来的电脑上运行了一下试了试运行非常流畅。连运行Galgame都这么垃圾其他游戏估计更不用说了。不过这估计也是因为是虚拟机的缘故所以我想找找MacOS支持的游戏。去Apple Store下载游戏……都要花钱不过我看到我的MacBook作为Pro有个Touch Bar所以想整个Touch Bar的游戏正好看到了个打砖块试了试效果还不错。
当然用MacBook光看打砖块流畅那就没啥意义了所以再升点级试试三维弹球吧😝之前我在网上看到一个开源版本的三维弹球叫做[SpaceCadetPinball](https://github.com/k4zmu2a/SpaceCadetPinball)是用Windows XP自带的那个版本逆向出来的我看了一眼是支持在MacOS上运行的于是就下载下来编译了一下效果确实不错不过我又试了一下在Windows原生的版本一样很流畅啊😂而且不知道为什么感觉开源的这个版本缓冲器不太对劲弹的没原生的舒服……这试游戏没必要针对弹球游戏吧😂。
不过我也不知道MacOS支持什么游戏想了想我在Epic Games上白嫖了不少游戏干脆下载下来看看都有啥支持吧。看了一圈while True:learn()居然支持然后就下载下来试了一下不过这个基本上也没啥特效啥的就是那种逻辑推理游戏也展现不出什么不过我原来的电脑运行这个游戏的时候风扇就开始高速转起来了MacBook能完全没声音应该还是证明有点东西的。
不过我也不一定非要考虑电脑游戏我也可以考虑一下手机游戏毕竟MacOS在M系列芯片上是可以运行iOS软件的不过系统做了一些限制不是所有都支持所以我就下了一个[PlayCover](https://github.com/PlayCover/PlayCover),在上面安装了公主连结 Re:Dive。效果还挺不错的完全不卡不过运行的时候可以明显感觉有点开始发热了我浏览网页看视频的时候完全不发热看来这个游戏还是挺费资源的。
## 综合体验
经过这些天的使用我感触最深的就是这台电脑的续航了别说一天不充电感觉两三天不充电都没问题毕竟标称续航是20小时可以算是续航最强的笔记本电脑了。不过这样的话感觉就更像是大号手机/平板那样了用的时候不充电24小时不用关机感觉和手机差不多相比平板功能还是更多要是说用iPad那个东西可没有终端越狱也还是比不了MacOS。而相比Android平板我之前还在上面[试过Termux](/2022/02/15/termux.html)不过问题和越狱差不多支持的东西还是不如MacOS虽然MacOS也不是开源的但是对我来说我感觉那个终端就像Linux那个终端差不多加上HomeBrew效果还是挺不错的另外MacBook比平板的续航更长就是重量也更重了。
# 感受
总的来说从体验上来说还是挺不错的触控板的操作还有续航啥的都挺不错的还有虽然这款MacBook是用的2016年的模具但是我真没用过Touch Bar可能确实挺鸡肋的但是还是挺好看的Fn功能键也没有很高的使用频率不过感觉可能也就这样了只能拿来看看视频写点代码啥的有些关键性的东西以及打Galgame都还只能用我原来的Windows电脑还好这些可能不是用的特别多的情况也许调整好之后我可以把我所有的东西都迁到这个MacBook上然后关键的东西用云电脑呢。

View File

@ -1,51 +0,0 @@
---
layout: post
title: 使用CF Workers Cron触发器进行签到
tags: [Javascript, Cloudflare, cron, workers]
---
Github Actions(×)Cloudflare Workers(√)<!--more-->
# 起因
前几天,我的[云·原神签到脚本](https://github.com/Mabbs/MHYY-AutoCheckin)被Github Ban掉了其实我非常能理解这种情况实际上用Actions做签到确实太重了。毕竟启动一个Actions需要的资源还算比较多相当于开一个Docker容器然而实际上做的事情却是很简单的请求一个接口罢了。而专业的全自动签到者有更专业的选择比如[QianDao](https://github.com/qiandao-today/qiandao)可以挂很多签到脚本而且操作非常简单只是需要服务器……而我为了能保证优质的签到水平用这种东西显然还是不够稳当服务器还会到期呢所以像这种简单的事情我觉得还是应该用Cloudflare Workers来做更好。
# 使用Cloudflare Workers Cron触发器
其实有一说一我的Javascript并不怎么样不过至少文档我还是能看懂的Workers进行网络请求不需要用XHR这样奇怪的东西我感觉它应该是基于Node.js的看了一眼是用fetch函数去进行网络请求的 ~~(……又不是没用过,以前不还拿[Workers写反代](/2021/03/02/workers.html)嘛……)~~ 另外又看了看Cron触发器的文档然后根据之前那个Python版因为懒得分析哪些请求有用没用了反正就三个都弄上吧……最终总算是知道怎么写了。于是代码如下
```javascript
addEventListener('scheduled', event => {
event.waitUntil(
handleSchedule(event.scheduledTime)
)
})
async function handleSchedule(scheduledDate) {
const init = {
headers: {
'x-rpc-combo_token': '填入Token',
'x-rpc-client_type': '2',
'x-rpc-app_version': '3.4.0',
'x-rpc-sys_version': '11',
'x-rpc-channel': 'mihoyo',
'x-rpc-device_id': '填入设备ID',
'x-rpc-device_name': '填入手机名称',
'x-rpc-device_model': '填入手机型号',
'x-rpc-app_id': '1953439974',
'Referer': 'https://app.mihoyo.com',
'Host': 'api-cloudgame.mihoyo.com',
'Connection': 'Keep-Alive',
'Accept-Encoding': 'gzip',
'User-Agent': 'okhttp/4.9.0'
},
};
console.log(scheduledDate);
console.log(await fetch("https://api-cloudgame.mihoyo.com/hk4e_cg_cn/wallet/wallet/get", init));
console.log(await fetch("https://api-cloudgame.mihoyo.com/hk4e_cg_cn/gamer/api/getAnnouncementInfo", init));
console.log(await fetch("https://api-cloudgame.mihoyo.com/hk4e_cg_cn/gamer/api/listNotifications?status=NotificationStatusUnread&type=NotificationTypePopup&is_sort=true", init));
}
```
至于怎么获取Token之类的参数用HttpCanary之类的抓包就好了不过要先启动云·原神之后再抓包不然程序貌似会检验SSL证书是不是合法的然后就退出登录了……抓到之后随便点开一个请求里面就有上面的值了根据情况填到上面就行了。
还有Workers的配置就很简单了把代码粘到Workers里面之后在触发器里面的“Cron 触发器”中设定时间就行了一般就一天一次反正它能自动生成Cron表达式也不用自己写要不写“0 0 * * *”也行,然后就什么都不用做了。
# 感想
写完这个签到脚本之后我觉得应该鼓励大家都去使用Workers这种方法去进行签到Cloudflare可不会因为这种东西去Ban你的东西至于Actions应该更多用于更需要计算资源的事情比如编译代码啊或者生成静态HTML还是日报之类的签到啥的确实是太浪费了而且还会Ban
还有就是云函数啥的……不过那个貌似本质来说还是Docker它运行时是一个完整的环境不像Workers那样应该是运行在一个更加轻量的沙箱里的也许还更环保呢XD。

View File

@ -1,21 +0,0 @@
---
layout: post
title: PHP异步执行的探索
tags: [PHP, 异步]
---
看来异步总是个难以解决的问题啊……<!--more-->
# 起因
最近我在写一个ThinkPHP框架为基础的代码时遇到了一个问题我希望在执行完一个操作后立马返回数据然后在后台继续运行一个比较耗时的东西。我以前写的一个[图片机器人](/2021/02/23/picbotpro.html)其实也遇到过这种问题为了解决返回很慢的问题我采用了“离弦之箭”——使用file_get_contents函数请求自己并且使用'timeout'参数来防止页面挂起,另外接收的部分使用`ignore_user_abort(true)``set_time_limit(0)`保证在请求结束时让程序依然继续运行。不过我用的是TP框架啊不知道用那两个函数会不会出问题还有这个“timeout”到底填多少比较合适也不确定所以就想试试别的方法。
# 探索异步的方法
对于正规的情况来说直接去网上搜如何让PHP异步执行代码估计大多会说使用什么消息队列或者用什么Swoole框架吧或者简单点用popen函数来fork一个进程或者用什么fsockopen貌似原理和我用file_get_contents函数差不多其实吧我觉得从本质来说那个所谓的Swoole框架已经不算PHP的东西了我觉得它更像是一个能通过http请求的popen函数通过某种方式也一样是在本地去调用PHP脚本只是可能用了些什么比如线程啥的特性提高了性能而已。
我看完这些选择之后很不满意我不希望代码里出现popen这样的函数说实话这是个危险的函数绝大多数情况下服务器应该要禁用这种函数的毕竟如果因为某些原因被人上传了PHP木马他们可以直接用这个函数去执行命令了。至于什么乱七八糟的异步框架想不想学是一方面主要是我的项目还没有达到用这种东西的规模。那难不成我只能继续用之前图片机器人的那个“离弦之箭”的办法了吗
后来我找到了一个很不错的函数,叫做[fastcgi_finish_request](https://www.php.net/manual/zh/function.fastcgi-finish-request.php)它可以在程序结束前把要输出的东西输出并且结束请求不过使用它以后看文档说明好像说推荐再执行一下session_write_close函数不然在这个程序执行完成前session会被锁住没法操作。
不过这个函数只能在使用PHP-FPM的时候使用如果是像Apache那样使用模块的方式运行PHP估计就用不了了当然目前大多数环境应该都用的是Nginx+PHP-FPM吧我反正是很少见到有人用Apache虽然听说那样性能似乎会更好
还有一个问题就是如果这个需要运行的脚本的时间太长了以至于同时运行这个脚本的进程数量超过了pm.max_children那么PHP-FPM就不能接受新的请求了这也是一个缺陷。
另外在这种情况下我使用了TP框架还会遇到一个问题那就是我不能使用return返回内容了毕竟return了之后就不能执行其他函数了啊所以就只能提前用echo之类的东西输出执行完fastcgi_finish_request和所有需要长时间运行的代码后就只能return空值或者直接exit吧。
# 感想
看来用PHP来做异步果然是难事啊不如说大多数程序想要处理好多线程的问题都挺难的吧也许如果项目经常遇到这种问题应该考虑用其他语言来编写了呢。

View File

@ -1,26 +0,0 @@
---
layout: post
title: 关于最近人工智能的探索
tags: [AI, LLM, 人工智能]
---
最近人工智能发展的还真是不错啊……<!--more-->
# 起因
最近ChatGPT为代表的人工智能发展的越来越好了而且因为它对生产力的提升使得了解AI的人也越来越多了。虽然我也不算是对AI很感兴趣但是我在Github Copilot刚出的时候就已经用上了到现在一直在用不过毕业了以后估计就用不了了吧😂。不过那时候Copilot毕竟专业性比较高知道的人也比较少不像现在ChatGPT能在各行各业使用甚至还有基于类似模型的Vtuber比如[Neuro-sama](https://www.twitch.tv/vedal987),所以即使是普通人使用它,都能够减轻自己的工作压力,所以现在的人们都在讨论它。
当然在这之前还有一些很厉害的画图AI比如使用了Stable Difusion的NovalAI以及Midjourney啥的不过因为我对画图并不感兴趣所以它发展的有多好也基本上和我没有关系。其实除了这些能够AIGC的模型之外在那之前还有下围棋的AlphaGO啥的那个我就更不感兴趣了相信大多数人也不感兴趣所以总的来看也就只有现在才能证明AI发展到了能够让大家觉得能干涉到更多人的地步吧。
也正因为现在以ChatGPT为代表的LLM的发展开源社区也开始搞起来一些有意思的东西。不过LLM的训练成本比较高所以现在开源社区在这一块的发展也许得感谢比如Facebook的[LLaMA](https://github.com/facebookresearch/llama)之类基础的模型才能让大家能用较低的成本去训练属于自己的AI吧。
# 关于LLaMA衍生的模型体验
在刚开始LLaMA被Facebook开源的时候GitHub上就出现了[llama.cpp](https://github.com/ggerganov/llama.cpp)这个项目因为我没钱买显卡手头只有笔记本电脑上的一张非常垃圾的GTX1650Ti 4GiB显存的显卡多亏了这个项目可以让我这种没显卡的人也能体验LLM的乐趣。而且这个项目使用起来非常简单不像很多AI项目还要装什么TensorFlow啊还是什么PyTorch啥的那些东西不仅大还非常的挑版本这个项目运行的时候就什么都不用考虑对使用者来说非常的友好像清华那个[ChatGLM-6B](https://github.com/THUDM/ChatGLM-6B)我就完全跑不了它要想正常体验得要有8GiB的显存我就没法整这种东西了。
我体验了那个最开始的LLaMA-7B的模型效果其实不怎么样根本没法流畅对话不过也能理解因为它应该相当于是把一堆数据堆到一起的东西吧也没有针对对话进行训练。不过很快斯坦福大学对这个模型进行了Finetune制作出了[Alpaca](https://github.com/tatsu-lab/stanford_alpaca)当然这个仓库里面的东西是纯粹的菜谱和食材把他们加工成模型得要整一堆A100的显卡跑几个小时这个我可整不来不过还好有人根据这个原材料加工成了完整的模型现在去🤗上就能下载的到比如去[这个仓库](https://huggingface.co/chavinlo/alpaca-native)就能下载到训练好的模型,在[这里](https://huggingface.co/Pi3141/alpaca-native-7B-ggml)可以下载到已经经过量化直接可以给llama.cpp使用的版本不过现在llama.cpp升级了得要按照说明在仓库里执行那个Python脚本进行转换才能正常使用
我运行这些东西是在我的Macbook Pro上它只有8GiB的内存所以只能跑7B70亿参数的模型不过就这个模型也已经非常厉害了虽然只能说英文但是流畅程度上下文关系的能力都非常不错而且常见的知识都能正确回答效果让我很满意。不过8GiB内存实在是太小了想跑点别的也没办法……不过16GiB内存的电脑我还是能找得到的我找了台CPU是i7-11700K的台式机跑了下[使用GPT-4对话数据微调的13B模型](https://huggingface.co/Pi3141/gpt4-x-alpaca-native-13B-ggml)速度比M2芯片跑的速度感觉慢了至少5倍吧Macbook生成的速度基本上能达到对话的语速台式机跑的速度那就是一个一个词往出蹦这下就能感受到M2芯片的计算能力还是强大啊4大核+4小核比8核16线程还要厉害苹果的产品属实有点东西😝不过这个13B的模型也确实厉害有些7B的模型回答有错误的部分这个13B的都能正确回答如果我能整个16GiB的Macbook可能就能完整体验了吧可惜苹果家的内存比金子都贵实在是买不起啊……
斯坦福的这种Finetune方法成本还是有点高所以后来又有人研究出了一个叫[LoRA](https://arxiv.org/pdf/2106.09685.pdf)的办法去Finetune模型据说只要一张普通的显卡就可以进行不需要一堆高级显卡也能跑不过再低级的显卡也不是我这GTX1650Ti能碰瓷的所以我也只能看看别人训练的模型啦。在看的时候我发现了一个用的中文训练集跑的模型项目[Chinese-LLaMA-Alpaca](https://github.com/ymcui/Chinese-LLaMA-Alpaca)看起来还挺有意思的不过他们似乎担心什么版权问题只放出了LoRA权重没有完整的模型就相当于是没有面饼的泡面只有料包好在他们倒是给了去哪里找面饼。不过泡面的这个过程对我来说也挺难的合并它需要13-15GiB的可用内存16GiB的内存肯定不够用所以得找一台32GiB内存的电脑不会有人组非2次方倍数内存的电脑吧……我手头没有还好从网上找了台免费的云主机整了个32GiB内存的才成功的把这碗面泡出来了。虽然泡面的步骤不多也不算特别难只是我是觉得干嘛同一碗面泡那么多次不如我提前泡好直接放网上所以我也在🤗上上传了最终合并并量化的模型[在这里](https://huggingface.co/Mabbs/chinese-Alpaca-lora-7b-ggml)就能下载到直接就能拿来用的模型了。至于运行的参数就按照之前仓库的操作就行了。
# 让M2芯片发挥更大的作用
在我玩完那个llama.cpp项目之后我觉得让M2芯片光用CPU算好浪费啊毕竟这个芯片里面还有神经网络引擎和GPU啊这些哪个都比CPU算更好吧不过想要调那些东西进行人工智能计算貌似只能用苹果的Core ML框架。这两天我在Github看到一个苹果官方发布的[Core ML Stable Diffusion](https://github.com/apple/ml-stable-diffusion)看起来还挺有意思的我倒是也想在我的Macbook上跑一下正好🤗开发了一个示例[Diffusers](https://apps.apple.com/app/diffusers/id1666309574)可以拿来试试看可惜8GiB内存还是限制了它的发挥跑是能跑速度也挺快的就是模型没法换因为内存也只能跑小的模型跑出来可以说真的就是那种抽象的不能再抽象的东西吧……不过不管怎么说这还是发挥了一下神经网络引擎和GPU的作用吧不然感觉苹果做了这些东西就没啥作用了😂。
# 感想
从这次体验来看我对开源社区的AI发展感觉还是挺有信心的虽然相比于ChatGPT之类的来说可能还没办法当作生产力不过毕竟它比较平民化至于知识量少的问题如果开发者们能加把油能让这些模型对接网络那也许就可以在很低成本的情况代替OpenAI的ChatGPT吧也能避免他们服务器出问题之类的原因导致生产力的下降吧。不过开源这种事情还是有点……毕竟还是不希望这些东西被人拿去商业化更不希望出现国外一开源国内就自研这种糟糕情况也许开源产品比不上人家的商业产品也是正常的。

View File

@ -1,23 +0,0 @@
---
layout: post
title: 使用树莓派安装Windows的尝试
tags: [树莓派, Windows]
---
树莓派能不能作为迷你主机使用呢?<!--more-->
# 起因
前段时间家里人送给了我一个树莓派4B-8GiB内存版因为手头用着MacBook Pro看到这个比我之前用的树莓派3B好了不少的东西就开始想它能不能和用着一样是ARM架构的Mac Mini M2那样使用当然想给树莓派安装黑苹果那就是天方夜谭了毕竟macOS里用到的很多东西也不完全只是ARM想想也知道既然是苹果自己研发的芯片里面肯定是有一些比如专有的指令集什么的树莓派应该算是公版的ARM吧肯定有些指令是没有的……不过我还是愿意仿个macOS试试看我在网上看好像[TwisterOS](https://twisteros.com)仿macOS的效果最好而且它是基于树莓派官方系统开发的所以应该也没啥兼容性的问题另外它其他的主题比如仿Windows的做的也不错但仿Windows还不如给它装一个真正的Windows毕竟网上是有能够给树莓派安装Windows ARM版的办法的。
# 给树莓派安装Windows
最开始我想给树莓派安装Windows的时候手头没有Windows的电脑但是给树莓派安装Windows所用的软件[Windows on R](https://worproject.com)貌似用到了Windows上的一些东西。不过他们提供了一种可以先给卡里安装WinPE然后再安装系统的办法最开始我是先尝试的那种方案我可以先用一张安装了树莓派官方系统启动树莓派然后用[WoR-flasher](https://github.com/Botspot/wor-flasher)给另外一张卡安装WinPE以及系统镜像。操作很简单照着README做就行了不过不知道是为什么尝试了好几次每次安装到一半就卡住然后报错安装失败然后连WinPE都进不去了……
我怀疑是通过这种方式安装可能有什么问题而且当时安装到时候卡是32GiB大小的虽然官网上说32GiB是足够的不过也许还是有什么问题所以后来我重新买了一张64GiB的卡片并且用Windows去运行Windows on Raspberry imager给卡里安装了Windows 11不过很奇怪的是还是运行不了……换了好几个系统镜像都不行后来才发现原来是我自作多情每次启动的时候都把频率调成2.2GHz所以不能启动默认的1.5GHz或者调高到2.0GHz都没有问题😥,因为这个问题尝试了好多次……
# 在树莓派上的Windows体验
安装好之后就可以尝试验证树莓派的生产力了不过结果让我很失望……首先是我用的TF卡是UHS-1写速度貌似是10MiB/s读速度商家宣传是130MiB/s不过实际上我也不太清楚随机读写估计就更慢了……这样的速度加载东西实在是有够慢……另外目前[在树莓派上使用的Windows驱动](https://github.com/worproject/RPi-Windows-Drivers)里并没有无线网卡和核显的驱动所以体验也很差移动窗口之类的操作CPU都占用了不少我本来还想着考虑能不能比Macbook开虚拟机效果好一些不过目前来看这个结果应该是只差不好吧……虽然价格上树莓派和Mac Mini M2差了4倍不过体验这么差的话估计当生产力是没机会了。
# Linux的生产力对比
相比之下用树莓派官方的系统感觉要流畅不少毕竟官方系统的所有驱动都是正常工作的应该也能使用硬件解码只是有些桌面版的程序没有比如MS Office还有像7-Zip、WinSCP、XShell之类的软件 ~~其实macOS也不行🤣~~ ……用Wine怎么样呢其实我觉得应该好不到哪里毕竟大多数Windows的程序都是x86_64指令集Wine想要运行这些软件照样得靠QEMU翻译只不过可能调用的一些Windows的API可以原生执行而已除了这些之外我还试了试用Chromium播放Bilibili的视频结果也令人大失所望360p的视频都不能流畅播放更别说1080p了当然也不排除是因为Bilibili的视频用了硬件解码器不能解码的编码方式虽然相比树莓派3B来说确实至少可以流畅浏览网页了但是连视频都不能流畅播放那看来想当生产力还很远呢。
# 感想
果然树莓派还是没有办法当作普通的电脑来用啊更不用说生产力了同样的价格至少还能组个能打游戏的电脑。尽管性能比树莓派3B好不少但毕竟用的还是很低级的芯片也许它就应该当作物联网的开发板来使用吧但很奇怪的是如果是这样树莓派3B就足够了吧何必开发树莓派4B以及带键盘的树莓派400呢还有就是树莓派CM4他们不会真以为自己的芯片速度很快吧🤣

View File

@ -1,301 +0,0 @@
---
layout: post
title: 基于ThinkPHP5.1核酸检测登记系统的设计与开发
tags: [核酸检测, 后端, 系统设计, 论文]
---
论如何水一篇论文🤣<!--more-->
# 前言
最近终于顺利毕业了……既然说到毕业,那毕业论文肯定是最重要的。既然已经毕业了,那就顺便把毕业论文发出来吧,反正也算是我写的东西 ~~(可以拿来水一水博客😝)~~ 。另外还有配套的[项目源代码](https://github.com/Mabbs/nucleic-acid-management)也一起发出来吧。
另外这个毕业论文经过了ChatGPT润色包括项目代码也使用Github Copilot现在的AI真的是相当方便啊自己写的不通顺的地方它可以帮你改的更流畅算是理科生的福音了😝而且内容是完全原创的查重也只有个位数大大降低我在写这个没用的东西上浪费的时间😁而且写的也相当不错可以说确实是能大幅提高生产力了至少在AI兴起的这段时间里不仅仅是[玩AI](/2023/04/05/ai.html)也得拿AI解决点自己的问题才算跟得上时代吧。
另外原文的所有图片为了节省空间还有一些比较复杂的表格因为用Markdown写太麻烦所以都去除掉了那么从接下来开始就是论文的正文部分了
# 摘要
本文介绍了基于ThinkPHP框架开发的核酸检测登记系统的设计和开发过程包括需求分析、数据库设计、功能实现和系统测试等方面。该系统旨在方便用户在线登记核酸检测信息提高检测效率、减少人员接触专为新冠疫情防控而设计。在需求分析阶段规划了系统的功能和性能需求在数据库设计方面采用了关系型数据库MySQL在功能实现方面使用了前后端分离架构其中后台前端采用Vue框架用户前端使用jQuery库后端采用ThinkPHP框架在系统测试方面介绍了系统测试结果及问题解决方案。通过本文的介绍读者可以了解项目开发的各个方面对具体的项目开发有更深入的认识。
**关键词:** 核酸检测,后端,系统设计
# ABSTRACT
This article describes the design and development process of a nucleic acid testing registration system based on the ThinkPHP framework, including requirements analysis, database design, feature implementation, and system testing. The system aims to facilitate users in registering nucleic acid testing information online, improve testing efficiency, reduce personnel contact, and is specifically designed for COVID-19 pandemic prevention and control. In the requirements analysis phase, the system's functional and performance requirements were planned. For database design, a relational database MySQL was adopted. In feature implementation, a front-end and back-end separation architecture was used, with the back-end front-end using the Vue framework, user front-end using the jQuery library, and the back-end using the ThinkPHP framework. System testing results and problem-solving solutions are also presented. Through this article, readers can gain a comprehensive understanding of the various aspects of project development and have a deeper understanding of specific project development.
**Key Words:** nucleic acid testing, back-end, system design
# 第1章 绪论
## 1.1 选题背景
核酸检测是一种用于检测病原体例如病毒、细菌等的常见检测方法之一也被广泛用于新型冠状病毒COVID-19的检测中。在COVID-19大流行期间核酸检测已成为公共卫生应对策略的重要组成部分。核酸检测主要是通过提取样本中的核酸例如RNA或DNA然后使用特定的技术例如聚合酶链式反应PCR扩增特定的基因序列来检测是否存在目标病原体。这些检测技术可以用于检测病原体的存在也可以用于确定感染者的数量和病毒载量等信息文章内容<sup id="al1">[[1]](#ref1)</sup>。对于COVID-19核酸检测被广泛用于诊断和监测感染者以及筛查病毒感染的人群。许多国家和地区都采取了强制性的核酸检测措施来控制疫情例如旅行前的检测和隔离措施。为了有效地管理核酸检测和监测COVID-19疫情许多地区建立了核酸检测登记系统。这些系统通常由卫生部门或其他相关机构负责旨在收集和管理核酸检测的数据以便有效地跟踪和监测疫情的发展趋势并及时采取必要的应对措施。本文以ThinkPHP开发框架为基础微信平台作为承载研究了基于ThinkPHP5.1的核酸检测登记系统的设计与实现,包括系统需求分析、系统功能设计、公众号设计、接口设计以及数据库设计。重点阐述了普通用户与管理用户的用户模块、核酸试剂模块、公告模块的设计<sup id="al2">[[2]](#ref2)</sup>
## 1.2 研究目标和意义
该研究的主要目标是设计和实现一个基于ThinkPHP5.1的核酸检测登记系统,该系统可以通过微信平台进行访问和使用。该系统将具有以下功能:
用户模块:该系统将支持普通用户和管理用户两种不同类型的用户。普通用户可以在系统中注册并填写个人信息,以便卫生部门进行核酸检测和疫情监测。管理用户可以对系统中的数据进行管理和维护,包括审核用户信息、发布公告、查询数据等。
核酸试剂模块:该系统将支持管理用户管理核酸试剂信息,包括试剂的识别码、生产商、库存等信息。同时,系统将支持管理用户对试剂进行状态编辑、入库、销毁等操作,以便跟踪试剂的使用情况和库存情况。
公告模块:该系统将支持管理用户发布公告,包括疫情通报、政策通知、操作指南等信息。同时,系统将支持普通用户查看最新公告,并及时掌握疫情信息和政策变化。
该系统的意义在于1.提高疫情监测和管理的效率该系统可以有效地收集和管理核酸检测数据和试剂信息为卫生部门和政府提供准确的疫情数据和管理信息有助于及时发现和控制疫情的蔓延。2.提高用户体验和服务质量该系统通过微信平台进行访问和使用方便用户随时随地进行核酸检测登记和信息查询提高用户的使用体验和服务质量。3.促进信息共享和协同合作:该系统可以实现数据共享和信息协同,协助各个部门和机构之间的合作,提高疫情防控的效率和质量。
该研究的创新点在于:将核酸检测结果通过微信公众号进行推送,从而方便用户快速查看检测结果,避免用户不必要的出行和接触风险。此外,通过将核酸检测与微信公众号相结合,可以实现对用户健康状态的实时监测和管理,进而提高社区健康防控水平。这一创新方法不仅提高了检测结果的传递效率,还为健康管理和疾病预防提供了新的思路。值得一提的是,该方法不仅适用于核酸检测,在其他领域的应用也具有潜力,可以为现代社会的公共卫生事业做出更大的贡献。
## 1.3 国内外现状
为确保核酸检测结果的真实性和可靠性,全球各国和地区都采用信息化技术建立了核酸检测登记系统,该系统将检测结果与检测者身份信息进行绑定。在疫情防控中,该系统有助于追踪和管理疫情。在设计相关产品之前,需要了解国内外核酸检测登记系统的现状,以更好地进行系统设计和开发。
### 1.3.1 国内现状
在中国核酸检测登记系统已成为疫情防控的重要组成部分并且已得到广泛应用。从2020年开始核酸检测登记系统已成为中国疫情防控的重要组成部分并且已得到广泛应用。这个系统的实施为疫情防控提供了极大的便利和帮助既可以确保每个接受核酸检测的人的检测结果真实可靠也可以实现有效的疫情追踪和管理。
在这个系统中,每个接受核酸检测的人都需要提供身份证件信息和手机号码,并将检测结果与个人信息进行绑定。这样一来,每个人的检测结果都可以被准确地记录和管理。此外,中国各个城市和机场也建立了相应的核酸检测登记系统,以确保疫情防控的有效性。这些系统通过高效的信息技术手段,实现了对接受检测的人员的信息管理和追踪,使疫情防控工作更加有力和高效。
除了国家级的核酸检测登记系统外,很多省市也建立了自己的系统,通过手机应用程序实现了个人核酸检测结果、健康状态和行程轨迹的信息管理。每个人的健康码都是动态的,根据个人的核酸检测结果、行程轨迹和接触史等信息进行自动更新,方便了疫情追踪和管理。这些系统的建立和应用为疫情防控提供了重要的技术支持和保障,同时也为其他公共卫生事件的应对提供了宝贵的经验和借鉴。
### 1.3.2 国外现状
随着新冠疫情在全球蔓延越来越多的国家开始采取措施建立自己的核酸检测登记系统。除了美国CDC建立的COVID-19报告门户网站之外其他国家也纷纷建立类似的在线平台以便实验室和医疗机构可以直接向相关部门报告病例和检测结果。这些国家包括但不限于英国、德国、法国、澳大利亚等。
在欧洲除了欧盟数字COVID证书系统外一些国家也开始建立自己的核酸检测登记系统。例如英国建立了国家医疗服务体系NHS测试和跟踪系统该系统允许英国居民在线预约COVID-19测试同时可以跟踪他们的检测结果<sup id="al3">[[3]](#ref3)</sup>。在德国类似的系统名为Corona-Warn-App通过手机应用程序追踪人们的接触历史和检测结果<sup id="al4">[[4]](#ref4)</sup>
随着全球疫情形势的不断发展,建立核酸检测登记系统已成为越来越多国家的必然选择。这些系统可以更好地追踪和管理疫情,为政府和公众提供及时、准确的疫情信息,从而更好地应对疫情挑战。此外,这些系统还可以为旅行者提供方便,使他们能够更加安全地穿越不同国家和地区的边境,保护自己和他人的健康安全。
## 1.4 论文结构
本论文根据软件开发过程,详细阐述了系统实现整体流程,分为七章内容,具体结构如下:
第一章是本文的引言部分,主要介绍了核酸检测的背景、研究目的与意义、国内外研究现状以及研究内容与方法。通过对核酸检测的背景和相关问题的深入认识和分析,可以更好地理解本文的研究背景和动机。
第二章将对与本研究相关的技术进行概述,本章旨在为后续的研究内容提供技术支持和基础知识,帮助读者更好地理解本研究的实现和应用。
第三章主要对系统进行了需求分析及设计。具体而言,本章包括了系统的设计目标、功能和角色的关系和流程等方面的详细介绍。
第四章通过详细介绍每个模块的接口设计,展示了系统各个模块之间的联系和交互方式,以及模块之间的数据传输方式和数据格式。此外,我们还介绍了数据库的结构设计,包括表的设计、数据类型的选择、索引的使用等等。通过这些介绍,读者可以更好地了解系统的整体架构和实现细节。
第五章详细描述了系统的部分模块的具体实现过程,其中包括系统设计、系统功能的实际实现以及部分实现后的系统运行界面展示等。这一章节的目的是满足系统设计需求,并确保系统的各项功能能够得到有效的实现。
第六章我们会对一些接口进行软件测试。这包括设计测试用例、配置测试环境以及记录相应的测试结果。通过这些测试,我们不断改进系统,提高其性能。
第七章对主要是对本论文内容的总述以及展望。
# 第2章 相关技术概述
## 2.1 PHP语言
PHP全称Hypertext Preprocessor中文名“超文本预处理器”是一种广泛使用的开源服务器端脚本语言它主要用于Web应用程序的开发。PHP可以嵌入到HTML中也可以独立运行在服务器端通过处理数据、生成动态内容和与数据库交互等方式来构建Web应用程序<sup id="al5">[[5]](#ref5)</sup>
PHP最初是由Rasmus Lerdorf在1994年开发的后来由开源社区不断发展和完善。PHP具有易学易用、高效快速、跨平台等特点可以与各种Web服务器和数据库配合使用。目前PHP已经成为最受欢迎的Web开发语言之一许多知名的网站和应用程序都采用了PHP开发<sup id="al6">[[6]](#ref6)</sup>
## 2.2 ThinkPHP框架
ThinkPHP是一个免费开源的快速、简单的面向对象的轻量级PHP开发框架是为了敏捷WEB应用开发和简化企业应用开发而诞生的。此框架提供了一系列丰富的功能和组件包括路由、模板引擎、数据库操作、缓存、表单验证、文件上传等支持多语言、多模块、多应用等功能能够满足不同规模和需求的项目开发。另外该框架具有良好的扩展性和可定制性可以根据实际需求选择和配置不同的组件和插件<sup id="al7">[[7]](#ref7)</sup>。同时ThinkPHP框架也拥有一个活跃的开源社区提供了丰富的文档和教程方便开发者快速学习和上手。
## 2.3 MySQL数据库
MySQL是一款开源的关系型数据库管理系统是目前最受欢迎的数据库之一。MySQL使用标准的SQL语言进行操作支持多种操作系统包括Windows、Linux、UNIX等以及多种编程语言如PHP、Java、Python等。
MySQL提供了高性能、高可靠性、高可扩展性和丰富的功能支持事务处理、存储过程、触发器、视图、索引等具有较好的安全性和稳定性。同时MySQL也有很好的社区支持和文档资料开发者可以方便地获取相关帮助和资源<sup id="al8">[[8]](#ref8)</sup>
MySQL被广泛应用于Web应用程序、电子商务、社交网络、金融、游戏等领域是许多知名网站和企业的首选数据库。
## 2.4 API技术
APIApplication Programming Interface应用程序编程接口是一组定义了软件应用程序之间如何互相通信的规则和接口。API提供了一个标准的方式使得应用程序之间可以相互调用获取所需的数据和功能。它可以用于不同平台和编程语言之间的通信如Web应用程序、移动应用程序、桌面应用程序等。API定义了一些公共的接口和参数使得应用程序之间可以相互交换数据和信息完成各种任务和功能。API可以分为不同的类型如Web API、操作系统API、库API等。其中Web API是最为常见和广泛应用的类型它通过HTTP协议传输数据通常采用RESTful架构风格或者SOAP协议<sup id="al9">[[9]](#ref9)</sup>。使用API可以极大地提高应用程序的开发效率和可重用性促进应用程序之间的协作和集成。
# 2.5 本章小结
在本章中,我们对本论文开发过程中使用的开发语言、工具和数据库软件进行了介绍。此外,本章还介绍了系统开发项目在实现过程中使用到的主要开发技术。我们详细介绍了这些技术的原理和应用,以帮助读者更好地理解本项目的开发过程。
# 第3章 需求分析及设计
## 3.1 软件需求分析
基于ThinkPHP5.1的核酸检测登记系统是一个高负荷的系统为了保障核酸检测登记系统的高可用和长期稳定使用并满足业务流转的需求我们将采用基于ThinkPHP5.1框架的PHP语言进行开发。同时我们将通过前后端分离的方式<sup id="al10">[[10]](#ref10)</sup>使用Vue框架编写后台前端微信公众号作为面向普通用户的前端并将数据存储在MySQL数据库中以建立一套稳定高效的系统。
## 3.2 功能需求分析
核酸检测登记系统的设计与开发需要考虑到各方面的因素,包括系统的可用性、可扩展性、可维护性等。在设计之初,我们通过对以往核酸检测的经验和实际需求的分析,确定了该系统的主要功能和模块,以及各个模块之间的交互和流程。
为了实现高效的信息收集和处理系统采用了基于微信端和后台管理系统的分层设计将不同的功能模块划分到不同的层级中。微信端提供给用户和检测者使用的功能主要包括绑定、二维码展示、检测结果查询、扫码登记和公告查看等这些功能通过微信公众号平台实现可以方便地让用户和检测者进行操作同时也保障了系统的安全性。后台管理系统则负责管理整个系统的数据和逻辑流程包括公告管理、用户管理和管码管理等这些功能可以通过Web界面进行操作使得系统管理员可以方便地对整个系统进行管理和监控。
在核酸检测登记系统的实现过程中也需要注重用户体验的设计。系统采用了人性化的交互方式和UI设计以简洁、明了的方式呈现信息和功能从而提高了用户的使用体验和操作效率。
## 3.3 非功能需求分析
非功能性需求分析包括易用性和可靠性等方面的分析。对于面向大众的系统来说,易用性要求系统容易被理解,使用学习成本低,操作简洁明了;而对于用户量庞大的系统,可靠性更加重要,需要保证系统在高负载下也不会出现严重问题,并且在出现问题后能够及时恢复。
除此之外,在非功能性需求分析中还需要考虑性能和安全性等方面的分析。性能分析需要考虑系统的响应速度、吞吐量等指标,以确保系统能够在合理时间内完成任务。安全性分析需要考虑系统的数据保密性、完整性和可用性,以避免系统受到恶意攻击或数据泄露等安全问题的影响。
同时,在非功能性需求分析中也需要考虑可维护性和可扩展性等方面。可维护性要求系统易于维护和修改,以保证系统的稳定性和可靠性。可扩展性要求系统能够根据需求增加新的功能或扩展规模,以适应未来的业务需求和用户数量增长<sup id="al11">[[11]](#ref11)</sup>
## 3.4 功能设计
### 3.4.1 角色关系设计
核酸检测系统涉及到管理员、核酸检测机构、登记人员和市民四个至关重要的角色,各自担负着不同的职责和任务。下面将详细描述这四个角色在核酸检测系统中所需使用的功能和任务。
管理员是核酸检测系统中的管理者和决策者,拥有对系统的管理和监控职责。管理员需要使用该系统来收集和管理所有与核酸检测相关的信息,例如检测机构、登记人员和检测核酸的市民的基本信息、检测结果、样本的处理情况等等。他们需要定期更新系统中的信息,以确保信息准确完整。此外,管理员还需确保核酸检测系统的安全性,防止信息泄露等安全问题的发生。管理员需要监控整个核酸检测系统的运行,确保系统工作高效运作,以便政府决策人员及时掌握最新的疫情情况。
核酸检测机构在核酸检测系统中扮演着产出核酸检测结果的关键角色。他们需要使用该系统记录和管理所有检测样本相关的信息,例如每个样本的采集时间、状态、结果等等。同时,核酸检测机构需及时更新系统中的信息,以确保管理人员和市民能够及时获取最新的检测结果。在核酸检测工作中,核酸检测机构需要严格遵守操作规程,并保证检测结果的准确性。只有准确的检测结果才能帮助政府制定有效的疫情防控策略。
登记人员在核酸检测系统中扮演着关键执行者的角色。他们需要使用该系统进行前台扫码登记,提交并关联用户信息到系统中,方便用户和管理人员及时得到核酸检测结果通知。登记人员需要确保每个参与核酸检测的市民都完成了前台扫码登记,以便核酸检测机构可以顺利地获取相关的样本的关联信息。
市民是核酸检测系统中的使用者,需要通过该系统记录个人信息,并在核酸检测时通过展示二维码的方式绑定核酸关联关系。市民可通过该系统查询自己的核酸检测情况,并了解相关政策和指导意见。在使用核酸检测系统前,市民需要提供必要的身份验证信息,以确保信息安全和准确性。市民有义务按照规定参加核酸检测,并及时核实检测结果。
## 3.4.2 流程设计
根据上述设计,核酸检测系统将会按以下步骤执行:
试管登记:厂家需要对试管进行登记,包括试管编号等信息,以确保试管的准确性和追踪性。
用户注册和身份验证:用户需要在系统中进行注册并提供身份信息,以便核实身份。扫码人员会根据标准操作采集相应部位的样本,并将样品与试管编码和用户进行绑定,以避免混淆和错误。
样品运输:采样的样品会被运输到核酸检测机构,以进行后续检测步骤。
核酸检测过程在检测机构内样品经过复杂的生化反应和PCR扩增等过程来检测是否存在新冠病毒。
结果上传和记录:检测结果信息会被上传至相关系统中,并记录下核酸检测时间、地点等信息,以便后续跟踪和分析。
结果查看和处理:用户和管理员可以通过系统查看结果信息。如果结果为阳性,则用户需要立即进行隔离治疗,并配合当地防控部门的要求进行后续措施。
整个核酸检测流程需要各方密切配合和精准管理,从而最大程度地提高检测的准确性和效率,进一步强化疫情防控的力量。
## 3.5 本章小结
本章主要针对核酸检测登记系统进行了详细的需求分析。首先明确了系统的总体目标和需求分析的前提条件,为后续的功能分析和需求分析奠定了基础。接着对系统进行了功能分析,明确了各个模块之间的业务逻辑关系,确保系统的各项功能能够相互协调和配合。针对系统的核心功能,进行了具体的需求分析,明确每个功能的详细需求,以确保系统的各项功能能够准确地满足用户的需求。
此外,本章还对系统进行了非功能性需求分析,主要考虑系统的易用性、可靠性、性能和安全性等方面,以确保系统不仅具有高效的功能,而且还具有良好的用户体验和安全保障。最后,本章还对系统中各个角色之间的关系和流程进行了详细的设计。
# 第4章 详细设计
作为系统的后端API需要负责处理各种请求并返回相应的数据。为此必须仔细设计数据库结构以确保数据的高效存储和检索。此外还需要定义各种接口以便客户端应用程序可以方便地与后端API进行交互。因此下面提供了关于该系统的详细设计包括数据库结构、接口定义等方面的内容。
## 4.1 接口设计
该系统旨在为微信用户端和后台管理端提供服务,因此需要设计两个独立的模块以支持这两部分服务。这两个模块将包含不同的功能和接口定义,以满足微信用户和后台管理员的需求。因此,在整个系统的设计中,需要考虑这两个模块的交互和协同工作,以确保系统的可靠性和稳定性。
### 4.1.1 后台接口
作为后台管理,管理用户是必不可少的任务之一。因此,需要设计一套完整的用户管理接口,以便管理员可以方便地进行用户管理。这些接口将包括用户信息的创建、修改和删除等操作,同时还需要提供查询用户信息的接口,以便管理员能够快速查找和浏览用户信息。
作为核酸检测系统,管理核酸试剂是必不可少的任务之一。因此,需要设计一套完整的核酸试剂管理接口,以便管理员可以方便地进行试剂管理。这些接口将包括试剂的添加,删除、查询和更新等操作。
对于一个管理系统,公告也是必须的信息之一。管理员需要及时发布各种公告,以便向用户传达重要信息或者通知用户系统的更新和维护等情况。因此,需要设计一套完整的公告管理接口,以便管理员可以方便地发布、查询、修改和删除各种公告。这些接口应该具有良好的可扩展性和可维护性,以便随时满足不同的公告需求。
对于一个管理系统,了解系统运行的状态是必不可少的。管理员需要随时监控系统的各种指标,以便发现并解决可能出现的问题。因此,需要设计一套完整的系统状态查看接口,以便管理员可以方便地查看系统的注册量、试剂量等信息。这些接口应该具有良好的可扩展性和可定制性,以便满足不同的监控需求。此外,还需要考虑系统状态信息的安全性和保密性,以确保管理员的身份和权限得到充分验证和保护。
### 4.1.2 前台接口
在用户端,验证用户身份和获取用户信息是非常关键的操作。系统需要验证用户的身份,以确保用户的合法性和权限。因此,需要设计一套完整的用户验证和信息获取接口,以便用户可以方便地进行身份验证和信息查询。
在核酸检测的用户端,用户需要能够方便地查询自己的检测信息和相关结果,同时扫码人员也需要能够方便地进行核酸检测操作。因此,需要设计一套完整的核酸检测接口,以便用户和扫码人员可以方便地进行核酸检测相关操作。
由于微信的各种限制,例如在微信上调用扫码等操作,需要进行验证。为此,需要后端对微信端的页面进行验证。
为了确保用户端能够获取到管理员发布的与核酸检测相关的信息,需要提供公告的接口。这样,用户端就可以及时了解最新的政策和指南,并采取相应的措施。
## 4.2 数据库设计
在核酸检测登记系统中准确地记录并存储每个人的检测数据至关重要。为了实现这一目标必须精心设计数据库结构并确保其可靠性和完整性。设计数据库的关键在于确定各种实体之间的关系以及它们之间的属性以便能够准确地存储和检索数据。因此为了满足这些要求需要采用实体关系图E-R图来建立该系统的数据库结构。E-R图能够清晰地展示实体之间的关系包括实体之间的联系和依赖关系以及它们之间的属性<sup id="al12">[[12]](#ref12)</sup>
此外,为了进一步确保核酸检测登记系统数据库的可靠性和完整性,我们还对其进行了详细设计。详细设计涵盖了数据库的各个方面,包括数据类型、数据表结构、索引等等。通过仔细考虑每一个细节,我们能够确保该数据库能够准确地存储、管理和检索所有的检测数据,并能够满足各种数据操作的要求。因此,在进行详细设计时,我们不仅仅关注数据库的功能和性能,还需要考虑到系统的可维护性和扩展性,以便在未来的运营过程中能够方便地进行系统的更新和维护。以下内容是该数据库的详细设计。
在进行核酸检测时,通常需要对试管的状态进行检测,因为试管的状态与被检测者的状态是对应的。因此,在设计检测流程时,我将重点记录试管的状态信息。在下表中,我们可以看到有关试管状态的信息,这些信息将有助于我们进行准确的核酸检测。
#### 表 核酸检测管信息表结构
| 字段名 | 类型 | 长度 | 索引及关系 | 注释 |
| - | - | - | - | - |
| id | int | 11 | 主键 | 主键ID |
| serial | varchar | 11 | 唯一键 | 管码 |
| fuid | int | 10 | 关联user表id | 所属用户ID |
| status | enum | 0,1 | | 状态0=未检1=阴性2=阳性) |
| is_del | enum | 0,1 | | 软删除 |
| create_time | datetime | | | 添加时间 |
| update_time | datetime | | | 更新时间 |
在存储公告信息的过程中,为了方便管理和使用,我设计了一个包含标题、内容和图片信息的数据表。标题信息是公告的主题,通过标题可以快速地了解公告的内容和主要信息。内容信息则是公告的详细描述,可以包括公告的发布时间、地点、目的、重要性等内容。在某些情况下,公告可能需要配有图片信息,以便更直观地展示公告的内容和意义。因此,我在设计表格时特别留出了图片信息的存储空间。通过这些信息的存储和管理,我们可以更加高效地发布和管理公告,同时也可以使公告信息更加全面和直观。这样有助于提高公告的传播效果和实际效果,确保公告信息得到更好地传递和利用,具体表结构见下表。
#### 表 公告数据表结构
| 字段名 | 类型 | 长度 | 索引及关系 | 注释 |
| - | - | - | - | - |
| id | int | 11 | 主键 | 主键ID |
| title | varchar | 255 | | 标题 |
| content | text | | | 内容 |
| media_url | varchar | 255 | | 媒体URL |
| uid | int | 10 | 关联user表id | 添加者(仅超管) |
| is_del | enum | 0,1 | | 软删除 |
| create_time | datetime | | | 添加时间 |
| update_time | datetime | | | 更新时间 |
为了使后台管理人员和微信用户都能够方便地使用系统我在设计用户信息表时特别考虑了用户权限的管理和用户身份的识别。为此我同时设计了密码和微信OpenID字段。密码字段可以使后台管理人员设置用户密码以便管理人员能够轻松地通过用户名和密码登录系统进行管理操作。微信OpenID字段则是为了便于微信用户在登录系统时进行身份识别和权限验证从而能够更加便捷地使用系统的各种功能。通过这样的设计系统不仅可以实现后台管理和微信用户端的统一管理而且也使得系统更加简洁和易用具体表结构见下表。
#### 表 用户信息表结构
| 字段名 | 类型 | 长度 | 索引及关系 | 注释 |
| - | - | - | - | - |
| id | int | 11 | 主键 | 主键ID |
| name | varchar | 11 | | 用户名 |
| password | char | 32 | | 密码md5 |
| uniqid | char | 18 | 唯一键 | 身份证号码或员工号码(登录用) |
| gid | enum | 1,2,3,4 | | 组ID1=普通用户2=扫码员3=检测员4=超管) |
| wechat_openid | char | 29 | 唯一键 | 微信OpenID |
| is_del | enum | 0,1 | | 软删除 |
| create_time | datetime | | | 添加时间 |
| update_time | datetime | | | 更新时间 |
由于核酸检测中往往会存在混检的情况即多个人的检测样本可能会被混在一起进行处理因此在设计数据库表格时需要特别注意用户和检测管之间的关系。为了更好地处理这种情况我将用户与检测管的关系设计为多对多的关系即一个用户可能对应多个检测管一个检测管也可能对应多个用户。这样当出现混检情况时我们可以通过用户与检测管之间的关联表来准确地确定每个检测管中所包含的样本属于哪些用户从而可以快速地解决混检问题。下表是用户与检测管的关联表的表结构包括用户ID、检测管ID等字段这些字段将为用户和检测管之间的关系提供关键信息。
#### 表 用户-检测管关联表结构
| 字段名 | 类型 | 长度 | 索引及关系 | 注释 |
| - | - | - | - | - |
| id | int | 11 | 主键 | 主键ID |
| kid | int | 11 | 关联kit表id | 检测管ID |
| uid | int | 11 | 关联user表id | 用户ID |
| add_time | datetime | | | 添加时间 |
## 4.3 本章小结
本章详细介绍了核酸检测登记系统的系统设计。明确了系统设计的目标和预期的成果,为项目的顺利实施奠定了基础。设计实现了数据库的搭建,确保系统的数据存储和管理能够高效、稳定地运行。详细描述了系统的接口,以确保系统的各个模块之间能够良好地交互和通信。通过对系统接口的设计描述,为最后的相关系统的实现打下了坚实的基础。
# 第5章 系统实现
在本系统中,由于大多数接口都是常规的接口,所以我们在本章中主要着重介绍其中核心的功能以及技术。这些核心功能和技术对于系统的整体性能和可用性起着至关重要的作用。我们将详细介绍这些核心功能和技术的实现原理,包括其设计思路和代码实现等方面,以便读者可以更加深入地理解系统的工作原理和实现细节。
## 5.1 权限系统的实现
在一个系统中确保每个用户只能访问其被授权的资源是至关重要的。为了实现这一目标开发者需要采取措施来明确用户之间的权限区分。在我开发的系统中我使用了ThinkPHP框架提供的Controller的$beforeActionList属性这个属性可以在每个控制器方法执行之前调用指定的方法从而使得系统可以对用户的权限进行预处理。通过在$beforeActionList中设置适当的权限验证方法可以确保只有具备相应权限的用户才能够执行对应的操作。这种做法不仅可以提高系统的安全性还可以保护系统中的敏感信息不受未授权用户的访问。
所以我在我的大多数接口前都写了一个auth()函数,内容如下:
```php
protected $beforeActionList = [
'auth'
];
protected function auth(){
if (!session('user')) {
die(json_encode(['code'=>400,'msg'=>'请先登录']));
}
}
```
因为系统在登录时使用了Session存储用户信息所以通过这种方式就可以判断用户是否登录未登录用户将没有权限执行接下来的语句。
不过对于登录注册等功能不适用此方法,这时候将`$beforeActionList`中所调用的函数后面加一个值,例如:
```php
protected $beforeActionList = [
'auth' => ['except'=>'login,register']
];
```
就可以让这两个方法不调用`auth()`函数。
在此系统中为了确保不同用户能够获得其对应的权限我采用了gid进行区分。gid是指用户所属的组别在我的设计中不同的gid代表不同的权限级别。为了使系统更加安全我设置了一个权限门槛只有具备特定gid的用户才能够访问系统中的特定资源。例如以下代码
```php
if (session('user')['gid'] < 3) {
die(json_encode(['code'=>400,'msg'=>'权限不足']));
}
```
如果用户的gid值小于3即比检测员的权限小则表示其权限不足无法执行相应的操作我会通过在程序中判断用户的gid值如果用户权限不足则会返回一个错误提示并终止程序的执行。这种做法可以保护系统中的敏感资源不被未授权用户访问同时还可以防止潜在的恶意行为对系统造成损害。此外我还允许高权限的用户执行低权限用户的所有接口从而能够更加灵活地控制系统中的访问权限。这种做法可以为系统的使用者提供更加便利的操作体验同时还能够保护系统的安全性和稳定性。
## 5.2 数据增删改查的实现
在ThinkPHP5.1框架中我们可以使用think\Db类来访问数据库。考虑到系统需要具备高性能的特点我在使用数据库时使用了Db::execute和Db::query方法而不是使用构造器或者模型来实现数据操作。这是因为使用构造器或者模型会增加系统的复杂度和开销而Db::execute和Db::query方法能够更加高效地实现数据操作从而提升系统的性能。同时为了保证系统的安全性我在使用Db::execute和Db::query方法时采用了参数化的方式来进行数据查询和更新操作避免了SQL注入等安全问题。参数化查询能够通过将参数传递到查询语句中从而防止恶意用户通过在查询参数中插入恶意代码对系统造成安全威胁。
在设计查询接口时我为了进一步提高系统的运行效率使用了SQL_CALC_FOUND_ROWS关键字来统计查询结果的总条数。相比于使用COUNT()函数使用SQL_CALC_FOUND_ROWS可以减少不必要的查询次数从而更加高效地实现数据的查询和处理<sup id="al13">[[13]](#ref13)</sup>。这是因为在使用COUNT()函数时需要进行两次查询第一次查询结果记录数第二次查询结果数据而使用SQL_CALC_FOUND_ROWS则只需要进行一次查询同时还能够获得查询结果的总条数这种做法能够节省系统的运行时间和资源开销从而提升系统的性能和用户体验。例如获取公告列表方法
```php
public function read($offset = 0, $limit = 10){
return json(['code'=>200,'msg'=>'获取成功','data'=>Db::query("select SQL_CALC_FOUND_ROWS id, title, content, media_url, create_time, update_time from notice where is_del='0' limit ?,?",[$offset,$limit]),'count'=>Db::query("select FOUND_ROWS() as count")[0]['count']]);
}
```
## 5.3 核酸检测的实现
在微信网页开发中,为了保证安全性,微信官方要求从后端调用微信公众号接口获取凭据<sup id="al14">[[14]](#ref14)</sup>,然后在前端注入后才可以使用诸如扫码等功能。在使用扫码功能时,对于管码只处理条形码,添加用户时只处理二维码。
另外,用户的二维码除了用户本身的信息以外,还有红黄绿三种颜色。这三种颜色是根据最近的核酸结果得出,如果七天未检查为黄色,七天内最后一次检查为阴性为绿色,阳性为红色。
在实现扫码功能时,为了保证系统的高效性,我们会将需要提交至后端的数据在一个变量中进行处理,最终收集齐所有信息再一次性提交。这种做法能够降低整个服务器的压力,提高系统的性能表现。
在此之后,检测员将会使用后台界面去修改核酸状态。修改后,用户就能及时收到检测结果。并显示在用户检测的历史记录中。
## 5.4 微信公众号异步发送通知的实现
在本系统中,用户需要通过微信公众号接收核酸检测的结果。当检测员得出结论并修改核酸结果后,用户就能收到核酸检测的结果。
收到通知后可以在近7次核酸检测中看到结果这个结果是使用一条联表查询得出
```php
Db::query("SELECT user.`name`, kit.`status`, user_kit.add_time FROM user_kit INNER JOIN kit ON user_kit.kid = kit.id INNER JOIN `user` ON kit.fuid = user.id WHERE user_kit.uid = ? ORDER BY user_kit.add_time DESC LIMIT 7", [session('user')['id']])
```
然而调用微信公众号接口通知用户的速度较慢可能会导致用户体验不佳。为了避免这种情况的发生我使用了php-fpm专有的函数fastcgi_finish_request()来实现此功能。
fastcgi_finish_request()函数可以将响应发送到客户端然后继续处理其他任务从而提高系统的响应速度和性能。在我的设计中当检测员修改核酸检测结果后我在调用微信公众号接口通知用户之前先使用fastcgi_finish_request()函数将响应发送给客户端。这样一来,系统就可以在发送响应的同时,继续执行其他任务,从而避免了用户等待时间过长的问题,提高了系统的响应速度和用户体验。
## 5.5 公众号界面的菜单实现
为了更方便地设计菜单我选择使用回复信息来承载菜单。具体实现方法如下首先在定义微信内置的菜单时我设定了一个带有click事件的按钮。然后在我的回调地址中监听这个事件一旦收到了点击事件就会触发回复菜单的操作。这样就可以很轻松地获取用户信息并根据用户的权限来判断可以使用哪些选项从而实现更加个性化的菜单设计。
为了保证系统的高效运行我在这里的实现中使用了cache去缓存用户信息。这种做法的好处在于它可以避免因为数据库过慢而导致的性能问题同时还可以让菜单更快速地返回。具体来说当用户进行菜单操作时系统会首先检查cache中是否存在该用户的信息。如果存在则可以直接从cache中获取用户信息而无需再次访问数据库从而大大提高了系统的响应速度。而如果cache中不存在该用户的信息则会去数据库中获取并将获取到的信息缓存到cache中以供下一次使用。
## 5.6 本章小结
在前几章的内容基础上,本章详细阐述了系统的具体实现过程。考虑到篇幅限制,我们选择了一些关键技术作为示范进行说明。包括了系统的一些重要功能和实现。
# 第6章 系统测试
## 6.1 测试概述
核酸检测登记系统是一种用于信息收集的软件,其研发和使用对于疫情的防控具有十分重要的意义。本章旨在对核酸检测系统进行测试,并对测试过程和结果进行概述。
测试的目的是为了验证核酸检测系统在生产环境下的性能、可靠性、安全性以及交互性等方面是否符合需求和用户期望,同时确保系统的完整性和稳定性。测试的对象包括系统的功能、性能、接口、兼容性、安全等各个方面。在测试过程中,我们还将发现问题和瑕疵,并提出改进建议,以确保系统能够更好地满足用户需求。
在功能性测试阶段,我们将测试每个功能的正确性、完整性和易用性,以确保系统能够按照用户需求稳定运行,并关注客户需求,提高用户满意度。在兼容性测试中,我们将测试核酸检测系统的兼容性。在性能测试中,我们将测试系统的响应时间、资源使用率和负载能力等,以确保系统具备高效、快速和高性能的特点。
此外,测试活动还关注了其他方面的问题,如数据安全、网络安全和用户体验等。我们测试了数据的保密性和完整性,网络通信的防伪保密等方面,并检查软件是否易于使用,是否具有直观性、一致性和可信度等特点。
## 6.2 关键环境测试
在开发过程中,环境测试的重要性不言而喻。在测试过程中,尽可能多地考虑不同软硬件条件下的情况可以最大化地发现问题。因此,建议在不同的操作系统环境和不同的计算机硬件环境下进行测试<sup id="al15">[[15]](#ref15)</sup>
对于关键测试的软件环境我们的程序主要是在微信客户端上运行因此测试主要针对微信上的运行环境进行。其次我们也在Android系统、iOS系统以及Android模拟器上进行了测试除此之外还有后端API接口是在服务器上运行也会对其进行测试具体测试内容如下表所示
#### 表 关键环境测试列表
| 软件环境 | 硬件环境 | 软件 | 测评对象 | 能否使用 |
| - | - | - | - | - |
| Android 12 | Redmi K20 Pro | 微信 | 公众号页面 | 能 |
| iOS 13 | iPhone 12 | 微信 | 公众号页面 | 能 |
| Android 12 | Xiaomi 12 | 微信 | 公众号页面 | 能 |
| Android 13 | WSA模拟器 | 微信 | 公众号页面 | 能 |
| MacOS 13 | Macbook Pro | PHP | 后端API | 能 |
| Ubuntu 22 | 阿里云服务器 | PHP | 后端API | 能 |
| Windows Server 2022 | 阿里云服务器 | PHP | 后端API | 能 |
## 6.3 软件性能测试
性能测试是一种测试方法,用于测量软件系统在不同的工作负载下的性能、稳定性和可靠性,以确定系统性能瓶颈和性能瓶颈的原因。在设计性能测试时,需要考虑系统的关键性能指标,并设计测试用例以验证这些指标。对于本系统来说,响应时间和并发数是比较重要的性能指标,因此,在设计性能测试时主要针对这两点进行测试<sup id="al16">[[16]](#ref16)</sup>
为了测试系统的性能,我们以后台登录为示例,设计了一个性能测试用例表,结果如下表所示。
#### 表 性能测试用例表
| 用例名称 | 描述 | 预期结果 |
| - | - | - |
| 正常登录测试 | 输入正确的用户名和密码,登录系统 | 登录响应时间在3秒以内用户能够成功登录系统 |
| 错误用户名测试 | 输入错误的用户名和正确的密码,尝试登录系统 | 登录响应时间在3秒以内系统提示用户名或密码错误 |
| 错误密码测试 | 输入正确的用户名和错误的密码,尝试登录系统 | 登录响应时间在3秒以内系统提示用户名或密码错误 |
| 多用户并发测试 | 多个用户同时登录系统 | 系统能够处理多个用户的请求并保持响应时间在3秒以内 |
| 长时间登录测试 | 单个用户长时间登录系统 | 系统能够保持响应时间稳定,并不会出现登录超时或登录失败的情况 |
## 6.4 测试功能及测试用例设计
设计测试用例是为了检查程序路径是否满足某些特定要求,测试用例包含实际测试输入、执行条件和预期结果。整个测试任务的核心工作在于测试用例的设计,因为好的测试用例可以直接揭示系统中的潜在问题。通过解决这些潜在问题,可以大幅提升系统的性能和用户体验。在功能测试过程中,测试用例的设计一般包括四个部分:主题、前提条件、执行步骤和期望输出结果。以下以进行核酸检测接口为例设计测试用例,并总结测试结果<sup id="al17">[[17]](#ref17)</sup>
针对核酸检测接口进行测试后,对测试结果进行了分析:所有测试结果都与预期输出结果一致,表明该用例的功能测试已经完成。测试表明,本系统能够达到与测试性能相应的要求,并且成功地完成了相应的功能。
## 6.5 本章小结
在本章中,首先简要介绍了软件测试的必要性和常见的测试方法。接着,我们详细讲解了如何进行软件环境和软件性能测试,包括性能测试中的负载测试、压力测试等。最后,我们以核酸检测功能为例,设计了测试用例并进行了用例测试,得到了丰富的测试结果和数据,帮助我们评估软件的稳定性和可靠性,以及发现和修复潜在的问题和漏洞。
# 第7章 结论
## 7.1 总结
在这次的软件设计过程中,我采用了系统化的方法来确保最终的系统能够满足用户的需求和期望。首先,我进行了详细的需求分析,明确了系统的核心功能和特点。在这个过程中,我深入研究了中外核酸管理系统,学习借鉴了其中的经验和教训,从而能够更好地理解核酸数据的隐私和安全问题。因此,在系统设计中,我注重了权限验证和安全措施,以确保用户的数据不会被恶意使用或泄露。同时,我也考虑到用户的使用体验,优化了交互方式,让系统更加易于使用和友好。
在流程梳理过程中,我将整个系统的业务流程进行了详细的拆分和设计,通过建立流程图来清晰地表达系统的运作方式。我采用了敏捷开发的方法,将整个开发过程划分为多个迭代,每个迭代都可以快速交付可用的功能模块,以确保系统可以逐步完善。在这个过程中,我进行了前后端的沟通和协作,以及技术的不断学习和探索,以便更好地解决遇到的挑战和问题。
在开发过程中我遵循了代码规范和工程管理标准采用了Git等工具进行版本控制和团队协作。我使用了ThinkPHP框架和MySQL数据库进行开发并对系统进行性能和安全方面的优化以确保系统的可靠性和稳定性。我深入研究了框架和数据库的细节并对它们进行了合理的调优从而提高了系统的运行效率和安全性。
同时,我们还进行了系统的测试和优化。在测试过程中,我们对系统进行了功能测试、性能测试、安全测试等多个方面的测试,以确保系统的功能符合要求、性能稳定高效、安全性强。在测试中发现的问题,我们及时进行了优化和修复,确保了系统的稳定性和可靠性。
在整个开发过程中,我们遇到了很多挑战和问题。例如,开发周期紧张、需求变化频繁、技术不熟悉等。但是,通过加强前后端的沟通和协作,以及技术团队的不断学习和探索,我们逐步解决了这些问题,并最终实现了一个高效、稳定、安全的系统。
综上所述基于ThinkPHP的核酸检测登记系统的设计与开发是一项非常具有挑战性的工作。通过对需求分析、流程梳理、开发过程等的认真规划和实践最终我们成功地实现了一个高效、稳定、安全的系统能够为疫情防控工作做出贡献。
## 7.2 展望
虽然疫情已经结束,但是可以将登记系统进一步完善,以适应未来的发展需求。以下是三个可以实施的改进方案:
首先,可以增强数据分析功能。通过积累更多用户数据,我们可以进行更全面的数据分析和处理,从而提供更准确、有用的信息和分析结果。例如,我们可以分析疫情传播趋势、用户行为模式等,为政府和医疗机构提供更有效的决策支持。
其次,可以增加预约功能。现有系统只能登记用户信息和检测结果,但未来我们可以考虑增加预约功能,让用户能够在线上进行检测预约。这样用户就可以更方便地安排行程,同时也可以减少排队等待时间。
第三,可以引入自动化处理技术,如人脸识别技术等,以实现自动识别用户信息和检测结果。这样就可以减少人工处理的时间和工作量,提高工作效率。
未来,如果有机会,我们可以让这个系统发挥更多的作用,比如在未来的其他疫情中起到重要的作用。我们可以引入更多的功能和技术,以满足未来需求的变化,从而更好地保障公共卫生和社会安全。
# 参考文献
1. <span id="ref1"><a href="#al1">^</a></span> 靳英辉,蔡林,程真顺,等. 新型冠状病毒(2019-nCoV)感染的肺炎诊疗快速建议指南(标准版)[J]. 解放军医学杂志,2020,45(01):1-20.
2. <span id="ref2"><a href="#al2">^</a></span> 宗晓祥,胡云,马利亚.核酸检测云平台的设计与实现[J].集成电路应用, 2022, 39(10): 47-49.
3. <span id="ref3"><a href="#al3">^</a></span> Shaun Griffin. Covid-19: NHS England should manage test and trace system, says Independent SAGE[N]. BMJ,2020,371:m4330
4. <span id="ref4"><a href="#al4">^</a></span> Simon Judith,Rieder Gernot. Trusting the Corona-Warn-App? Contemplations on trust and trustworthiness at the intersection of technology, politics and public debate[J]. European Journal of Communication,2021,36(4).
5. <span id="ref5"><a href="#al5">^</a></span> 喻健,鲍琪. 基于ThinkPHP的人口信息系统设计[J]. 信息技术与信息化,2022,(02):9-12.
6. <span id="ref6"><a href="#al6">^</a></span> 蒋先梅. 基于PHP的学生信息管理系统的设计与实现[J]. 无线互联科技,2023,20(01):45-47.
7. <span id="ref7"><a href="#al7">^</a></span> 谷恪忱. 基于ThinkPHP框架的工控品采购平台设计与实现[J]. 软件工程,2020,23(03):53-59.
8. <span id="ref8"><a href="#al8">^</a></span> 赵莹,胡畅达,王国宇. 三种关系型空间数据库比较[J]. 科技创新与应用,2021,11(19):62-64.
9. <span id="ref9"><a href="#al9">^</a></span> 李琦,姚龙. 基于REST架构的湖泊环境监测物联网平台[J]. 计算机工程,2016,42(11):27-31+37.
10. <span id="ref10"><a href="#al10">^</a></span> 卢彦晓. 浅谈前后端分离技术在权限管理系统中的应用[J]. 电脑知识与技术,2021,17(34):68-69.
11. <span id="ref11"><a href="#al11">^</a></span> 张然,孙浩,张鑫. 基于JavaWeb的阿尔茨海默症早期康复系统设计[J]. 电子技术与软件工程,2022,(23):259-262.
12. <span id="ref12"><a href="#al12">^</a></span> 杨中书,刘臣宇. 基于E-R模型的关系数据库设计方法[J]. 价值工程,2014,33(30):242-243.
13. <span id="ref13"><a href="#al13">^</a></span> 黄金春,杜娟娇. 编写web服务器远程查看mysql数据[J]. 信息系统工程,2009,(07):26-29.
14. <span id="ref14"><a href="#al14">^</a></span> 陶亮亮. 基于微信公众号的掌上医院的设计与实现[J]. 电脑知识与技术,2022,18(09):46-48.
15. <span id="ref15"><a href="#al15">^</a></span> 陈莎莎. 基于JSP网页技术的高校PU系统功能可视化界面设计[J]. 自动化与仪器仪表,2023,(02):146-151.
16. <span id="ref16"><a href="#al16">^</a></span> 纪芩. 基于云平台的软件性能测试技术分析[J]. 电子技术与软件工程,2022,(23):74-77.
17. <span id="ref17"><a href="#al17">^</a></span> 刘肖. 基于JSP+MySQL的供电管理系统的设计与实现[D].电子科技大学,2021.

View File

@ -1,33 +0,0 @@
---
layout: post
title: 分享一种无人值守的新型诈骗手段
tags: [骗子, 诈骗]
---
差点就被骗子骗了🤣,还是主动上钩的……<!--more-->
# 起因
今天因为某些原因从网上随便搜了一个公共的接码平台用,接完自己要用的短信之后突然瞥到这么一条信息:
> NEW BlTMØ L0GlN \|\| www.Bitmo.vip \|\| Username:Huzhou Pa**word:4894688 BaIance:65.77BTC.........
我没怎么注意这条信息的意思但是既然有网站名用户名和密码自然会不由自主的想去登录一下啦然后就会看到账户里有巨额的财产。我登录的时候账户里面还有67BTC换算下来大概有**1400wCNY**的样子。
# 落入圈套
刚开始我打开这个网站的时候还没意识到这是个诈骗网站还以为是哪个交易所不过既然登录上来了自然想看看登录账号后的网站都有些啥功能首先看到的就是些充值、提现、转账和开票之类的功能看上去好像还挺像回事的不过试了几下除了转账之外的其他功能其实是没法用的充值和开票需要用到安全密钥而提现除了需要用到安全密钥外系统说账户因为1年没提现了所以提现功能被禁用了但是仍然可以转账:
> Withdrawal to your registered ฿itcoin wallet address has been disabled because you haven't withdrawn for more than 365 days. To reactivate withdrawal you need to contact customer care and provide your secure key you created during account registration.
> You will still be able to carry out transfers and transactions from your account balance to other BITMO VIP members without your secure key for the next 6 months.
于是我想都没想就注册了一个账户想着既然有这个功能就给自己转点钱呗。注册好账户以后发现我是免费账户除了开通VIP外什么功能都用不了而开通VIP至少要充0.004BTC进去大约相当于800多CNY。当然VIP我是不可能开的我打算先试试转钱到我的账户中。
在转账的过程中一次最多只能转出0.2BTC而且同一个IP似乎只能转一次。我试着转了0.2BTC到我的账户中想不到还成功了😨毕竟0.2BTC也相当于4w多CNY呢于是我换了一个IP又转了一次也成功了不过第三次会失败貌似免费账户最多只能接受0.4BTC。随后我登录到我的账户上看了一眼我以为转完之后我会直升VIP6结果系统显示免费账户不能接受转账必须开通VIP才可以
> Hello MAYX, the user HUZHOU has recently tried to transfer 0.40000 ฿TC ($ 12088.33) to your account. Our system witheld the transfer because free-trial accounts cannot send or receive Bitcoin through our service. Once you make an investment in any of our VIP plans, our system will automatically add the 0.40000 ฿TC ($ 12088.33) to your VIP account balance.
# 产生怀疑
这时候我开始怀疑这个网站的身份了我看了一眼帮助显示这个平台是一个2014年创立的平台可是我搜了一下域名的WHOIS发现它是2023-05-28创建的……也就不可能存在有大佬在一年或者更早存这么多钱进去了。Google搜索了一下这个平台也没有相关的结果看来是诈骗网站没错了。毕竟就算是最低的VIP也要不少钱充进去能把那0.4BTC拿到的概率只能说是0%……可惜错失了一次发财的机会啊🤣。
之后看了看它的源代码,里面怎么还有中文🤣,原来是国人开发的诈骗网站。仔细看了看结果发现其他功能的报错都是硬编码的,根本就没有请求服务器😅。
# 感想
前两次收到的诈骗邮件[富婆找对象](/2019/06/10/cheat.html)和[被拍糟糕视频](/2021/11/28/spam.html)两个可以说是真的傻子才会相信,因为内容太离谱了,能上当的人太少了,而且我发完邮件他们还得回复,效率也很低下。这次遇到的这个诈骗就好多了,让被骗的人很有参与感,而且建好网站之后什么都不用做,只要等着有人打钱就好,效率非常高,而且做的还挺像回事,估计被骗的人不会少。
不过之后想想也是,这种短信大概率就是那种群发的垃圾短信,实际上主动登录的人应该也不多吧😂。

View File

@ -1,129 +0,0 @@
---
layout: post
title: 如何让Python脚本接收OAuth2.0的Code
tags: [Python, 服务器, OAuth]
---
越简单,就越复杂。<!--more-->
# 起因
最近我在写一个在Windows上运行的Python脚本需要做一个类似于第三方登录的功能。一般来说像这种东西都是使用的OAuth2.0来做认证我接入的平台没有悬念的也是使用的这个东西其中的重点就是获取到第三方网站的授权码Code然后用它换取用户信息。于是我就在想怎么做比较好呢
# 解决方法
## 1. 使用URI Scheme
我看VSCode在实现类似功能的时候似乎用到了URI Scheme就是在系统中注册一个伪协议然后通过这个伪协议来调用程序实现获取Code方法很简单首先先在注册表里导入
```ini
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\mayx]
"URL Protocol"="D:\\mayx.exe"
@="MayxProtocol"
[HKEY_CLASSES_ROOT\mayx\DefaultIcon]
@="D:\\mayx.exe,1"
[HKEY_CLASSES_ROOT\mayx\shell]
[HKEY_CLASSES_ROOT\mayx\shell\open]
[HKEY_CLASSES_ROOT\mayx\shell\open\command]
@="\"D:\\mayx.exe\" \"%1\""
```
然后编写一个Python脚本并用Pyinstaller打包
```python
import sys
print(sys.argv[1])
```
最后将回调地址填为“mayx://get”这样认证完成之后就会像这样调用程序“D:\mayx.exe mayx://get?code=something”再用urllib简单做个解析就完成了。
这样看起来是不是非常的简单看起来确实是挺简单的可惜坑比较大第一个是像上述这样的注册表有些杀毒软件会拒绝导入因为像“shell\open\command”这种东西被病毒啥的滥用的地方太多了除非软件通过了数字签名或者某些认证否则正常情况下根本没法导入。二是不是所有的第三方平台都支持伪协议的方式调用不过我试了一下我用的那个平台倒是支持😂除了杀毒软件比较讨厌之外其他的倒还好。
## 2. 使用http服务监听
很多跨平台的程序像有些主要在Linux上运行的某些程序就喜欢在获取Code的时候启动一个简单的web服务。其实用这个方法的话可能还更方便一点不容易出问题。
### 使用Flask实现
最开始我想着要不然就用Flask来实现这个功能吧实现起来也简单写起来就几行
```python
from flask import Flask, request
code = ""
app = Flask(__name__)
@app.route('/getcode')
def get():
global code
code = request.args.get("code")
shutdown = request.environ["werkzeug.server.shutdown"]
shutdown()
return "OK"
app.run(host="127.0.0.1",port=8000)
print(code)
```
看起来也确实很简单功能实现的也很完美但是有个问题是总感觉用Flask做这么简单的事情实在是大材小用打包成程序也要占不少空间另外就是这个方法已经被弃用了感觉就是很不爽。那要说不爽的话怎么才爽呢
### 使用socket实现
我想起来之前期末时写的期末作业[socket-bbs](https://github.com/Mabbs/socket-bbs)这就是用socket实现的一个简单的论坛那我这么简单的功能想来用socket实现不是很好吗于是就写了一个这段代码没有测试因为这个方法不能用所以把代码删了这是重新做的
```python
import socket
import urllib.parse
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #打开一个网络连接
server.bind(('127.0.0.1',8000)) #绑定要监听的端口
server.listen(5) # 设置最大的连接数量为5
code = ""
while True:
sock, addr = server.accept() # 建立客户端连接
data = sock.recv(8192).decode('utf-8').split('\r\n')#接收TCP数据,数据以字符串的形式返还
if not data[0]:
sock.close() # 关闭连接
continue
url = urllib.parse.urlparse(data[0].split()[1])
if url.path == '/getcode':
query = urllib.parse.parse_qs(self.data)
code = query["code"][0]
sock.send(("HTTP/1.0 200 OK" + '\r\n').encode('utf-8'))
sock.send(("Content-Type: text/html; charset=utf-8" + '\r\n').encode('utf-8'))
sock.send('\r\n'.encode('utf-8'))
sock.send("OK".encode('utf-8')) #发送TCP数据
sock.close() # 关闭连接
break
else:
sock.send(("HTTP/1.0 404 Not Found" + '\r\n').encode('utf-8'))
sock.send(("Content-Type: text/html; charset=utf-8" + '\r\n').encode('utf-8'))
sock.send('\r\n'.encode('utf-8'))
sock.send("Not Found".encode('utf-8')) #发送TCP数据
sock.close() # 关闭连接
print(code)
```
看起来是不是复杂多了?其实大多数时候工作的好像挺正常的,但是不知道为什么莫名其妙第一次访问的时候会卡住,改了半天头都大了,于是就只好放弃这种方法了……
### 使用http.server实现
这时候我突然想到我平时用来传文件用的python自带的模块http.server既然这个模块是自带的大小应该大不到哪去吧随后我就写了一个
```python
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
import urllib.parse
code = ""
class Resquest(BaseHTTPRequestHandler):
timeout = 5
def do_GET(self):
url = urllib.parse.urlparse(self.path)
if url.path == "/getuser":
self.send_response(200)
self.send_header("Content-type", "text/html") # 设置服务器响应头
code = urllib.parse.parse_qs(url.query)["code"][0]
buf = '''OK'''
self.wfile.write(buf.encode())
self.server.shutdown()
else:
self.send_response(404)
self.send_header("Content-type", "text/html") # 设置服务器响应头
self.end_headers()
buf = '''Not Found'''
self.wfile.write(buf.encode())
host = ("127.0.0.1", 8000)
server = ThreadingHTTPServer(host, Resquest)
print("Starting server, listen at: %s:%s" % host)
server.serve_forever()
server.socket.close()
print(code)
```
最后打包试了一下功能正常虽然还是大了点不过比Flask小😁。其实我在写这个代码的时候最开始不知道要在最后加上`server.socket.close()`一开始写的时候总是遇到程序执行完之前端口必定不会释放令人很烦直接搜也没什么好的结果不过问了下ChatGPT立马就解决了🤣它说
> 当你调用`server.shutdown()`来停止服务器时它会停止接收新的连接并关闭已有的连接。但是由于Python的socket库的设计socket对象并不会立即释放端口。相反它会在一段时间内处于TIME_WAIT状态以确保在网络中所有挂起的数据都被正确传递或丢弃。这是一种网络协议的要求称为"TCP TIME_WAIT"状态。
AI还真是方便啊……
# 感想
解决这么一个小问题却一时半会拿不下最合适的方案这难道就是了解太多的副作用吗😝不过最终来看还是AI厉害一下子就解决了我的问题。

View File

@ -1,27 +0,0 @@
---
layout: post
title: 关于卫星通信的一些看法
tags: [卫星, 通信]
---
卫星通信也许并不困难😁<!--more-->
# 起因
前段时间华为出了一款可以打卫星电话的手机——Mate 60 Pro。我虽然对华为不怎么感兴趣对于它能把3年前的芯片卖到7K+CNY的营销水平也不感兴趣但是对于卫星通信我还是挺感兴趣的所以今天我就想说说我了解到的一些关于卫星通信的东西。
# 关于卫星通信
其实卫星通信在我们身边非常的常见最常见的应该就是GNSS了现在不仅手机可以通过卫星来导航连各种各样的物联网设备也可以做到。不过这和卫星电话还是有点区别因为卫星电话是双向通信但是导航卫星是单向通信手机通过卫星广播的位置信息以及一些信号差分等方式来计算出当前的坐标所以连接导航卫星并不需要很长的天线因为它不需要发射信号。
和这个类似的还有卫星电视虽然卫星电视也不需要双向通信但是可能因为它带宽比较大然后稳定性要求比较高所以大多需要一个接收锅来接收卫星信号。不过也许我说的是错的以前在智能手机不太流行的时候有一种能在小型设备上观看的卫星电视叫做CMMB那个就是在手机上拉出一条天线就可以看电视了不过我不太确定这个是通过卫星还是通过地面中继的方式工作的也许两个都有我记得这个似乎在房间里面也能收到信号不太确定这小小的天线是不是真的能连接到卫星。
除了这些之外还有一些搞业余无线电之类的人可以从国际空间站上通过SSTV之类的方式发送比如在太空中拍的图片啥的不过我不太了解这些😂就不多说了。
至于双向通信可能日常遇见的比较少,可能比较常见的就是有些电视台会使用卫星来转发信号之类的,还有就是打国际长途的时候似乎也是通过卫星来转发的。当然做这些操作的设备一般天线都非常大。
小的倒也不是没有有些比较高级的车上面会搭载车载卫星电话在紧急救援的时候就可以使用当然普通的卫星电话也不大只不过一般都会带折叠天线价格倒是也还好便宜的也有2K多。除了卫星电话之外可能最知名的就是星链了那个也是使用的是卫星锅来上网不过因为是近地卫星而且数量众多所以速度要比通讯卫星的速度快得多。
除此之外我之前还看过一位大佬[用卫星和世界各地的人通信](https://blog.aoaoao.me/p/amateur-satellite/),不过那个天线比较大,还要手动操作😂。
# 关于华为卫星电话的看法
综上所述,华为新出的卫星电话能不使用外置天线就能使用卫星电话似乎确实挺厉害的?不过因为我没用过普通的卫星电话所以不太清楚,如果普通的卫星电话不需要转手机来寻星,那华为的卫星电话可能算不了什么,毕竟那么大个直板机,把自己当天线也不是什么难事。不过如果普通的卫星电话也需要瞄准卫星才能通信,那华为应该还是有点水平的。
我看过几个这个手机拆解视频,不过到处都没有看到明显的天线痕迹,卫星电话应该需要一个比较大的天线吧……那它能把天线藏到哪里呢?我想那个巨大的均热板会不会是天线呢?本来就是铜的,当个天线可能也是正常的吧,不过我毕竟在云,也不能完全确定😂。
至于在智能手机上增加卫星电话的功能……其实我觉得这是个莫名其妙的行为可能主要还是为了营销从价格上来说3K买个卫星电话+3K买个SOC是骁龙8gen2的手机例如红米K60 Pro也比华为Mate 60 Pro便宜而且灵活性和手机性能都更好我不知道增加了这个卫星电话功能对手机成本的增加到底有多少如果很多的话我想除了脑子有病的厂商才会去干这件事毕竟绝大多数的情况都用不到卫星电话很多时候没有移动信号的时候同样也接收不到卫星信号比如埋在废墟中或者在电梯中等除此之外还只能使用中国电信的SIM卡才能使用还要开通套餐还只能使用天通卫星去远一点的海上旅个游是不是又得买别的卫星电话😅。当然如果成本很低比如确实就是均热板另外加个芯片就能用那我觉得还行就是销售价格太贵不过是公司想多赚点嘛这能理解😆。
至于有些人说的布局6G那就更扯了如果真的6G是卫星网络那不可能不加天线我相信没人会想瞄着卫星上网吧而且卫星网络无论如何都没办法做的比地面基站更快总不至于6G比5G还慢吧🤣。
# 感想
卫星通信看似高级,不过本质其实就只是和飞的比较快(同步卫星可能不需要考虑这个吧……),离得比较远 ~~(几万公里其实还挺远的🤣)~~ 的无线电台通信罢了再简单点拿个激光笔都能和几公里外的人通信所以这真不是啥难事想想人类都能和飞了不知多远的旅行者1号通信是不是觉得其实还好呢

View File

@ -1,65 +0,0 @@
---
layout: post
title: 在树莓派4B上安装Ubuntu以及各种操作
tags: [树莓派, Ubuntu]
---
明明在普通的电脑上也能完成这些操作……😥<!--more-->
# 起因
自从上次我给我的树莓派4B-8GiB内存版[安装了Windows11](/2023/05/22/rpi-win.html)以后我感觉这个东西上是真的鸡肋速度慢而且兼容性还差指令集有缺失连很多需要用到加密库的软件都不能正常运行……后来我就重装了一个ESXi-Arm Fling但是装这个也有个问题就是它不能使用TF卡存储东西我还特地为了Windows买了个64GiB的TF卡结果装虚拟机还用不了😂U盘我也只有一个32GiB的ESXi-Arm Fling如果想要正常的存储配置信息就至少需要占用掉3*4GiB的空间这样虚拟机就只能使用20GiB的空间……真的全都是垃圾20GiB能开几个虚拟机啊开了也没啥能用的。所以这个树莓派就一直在吃灰。
后来我又想整点活想着干脆安装个Ubuntu好了反正放着也是吃灰也错过了最佳卖树莓派的机会就用起来吧安装Ubuntu的时候居然也是各种碰壁😓一开始我用树莓派镜像烧录器闭着眼睛直接选了Ubuntu Server系统我还以为它可以像安装树莓派系统那样第一次启动的时候让我设置密码结果烧录完之后引导就直接让登录了我连密码都不知道要怎么登录啊😥网上搜了一下有默认密码输进去之后显示需要让我更改密码结果这个需要更改的密码怎么设置都不能生效😰后来去Ubuntu官网看了一眼才知道原来需要在烧录中选择高级设置手动设置密码才行……网上这些教程都是垃圾这个软件也一样🤬啥提示都没有不看文档就只能靠猜了😢。
最后终于把Ubuntu安装好了可以开始整活了😁。
# 用树莓派整点什么
## 整点FM电台
安装好Ubuntu后我最先想干的事情还是整[FM电台](/2022/03/27/radio.html),毕竟这真的就是树莓派唯一和其他设备不一样的地方了啊,于是我就编译了一下[PiFmAdv](https://github.com/miegl/PiFmAdv)并运行,结果不知道为什么一运行树莓派就直接死机……于是我退而求其次,选择了[fm_transmitter](https://github.com/markondej/fm_transmitter)这个倒是能运行不过操作和树莓派3B区别相当大首先编译得要用`make GPIO21=1`然后杜邦线也要插到第40个接口具体如下图打x的位置
```
,--------------------------------.
| ooooooooooooooooooox J8 +======
| 1ooooooooooooooooooo PoE | Net
| Wi 1o +======
| Fi Pi Model 4B V1.4 oo |
| ,----. +---+ +====
| |D| |SoC | |RAM| |USB3
| |S| | | | | +====
| |I| `----' +---+ |
| |C| +====
| |S| |USB2
| pwr |hd| |hd| |I||A| +====
`-| |---|m0|---|m1|----|V|-------'
```
CPU和GPU也全部需要定频运行另外设置频率不能超过93 MHz……我调了半天才能正常运行……还有就是不像之前PiFmAdv那个项目可以使用立体声感觉树莓派4B还不如3B……
不过我写着写着感觉好像不太对劲看了一眼我上次写电台的那篇文章的时间比PiFmAdv最后一次更新还要早看了一眼提交发现人家已经把问题解决了难怪我运行不起来原来是代码没用最新的🤣刚刚更新了一下代码之后再运行已经没有任何问题了立体声啥的都能正常使用了。不过Makefile还是没改……aarch64的系统运行依然会出问题😥……其实改起来也很简单把Makefile里面的两个参数换成
```Makefile
CFLAGS = $(STD_CFLAGS) -march=armv8-a -ffast-math -DRASPI=4
TARGET = pi4
```
就可以正常编译了。
## 整点大语言模型LLaMA
因为我的树莓派有8GiB内存之前我在我的8GiB内存的[MacBook Pro上跑LLaMA](/2023/04/05/ai.html)都没问题那在树莓派上跑个LLaMA应该也没问题所以就想试试看。跑起来非常简单把[llama.cpp](https://github.com/ggerganov/llama.cpp)拉下来然后直接编译就行了但是实际跑起来速度非常慢大概1token要1-2秒……根本用不成不过现在的llama.cpp已经非常完善了支持各种各样的硬件加速无论是在我的MacBook上还是用N卡、A卡甚至手机使用OpenCL似乎都可以进行硬件加速。这些都能得到很不错的速度那树莓派呢树莓派用的好像是博通的叫什么VideoCore的显卡我搜了一下貌似没有办法使用OpenCL……不过搜的过程中发现似乎可以[装Vulkan](https://qengineering.eu/install-vulkan-on-raspberry-pi.html)虽然llama.cpp不能使用Vulkan不过ncnn框架似乎可以使用Vulkan跑个waifu2x也算不浪费这个树莓派的GPU啊只是安了半天发现不连接屏幕貌似安了也识别不了……所以还是算了吧……
## 整点QEMU-KVM Windows虚拟机
当时我在树莓派上安装Windows11的时候听说在虚拟机上运行的效果要比裸机安装效果更好我听到之后认为这是胡说八道哪有虚拟机比裸机运行效果好的啊不过树莓派嘛……说不定会有因为驱动不完整之类的情况毕竟如果是在虚拟机里安装系统外面的Linux系统可以使用无线网卡而直接安装Windows是不能使用无线网卡的所以这次我也打算试试看反正树莓派上使用虚拟机是可以使用KVM加速的所以试试也没关系。
安装QEMU也很简单直接执行
```bash
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager qemu-system-arm qemu-efi-aarch64 seabios vgabios
```
就可以了安装系统的话也很简单首先去下载Windows所需要的驱动[virtio-win](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/)然后下载Windows ARM版的安装光盘这个去MSDN I tell you下载就行了之后下载一个VNC客户端用来连接虚拟机的屏幕然后创建硬盘
```bash
qemu-img create -f vhdx -o subformat=fixed system.vhdx 30G
```
准备好这些以后就可以启动虚拟机了,启动的命令如下:
```bash
sudo qemu-system-aarch64 -M virt-2.12 -smp 4 -m 4G -cpu host -enable-kvm -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd -device ramfb -device qemu-xhci,id=xhci -usb -device usb-kbd -device usb-mouse -device usb-tablet -k en-us -device virtio-balloon -device virtio-rng -device virtio-blk,drive=system -drive if=none,id=system,format=raw,media=disk,file=system.vhdx -device usb-storage,drive=install -drive if=none,id=install,format=raw,media=cdrom,file=win10.iso -device usb-storage,drive=drivers -drive if=none,id=drivers,media=cdrom,file=virtio-win.iso -device virtio-net,disable-legacy=on,netdev=net0 -netdev user,id=net0,hostfwd=tcp::3389-:3389 -vnc :1
```
然后就能像正常安装Windows系统那样安装了其中需要注意的一点是安装的时候会读不到硬盘需要加载光盘中的驱动其他缺失的驱动光盘里基本上都有直接安装就行。另外第一次重启前最好把`-device usb-storage,drive=install -drive if=none,id=install,format=raw,media=cdrom,file=win10.iso`删掉安装好之后可以打开远程桌面就可以直接使用树莓派的IP去连接Windows系统还能有完整的分辨率和音频支持。
既然装好了虚拟机那么我就应该验证一下虚拟机是不是真的比物理机安装效果更好了。具体怎么验证呢我又找了一个树莓派4B-4GiB内存版在上面安装直接安装同版本的Windows ARM版然后把两个树莓派的频率都调为1.8GHz在两个Windows系统上下载了7-Zip ARM版跑一遍基准测试结果裸机安装的总体评分为6.1GIPS左右虚拟机是5.1GIPS左右这很明显裸机还是更强嘛虚拟机唯一的优势就是可以用无线网络罢了说到网络我也测了一下这个速度在同样使用有线网络的情况下虚拟机因为用的是user模式效果很差连50Mbps都跑不到而裸机可以超过100Mbps。至于qemu怎么使用其他网络模式我也不太会整起来好像还挺麻烦的。总的来看树莓派安装QEMU-KVM运行Windows实在是不怎么样……一样是个垃圾。
## 让树莓派运行x86程序
既然安装了QEMU那就该玩玩跨指令集的东西了当然跨指令集是没办法使用KVM了而且树莓派不像MacBook的Rosetta 2那样有硬件加速效果肯定会非常差不过我已经做好了觉悟还是想整个玩玩。怎么整呢非常简单只要运行
```bash
sudo apt install qemu-user-binfmt
```
就好了那到底是什么软件让我想大费周章的让树莓派运行x86程序呢其实是一个叫做[postjson](http://cdn.ouapi.com/postjson_linux.zip)的接口测试工具似乎是拿Go写的但是没有开源也没有ARM64的二进制文件所以就只好用QEMU啦试了一下还真能运行而且就像Rosetta 2那样直接当作原生的程序运行就可以效果挺不错不过CPU占用非常高一运行一个CPU核心就占满了😂也就是勉强能用的水平吧。
# 感想
搞了这么多东西之后发现树莓派除了那个FM电台不能在普通电脑上操作其他不是和普通的电脑一样吗🤣那买树莓派还有什么意义不如买个二手手机不过有了树莓派就感觉越垃圾越想挖掘它的作用这可能就是它存在的意义吧🤣。

View File

@ -1,33 +0,0 @@
---
layout: post
title: 在MacBook玩游戏的各种方法
tags: [Apple, MacBook, 游戏]
---
我倒要看看是谁在说Mac打游戏是疯子😡<!--more-->
# 起因
自从[用了MacBook Pro](/2023/02/03/mbp.html)以后我用我以前Windows笔记本的次数越来越少了。虽然性能可能比不上但是安静和超长续航的体验还是相当不错的。但是我也不是完全不玩游戏的人有时候闲了也有打游戏的需求那我如何在不使用Windows系统的情况下打游戏呢
# 在MacBook玩游戏的方法
## 原生游戏
一般来说如果想发挥MacBook的全部能力那自然是完完全全为Mac设计不需要任何转换等方法的游戏最好了这类游戏一般在Mac App Store就能找到和下载只是绝大多数都不是免费的我也就下过一款[TouchBrickOut](https://apps.apple.com/us/app/ibreakout/id1582094533)的打砖块游戏这是真真正正为Mac设计的不仅原生还要Touch Bar。当然对于大多数游戏来说不会为Mac专门设计毕竟Mac的游戏玩家比较少。但是能在Mac上原生运行的游戏除了为Mac设计以外就是开源游戏了。毕竟源代码都有了想在哪里编译都可以。对于我玩的游戏来说有几款正好符合这一点比如[osu!lazer](https://github.com/ppy/osu),还有之前玩过的[三维弹球](https://github.com/k4zmu2a/SpaceCadetPinball)。
## iOS游戏
因为M系列芯片基于ARM架构所以我的MacBook也可以玩iOS的游戏。这类游戏一般也能直接在Mac App Store上下载到比如我玩过的[药水制作师](https://apps.apple.com/us/app/%E8%8D%AF%E6%B0%B4%E5%88%B6%E4%BD%9C%E5%B8%88/id950654598)。但其实有很多iOS游戏在Mac App Store上都搜索不到应该是开发者设置了规则不允许在Mac上使用。对于这类游戏可以在[Decrypt IPA Store](https://decrypt.day/)上下载,并且使用[PlayCover](https://github.com/PlayCover/PlayCover)安装。对我来说,我一般玩[公主连结Re:Dive](https://decrypt.day/app/id1423525213),以及一些模拟器,比如[XP3Player](https://apps.apple.com/us/app/xp3player/id1064060287)和[ONSPlayer](https://apps.apple.com/us/app/onsplayer/id1388250129)其实这两款软件可以在Mac App Store上下载但是都要花钱……所以我就去网上找的ipa文件然后在PlayCover上安装了
## 使用Rosetta 2的x86游戏
在M系列芯片出来以前其实也有不少Mac上的游戏但是这类游戏可能在M芯片的Mac出来之前就已经开发好了想让开发者为M芯片做适配显然不大可能。不过macOS有Rosetta 2可以让开发者不需要任何改动的情况下就让游戏在M系列芯片Mac上运行。这类游戏非常多基本上在Steam和Epic Games上下载的游戏都是x86的像我用的Epic Games Launcher以及在上面下载的游戏[while True:learn()](https://launcher.store.epicgames.com/zh-CN/p/while-true-learn)都是这样的,不过我玩的这些对性能要求都非常低,所以即使用了转译,但是玩起来并不会卡。
## 基于脚本的Galgame游戏
很多Galgame都是用一些专用的脚本引擎工具写出来的例如T Visual Presenter、NScripter还有Ren'Py等等因为是脚本所以通常来说很容易跨平台毕竟它们没有太多依赖系统本身的东西只要能写出对应平台的解析器脚本都能运行。像上述提到的XP3Player、ONSPlayer还有[RenPyViewer](https://apps.apple.com/us/app/renpyviewer/id1547796767)就可以运行很多基于脚本的游戏。不过很多Ren'Py游戏都有发行macOS版本所以一般不需要安装RenPyViewer。只是有可能它们都是基于x86开发的可能需要用Rosetta 2转译……
## 在网页上运行的游戏
浏览器作为跨平台最强的解决方法自然游戏也不例外能在网页上运行的游戏也很多像RPG Maker MV制作的游戏基本上都可以在浏览器上运行。我看到有一个[网站](https://amemei-lists.top/posts/49e03169/)就收集了很多这种游戏他们之前还把游戏放在了GitHub上。不过Github对[Sexually Obscene Content](https://docs.github.com/zh/site-policy/acceptable-use-policies/github-sexually-obscene-content)内容是不容忍的所以他们在GitHub上的东西就消失了……不过我搜了一下还有一些漏网之鱼[这个账号](https://github.com/jjbR18)还有这样的游戏可以玩🤣有效性只限我写文章之前的时间说不定哪天被GitHub发现就没了。其实对于这种网页上可以运行的游戏来说最好下载下来虽然RPG Maker MV的游戏可以在线玩但是加载那么多资源尤其这些文件还是在境外对国内玩家非常的不友好😆所以如果想在Mac上玩可以下载下来然后在终端那个目录下执行`python3 -m http.server`,就可以打开 <http://127.0.0.1:8000> 下开始游戏了。不过Safari的效果不太行很多游戏连声音都没有想玩还是下载Chrome之类的浏览器比较好。
## 使用Wine🍷游玩Windows游戏
除了相对比较原生的办法不太优雅的办法就是用基于Wine的各种东西了。其实我之前不太想在MacBook上使用Wine的因为一般如果是Linux系统在ARM芯片上运行的话需要用QEMU User模式模拟x86然后再运行Wine效率极其低下还不如用虚拟机呢虽然听过Crossover不过我当时以为它是按这种方式的而且还要收费😂。不过macOS不太一样它有Rosetta 2加持效率比QEMU User模式高太多了虽然是两次翻译但是毕竟有黑科技还算是能玩。尤其是前段时间出的Game Porting Toolkit据说很厉害所以前几天我根据[这个教程](https://www.applegamingwiki.com/wiki/Game_Porting_Toolkit)安装了一个编译的时候第一次听到我的MacBook风扇转😂。试了试效果确实不错找了个Unity3D的游戏可以满帧率运行。虽然很不错不过我又去网上搜了搜发现我是**,有个开源的软件[Whisky](https://github.com/Whisky-App/Whisky)不需要编译任何东西就可以使用Wine和GPTk而且配置也很简单还能使用DXVK而且因为是已经编译好的不需要安装依赖也不需要源码之类的东西我通过上面教程安装的大小要4个多GiB但是这个就只要1个多GiB还不需要考虑乱七八糟的东西。
经过我的实测GPTk其实就是D3DMetal兼容性更好一些效率也更高但是占内存很大DXVK似乎效率低一些但是占内存比较小因为我的MacBook只有8GiB内存而且我玩的游戏在哪个上面都能跑满帧率 ~~反正3A大作我也不可能在MacBook上玩估计M2的水平也玩不了……不如说我基本上不玩3A大作🤣~~ 所以我在玩游戏一般还是会用DXVK多一些除非打不开才会用D3DMetal。
## 使用虚拟机游玩Windows游戏
因为我的MacBook只有8GiB内存而且硬盘也只有256GiB跑虚拟机压力实在是太大了我以前试过[UTM](https://github.com/utmapp/UTM)但是玩不了游戏随便什么游戏都会卡的动不了当然也可能是UTM的显卡驱动不太行不过现在的话我也不想尝试其他虚拟机了所以我只能说强烈不推荐使用虚拟机玩游戏。
## 云游戏方案
这种方案直接就不在本机运行了,流畅程度全看网络和连接的主机性能。我以前也写过一篇[关于云游戏的体验](/2021/09/28/cloudgame.html),在这里就不多赘述了。
# 感想
这么看来MacBook玩游戏的方法挺多的嘛谁说一定要Windows才能打游戏呢我觉得说在macOS上打游戏的人是精神病的人自己才是精神病吧谁也没有说买MacBook就是专门拿来打游戏的那些人就是觉得买Mac亏估计还很穷吧🤣。
顺便一说,有个叫[AppleGamingWiki](https://www.applegamingwiki.com/wiki/Home)的网站上记录了一些比较大的游戏在M系列芯片上的兼容性如果真的有想在Mac上打游戏的想法也可以去这个Wiki上参考一下。

View File

@ -1,24 +0,0 @@
---
layout: post
title: rpi4-openfyde的使用体验
tags: [树莓派, openfyde]
---
什么样的系统用户体验更好呢?<!--more-->
# 起因
最近玩树莓派感觉有点玩腻了毕竟我不是搞硬件的人树莓派的GPIO接口对我来说毫无意义当作PC或者服务器的话性能又太差了兼容性也不太行这么看来新出的树莓派5一样对我来说毫无意义和4B一样都是垃圾。但是毕竟那个东西也挺贵的闲置也不太好因此我想在上面装上适合普通人使用的系统然后送给家里的人使用。
# 系统的选择
首先服务器版的系统肯定不需要考虑了谁会用一个满是命令行的系统啊在我看来普通人使用的系统只能在Windows, MacOS, Android, ChromeOS里面选了任何GNU/Linux发行版的桌面版在我看来都不太适合普通人使用[Windows之前已经试过了](/2023/05/22/rpi-win.html)可以说基本上没法用就是纯粹的垃圾。MacOS显然还没有什么方案可以安装至于仿MacOS的TwisterOS对于普通人来说使用难度也很大安装软件都是难事Android虽然也不是不能用但是作为桌面端系统效果还是不太行所以我觉得可能也就只有ChromeOS可以考虑一用了。
不过官方的ChromeOS要支持的设备才能刷树莓派显然不在其中要么就刷ChromiumOS但是那个要登谷歌账号在国内使用也不太好。幸好国内有一家对ChromeOS做了本地化的公司开发了FydeOS我看了一下如果想在树莓派上安装就只能安装FydeOS for You但那个是收费的每年要120CNY太贵了我肯定是不会考虑的。还好还有一个替代品那就是openFyde两个系统我也不太清楚有什么区别可能是云服务有所不同吧对于树莓派来说安装[rpi4-openfyde](https://github.com/openFyde/overlay-rpi4-openfyde)就可以了另外想要安装的话最好选文件名中包含“archero”的那个才能使用Android子系统。
# 安装与使用体验
第一次安装的时候我是直接把镜像用Raspberry Pi Imager刷进去的我以为它和其他的树莓派系统一样刷进去之后再配置其他东西结果并不是那个镜像是个安装包想要用的话需要先格式化TF卡然后找一个U盘把系统刷进去然后把U盘和TF卡都插入树莓派才能安装就和安装ESXi一样。
安装之后拔掉U盘重启就可以创建用户使用了首先作为浏览器为基础的系统我平时用浏览器可能也就是看看Bilibili吧之前我使用树莓派官方系统的浏览器看Bilibili效果非常差看看装了openFyde的效果怎么样结果令人失望效果还是一样的差主要应该还是没有硬件解码的问题吧……树莓派4B的GPU好像只支持硬件解码H264而树莓派5更是卧龙凤雏只支持H265真是有够逆天。这么说来FydeOS for You可是要每年120CNY呢这个水平的性能他们有自己测过吗就这样也能收费吗至于其他不涉及视频的网页倒是还算流畅不过毕竟GPU很垃圾有一些特殊情况还是会卡。
除了浏览器之外可能用的比较多的就是Android子系统了吧要是想轻度办公的话应该需要一个Office用浏览器的Office也不太好所以先安装个WPS Office试试看这个从Fyde的应用商店里就能直接安装还挺方便的。不过安装好之后效果感觉不太行首先这个Android子系统居然不支持滚轮复制粘贴都要像手机那样长按而且很多时候比如新建文档它会开两个窗口原来新建文档的窗口不会关掉……这可不像是能让人用的样子啊……而且整体使用也比浏览器卡使用起来并不顺畅。另外输入法也不是默认开启的要在设置里设置体验也不太行。
我试了一下那个应用商店上面的应用要么就是网页链接要么就是Android程序要么就是浏览器插件Android程序从我用了WPS Office来看不怎么抱有希望了放网页链接的我感觉有点无语😓其他系统的浏览器都能把网页当作应用这个系统反倒是直接当超链接跳过去了……至于浏览器插件那个只要是能安装浏览器就都能用吧没啥特别的。
虽然普通人可能用不上这个系统还有一个Linux子系统具体是什么Linux我没细看不过好像是使用容器启动的。我试了一下效果还行只是不知道为什么不能使用全部内存我使用的是8GiB的树莓派但是分配给Linux的只有6GiB存储也是分配的默认10GiB。明明都是Linux系统为什么ChromeOS要限制子系统的资源呢
# 总结
总的用下来树莓派4B的性能可能真的就只能看看网页了连视频都不能流畅播放安装Android应用效果也很差不过有时候限制多并不是一件坏事毕竟对普通人来说如果这个性能让人不要抱有更多的希望反倒是提高了用户体验呢。虽然如果是用比如Ubuntu之类的系统能做的事情应该更多但很多情况不是普通人应该关心的事情尤其这个芯片还是ARM指令集的即使某些应用提供了Linux版也不一定能在树莓派上安装尤其这个安装很多时候也不是双击就能搞定的openFyde至少能做到真想安装Android应用的时候双击还是能安装的卡虽卡了点但是一般情况不会出现让普通人看了会看不懂的情况已经算很不错了。
因此我觉得如果让普通人使用树莓派安装openFyde是最好的选择了。

View File

@ -1,24 +0,0 @@
---
layout: post
title: 如何在Linux容器内运行Android
tags: [Linux, Android]
---
原生运行Android肯定比虚拟机好<!--more-->
# 起因
前段时间我在树莓派上安装了[openFyde](/2023/12/10/openfyde.html)后来发现原来它的ArcHero安卓子系统是基于anbox开发的和ChromeOS的安卓子系统有一些区别至于区别在哪我也不是特别清楚。不过既然它的安卓子系统和Linux直接安装的没啥区别那不如我试试看在普通的Linux上安装容器化的安卓系统效果怎么样
# 试用Waydroid
最开始我测试的是[Waydroid](https://github.com/waydroid/waydroid)因为听说anbox的升级版就是Waydroid据说性能比anbox强所以想试试看安装挺简单的执行个脚本之后用apt就能安装。不过我的测试平台是Ubuntu Server 20.04LTSWaydroid之所以叫这个名字是因为它要基于Wayland显示服务器运行可我是无界面的系统要怎么用它啊Waydroid好像没有无头模式这种东西不过我搜了一下weston实现了Wayland协议而且支持无头模式用法也很简单安装好weston之后执行`weston --backend=headless-backend.so`就可以了。
不过默认安装好的Waydroid不能运行ARM架构的程序似乎是因为libhoudini之类的库是有版权的所以不能直接集成不过还好有人开发了一个[工具包](https://github.com/casualsnek/waydroid_script)可以给Waydroid安装包括libhoudini在内的多个因为版权等原因不能直接在项目里使用的程序而且操作起来也很简单体验还不错。
至于怎么查看界面因为是无头模式启动的所以没有界面只能通过adb查看不过我试了一下scrcpy不知道为什么不能用但是用Airtest就能看到界面就挺奇怪的……还有就是分辨率很低不过这个应该改weston的启动参数就可以改分辨率了吧但因为后来发现Waydroid不能开多个实例感觉有点废物就没有在继续研究了。
不过总的来看如果是在桌面版的Linux上而且界面是使用Wayland协议的效果应该会比较好好像Ubuntu22.04以上的系统默认会使用Wayland在这个系统上面使用Waydroid效果应该比在Windows上使用WSA的效果还要好。毕竟这可不是虚拟机运行而是使用容器技术原生运行的如果有机会的话还是值得一用的。
# 试用redroid
因为Waydroid不能开多个实例所以我搜了一下有没有类似技术而且能开多个实例的结果就找到了[redroid](https://github.com/remote-android)。安装也很简单执行几个命令修改下内核模块然后直接用docker pull个镜像就可以用而且这个切换版本比Waydroid简单Waydroid想换别的安卓版本要自己整镜像不然就只能用基于Android 11的LineageOSredroid可以按镜像的版本号选择希望使用的安卓版本而且我测试了一下redroid是可以使用scrcpy连接的看起来效果还不错。
但是我试了一下运行一些ARM的安卓程序会出现闪退的情况我以为是因为没有ARM兼容库的问题但是文档上写的镜像里面已经自带了libndk……这么看来可能是因为libndk的兼容性不太行啊另外libndk好像是给AMD的CPU使用的我用的CPU是Intel的Intel应该用libhoudini才对然而我找了半天也没有找到怎么让redroid使用libhoudini……真是令人失望啊。
# 总结
看来在容器内运行Android系统的需求还是太少了很多问题都没人解决……不过想想也是那些搞云手机的大多直接拿真机运行Android用兼容层的性能损耗也很大而服务器级别的ARM芯片也不便宜……
另外就是使用Linux的人也很少而且像那些在Windows上玩安卓游戏的人都是用的虚拟机性能也都够用了毕竟那么高功率的桌面端CPU怎么样都比超低功率的手机CPU强啊所以容器内运行Android的需求比较少可能也很正常吧……

View File

@ -1,21 +0,0 @@
---
layout: post
title: 年终总结
tags: [总结]
---
接下来,就是长跑的时间了……<!--more-->
# 2023年过的怎么样
至少今年我顺利毕业了而且也有一份还可以的工作能让我赚点钱比年初的预期已经好了很多从总体上来看还算不错吧另外还有一个很重要的原因就是我早晨抽卡抽到UP角色了😂所以状态还可以。
不过从我写博客的次数可以看出来今年我探索新事物的动力也不怎么高了其实吧我的工作也不怎么忙算是965的程度平时也没什么加班之类的但我每次回到住所之后就只会躺在床上看看视频和打游戏视觉小说而已而且经常就玩到很晚导致我晚上睡觉的时间还很短可能也就6个小时多。也就是说我平时我晚上玩的时间可能就要7个小时多了。另外这对我的影响还是挺大的最近我在玩osu!mania前段时间我打的水平应该算越来越好吧但是最近脑子不太好使了打的效果越来越差了还有最近幻视看错字的情况比之前发生的概率高了不少还挺令我头疼的……
不过这可能和我未来的打算差不多,我本来就想在赚够我一个人一辈子花的钱之后就不再继续工作了,不过要是到那个时候我还是像现在这样黑白颠倒,不能好好吃饭的话可能一辈子也花不完我赚的那些钱🤣。
不过总的来说可能就是因为我没啥照顾自己的能力吧所以说明明是挺不错的环境但是过的就像那些997的人一样🥲……像这种问题还是应该考虑解决一下才行。
至于在2023年发生的事情倒是还挺多的令人印象最深刻的大概就是AI了吧自从ChatGPT出了之后各行各业都开始搞LLM了而且正是因为LLaMA这种东西的出现国内的AI才会五花八门吧只是LLM对我的影响可能还是不太大后来发现大多数问题我自己就能解决我解决不了的问题问它也没法解决而且需要我写文案的时候很少大多数情况并不需要生成一堆废话。
# 未来的打算
就和上面提的一样我的目标就是赚够我一个人一辈子花的钱所以接下来的日子很可能会是一成不变的工作日上班下班了玩电脑休息日睡觉节假日回家了🤣而且未来的10年里很可能都是这样没有更多的计划了。
但是看环境我猜应该会比往常有更多不可预料的情况吧最近在这个世界上各种各样的事情越来越多了我想接下来的一年里可能会有更多情况发生说不定就是世界末日呢😆至于会不会影响到我可能也只能到时候才知道了吧不过对我来说最好还是别发生对普通人影响特别大的事情比如手头的钱全变成废纸啥的如果真出现那种情况最好能提前发现然后全部转成黄金或者USDT之类的最好吧如果没有这样做的话……反正大家的起点可能就差不多了吧不知道到时候会发生什么样的事情。
# 总结
总的来说,过去一年里倒是没那么差,至于未来会更差还是更好也很难说,至于过去的一年里到底发生了什么我也记不太清了,现在的我只能说一些没什么营养的废话填充这篇文章了🤣。

View File

@ -1,25 +0,0 @@
---
layout: post
title: 如何在macOS上玩基于Ren'Py的视觉小说
tags: [Apple, macOS, 视觉小说]
---
跨平台的游戏移植起来就是简单啊<!--more-->
# 起因
最近我在玩[Winged Cloud](https://store.steampowered.com/developer/WingedCloud/)出的视觉小说他们家出的视觉小说画风都很不错比很多其他同行画的好看另外长度一般都很短大概1-2个小时就能看完很适合下班之后闲了看一部不过我现在已经换了MacBook要怎么玩呢他们家的视觉小说基本上都是用的Ren'Py引擎开发的。Ren'Py引擎的游戏本身其实原生就是跨平台的但是也许是因为我是直接从互联网上下载的macOS会有些验证之类的直接运行.app结尾的文件是没办法打开游戏的双击会显示应用程序无法打开……那该怎么运行呢
# 玩法研究
## 使用iOS版的RenPyViewer
不过看看之前[我在MacOS上玩游戏的经验](/2023/10/21/game.html)对于Apple芯片的Mac来说可以下载[RenPyViewer](https://apps.apple.com/us/app/renpyviewer/id1547796767)来玩。只是经过我的测试发现RenPyViewer能玩的游戏很有限因为它内置的Ren'Py引擎版本是7.5.3的如果游戏用的Ren'Py引擎和这个版本相差不大或者没有用到新版的特性之类的倒是能正常运行我试了一下Sakura MMO系列、Sakura Gamer系列等都能正常运行但只要运行游戏Ren'Py的版本过高或者过低的游戏都会报错尤其像新出的基本上都是8.0以上的版本了Python的版本也从2换成3了显然用RenPyViewer肯定是没法运行的。
## 使用Intel macOS版的RenPyViewer
其实在我发现iOS版的RenpyViewer不能运行一部分Ren'Py游戏之后我又去搜了一下在知乎上找到了iOS版的RenPyViewer作者发的文章介绍了[macOS如何游玩Ren'Py引擎游戏](https://zhuanlan.zhihu.com/p/477696534)其中包含了他为macOS做的RenPyViewer不过我下载看了一下是Intel版的……不过也许这个里面用的引擎更新一点一部分iOS版不能玩的这个版本就可以玩。
## 使用终端运行
但毕竟前面两个方法内置的引擎版本是固定的能玩的游戏也很少看来得想个通用的办法毕竟Ren'Py游戏在发行的时候是支持macOS的啊。所以我又看了看Ren'Py开发的游戏发行之后一般在游戏文件夹里有一个.sh的文件看起来应该是给Linux系统运行使用的但是macOS也可以运行.sh的文件啊所以我就直接在终端运行了它结果macOS和Linux不一样的地方是所有从网上下载的可执行文件都必须签名不然就会报移到废纸篓之类的错关于这个问题我看网上说的好像是执行`xattr -r -d com.apple.quarantine <path>`就可以,不过后来我也忘了是出什么问题,最后是手动一个一个给每个可执行文件加的权限,最终倒是也运行起来了。
## 手动修改.app文件
不过每次运行要是用终端那不是很麻烦嘛,另外既然游戏里面明明有.app的文件为什么会运行不了呢后来我看了看发现Contents/MacOS文件夹下的文件并没有可执行权限我猜可能是和这个有关系加了可执行权限之后倒是没有报应用程序无法打开的错了但是还是不能运行点开之后在Dock栏跳了几下就消失了……然后我就去看了下那个可执行文件发现就是一个Shell脚本后面的版本换成可执行文件了里面定义了几个ROOT变量一个是和脚本同级的目录一个是和.app同级的目录还有一个是Contents/Resources/autorun目录这么看来正常情况下因为游戏是跨平台的游戏肯定不会在.app里面在外面的话……看现在macOS权限管的这么严格让它读取.app外面的文件估计不太行肯定只能读取.app里面的文件至于Intel macOS版的RenPyViewer我看了一下好像原理差不多是把游戏目录用软链接映射过去的所以才能在不直接获取.app外面的文件下运行。之后我又参考了一下其他直接在macOS发行的Ren'Py游戏感觉也差不多。所以解决方法也很简单要么把游戏文件放到Contents/Resources/autorun目录下要么做个软链接放过去我觉得单个.app管理起来会方便一些所以就直接把游戏文件全部移动进去了。试了一下总算可以正常运行了。而且多试了几个基本上都没有问题。
但有些Ren'Py游戏连.app都没提供我不知道SDK默认生成分发版的时候会不会包含macOS上用的.app文件不过也有可能是发行的时候只针对Windows所以删掉了对于一些非官方汉化版很有可能是汉化的人给删掉了。对于这种情况可以先搞清楚这个游戏使用的Ren'Py版本然后去Ren'Py官网下载对应版本的SDK把SDK中的renpy.app复制出来然后按照上面的方法把游戏拷进去就可以正常运行了。
另外macOS上还有一些坑比如说Windows的文件名是不区分大小写的但是macOS是区分的有时候他们写脚本的时候文件名和程序里可能有些比如CG之类的大小写不一致结果图片不能正常加载这种情况就只能用unrpa解包然后把对应的图片名改成正确的才能运行了当然Ren'Py提供了忽略错误的功能但是不知道为什么只有英文模式下有中文下就没有……这种情况还得先切换到英文才行。
# 总结
总的来看以后如果想在macOS上玩Ren'Py游戏优先应该用游戏自带的.app最好把Contents/MacOS下的文件添加可执行权限然后把文件全部移动到Contents/Resources/autorun下。不过旧版的Ren'Py基本上都是只有x86_64的可执行文件新的才有两种都支持的如果是用的Apple芯片的Mac最好先看看可执行文件是不是通用的如果不是优先应该先试试iOS版的RenPyViewer毕竟原生运行肯定要更省电一些如果不能运行再用上面的办法。

View File

@ -1,23 +0,0 @@
---
layout: post
title: 如何离线安装1Panel
tags: [离线, 1Panel]
---
Go写的程序感觉离线使用还挺方便的<!--more-->
# 起因
为了更好的管理服务器我之前用过几种面板比如宝塔小皮appnode还有[1Panel](https://github.com/1Panel-dev/1Panel)之类的,之所以用面板主要还是觉得这种用起来方便一些。有些脑子不合适的人看不起使用面板的人,他们可能用了比如软件包安装,或者源码编译、容器等等,结果一顿操作猛如虎,结果配置还是安装默认的,连调优都没做🤣。
总之最近正好需要在不能连接互联网的地方安装LEMP的环境虽然现在的面板很多但是似乎很少有面板支持离线安装。宝塔好像有付费的离线安装服务但是我首先不信任宝塔另外怎么可能给他们付钱呢😆1Panel虽然官方不支持离线安装但是社区中有离线安装的方法不过好像不能使用网站管理的功能……当然经过我的测试其实是有办法可以使用网站管理的功能所以分享一下方法。
# 离线安装1Panel的方法
一般想离线安装的话搜到的文章应该就是[这篇文章](https://bbs.fit2cloud.com/t/topic/386)了吧,看起来操作有一点点复杂,不过评论里有个人整了个可以离线安装的[项目](https://github.com/wojiushixiaobai/1Panel-installer)使用起来非常简单连docker也一起安装了。只是使用的时候稍微有一点点坑就是它的“--install-dir”参数默认是“/opt/1panel”但是安装的时候会在这个目录里再建一个1panel文件夹所以在使用的时候最好手动把参数设置为“--install-dir /opt”。
安装没什么问题不过应用商店是空的什么软件都安装不了我在社区论坛里找了一下好像可以把在互联网端1Panel实例中“/opt/1panel/resource/apps/remote”中的文件拷到离线设备中的“/opt/1panel/resource/apps/local”下然后点更新就可以了我试了一下确实可以把镜像导出来再导入到离线设备直接安装可能会报错但是重建一下容器就能正常启动了。虽然容器是启动了但是面板好像没识别到还是不能管理而且应用的文件被放在了“/opt/1panel/apps/local”目录下就算能识别到文件路径也是错的。看来得让面板认为导入的程序不是本地安装的而是在线安装的。
# 离线安装1Panel中应用的方法
我在网上怎么搜,都没有找到现成的解决方法,看来只能我自己研究了😂。我找了一下,面板安装目录下有一个“/opt/1panel/db/1Panel.db”文件应该是面板的数据库我用sqlite3客户端打开看了一下里面的apps表中可以看到应用被导入了但是key在前面都被加了local比如openresty变成了localopenresty我对比了一下互联网端的数据库除了这一处外还有resource字段的内容也从remote变成了local。既然是这里有不一样的地方那就把它改成一样的呗另外这里的字段名既然叫resource那么肯定和那个目录也有关系所以就得把“/opt/1panel/resource/apps/local”文件夹下的内容再全部移动到“/opt/1panel/resource/apps/remote”中把数据库上传然后重启离线环境中的1Panel也能正常识别了而且安装后网站标签页也能正常创建网站之类的操作了。
Nginxopenresty和MySQL这样安装都没啥问题但是PHP出现了点问题因为1Panel的PHP会在线下载扩展来构建镜像的不是直接使用镜像创建的容器所以安装会报错。不过既然能看到数据库我发现有个runtimes表记录了PHP的状态那么我把状态改成normal就可以了吧试了一下还真行改完上传然后重新导入容器PHP也正常了。另外需要注意的是从互联网端导出的镜像名字和版本必须和离线端一样不然可能识别不到至于扩展啥的在互联网端选择好就可以了离线端不需要修改。
所有操作完成之后试了试创建网站以及和PHP的连接之类的都可以正常使用了就可以在内网环境下完全发挥1Panel的能力了。
# 感想
无论是Docker还是1Panel能这么简单的在离线环境下安装我想可能是因为它是Go写的程序吧能无依赖静态编译的程序在没网的情况下还是方便啊……另外就是Docker果然也是离线使用的利器想安什么在互联网准备好直接拿到离线端就能用真是方便啊。

View File

@ -1,24 +0,0 @@
---
layout: post
title: Luckfox Pico Plus使用体验
tags: [开发板, 树莓派]
---
开发板还是越小越好啊<!--more-->
# 起因
前段时间银行送了我一张满50减50的淘宝不限品类优惠券但是我一时半会没想好买什么。不知道怎么的就想起在Bilibili上看到的微型开发板Luckfox Pico系列当时看了视频觉得挺有意思的这次既然有机会了就可以买一个了吧……不过有这钱去买箱牛奶不好吗🤣。
最终买的Luckfox Pico Plus开发板当时的价格是52CNY加了8CNY的运费然后用券抵完就是10CNY了。价格看上去挺不错的不过相比之下还是不如随身WiFi便宜那个正常买好像也才10CNY而且整体性能也要比这个好很多还能用WiFi联网……不过既然买了就玩玩呗看起来也挺有意思的。
# 使用体验
从外观来看整体大小只有一根食指大因为选了带RJ45接口的板子所以其实不算特别小而且背面甚至没有焊元件其实它的SOC RV1103只有不到小拇指指甲盖的大小很难不相信它其实还能做的更小。
## 安装系统
刚买来的时候里面有预装的测试系统,不过测试系统几乎把里面的空间都占满了,肯定是不能用的,我去看了看[官方的Wiki](https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-quick-start)官方有提供编译好的BusyBOX、Ubuntu、buildroot以及Alpine Linux也有可以自己编译的SDK。对我来说我也不愿意整麻烦的事情所以肯定会选编译好的至于系统也肯定要有软件包管理器的另外因为这个开发板只有64MiB的内存和128MiB的存储虽然可以插TF卡但是内存还是没法加系统也不能太大所以就只有Alpine Linux可以选了。我之前[在虚拟机里测试过Alpine Linux](/2022/03/12/alpine.html),体验还是挺不错的。
安装方法也很简单,[官网的Wiki](https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-Alpine-Linux-1)有详细的说明。不过有一些不太一样的地方我没有USB转UART串口模块我有的只是树莓派。所以烧录完系统之后的改密码以及配置网络的过程就得用树莓派来做了其实这体现了一下树莓派的作用至少那堆GPIO接口不是当摆设的🤣。用法的话就是首先刷一个树莓派的官方系统到树莓派上然后在配置里打开UART并关掉树莓派的串口登录按官网的图接三根线只要是导线就行对树莓派来说应该是第8和第10脚分别是RX和TX第6脚有一个地线依次接到开发板上在终端里安装screen使用`screen /dev/serial0 115200`就可以登录开发板的终端了如果连接有问题可能是RX和TX接反了反过来重新插一下就行。之后改密码以及配置网络就很简单配置好之后连上网线就可以正常使用了。
不过这个系统有个缺陷没有配置TF卡这还是挺重要的回头有时间可能还是得编译个能使用TF卡的Alpine Linux或者看看官方愿不愿意编译一个
## 使用软件
安装好系统之后就可以用SSH连接了。首先试了一下安装软件Alpine Linux的软件包管理器apk用法和apt的用法差不多而且源里的软件也非常多安装了个Python3试了一下没有任何问题安装好pip之后安装python包也没有问题这样就可以运行我用python写的一些定时任务了。另外我又下了一个[go-cqhttp](https://github.com/Mrs4s/go-cqhttp)搭了个机器人试了一下居然也能正常运行看来64MiB的内存还可以啊跑些软件还是绰绰有余的这么看来的话就可以替代掉我的树莓派了反正我的树莓派平时除了网口其他的口都没用运行些定时任务或者QQ机器人又觉得利用的性能太少了而且很明显的是这个东西显然比树莓派的能耗要小的多挂在家里挺合适的不过缺陷可能就是如果哪天我想整个[电台](/2022/03/27/radio.html)树莓派的GPIO接口还能派上用场这个Luckfox Pico Plus的GPIO可能除了最开始装系统的时候用了一下之后就再没有用了。
另外作为在家里装的开发板内网穿透也是需要的但是装了个go-cqhttp之后内存就剩下30MiB了还要考虑定时任务运行时也要用掉一些内存用frp肯定不太合适但是用ssh的话又容易断我想了一下干脆折中一下用autossh吧如果断了也能自动重连。
# 感想
感觉作为开发板Luckfox Pico Plus相比树莓派来说用途差不多而树莓派的定位却不太准确又想当开发板又想当普通PC结果作为开发板价格有点贵尺寸有点大功耗也有点高作为PC性能过差啥也干不了作为NAS接硬盘也接不了几块才两个USB3.0口还要另外接供电属实是比上不足比下有余。这款产品我倒是觉得挺不错的主要是颜值比较吸引我😆其实还有和这个一样芯片的另外一个开发板更便宜还带WiFi模块但是相比之下还是这个好看所以如果想整开发板我觉得Luckfox Pico Plus比树莓派更合适。

View File

@ -1,41 +0,0 @@
---
layout: post
title: 如何用requests库验证证书
tags: [Python, requests, ssl]
---
用Python制作的程序怎么样<!--more-->
# 起因
之前在抓包某些APP的时候可能会遇到即使信任了抓包软件的CA根证书也无法抓包的情况听说之所以遇到这种情况是因为那些APP使用了“SSL Pinning”的技术可以只信任代码中认为可以信任的证书。不过对于逆向之类的事情我并不擅长这种问题我也不太会解决。但是不能解决问题我可以创造问题啊Java的APP我不会写但是我会用Python写所以今天来看看怎么样用Python实现类似“SSL Pinning”的技术。
# 实现方案
真正的SSL Pinning似乎是通过预置网站所使用的根证书或者中间证书来实现的这样的好处是即使证书到期换了证书也能继续验证。不过我觉得其实没必要这么麻烦一般Python程序要连接的后端也没必要在浏览器中调用大不了就自签一个证书然后自己验证证书就好了反正中间人攻击重新签的公钥证书的指纹肯定和原来网站公钥证书的指纹不一样用这一点就可以判断有没有被抓包。
不过我搜了一下如果想实现这个功能首先请求的时候就要获得网站的证书很多资料都是直接用socket和ssl这两个包实现的但是在python上请求一般都是用requests用socket操作有点太麻烦了吧再问问AI呢AI给出的回复是`response.raw.connection.getpeercert()`结果执行了根本没有这个方法不愧是只会东拼西凑这应该是ssl库的函数吧……要么可以用`urllib3.contrib.pyopenssl.ssl.get_server_certificate()`这个方法获取但是这个方法不是在发起请求的时候获取的证书而是直接先访问了一下服务器然后直接获取的证书这样每次调用接口的时候可能就要请求两次服务器了感觉不怎么好……后来去Stack Overflow上搜了一下还真有关于类似这个问题的[讨论](https://stackoverflow.com/questions/16903528/how-to-get-response-ssl-certificate-from-requests-in-python),于是我简单改编了一下,最终效果如下:
```python
import requests
import hashlib
HTTPSConnection = requests.packages.urllib3.connection.HTTPSConnection
orig_HTTPSConnection_connect = HTTPSConnection.connect
def new_HTTPSConnection_connect(self):
orig_HTTPSConnection_connect(self)
try:
self.peer_certificate = self.sock.getpeercert(binary_form=True)
except AttributeError:
pass
HTTPSConnection.connect = new_HTTPSConnection_connect
def verify_cert_request(url):
with requests.get(url, stream=True, verify=False) as r:
result = [ hashlib.sha256(r.raw.connection.sock.getpeercert(binary_form=True)).hexdigest(), r.text ]
return result
result = verify_cert_request('https://www.baidu.com')
print(result[0])
print(result[1][:10])
```
用这个代码就能获取到请求的网站中证书的指纹了如果不希望其他人抓包先自己计算一下自己证书的hash指纹然后在代码中执行逻辑的时候先判断一下请求网站的指纹是不是自己网站的指纹如果不是还可以考虑一下反制措施这样就能实现证书的验证了。
# 后记
不过Python作为解释型语言代码不是随便看😂就算用Cython然后加壳啥的调用的库依然不是加密的大不了修改依赖的库然后让它返回的结果向正确的凑可能也行不过这样至少能防止绝大多数抓包的人了。

View File

@ -1,213 +0,0 @@
---
layout: post
title: 关于旧电脑的使用探索
tags: [旧电脑, Darling, whisper, Anbox]
---
性能差也不一定要淘汰!<!--more-->
# 起因
最近我偶然得到了几台淘汰的废旧电脑试着重新拼装了一下发现还有4台电脑还能开机所以我想试试看这些旧电脑除了性能以外有什么该被淘汰的地方。
# 测试平台介绍
本次测试的4台电脑为了方便操作我都装了Linux发行版Windows的话想要登录还要远程桌面太麻烦了以下是这些电脑的配置
一、装有 [Intel® Pentium® E5300](https://www.intel.cn/content/www/cn/zh/products/sku/35300/intel-pentium-processor-e5300-2m-cache-2-60-ghz-800-mhz-fsb/specifications.html) CPU的电脑
```
.. root@localhost.localdomain
.PLTJ. --------------------------
<><><><> OS: CentOS Stream 8 x86_64
KKSSV' 4KKK LJ KKKL.'VSSKK Host: G31M-ES2C
KKV' 4KKKKK LJ KKKKAL 'VKK Kernel: 6.8.1-1.el8.elrepo.x86_64
V' ' 'VKKKK LJ KKKKV' ' 'V Uptime: 2 days, 19 hours, 11 mins
.4MA.' 'VKK LJ KKV' '.4Mb. Packages: 953 (rpm)
. KKKKKA.' 'V LJ V' '.4KKKKK . Shell: bash 4.4.20
.4D KKKKKKKA.'' LJ ''.4KKKKKKK FA. Terminal: /dev/pts/2
<QDD ++++++++++++ ++++++++++++ GFD> CPU: Pentium E5300 (2) @ 2.600GHz
'VD KKKKKKKK'.. LJ ..'KKKKKKKK FV GPU: Intel 82G33/G31 Express
' VKKKKK'. .4 LJ K. .'KKKKKV ' Memory: 597MiB / 2969MiB
'VK'. .4KK LJ KKA. .'KV'
A. . .4KKKK LJ KKKKA. . .4
KKA. 'KKKKK LJ KKKKK' .4KK
KKSSA. VKKK LJ KKKV .4SSKK
<><><><>
'MKKM'
''
```
二、装有 [AMD Athlon™ II X4 641](https://www.amd.com/zh-hans/product/1326) CPU 和 NVIDIA GeForce GT 440 的电脑
```
.-/+oossssoo+/-. mayx@mayx-server
`:+ssssssssssssssssss+:` ----------------
-+ssssssssssssssssssyyssss+- OS: Ubuntu 20.04.6 LTS x86_64
.ossssssssssssssssssdMMMNysssso. Kernel: 5.4.0-174-generic
/ssssssssssshdmmNNmmyNMMMMhssssss/ Uptime: 1 day, 23 hours, 13 mins
+ssssssssshmydMMMMMMMNddddyssssssss+ Packages: 1276 (dpkg), 4 (snap)
/sssssssshNMMMyhhyyyyhmNMMMNhssssssss/ Shell: bash 5.0.17
.ssssssssdMMMNhsssssssssshNMMMdssssssss. Terminal: /dev/pts/0
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ CPU: AMD Athlon II X4 641 (4) @ 2.800GHz
ossyNMMMNyMMhsssssssssssssshmmmhssssssso GPU: NVIDIA GeForce GT 440
ossyNMMMNyMMhsssssssssssssshmmmhssssssso Memory: 242MiB / 7925MiB
+sssshhhyNMMNyssssssssssssyNMMMysssssss+
.ssssssssdMMMNhsssssssssshNMMMdssssssss.
/sssssssshNMMMyhhyyyyhdNMMMNhssssssss/
+sssssssssdmydMMMMMMMMddddyssssssss+
/ssssssssssshdmNNNNmyNMMMMhssssss/
.ossssssssssssssssssdMMMNysssso.
-+sssssssssssssssssyyyssss+-
`:+ssssssssssssssssss+:`
.-/+oossssoo+/-.
```
三、装有 [Intel® Pentium® G3240](https://www.intel.cn/content/www/cn/zh/products/sku/80796/intel-pentium-processor-g3240-3m-cache-3-10-ghz/specifications.html) CPU的电脑
```
.-/+oossssoo+/-. mayx@mayx-server
`:+ssssssssssssssssss+:` ----------------
-+ssssssssssssssssssyyssss+- OS: Ubuntu 22.04.4 LTS x86_64
.ossssssssssssssssssdMMMNysssso. Host: H81M-S1
/ssssssssssshdmmNNmmyNMMMMhssssss/ Kernel: 5.15.0-101-generic
+ssssssssshmydMMMMMMMNddddyssssssss+ Uptime: 2 days, 19 hours, 58 mins
/sssssssshNMMMyhhyyyyhmNMMMNhssssssss/ Packages: 984 (dpkg), 6 (snap)
.ssssssssdMMMNhsssssssssshNMMMdssssssss. Shell: bash 5.1.16
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ Terminal: /dev/pts/3
ossyNMMMNyMMhsssssssssssssshmmmhssssssso CPU: Intel Pentium G3240 (2) @ 3.100GHz
ossyNMMMNyMMhsssssssssssssshmmmhssssssso GPU: Intel HD Graphics
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ Memory: 371MiB / 3800MiB
.ssssssssdMMMNhsssssssssshNMMMdssssssss.
/sssssssshNMMMyhhyyyyhdNMMMNhssssssss/
+sssssssssdmydMMMMMMMMddddyssssssss+
/ssssssssssshdmNNNNmyNMMMMhssssss/
.ossssssssssssssssssdMMMNysssso.
-+sssssssssssssssssyyyssss+-
`:+ssssssssssssssssss+:`
.-/+oossssoo+/-.
```
四、装有 [Intel® Xeon® E5-2620](https://www.intel.cn/content/www/cn/zh/products/sku/64594/intel-xeon-processor-e52620-15m-cache-2-00-ghz-7-20-gts-intel-qpi/specifications.html) CPU的电脑
```
.-/+oossssoo+/-. mayx@mayxserver
`:+ssssssssssssssssss+:` ---------------
-+ssssssssssssssssssyyssss+- OS: Ubuntu 22.04.4 LTS x86_64
.ossssssssssssssssssdMMMNysssso. Host: X79 0.9
/ssssssssssshdmmNNmmyNMMMMhssssss/ Kernel: 5.15.0-101-generic
+ssssssssshmydMMMMMMMNddddyssssssss+ Uptime: 18 hours, 41 mins
/sssssssshNMMMyhhyyyyhmNMMMNhssssssss/ Packages: 773 (dpkg), 9 (snap)
.ssssssssdMMMNhsssssssssshNMMMdssssssss. Shell: bash 5.1.16
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ Terminal: /dev/pts/0
ossyNMMMNyMMhsssssssssssssshmmmhssssssso CPU: Intel Xeon E5-2620 0 (12) @ 2.500GHz
ossyNMMMNyMMhsssssssssssssshmmmhssssssso Memory: 8773MiB / 11928MiB
+sssshhhyNMMNyssssssssssssyNMMMysssssss+
.ssssssssdMMMNhsssssssssshNMMMdssssssss.
/sssssssshNMMMyhhyyyyhdNMMMNhssssssss/
+sssssssssdmydMMMMMMMMddddyssssssss+
/ssssssssssshdmNNNNmyNMMMMhssssss/
.ossssssssssssssssssdMMMNysssso.
-+sssssssssssssssssyyyssss+-
`:+ssssssssssssssssss+:`
.-/+oossssoo+/-.
```
# 使用探索
其实对我来说,性能根本不是什么问题,毕竟想想即使是这些淘汰的电脑,性能也比树莓派强的多,包括对比上次买的[Luckfox Pico Plus](/2024/02/24/luckfox.html)来说就强的更多了,所以即使性能比较差的电脑也不是不能用。
不过这些老机器还是有一些坑的像第一台奔腾E5300的电脑我试了一下Ubuntu就装不上安装程序都打不开可能还是有一些有差别的地方所以安装了CentOS Stream 8。不过还好这些机器都是64位的CPU如果是32位的就更麻烦了可能很多包都没地方下载。
## 关于Darling的探索
那么对于这些机器来说干点什么好呢当然除了GPIO之类的树莓派能干的他们也能干所以要干就干一些特别的东西。我想了一下我平时用的电脑是macOS系统虽然给那些旧电脑装黑苹果可能不太现实但是我之前发现了一个叫[Darling](https://github.com/darlinghq/darling)的项目类似Wine那样在Linux上运行Windows程序这个项目可以在Linux上运行macOS的程序。看起来挺有意思的所以我打算在第一台机器上试着安装一下。
不过我按照官方文档上安装对于CentOS Stream 8来说有好多包不知道为什么似乎都没有比如libavformat-free-devel之类的我只好从网上找其他RedHat系列类似的包或者找替代品FFmpeg另外Darling需要Linux 5.0或者更高的内核CentOS的内核版本太低了所以我升到了主线版本的Linux也就是6.8的版本……最终花了一天的时间终于编译好了然而悲剧的是运行的时候报了非法指令“Illegal instruction (core dumped)”的错误。一般来说这个错误是新机器上编译的程序在旧机器运行才会报的错,可我是在同一台机器上编译的为什么会报这种错误呢?可能是因为代码里包含汇编语言的代码吧。我发了个[Issue](https://github.com/darlinghq/darling/issues/1497)问了一下作者,不过看起来他也不知道是什么问题……
对于这种问题我感觉也没什么好办法……可能这台机器真的就没办法了在第二台速龙641的电脑上试了一下也不行……不过后来我在第三台装有奔腾G3240的电脑上试着编译安装了一下结果可以运行。看来确实是奔腾E5300的问题。不过它俩到底差在哪里呢看介绍会发现奔腾G3240里包含了Intel® SSE4.1和Intel® SSE4.2的指令集扩展。那么对于没有这个指令集扩展的CPU就没办法了吗Intel官方给了一个解决方法是[Intel® SDE](https://www.intel.com/content/www/us/en/developer/articles/tool/software-development-emulator.html)可以在旧机器上模拟运行使用了最新指令集的程序甚至包括AVX512都可以模拟的出来但是我用这个东西运行Darling的时候还是报错了可能Darling需要用到内核的一些特性但是SDE不能模拟……这都没办法是不是就彻底没办法了呢
在偶然的一次浏览中,我发现了一个神奇的东西,内核扩展[OPEMU](https://github.com/mirh/opemu-linux)它可以让不支持一些指令集扩展的CPU通过模拟的方式支持其实功能和SDE很像只是它是在内核中运行的我试着在第一台机器上编译安装了一下顺便一说如果是旧的5.x或者更早的Linux可以直接用这个仓库而更新的Linux比如6.x的需要用[PR](https://github.com/Spacefish/opemu-linux)中的这个仓库结果Darling真的可以运行了真是令人难以置信。
安装成功之后我在网上找了个C语言的程序[endoh1](http://www.ioccc.org/2012/endoh1/hint.html)这个程序可以用文本模拟流体。我在我的MacBook上编译了试了一下运行没有问题当然直接编译的程序是ARM64的程序肯定不能在Darling里面运行于是我切换到x86_64模式下又编译了一次并且用`lipo`命令把两个程序合并到了一起然后把程序上传到第一台机器中使用Darling运行竟然可以正常运行看来那个内核扩展还不错啊Darling居然没有出问题。
不过测试了一下可能还是有些地方有BUG比如用Git的时候会报错可能是和README中所说的CRC32表现有问题吧不过Darling好像可以直接运行Linux中的命令那我在用Git的时候调用Linux下的Git是不是也可以呢试了一下不太行因为执行Linux程序的时候不能用Darling中的目录结构不过我想装omz只需要/Users目录就够了我直接创建一个软链接把Darling的/Users目录映射到Linux的根目录就可以了吧试了一下还行可以正常运行虽然Homebrew不能安装有点可惜……不过Neofetch可以安装😆效果如下
```
'c. root@localhost.localdomain
,xNMM. --------------------------
.OMMMMo OS: macOS 11.7.4 Darling x86_64
OMMM0, Kernel: 20.6.0
.;loddo:' loolloddol;. Uptime: 2 days, 21 hours, 11 mins
cKMMMMMMMMMMNWMMMMMMMMMM0: Shell: bash 3.2.57
.KMMMMMMMMMMMMMMMMMMMMMMMWd. DE: Aqua
XMMMMMMMMMMMMMMMMMMMMMMMX. WM: Quartz Compositor
;MMMMMMMMMMMMMMMMMMMMMMMM: WM Theme: Blue (Print: Entry, AppleInterfaceStyle, Does Not Exist)
:MMMMMMMMMMMMMMMMMMMMMMMM: Terminal: /dev/pts/2
.MMMMMMMMMMMMMMMMMMMMMMMMX. Memory: 0MiB / 2969MiB
kMMMMMMMMMMMMMMMMMMMMMMMMWd.
.XMMMMMMMMMMMMMMMMMMMMMMMMMMk
.XMMMMMMMMMMMMMMMMMMMMMMMMK.
kMMMMMMMMMMMMMMMMMMMMMMd
;KMMMMMMMWXXWMMMMMMMk.
.cooc,. .,coo:.
```
既然第一台电脑装了内核扩展还是有BUG那么对于第三台电脑来说总该没问题了吧试了一下Git可以正常运行安装Homebrew也没问题但是用brew安装软件的时候会报错似乎是因为Darling安装的Command Line Tools for Xcode太旧了有些命令没有所以不能正常安装不过Neofetch又不需要编译试着安装了一下没问题但是运行的时候会报Segmentation fault: 11 (core dumped)的错误……不知道是什么问题。
## 关于旧显卡利用的探索
对于第二台电脑可以看出来它有一张上古的独显NVIDIA GeForce GT 440我装好驱动之后运行nvidia-smi可以看到
```
Sat Apr 6 08:26:45 2024
+------------------------------------------------------+
| NVIDIA-SMI 340.108 Driver Version: 340.108 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GT 440 Off | 0000:01:00.0 N/A | N/A |
| 40% 49C P0 N/A / N/A | 3MiB / 1023MiB | N/A Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Compute processes: GPU Memory |
| GPU PID Process name Usage |
|=============================================================================|
| 0 Not Supported |
+-----------------------------------------------------------------------------+
```
既然是独显那么果然还是想试试看能不能跑机器学习的算法呢。可是一般来说执行上面的命令可以看到显卡支持的CUDA版本这个执行完并没有显示啊……那我要怎么用首先我想试试装个PaddleOCR试试看但就是因为不知道这个显卡到底能用哪个版本的CUDA也不知道安装哪个版本的PaddlePaddle框架更何况之前的机器学习算法对环境要求特别严格甚至系统新了都没法用于是在各种报错下我败下阵来放弃使用CUDA来用这张显卡😭……
但并不代表机器学习必须使用CUDAOpenCL也是可以的啊正好我之前在测试OpenAI的ASR模型Whisper有人开发的一个C++使用这个模型的软件[whisper.cpp](https://github.com/ggerganov/whisper.cpp)是支持通过CLBlast使用OpenCL。于是我就先编译安装了CLBlast然后用对应的参数编译了whisper.cpp总算是能跑起来了后来看了一眼clinfo原来这张显卡才支持CUDA 6.5啊这能运行啥啊……最后试了一下效果也挺令人失望的就测试的那个音频用了大概33秒左右才转录完成果然旧显卡就是纯粹的垃圾啊。
## 关于Anbox Cloud的探索
现在轮到第四台至强E5-2620的电脑了呢这台电脑可不一般用的是服务器上用的CPU一看就是被奸商坑了买了个i9级处理器殊不知是淘汰的洋垃圾🤣。不过我手头用的服务器其实也没多好一台是[至强E5-2620v2](https://www.intel.cn/content/www/cn/zh/products/sku/75789/intel-xeon-processor-e52620-v2-15m-cache-2-10-ghz/specifications.html)(双路),另一台是[至强E5-2620v3](https://www.intel.cn/content/www/cn/zh/products/sku/83352/intel-xeon-processor-e52620-v3-15m-cache-2-40-ghz/specifications.html)(也是双路)(一二三代都有了🤣):
```
.-/+oossssoo+/-. mayx@mayx-server
`:+ssssssssssssssssss+:` ----------------------
-+ssssssssssssssssssyyssss+- OS: Ubuntu 22.04.3 LTS x86_64
.ossssssssssssssssssdMMMNysssso. Host: NF5270M3 00001
/ssssssssssshdmmNNmmyNMMMMhssssss/ Kernel: 5.15.0-78-generic
+ssssssssshmydMMMMMMMNddddyssssssss+ Uptime: 84 days, 22 hours, 20 mins
/sssssssshNMMMyhhyyyyhmNMMMNhssssssss/ Packages: 954 (dpkg), 4 (snap)
.ssssssssdMMMNhsssssssssshNMMMdssssssss. Shell: bash 5.1.16
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ Resolution: 1440x900
ossyNMMMNyMMhsssssssssssssshmmmhssssssso Terminal: /dev/pts/1
ossyNMMMNyMMhsssssssssssssshmmmhssssssso CPU: Intel Xeon E5-2620 v2 (24) @ 2.600GHz
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ GPU: 0b:00.0 ASPEED Technology, Inc. ASPEED Graphics Family
.ssssssssdMMMNhsssssssssshNMMMdssssssss. Memory: 68987MiB / 128875MiB
/sssssssshNMMMyhhyyyyhdNMMMNhssssssss/
+sssssssssdmydMMMMMMMMddddyssssssss+
/ssssssssssshdmNNNNmyNMMMMhssssss/
.ossssssssssssssssssdMMMNysssso.
-+sssssssssssssssssyyyssss+-
`:+ssssssssssssssssss+:`
.-/+oossssoo+/-.
.-/+oossssoo+/-. mayx@mayx-algo-server
`:+ssssssssssssssssss+:` ---------------------
-+ssssssssssssssssssyyssss+- OS: Ubuntu 22.04.3 LTS x86_64
.ossssssssssssssssssdMMMNysssso. Host: PowerEdge R730
/ssssssssssshdmmNNmmyNMMMMhssssss/ Kernel: 5.15.0-91-generic
+ssssssssshmydMMMMMMMNddddyssssssss+ Uptime: 84 days, 20 hours, 16 mins
/sssssssshNMMMyhhyyyyhmNMMMNhssssssss/ Packages: 1047 (dpkg), 4 (snap)
.ssssssssdMMMNhsssssssssshNMMMdssssssss. Shell: bash 5.1.16
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ Resolution: 1024x768
ossyNMMMNyMMhsssssssssssssshmmmhssssssso Terminal: /dev/pts/1
ossyNMMMNyMMhsssssssssssssshmmmhssssssso CPU: Intel Xeon E5-2620 v3 (24) @ 3.200GHz
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ GPU: NVIDIA Tesla T4
.ssssssssdMMMNhsssssssssshNMMMdssssssss. GPU: NVIDIA Tesla T4
/sssssssshNMMMyhhyyyyhdNMMMNhssssssss/ Memory: 66345MiB / 128808MiB
+sssssssssdmydMMMMMMMMddddyssssssss+
/ssssssssssshdmNNNNmyNMMMMhssssss/
.ossssssssssssssssssdMMMNysssso.
-+sssssssssssssssssyyyssss+-
`:+ssssssssssssssssss+:`
.-/+oossssoo+/-.
```
都是正儿八经的洋垃圾,不过对于服务器嘛,垃圾一点也没什么,又不是不能用,至少比租的云服务器好吧。
不过既然是服务器级的CPU自然实验也得要符合服务器级这个级别的处理器就不用担心什么指令集缺失之类的问题了正好最近注册了个Ubuntu Pro里面有个Anbox Cloud可以拿来试试看。
关于Anbox我之前[试过Waydroid和redroid](/2023/12/24/android.html)不过Anbox Cloud不太一样这个有点像OpenStack那样是云手机的管理和实现平台Anbox对它来说就像QEMU对OpenStack是创建实例的工具。安装还挺简单的启用Ubuntu Pro之后再执行`sudo pro enable anbox-cloud`剩下的跟着提示走就行了不过因为我的硬盘有点问题有一半的区域有坏块虽然屏蔽掉了但还是有些问题第一次安装失败了第二次才成功。不过应该说不愧是云平台吗用起来和我当年学OpenStack在虚拟机里安装一样卡而且啥也没干先占掉8GiB内存尤其是对这个又老内存也小的垃圾旧机器来说果然还是有点勉强啊更何况硬盘还是坏的🤣。安装好之后用浏览器直接输入IP就能登录平台了第一次使用要绑定Ubuntu One账号感觉有点不开放啊……登录之后可以上传应用作为模板类似镜像那样可以在创建会话的时候使用相同的镜像然后每个会话之间是隔离的。不过有个问题是这个东西居然没有ARM兼容层上传不兼容x86_64的软件会不允许创建应用😅这有点废物啊难不成想用这个东西搭个云手机厂商还要买一堆ARM的服务器之后我找了半天发现Via浏览器可以兼容所有架构的处理器上传上去之后又报错一次😅重新再上传才算正常运行起来了。
# 感想
经过这次的测试可以看出来这些旧电脑其实安装了Linux发行版之后除了会遇到一堆莫名其妙的问题之外并不是不能用顶多是卡了一些或者要花点精力解决罢了。其实这么看来除了人工智能方面的发展确实受到了硬件方面的制约其他的程序其实都无所谓呢即使是现在的软件放到以前的电脑上也能运行不知道是软件发展的太慢还是兼容性做的太好了呢

View File

@ -1,30 +0,0 @@
---
layout: post
title: 从宝塔面板中学习运维知识
tags: [宝塔, 运维]
---
用Python代码的程序就等着被抄吧<!--more-->
# 起因
之前我[用旧电脑拼了一堆服务器](/2024/04/06/old-pc.html),但是上面装的东西其实试完之后就没什么兴趣了,主要是它们实际上没有解决什么问题。后来我觉得还是更应该向更有意义的地方靠,于是我就在每个机器上安装了不同的运维面板,打算分别测试一下效果。
我安装的面板有[1Panel](https://github.com/1Panel-dev/1Panel)[小皮面板公测版](https://beta.xp.cn/)[宝塔面板破解版](https://baota.sbs/)。1Panel很不错但是除了网站管理之外功能全是Docker带来的另外代码是Go写的我现在还看不懂。小皮面板重构之后很令我失望功能比旧版小皮面板还少安装的时候居然还会收集服务器信息并上传运行环境版本少PHP连扩展安装的功能都没有而且现在直接摆烂全放的是配置文件要是都自己改配置文件了还要面板干啥另外重构之后也变成Go写的了就这样拿什么和别的面板打
宝塔面板破解版之前我在[测试Koyeb](/2022/11/29/free-server.html)的时候试过一个,不过后来看到了一个新的,主要是之前那个界面上改的全是的广告,新找的这个破解版不仅界面没有做什么修改,而且[后端开源](https://github.com/flucont/btcloud),也不用担心有什么后门。
虽然我不信任宝塔面板毕竟漏洞出的多各种收费项目还各种收集用户信息强制登录啥的但是有一个好处就是它是Python写的而且大多数代码并没有混淆代码倒是[开源](https://github.com/aaPanel)了就是没更新。作为一款算是比较成熟的面板有些功能还是比较有意思的而且我也能看懂Python代码所以有些有意思的功能就可以看看它的代码是如何实现的。
# 功能探索与解析
对于免费版有的功能其实我不太关心一是那些大多数并不复杂自己装也没什么难度二是大多功能其实我并不感兴趣🤣。对于付费功能不得不说有的还挺离谱的有些非常简单的功能价格居然很贵比如服务器网络加速BBR这个功能是内核提供的自己一个命令就能打开和宝塔半毛钱关系都没有价格居然是4.93元/天?不过我没用过官网下的宝塔,不知道是破解版乱标还是真是这个价格。
另外还有一些是纯粹解析类的也没什么意思比如网站监控报表还有WAF啥的那些没什么技巧就只是只要肯写这个功能就会有的东西。我的话更关心一些看起来实现还算难值得收钱但是实现其实很简单的东西😁。
## 宝塔防入侵
其实对于这个功能我觉得实现应该不复杂用SELinux或者AppArmor然后进行合理的配置应该就可以了但是离谱的是开了这个功能我安装Redis等软件的时候各种报错用宝塔安装Redis是通过编译安装的正常来说不应该报错才对的啊而且就算用了SELinux或者AppArmor也不应该有问题另外它的报错是Segmentation fault什么情况编译会报这种错误啊……所以我看了看它的代码原来他们的实现根本没有用SELinux或者AppArmor可能一是配置复杂他们的程序员驾驭不了二是Ubuntu和红帽系不一定都有安SELinux或者AppArmor适配起来比较麻烦。他们用的居然是一个不知名的开源软件[Snoopy](https://github.com/a2o/snoopy)原理也很简单就是在环境变量里配置在运行任意软件的时候把Snoopy先加载进去然后它就能记录程序运行时的行为了但显然这个程序并不怎么成熟运行某些软件的时候居然会报Segmentation fault的错误这样的东西也好意思收钱
## 宝塔系统加固
其实这个功能没啥特别的但是我看它有好多关于等保的功能因为我维护的服务器中也有需要符合等保要求的所以这个功能对我来说还挺有用至少可以做个参考。不过里面有些比如对文件或者文件夹的保护这个实现我还挺感兴趣的正常来说就算拿权限限制也限制不了root可是这个功能打开之后居然连root都没有权限操作还是挺神奇的之后我看了一下代码原来有一个叫做chattr的东西用这个可以加扩展权限比如`chattr +i <file>`就可以让任何人都没有权限操作这个文件,想要操作的话必须执行`chattr -i <file>`解除才行。因为一般都是拿普通权限限制的,从来没考虑过扩展权限,这下学到新知识了😆。
## 文件监控
这个功能其实也不复杂,之前我写过一个[定时调度器](/2022/09/21/cron.html)其中的热载功能用的是watchdog而wathcdog在Linux下其实用的就是inotify特性宝塔在实现这个东西的时候用的是pyinotify库其实它俩倒是没什么特别大的区别只是watchdog能跨平台而已虽然宝塔面板也有Windows版不过估计应该是没有这个插件吧。
## 堡塔企业级防篡改
这个和刚才那个用chattr的从功能上来看倒是挺像的不过这个写的是内核级看了一下确实有个内核模块叫做tempercore虽然编译是在本地进行的但是代码加了密编译还得用它文件夹里一个叫jm的程序进行编译😅我猜它的实现应该是在内核里hook了操作文件的API操作完之后会进行记录不过试了一下根本没有起效果😅不知道是我破解版的问题还是不支持Ubuntu……
## 堡塔运维平台
从功能上来看挺像Ansible的看了一下代码是用paramiko直接在远程服务器上执行命令的。不过Ansible也是Python写的倒是没差。功能有点太简单了自己用脚本也能实现不过提供了个面板可能相对适合小白吧就是这个价格恐怕只有脑子进水的人才会买了。
# 总结
总的看来宝塔确实有些有意思的功能,实现有些挺有意思的,看了他们的代码之后感觉也能学到点东西,也许以后有机会可以用得上。但是完全不值那个价,这点东西也敢卖钱也真是挺厉害的,不过可能对于政府项目来说这些安全功能还是挺有意义的,毕竟没什么运维会去当公务员,而且企业版的价格对他们来说都已经算相当便宜了🤣。

View File

@ -1,27 +0,0 @@
---
layout: post
title: Hackintosh使用体验
tags: [Apple, Hackintosh, macOS, 黑苹果]
---
使用Mac到底有些什么优势呢<!--more-->
# 起因
我曾经装过很多系统Windows、FreeBSD、Linux发行版什么的都试过但是直到我[拥有MacBook](/2023/02/03/mbp.html)我也没有试过安装黑苹果。主要是在ARM芯片的Mac出现之前我一直看不起Mac因为没有差异化明明和其他电脑用的是同样的东西一样的CPU、一样的显卡、一样的内存以及硬盘凭什么比其他电脑贵那么多也因此CPU能效不行续航也不行而且质量也不行据说在使用蝴蝶键盘那段时间键盘的损坏率极高而且散热很差经常出现CPU空焊的问题还因此有了“梦幻单热管”的名号。
当然也是因为垃圾的硬件与其配套的软件macOS也并没有什么优势我也没什么兴趣去装黑苹果对我来说我觉得x86时代的macOS更像是一种Linux发行版。
但直到ARM芯片的Mac出来之后一切才不一样起来差异化是一方面在这个芯片的加持下的macOS也出现了很多的黑科技……当然这都不是重点重点是最近正好需要一台Mac我又不想用我自己的MacBook所以随便找了台电脑装了个黑苹果试试效果。
# 安装体验
据说安装黑苹果很麻烦不过具体麻烦在哪我也不太清楚。看了一下教程是要根据自己的电脑硬件情况自定义一个EFI文件夹用来引导应该就是用这个方式模拟Mac的引导环境。至于怎么搞这个EFI文件夹我搜了一下有一个叫做[RapidEFI-Tool](https://github.com/JeoJay127/RapidEFI-Tool)的软件可以填入自己电脑的硬件信息然后一键生成EFI。生成完成之后把要装macOS的硬盘的分区全部删除然后新建ESP分区把EFI文件放进去就行了然后剩余的空间再创建一个分区把苹果官方的系统镜像用[balenaEtcher](https://etcher.balena.io/)烧录到U盘里剩下的就和正常安装系统的步骤一样了遵循向导的提示进行就行了。
这么来看好像也没有很复杂也可能是因为我用的是台式机不用考虑无线网络之类的问题吧当然隔空投送之类的东西就用不了了我看其他大多数人遇到的问题好像都出在无线网络上而且我的CPU比较老是i5-7500在适合装黑苹果的范围内所以没有出现奇怪的问题安装完成之后硬盘、显卡、内存都正确识别了打开浏览器也能正常上网看来是成功了。
# 使用体验
我装的系统和我的MacBook一样都是macOS Sonoma 14.5所以整体体验都是一样的而且黑苹果的内存还更大是16GiB的这也能让我安心的尝试虚拟机了不像我的笔记本才8GiB连虚拟机都不敢安。
绝大多数软件安装都没有问题使用也和笔记本一样不过如果完全一样不就体现不出我笔记本的优势了嘛🤣我还试了试别的软件比如针对Apple芯片优化的[llama.cpp](https://github.com/ggerganov/llama.cpp)试了一下可以运行但是结果全是乱码。应该是llama.cpp可以调Metal的API使用核显进行加速但是核显好像最多只能分配2GiB的显存而且和Apple芯片不一样的是它好像并不是可以随意分配内存给显卡的分配给显卡的部分CPU就不能用了而Apple芯片是两边都可以用也正是如此假设核显的内存够用模型也要占两份内存而Apple芯片的只需要占一份内存我猜的😝
另外使用了Apple芯片的NPU的软件[Mochi Diffusion](https://github.com/MochiDiffusion/MochiDiffusion)也是不能运行的因为根本没有做x86版本的🤣不过用brew安装居然可以安但是打不开🤣所以提了个[pr](https://github.com/Homebrew/homebrew-cask/pull/176891)。不过就算做了拿Intel那个核显跑估计会卡死。
另外还有[PlayCover](https://github.com/PlayCover/PlayCover)也装不了这个也算是Apple芯片的特色了毕竟苹果不可能做ARM转x86的RosettaiOS的软件只可能是ARM架构的Intel的Mac当然执行不了了。
还有为GPTk设计的软件[Whisky](https://github.com/Whisky-App/Whisky)也不能用不过这个无所谓毕竟黑苹果想切回Windows再简单不过了根本没有安装这种软件的必要当然如果说类似的Crossover应该可以用不过那个不是免费的所以我不会去尝试它。
虚拟机的话我先试了一下VMware Fusion安装是正常的但是打不开BIOS的虚拟化也开了VT-d好像黑苹果不能开但应该不影响运行虚拟机。之后又试了一下UTM我本来以为UTM是专门给Apple芯片使用的结果居然能安装上而且Intel版也有苹果官方的虚拟化框架所以原生运行x86版的Ubuntu没有问题而且系统信息显示的是Apple Virtualization Generic Platform看来虚拟化的功能都是正常的黑苹果效果还不错。
# 感想
虽然总的来看黑苹果算是不错但是在我看来也顶多省了个Mac Mini而已当然Mac Pro应该也能拿黑苹果代替iMac毕竟有个质量还不错的屏幕不能完全代替。毕竟从功能来说我觉得macOS和Linux差不多尤其现在Linux的软件越来越多现在连微信都有Linux原生版了而且还有Intel Mac没有的移动端软件Linux可以[用容器运行Android](/2023/12/24/android.html)。不过对于笔记本来说续航是最大的优势Apple芯片+macOS带来的笔记本体验才是最好的其他Mac Mini啥的根本没有体现出Apple芯片的优势毕竟要说性能的话同价格Mac是没有优势的唯有续航是没有其他笔记本产品能打的带充电宝没用充电宝能续几个航啊

View File

@ -1,294 +0,0 @@
---
layout: post
title: 使用Cloudflare Workers制作博客AI摘要
tags: [Cloudflare, Workers, AI, 博客]
---
Cloudflare实在是太强了以至于全都依赖它了😂<!--more-->
# 起因
虽然很早就在[关注AI](/2023/04/05/ai.html)了而且也看到有些博客早已用上了AI摘要比如xLog下的但是一般都要后端提前生成好另外那时候还没有那么多免费好用的接口可以用像OpenAI到现在还没有GPT免费的API😂至于花钱就更是想都别想互联网的东西我是不会花钱的就因为这样我一直都没有考虑过给我的博客加AI摘要的功能。
直到前两天看到一个Hexo的博客有一个AI摘要的功能如果是有后端的博客我可能还没什么兴趣但是既然是纯前端的就引发了我的兴趣我大概看了一下用的是一个叫[Post-Abstract-AI](https://github.com/zhheo/Post-Abstract-AI)的项目定睛一看居然还是收费的而且API Key还是直接明文放代码里的给我看笑了。如果我拿着这个Key去不停刷使用量不一会就把它刷完了不过这时候我想起来赛博活佛Cloudflare之前也出了AI功能还是免费的我何不用Workers写一个好好打脸一下这个收费的项目就像我对[Server酱](/2021/02/02/serverchan.html)做的事情一样。
# 开始制作
首先先不考虑重复造轮子去Github上看看有没有现成的毕竟Cloudflare的这个AI功能也出了不少时间了搜了一下还真有叫[Qwen-Post-Summary](https://github.com/FloatSheep/Qwen-Post-Summary)用的居然还是阿里的通义千问模型这倒是不错毕竟如果用Llama3的话说不定给我生成出来全是英文了国产的模型至少都是对中文优化过的。
我仔细看了看发现它怎么是把文章放GET请求里的要知道浏览器是不会允许超过4KiB的请求头的看了一下代码还截取成前1800字了感觉有点不爽不过我搜了一下为了能简单的做到流式效果用的EventSource功能根本不支持POST请求……看来这个代码不能直接拿来用了另外我也不希望每次打开文章都重新生成摘要那样不仅浪费计算资源而且毫无意义毕竟文章又不会变。所以我首先考虑怎么样存AI生成的结果呢另外为了能通过POST把文章喂给AI我也得考虑存文章。最开始我想着用Workers的KV数据库因为那是最早出的虽然限制很多但当时没得选。但这次点开发现居然有个D1数据库容量更大[延迟更低](https://github.com/bruceharrison1984/kv-d1-benchmark)操作次数更多而且还支持SQL语法这不比那个KV数据库好太多了这下都不知道这个KV数据库留着还有啥意义了可能就单纯是为了兼容以前的应用不得不留着了吧。
不过既然会存储内容还得考虑一点就是万一有人偷偷拿我的接口把我的文章内容换了让AI生成了糟糕的内容显示在我的文章里多不合适啊所以为了避免这种问题我每次会对比文章的数字摘要免得有人把我数据库里的文章篡改了🤣。
最终基于上面的代码边查文档边改把代码写出来了,顺便把我之前写的[博客计数器](/2019/06/22/counter.html)也一起替换掉了做到真正的Serverless
```javascript
async function sha(str) {
const encoder = new TextEncoder();
const data = encoder.encode(str);
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
const hashArray = Array.from(new Uint8Array(hashBuffer)); // convert buffer to byte array
const hashHex = hashArray
.map((b) => b.toString(16).padStart(2, "0"))
.join(""); // convert bytes to hex string
return hashHex;
}
async function md5(str) {
const encoder = new TextEncoder();
const data = encoder.encode(str);
const hashBuffer = await crypto.subtle.digest("MD5", data);
const hashArray = Array.from(new Uint8Array(hashBuffer)); // convert buffer to byte array
const hashHex = hashArray
.map((b) => b.toString(16).padStart(2, "0"))
.join(""); // convert bytes to hex string
return hashHex;
}
export default {
async fetch(request, env, ctx) {
const db = env.blog_summary;
const url = new URL(request.url);
const query = decodeURIComponent(url.searchParams.get('id'));
const commonHeader = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': "*",
'Access-Control-Allow-Headers': "*",
'Access-Control-Max-Age': '86400',
}
if (query == "null") {
return new Response("id cannot be none", {
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': "*",
'Access-Control-Allow-Headers': "*",
'Access-Control-Max-Age': '86400',
}
});
}
if (url.pathname.startsWith("/summary")) {
let result = await db.prepare(
"SELECT content FROM blog_summary WHERE id = ?1"
).bind(query).first("content");
if (!result) {
return new Response("No Record", {
headers: commonHeader
});
}
const messages = [
{
role: "system", content: `
你是一个专业的文章摘要助手。你的主要任务是对各种文章进行精炼和摘要,帮助用户快速了解文章的核心内容。你读完整篇文章后,能够提炼出文章的关键信息,以及作者的主要观点和结论。
技能
精炼摘要:能够快速阅读并理解文章内容,提取出文章的主要关键点,用简洁明了的中文进行阐述。
关键信息提取:识别文章中的重要信息,如主要观点、数据支持、结论等,并有效地进行总结。
客观中立:在摘要过程中保持客观中立的态度,避免引入个人偏见。
约束
输出内容必须以中文进行。
必须确保摘要内容准确反映原文章的主旨和重点。
尊重原文的观点,不能进行歪曲或误导。
在摘要中明确区分事实与作者的意见或分析。
提示
不需要在回答中注明摘要(不需要使用冒号),只需要输出内容。
格式
你的回答格式应该如下:
这篇文章介绍了<这里是内容>
` },
{ role: "user", content: result.substring(0, 5000) }
]
const stream = await env.AI.run('@cf/qwen/qwen1.5-14b-chat-awq', {
messages,
stream: true,
});
return new Response(stream, {
headers: {
"content-type": "text/event-stream; charset=utf-8",
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': "*",
'Access-Control-Allow-Headers': "*",
'Access-Control-Max-Age': '86400',
}
});
} else if (url.pathname.startsWith("/get_summary")) {
const orig_sha = decodeURIComponent(url.searchParams.get('sign'));
let result = await db.prepare(
"SELECT content FROM blog_summary WHERE id = ?1"
).bind(query).first("content");
if (!result) {
return new Response("no", {
headers: commonHeader
});
}
let result_sha = await sha(result);
if (result_sha != orig_sha) {
return new Response("no", {
headers: commonHeader
});
} else {
let resp = await db.prepare(
"SELECT summary FROM blog_summary WHERE id = ?1"
).bind(query).first("summary");
if (resp) {
return new Response(resp, {
headers: commonHeader
});
} else {
const messages = [
{
role: "system", content: `
你是一个专业的文章摘要助手。你的主要任务是对各种文章进行精炼和摘要,帮助用户快速了解文章的核心内容。你读完整篇文章后,能够提炼出文章的关键信息,以及作者的主要观点和结论。
技能
精炼摘要:能够快速阅读并理解文章内容,提取出文章的主要关键点,用简洁明了的中文进行阐述。
关键信息提取:识别文章中的重要信息,如主要观点、数据支持、结论等,并有效地进行总结。
客观中立:在摘要过程中保持客观中立的态度,避免引入个人偏见。
约束
输出内容必须以中文进行。
必须确保摘要内容准确反映原文章的主旨和重点。
尊重原文的观点,不能进行歪曲或误导。
在摘要中明确区分事实与作者的意见或分析。
提示
不需要在回答中注明摘要(不需要使用冒号),只需要输出内容。
格式
你的回答格式应该如下:
这篇文章介绍了<这里是内容>
` },
{ role: "user", content: result.substring(0, 5000) }
]
const answer = await env.AI.run('@cf/qwen/qwen1.5-14b-chat-awq', {
messages,
stream: false,
});
resp = answer.response
await db.prepare("UPDATE blog_summary SET summary = ?1 WHERE id = ?2")
.bind(resp, query).run();
return new Response(resp, {
headers: commonHeader
});
}
}
} else if (url.pathname.startsWith("/is_uploaded")) {
const orig_sha = decodeURIComponent(url.searchParams.get('sign'));
let result = await db.prepare(
"SELECT content FROM blog_summary WHERE id = ?1"
).bind(query).first("content");
if (!result) {
return new Response("no", {
headers: commonHeader
});
}
let result_sha = await sha(result);
if (result_sha != orig_sha) {
return new Response("no", {
headers: commonHeader
});
} else {
return new Response("yes", {
headers: commonHeader
});
}
} else if (url.pathname.startsWith("/upload_blog")) {
if (request.method == "POST") {
const data = await request.text();
let result = await db.prepare(
"SELECT content FROM blog_summary WHERE id = ?1"
).bind(query).first("content");
if (!result) {
await db.prepare("INSERT INTO blog_summary(id, content) VALUES (?1, ?2)")
.bind(query, data).run();
result = await db.prepare(
"SELECT content FROM blog_summary WHERE id = ?1"
).bind(query).first("content");
}
if (result != data) {
await db.prepare("UPDATE blog_summary SET content = ?1, summary = NULL WHERE id = ?2")
.bind(data, query).run();
}
return new Response("OK", {
headers: commonHeader
});
} else {
return new Response("need post", {
headers: commonHeader
});
}
} else if (url.pathname.startsWith("/count_click")) {
let id_md5 = await md5(query);
let count = await db.prepare("SELECT `counter` FROM `counter` WHERE `url` = ?1")
.bind(id_md5).first("counter");
if (url.pathname.startsWith("/count_click_add")) {
if (!count) {
await db.prepare("INSERT INTO `counter` (`url`, `counter`) VALUES (?1, 1)")
.bind(id_md5).run();
count = 1;
} else {
count += 1;
await db.prepare("UPDATE `counter` SET `counter` = ?1 WHERE `url` = ?2")
.bind(count, id_md5).run();
}
}
if (!count) {
count = 0;
}
return new Response(count, {
headers: commonHeader
});
} else {
return Response.redirect("https://mabbs.github.io", 302)
}
}
}
```
另外也写了配套的前端代码用的jQuery其实应该用Fetch的😂
{% raw %}
```html
<b>AI摘要</b>
<p id="ai-output">正在生成中……</p>
<script>
async function sha(str) {
const encoder = new TextEncoder();
const data = encoder.encode(str);
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
const hashArray = Array.from(new Uint8Array(hashBuffer)); // convert buffer to byte array
const hashHex = hashArray
.map((b) => b.toString(16).padStart(2, "0"))
.join(""); // convert bytes to hex string
return hashHex;
}
async function ai_gen(){
var postContent = "文章标题:" + {{ page.title | jsonify }} + ";文章内容:" + {{ page.content | strip_html | strip_newlines | jsonify }};
var postContentSign = await sha(postContent);
var outputContainer = document.getElementById("ai-output");
$.get("https://summary.mayx.eu.org/is_uploaded?id={{ page.url }}&sign=" + postContentSign, function (data) {
if (data == "yes") {
$.get("https://summary.mayx.eu.org/get_summary?id={{ page.url }}&sign=" + postContentSign, function (data2) {
outputContainer.textContent = data2;
});
} else {
$.post("https://summary.mayx.eu.org/upload_blog?id={{ page.url }}", postContent, function (data) {
$.get("https://summary.mayx.eu.org/get_summary?id={{ page.url }}&sign=" + postContentSign);
const evSource = new EventSource("https://summary.mayx.eu.org/summary?id={{ page.url }}");
outputContainer.textContent = "";
evSource.onmessage = (event) => {
if (event.data == "[DONE]") {
evSource.close();
return;
} else {
const data = JSON.parse(event.data);
outputContainer.textContent += data.response;
}
}
});
}
});
}
ai_gen();
</script>
```
{% endraw %}
本来文章内容应该从html里读更好一些但是标签啥的还得用正则去掉感觉不如Liquid方便😂。另外博客计数器不应该用MD5的但懒得改之前的数据了还好Cloudflare Workers为了兼容是支持MD5的免得我还得想办法改数据库里的数据。
# 使用方法
如果想给自己的静态博客加AI摘要功能的话也可以用我的接口把前端代码粘到模板里就行反正是用的Cloudflare的资源而且现在通义千问的模型还是Beta版调用没有次数限制就算之后变正式版也能每天免费用1w个神经元好像可以进行1k次左右的生成完全够用了只要别和我文章url重了就行。
不过毕竟Workers本身是有每日调用次数限制的自己部署当然更好。方法也很简单首先在D1里创建一个数据库然后创建一个Workers在变量里绑定AI和新建的D1数据库名字要起成blog_summary如果想换名字就要改代码里面建一张叫做blog_summary的表需要有3个字段分别是id、content、summary都是text类型如果想用博客计数器功能就再加一张counter表一个是urltext类型另一个是counterint类型。本来博客计数器接口名字也打算用counter的结果不知道AdBlock有什么大病居然会屏蔽“counter?id=”这样的请求😆害的我只能改成count_click这样的名字了。
# 其他想法
加了这个功能之后感觉效果还挺不错的,这下就有点想加点别的功能了,比如文章推荐和知识库问答啥的, ~~不过这个似乎需要什么向量数据库,而且数据需要进行“嵌入”处理,这用现有的东西感觉难度实在是太高了所以就算了……~~ 在2024.09.27中[已经实现了](/2024/09/27/rag.html) 另外还想用文生图模型给我的文章加个头图,不过我天天写的都是些技术文章,没啥图可加吧🤣。其他的之后再看看有什么有意思的功能再加吧。
# 感想
Cloudflare真不愧是赛博活佛这波操作下来不就省下了那笔生成费用啥都是免费的不过问题就是Cloudflare在这方面几乎是垄断地位虽然国际大厂倒是不担心倒闭不过万一挂了想再找个这样厉害的平台可就没了😆。

View File

@ -1,58 +0,0 @@
---
layout: post
title: 华为仓颉语言使用体验
tags: [华为, 仓颉, 体验]
---
看看“自研”的轮子有什么特别之处?<!--more-->
# 起因
前段时间因为华为对它的仓颉编程语言开启了公测(公开内测),随后媒体又吹了一波。虽然华为最近也整了好多乱七八糟的东西,但至少我没有亲眼见过。既然这个仓颉的编译器公测了我就申请试试看呗,反正编译器又不需要特定的设备或者系统运行。
申请之后过了几天就通过了然后编译器的安装包就可以在GitCode上下载。目前看起来没有开源可以在Windows x64macOS和Linux的x64和aarch64上运行和编译另外也支持它的那个鸿蒙Next系统虽然我申请了那个插件也通过了但是毕竟没有真机而且那个IDE挺大的也就算有模拟器可以用也懒得试😂。
# 编写体验
首先我下了Windows版的编译器安装好之后看了看文档感觉语法倒是没什么复杂的不过和Python差别还是挺大的所以还是得看着文档写😂。看了一圈之后首先写个九九乘法表试试看
```kotlin
main() {
for (i in 1..10) {
for (j in 1..i + 1) {
print("${j}*${i}=${i*j}\t")
}
println()
}
}
```
编译之后运行倒是没什么问题,随后再写个递归版的试试看:
```kotlin
func row(i: Int): Unit{
if(i < 10){
col(i, 1)
println()
row(i + 1)
}
}
func col(i:Int, j:Int): Unit{
if(i >= j){
print("${j}*${i}=${i*j}\t")
col(i, j + 1)
}
}
main() {
row(1)
}
```
运行也没有问题那就试试看把编译的产物放别的电脑运行试试看结果就不能运行了。似乎是依赖了“libcangjie-runtime”和“libsecurec”这两个库即使是在编译选项里开了静态编译也没有用因为SDK里没有这两个的静态库文件而且也没有它们的源代码……像Golang都是静态编译没有什么乱七八糟的依赖的啊……
另外我在Github上搜了一下“libsecurec”这个库是有源代码的叫做[libboundscheck](https://github.com/openeuler-mirror/libboundscheck)看名字是用来字符边界检查之类的库似乎华为很多产品里都有用在这个SDK里用的是[这个](https://github.com/openeuler-mirror/libboundscheck/tree/5701ca210dfb71037f3cb3340166d150917e8a4d)版本。
不过如果仓颉主要是给鸿蒙Next用的话那个系统应该是预先有装仓颉的运行环境的应该不静态编译也行。
# 对仓颉语言的看法
单从我上面写的这点代码看的话这语法比C都复杂😂看了一下文档乱七八糟的概念还挺多毕竟是融合了各种各样的语言有Java的复杂支持什么注解和反射之类的还有TS的声明类型变量还要指定变不变啥的不过似乎没有关于异步的语法可能是用线程弥补吧其他近些年出的语言我没怎么接触过所以其他的不太清楚不过让AI看了看我写的那段代码它说像Kotlin然后讨论群里又说借鉴了50%的Rust🤣确实融合的有点多。另外据说除了编译成机器码CJNative外还能编译成字节码CJVM不过CJVM在内测不知道到时候会不会正式发布……除此之外也能调C和Python的库似乎是用的FFI调用可以不用单独开个进程然后去获得输出的值效率应该还是挺高的。
但是要说这个语言有什么特别之处目前似乎也看不出来不过毕竟仓颉语言算是给鸿蒙Next系统用的学着iOS/macOS整Swift那样吧但是在苹果系开发要想用苹果的框架可能Swift是最好的选项。鸿蒙Next除了这个还整的什么ArkTS那个可能算是小程序吧毕竟那个没见过不知道底层是怎么运行的至于鸿蒙Next能不能用其他语言开发目前也不知道倒是能用NDK要是能的话大家肯定是用现有已经开发好的改改然后移植到鸿蒙Next吧前提是这些公司认为用鸿蒙Next的人使用他们的软件有足够的收益如果不行从头开发成本就更高了估计得劝退一大堆公司。毕竟鸿蒙Next没有历史和Android以及iOS根本不能比而且相比也没有解决什么痛点另外其他手机厂商也不会考虑使用鸿蒙Next只能像苹果一样搞成仅自家使用的系统。但是用户量根本和iPhone不能比公司可不会听华为在网上的营销毕竟公司是要实实在在赚钱的靠营销只能忽悠普通人但要是普通人买来发现除了国内大厂的软件其他软件全不能用估计也没人买了🤣
另外鸿蒙Next好像也会搞PC版就像Mac那样。不过Mac是正经啥语言写的都能运行而且相对还是挺开放的到时候如果PC版的鸿蒙Next连终端个也没有而且只能运行仓颉语言写的软件那怕是比其他Linux发行版还废了🤣。
不过如果用户侧如果搞不好的话说不定可以在服务器上用,毕竟服务器的话只在乎能不能写出这个软件,至于用什么语言写其实不重要,只要性能好就行,如果华为能整一批写仓颉的学生,还能把该整的库整好,也许会有公司考虑用,在做政府相关的项目说不定可以作为卖点🤣。
# 感想
虽然说华为整的这堆莫名其妙的东西也许没什么用,或者也可能会有些用,不过毕竟搞这些东西已经算是用公司的前景去赌未来了,虽然拿这些东西搞营销很恶心,但目前来看至少确实是有在也许没回报的东西上投真金白银的,还是挺厉害的。
但正因为它们营销搞太多了,到时候因为搞这些东西把公司玩死了我觉得也是大快人心的🤣🤣🤣。

View File

@ -1,23 +0,0 @@
---
layout: post
title: Mac mini 2018使用体验
tags: [Apple, Mac, 体验]
---
买个快过时的产品是什么感受🤣<!--more-->
# 起因
最近由于某些原因需要一个装有macOS的电脑用来开发虽然我自己[有MacBook Pro](/2023/02/03/mbp.html)但是我不太想让我的电脑上装一堆乱七八糟的环境而且我的Mac只有8GiB内存😅也不适合整比较复杂的东西。那既然这样上次不是[整了个黑苹果](/2024/06/16/hackintosh.html)吗但是考虑到黑苹果不太可靠可能更新着系统就挂了而且用APFS文件还不好拷出来。那既然买白苹果是不是还是买M芯片的Mac mini比较好但是这次开发的程序原来是在Intel的Mac上开发的虽然有Rosetta 2但是怕出一些莫名其妙的问题然后再考虑到以后可能要升macOS 15macOS 16应该就不再支持Intel的Mac了所以最后还是整了个二手的8+512的Mac mini 2018i5-8500B版
# 更换内存
刚拿到手的时候是8GiB内存显然有点小了不过Mac mini 2018是支持自己更换内存的所以又额外买了两条16GiB内存。东西都到了之后就打算直接拆开来换结果发现我手头没有T6H的螺丝刀🤣。我之前有买过一个很便宜的25合1的螺丝刀套装里面包含梅花螺丝批头但是没想到这个Mac mini上的螺丝上面有个柱子普通的T6螺丝刀根本插不进去。没办法只好单独买了这个螺丝刀……在拿到螺丝刀之前我觉得还是得看看教程所以网上搜了个[iFixit的教程](https://zh.ifixit.com/Guide/Mac+mini+Late+2018+%E7%89%88%E5%86%85%E5%AD%98%E6%9B%B4%E6%8D%A2/115309),看了一下还好只有外壳的螺丝是带柱子的,不然又得买😂。
最后东西到齐之后按照上面的教程把内存换了这下就成了32+512的Mac mini了也算够用了。
# 使用体验
作为最后一代Intel的Mac这个Mac mini其实和黑苹果的区别也就是T2芯片了。但要说这个T2芯片到底在使用体验上有啥区别目前来看只能说几乎没有……当然不是完全没有因为装有T2芯片以及之后的M芯片的Mac硬盘默认都是加了密的所以在开启文件保险箱的时候瞬间就能打开不需要额外的加密过程。黑苹果虽然也支持文件保险箱似乎是装“AppleKeyFeeder-64.efi”这个驱动就可以先不说这个东西会不会出问题至少它在加解密的过程中需要占用CPU在这个Mac上它的加解密都是在这个T2芯片上进行的所以不会影响CPU性能其实这要比Windows的Bitlocker要好一些现在预装Windows的电脑基本上默认就开了Bitlocker但使用肯定是要用CPU进行加解密的多多少少会影响一点性能在这个Mac上就不会有问题了。
除此之外就是无线网络了我装的黑苹果是在台式机上装的没有无线网卡当然隔空投送也用不了。白苹果就可以而且很快我试了一下从我的MacBook传到Mac Mini速度最高可以达到400Mbps当然和现在的Wi-Fi相比不算很快但是在我用的设备里面已经算快的了 ~~(用的全是垃圾🤣)~~
另外我还听说T2芯片在视频编解码上有额外的优势不过这个我没法测毕竟买它又不是为了剪辑的至于看视频基本上只要支持硬件解码看4K视频都不会有压力反正我试了我的黑苹果看4K也没有卡。
其他部分和黑苹果几乎没什么区别毕竟都是Intel的芯片黑苹果不能干的白苹果一样也不能干没有因为多出来一个T2芯片就多出来运行ARM程序的能力至于装Windows……当然两边都能装白苹果有启动转换黑苹果本来就能直接装。接下来的话就只能希望苹果在下一个macOS版本更新中淘汰掉没有T2芯片的Intel的Mac这样黑苹果就彻底完蛋了而这个有T2芯片的就能发挥它最后的价值了只不过目前来看黑苹果在macOS 15的Beta版仍然可以装看来是没什么希望了🤣。
# 感想
这么看来买这个Mac mini 2018似乎意义不大啊不过毕竟要长期用为了可靠性多花点钱也没什么问题不过这个二手的Mac mini 2018居然比M1的Mac Mini还要贵😂明明性能要更差啊……不过考虑到M芯片的加内存那么贵而且这个Intel芯片的以后就算不用macOS还能装Windows也许就是这个原因所以更贵吧

View File

@ -1,81 +0,0 @@
---
layout: post
title: Python国密算法使用探索
tags: [Python, GmSSL, 国密]
---
使用罕见的算法是什么感受😁<!--more-->
# 起因
前段时间因为某些原因需要对某些东西进行密评改造需要使用国密算法。虽然国密算法也算进入标准了但是网上能搜到的资料还是太少了尤其是Python的大多资料都是Java的所以我打算自己研究研究。
# 关于Python使用国密算法的方式
其实在新版OpenSSL中已经支持了国密算法比如SM3还有SM4不过[pyOpenSSL](https://github.com/pyca/pyopenssl)似乎只有对非对称加密算法的支持……我倒是不在乎,因为在我实际应用里加解密都是服务器密码机处理的,我自己连密钥也看不到,所以不需要管怎么实现。但是签名验签还有摘要算法之类的理论上应该是可以自己实现的,毕竟算法是公开的。
关于摘要算法SM3我搜了一下似乎因为它已经进入标准了至少在新版的Python中可以用`hashlib.new("sm3")`这样的方式进行计算但是旧版的Python用不了……所以如果要在旧版Python上处理还得自己想办法。
既然标准库不太能满足那第三方库选哪个比较好呢我看用的比较多的一个是封装C库[GmSSL](https://github.com/guanzhi/GmSSL)的[GmSSL-Python](https://github.com/GmSSL/GmSSL-Python)想要安装得先安装那个C库还有一个是纯Python实现的[gmssl](https://github.com/duanhongyi/gmssl)。对我来说的话我更喜欢后面那个纯python实现的虽然效率低了点但是看起来比较简单虽然看起来不是很专业🤣那个C库包装的感觉有点复杂……而且这两个库有冲突所以最终我选择了那个纯Python实现的版本。
# 使用SM2withSM3进行验签
在一些挑战应答方式的登录方式中就需要用到这种东西服务器发送一个随机数让客户端用私钥签名然后服务器用公钥进行验签。我看了一下那个库的“gmssl.sm2.CryptSM2”中有个verify_with_sm3方法挺符合需求的但有个问题是它这个CryptSM2传入的公钥是串数字但客户端传来的是证书……看来还得解析证书我看pyOpenSSL库里有加载证书还有导出公钥的方法但是那个导出的公钥也不是一串数字……后来看了半天发现导出的公钥的倒数130位才是公钥😅……最终把所有的值带进去试了一下终于没问题了最终的代码如下
```python
import OpenSSL.crypto
from gmssl import sm2
import base64
certSign = "" # 证书
signBytes = b"" # 签名
inData = b"" # 被签名的值
sm2.CryptSM2(
private_key="",
public_key=OpenSSL.crypto.dump_publickey(
OpenSSL.crypto.FILETYPE_ASN1,
OpenSSL.crypto.load_certificate(
OpenSSL.crypto.FILETYPE_PEM,
f"""-----BEGIN CERTIFICATE-----
{certSign}
-----END CERTIFICATE-----""".encode(),
).get_pubkey(),
).hex()[-128:],
asn1=True,
).verify_with_sm3(signBytes.hex(), inData)
```
# 使用HMAC-SM3对数据进行消息验证
这个其实新版的Python可以直接用因为新版Python的hashlib里有SM3所以一句
```python
hmac.new(key, data, digestmod="sm3").hexdigest()
```
就可以了但是我用的是旧版的PythonmacOS自带的3.9.6🤣不支持……那怎么办呢我看了一下这个函数的注释写的“digestmod”这个参数除了传hashlib支持的方法之外还可以传符合[PEP 247](https://peps.python.org/pep-0247/)的模块。显然无论是GmSSL-Python还是gmssl都没有符合这个规范。不过我可以自己写个适配器来适配这个规范。所以最终只好自己写一下了
```python
import copy
import hmac
from gmssl import sm3
class sm3_adapter:
def __init__(self):
self.msg = []
self.digest_size = 32
self.block_size = 64
def new(self):
self.msg = []
def update(self, data):
self.msg += list(data)
def copy(self):
return copy.deepcopy(self)
def digest(self):
return bytes.fromhex(self.hexdigest())
def hexdigest(self):
return sm3.sm3_hash(self.msg)
key = b"" # 密钥
data = b"" # 数据
hmac.new(key, data, digestmod=sm3_adapter).hexdigest()
```
# 感想
这么看来使用国密算法加密倒是也没很复杂但是和国际标准相比也没什么优势。虽然有些地方强制使用那确实没啥办法但是想要普及肯定是不用想了另外我自己的东西肯定是不敢用国密虽然进了标准而且也开放了算法但是很难说会不会像Dual_EC_DRBG算法那样偷偷插了后门 ~~(虽然我觉得他们应该没这个实力🤣)~~ ,但国际算法有后门我不怕,国内算法有后门那就吓人了🤣。

View File

@ -1,335 +0,0 @@
---
layout: post
title: 用CF Vectorize把博客作为聊天AI的知识库
tags: [Cloudflare, Workers, AI, RAG, Vectorize]
---
有了Cloudflare之后什么都免费了<!--more-->
# 起因
前段时间我用[Cloudflare Workers给博客加了AI摘要](/2024/07/03/ai-summary.html)那时候其实就想做个带RAG功能的聊天机器人不过这个操作需要嵌入模型和向量数据库。那时候Cloudflare倒是有这些东西但是向量数据库Vectorize还没有免费不过我仔细看了文档他们保证过段时间一定会免费的。直到前两天我打开Cloudflare之后发现真的免费了有了向量数据库之后我就可以让博客的机器人在电脑端可以在左下角和[伊斯特瓦尔](/Live2dHistoire/)对话)获取到我博客的内容了。
# 学习RAG
RAG的原理还是挺简单的简单来说就是在不用让LLM读取完整的数据库但是能通过某种手段让它获取到和问题相关性最高的内容然后进行参考生成至于这个“某种手段”一般有两种方式一种是比较传统的分词+词频统计查询这种其实我不会🤣没看到Cloudflare能用的比较好的实现方式另外这种方式的缺陷是必须包含关键词如果没有关键词就查不出来所以这次就不采用这种方法了。另一种就是使用嵌入模型+向量数据库了,这个具体实现我不太清楚,不过原理似乎是把各种词放在一个多维空间中,然后意思相近的词在训练嵌入模型的时候它们的距离就会比较近,当使用这个嵌入模型处理文章的时候它就会综合训练数据把内容放在一个合适的位置,这样传入的问题就可以用余弦相似度之类的算法来查询问题和哪个文章的向量最相近。至于这个查询就需要向量数据库来处理了。
原理还是挺简单的,实现因为有相应的模型,也不需要考虑它们的具体实现,所以也很简单,所以接下来就来试试看吧!
# 用Cloudflare Workers实现
在动手之前先看看Cloudflare官方给的[教程](https://developers.cloudflare.com/workers-ai/tutorials/build-a-retrieval-augmented-generation-ai)吧其实看起来还是挺简单的毕竟官方推荐难度是初学者水平😆。不过有个很严重的问题官方创建向量数据库要用它那个命令行操作我又不是JS开发者一点也不想用它那个程序但是它在dashboard上也没有创建的按钮啊……那怎么办呢还好[文档](https://developers.cloudflare.com/vectorize/best-practices/create-indexes/)中说了可以用HTTP API进行操作。另外还有一个问题它的API要创建一个令牌才能用我也不想创建令牌怎么办呢还好可以直接用dashboard中抓的包当作令牌来用这样第一步创建就完成了。
接下来要和Worker进行绑定还好这一步可以直接在面板操作没有什么莫名其妙的配置文件来恶心我😂配置好之后就可以开始写代码了。
首先确定一下流程当我写完文章之后会用AI摘要获取文章内容这时候就可以进行用嵌入模型向量化然后存数据库了。我本来想用文章内容进行向量化的但是我发现Cloudflare给的只有智源的英文嵌入模型😅不知道以后会不会加中文的嵌入模型……而且不是Beta版会消耗免费额度但也没的选了。既然根据上文来看嵌入模型是涉及词义的中文肯定不能拿给英文的嵌入模型用那怎么办呢还好Cloudflare的模型多有个Meta的翻译模型可以用我可以把中文先翻译成英文然后再进行向量化这样不就能比较准确了嘛。但是这样速度会慢不少所以我想了一下干脆用摘要内容翻译再向量化吧反正摘要也基本包含我文章的内容了给AI也够用了这样速度应该能快不少。当然这样的话问题也得先翻译向量化再查询了。
那么接下来就写代码吧直接拿上次AI摘要的代码改的
```javascript
async function sha(str) {
const encoder = new TextEncoder();
const data = encoder.encode(str);
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
const hashArray = Array.from(new Uint8Array(hashBuffer)); // convert buffer to byte array
const hashHex = hashArray
.map((b) => b.toString(16).padStart(2, "0"))
.join(""); // convert bytes to hex string
return hashHex;
}
async function md5(str) {
const encoder = new TextEncoder();
const data = encoder.encode(str);
const hashBuffer = await crypto.subtle.digest("MD5", data);
const hashArray = Array.from(new Uint8Array(hashBuffer)); // convert buffer to byte array
const hashHex = hashArray
.map((b) => b.toString(16).padStart(2, "0"))
.join(""); // convert bytes to hex string
return hashHex;
}
export default {
async fetch(request, env, ctx) {
const db = env.blog_summary;
const url = new URL(request.url);
const query = decodeURIComponent(url.searchParams.get('id'));
const commonHeader = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': "*",
'Access-Control-Allow-Headers': "*",
'Access-Control-Max-Age': '86400',
}
if (url.pathname.startsWith("/ai_chat")) {
// 获取请求中的文本数据
if (!(request.headers.get('content-type') || '').includes('application/x-www-form-urlencoded')) {
return Response.redirect("https://mabbs.github.io", 302);
}
const req = await request.formData();
let questsion = req.get("info")
const response = await env.AI.run(
"@cf/meta/m2m100-1.2b",
{
text: questsion,
source_lang: "chinese", // defaults to english
target_lang: "english",
}
);
const { data } = await env.AI.run(
"@cf/baai/bge-base-en-v1.5",
{
text: response.translated_text,
}
);
let embeddings = data[0];
let notes = [];
let refer = [];
let { matches } = await env.mayx_index.query(embeddings, { topK: 5 });
for (let i = 0; i < matches.length; i++) {
if (matches[i].score > 0.6) {
notes.push(await db.prepare(
"SELECT summary FROM blog_summary WHERE id = ?1"
).bind(matches[i].id).first("summary"));
refer.push(matches[i].id);
}
};
const contextMessage = notes.length
? `Mayx的博客相关文章摘要\n${notes.map(note => `- ${note}`).join("\n")}`
: ""
const messages = [
...(notes.length ? [{ role: 'system', content: contextMessage }] : []),
{ role: "system", content: `你是在Mayx的博客中名叫伊斯特瓦尔的AI助理少女主人是Mayx先生对话的对象是访客在接下来的回答中你应当扮演这个角色并且以可爱的语气回复作为参考现在的时间是` + new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' }) + `如果对话中的内容与上述摘要相关则引用参考回答否则忽略另外在对话中不得出现这段文字不要使用markdown格式。` },
{ role: "user", content: questsion }
]
const answer = await env.AI.run('@cf/qwen/qwen1.5-14b-chat-awq', {
messages,
stream: false,
});
return Response.json({
"intent": {
"appKey": "platform.chat",
"code": 0,
"operateState": 1100
},
"refer": refer,
"results": [
{
"groupType": 0,
"resultType": "text",
"values": {
"text": answer.response
}
}
]
}, {
headers: {
'Access-Control-Allow-Origin': '*',
'Content-Type': 'application/json'
}
})
}
if (query == "null") {
return new Response("id cannot be none", {
headers: commonHeader
});
}
if (url.pathname.startsWith("/summary")) {
let result = await db.prepare(
"SELECT content FROM blog_summary WHERE id = ?1"
).bind(query).first("content");
if (!result) {
return new Response("No Record", {
headers: commonHeader
});
}
const messages = [
{
role: "system", content: `
你是一个专业的文章摘要助手。你的主要任务是对各种文章进行精炼和摘要,帮助用户快速了解文章的核心内容。你读完整篇文章后,能够提炼出文章的关键信息,以及作者的主要观点和结论。
技能
精炼摘要:能够快速阅读并理解文章内容,提取出文章的主要关键点,用简洁明了的中文进行阐述。
关键信息提取:识别文章中的重要信息,如主要观点、数据支持、结论等,并有效地进行总结。
客观中立:在摘要过程中保持客观中立的态度,避免引入个人偏见。
约束
输出内容必须以中文进行。
必须确保摘要内容准确反映原文章的主旨和重点。
尊重原文的观点,不能进行歪曲或误导。
在摘要中明确区分事实与作者的意见或分析。
提示
不需要在回答中注明摘要(不需要使用冒号),只需要输出内容。
格式
你的回答格式应该如下:
这篇文章介绍了<这里是内容>
` },
{ role: "user", content: result.substring(0, 5000) }
]
const stream = await env.AI.run('@cf/qwen/qwen1.5-14b-chat-awq', {
messages,
stream: true,
});
return new Response(stream, {
headers: {
"content-type": "text/event-stream; charset=utf-8",
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': "*",
'Access-Control-Allow-Headers': "*",
'Access-Control-Max-Age': '86400',
}
});
} else if (url.pathname.startsWith("/get_summary")) {
const orig_sha = decodeURIComponent(url.searchParams.get('sign'));
let result = await db.prepare(
"SELECT content FROM blog_summary WHERE id = ?1"
).bind(query).first("content");
if (!result) {
return new Response("no", {
headers: commonHeader
});
}
let result_sha = await sha(result);
if (result_sha != orig_sha) {
return new Response("no", {
headers: commonHeader
});
} else {
let resp = await db.prepare(
"SELECT summary FROM blog_summary WHERE id = ?1"
).bind(query).first("summary");
if (!resp) {
const messages = [
{
role: "system", content: `
你是一个专业的文章摘要助手。你的主要任务是对各种文章进行精炼和摘要,帮助用户快速了解文章的核心内容。你读完整篇文章后,能够提炼出文章的关键信息,以及作者的主要观点和结论。
技能
精炼摘要:能够快速阅读并理解文章内容,提取出文章的主要关键点,用简洁明了的中文进行阐述。
关键信息提取:识别文章中的重要信息,如主要观点、数据支持、结论等,并有效地进行总结。
客观中立:在摘要过程中保持客观中立的态度,避免引入个人偏见。
约束
输出内容必须以中文进行。
必须确保摘要内容准确反映原文章的主旨和重点。
尊重原文的观点,不能进行歪曲或误导。
在摘要中明确区分事实与作者的意见或分析。
提示
不需要在回答中注明摘要(不需要使用冒号),只需要输出内容。
格式
你的回答格式应该如下:
这篇文章介绍了<这里是内容>
` },
{ role: "user", content: result.substring(0, 5000) }
]
const answer = await env.AI.run('@cf/qwen/qwen1.5-14b-chat-awq', {
messages,
stream: false,
});
resp = answer.response
await db.prepare("UPDATE blog_summary SET summary = ?1 WHERE id = ?2")
.bind(resp, query).run();
}
let is_vec = await db.prepare(
"SELECT `is_vec` FROM blog_summary WHERE id = ?1"
).bind(query).first("is_vec");
if (is_vec == 0) {
const response = await env.AI.run(
"@cf/meta/m2m100-1.2b",
{
text: resp,
source_lang: "chinese", // defaults to english
target_lang: "english",
}
);
const { data } = await env.AI.run(
"@cf/baai/bge-base-en-v1.5",
{
text: response.translated_text,
}
);
let embeddings = data[0];
await env.mayx_index.upsert([{
id: query,
values: embeddings
}]);
await db.prepare("UPDATE blog_summary SET is_vec = 1 WHERE id = ?1")
.bind(query).run();
}
return new Response(resp, {
headers: commonHeader
});
}
} else if (url.pathname.startsWith("/is_uploaded")) {
const orig_sha = decodeURIComponent(url.searchParams.get('sign'));
let result = await db.prepare(
"SELECT content FROM blog_summary WHERE id = ?1"
).bind(query).first("content");
if (!result) {
return new Response("no", {
headers: commonHeader
});
}
let result_sha = await sha(result);
if (result_sha != orig_sha) {
return new Response("no", {
headers: commonHeader
});
} else {
return new Response("yes", {
headers: commonHeader
});
}
} else if (url.pathname.startsWith("/upload_blog")) {
if (request.method == "POST") {
const data = await request.text();
let result = await db.prepare(
"SELECT content FROM blog_summary WHERE id = ?1"
).bind(query).first("content");
if (!result) {
await db.prepare("INSERT INTO blog_summary(id, content) VALUES (?1, ?2)")
.bind(query, data).run();
result = await db.prepare(
"SELECT content FROM blog_summary WHERE id = ?1"
).bind(query).first("content");
}
if (result != data) {
await db.prepare("UPDATE blog_summary SET content = ?1, summary = NULL, is_vec = 0 WHERE id = ?2")
.bind(data, query).run();
}
return new Response("OK", {
headers: commonHeader
});
} else {
return new Response("need post", {
headers: commonHeader
});
}
} else if (url.pathname.startsWith("/count_click")) {
let id_md5 = await md5(query);
let count = await db.prepare("SELECT `counter` FROM `counter` WHERE `url` = ?1")
.bind(id_md5).first("counter");
if (url.pathname.startsWith("/count_click_add")) {
if (!count) {
await db.prepare("INSERT INTO `counter` (`url`, `counter`) VALUES (?1, 1)")
.bind(id_md5).run();
count = 1;
} else {
count += 1;
await db.prepare("UPDATE `counter` SET `counter` = ?1 WHERE `url` = ?2")
.bind(count, id_md5).run();
}
}
if (!count) {
count = 0;
}
return new Response(count, {
headers: commonHeader
});
} else {
return Response.redirect("https://mabbs.github.io", 302)
}
}
}
```
# 使用方法
为了避免重复生成向量主要是不知道它这个数据库怎么根据id进行查询所以在D1数据库里新加了一个数字类型的字段“is_vec”另外就是创建向量数据库创建方法看官方文档吧如果不想用那个命令行工具可以看[API文档](https://developers.cloudflare.com/api/operations/vectorize-create-vectorize-index)。因为那个嵌入模型生成的维度是768所以创建这个数据库的时候维度也是768。度量算法反正推荐的是cosine其他的没试过不知道效果怎么样。最终如果想用我的代码需要在Worker的设置页面中把绑定的向量数据库变量设置成“mayx_index”如果想用其他的可以自己修改代码。
# 其他想法
其实我也想加 ~~推荐文章~~ 在2024.10.01[已经做出来了](/2024/10/01/suggest.html)和智能搜索的但就是因为没有中文嵌入模型要翻译太费时间😅所以就算啦至于其他的功能回头看看还有什么AI可以干的有趣功能吧。
# 感想
Cloudflare实在是太强了什么都能免费这个RAG功能其他家都是拿出去卖的他们居然免费唯一可惜的就是仅此一家免费中的垄断地位了希望Cloudflare能不忘初心不要倒闭或者变质了🤣。

View File

@ -1,97 +0,0 @@
---
layout: post
title: 如何给博客添加相似文章推荐功能
tags: [Cloudflare, Workers, Vectorize, 博客]
---
看来向量数据库的作用有很多啊……<!--more-->
# 起因
前几天我[用Cloudflare Vectorize给博客的聊天机器人加了知识库的功能](/2024/09/27/rag.html),本来想着用向量数据库做文章推荐是不是每次都要走翻译+向量化的操作不过后来我又仔细看了一下Cloudflare的官方文档发现它是[可以根据ID查询存储的向量](https://developers.cloudflare.com/vectorize/reference/client-api/#get-vectors-by-id)的,既然这样的话用现有的数据库做一个相似文章推荐应该非常简单,于是我就做了一个试试看。
# 制作过程
## 后端部分
其实流程很简单就是把对应ID的向量查出来之后拿着这个向量再去查询就好了唯一需要注意的就是它查出来的第一条肯定是自己所以只要把第一条删掉就行 ~~代码也非常简单~~ (后来又加了缓存稍微变的复杂了😂):
```javascript
if (url.pathname.startsWith("/suggest")) {
let resp = [];
let update_time = url.searchParams.get('update');
if (update_time) {
let result = await env.mayx_index.getByIds([
query
]);
if (result.length) {
let cache = await db.prepare("SELECT `id`, `suggest`, `suggest_update` FROM `blog_summary` WHERE `id` = ?1")
.bind(query).first();
if (!cache.id) {
return Response.json(resp, {
headers: commonHeader
});
}
if (update_time != cache.suggest_update) {
resp = await env.mayx_index.query(result[0].values, { topK: 6 });
resp = resp.matches;
resp.splice(0, 1);
await db.prepare("UPDATE `blog_summary` SET `suggest_update` = ?1, `suggest` = ?2 WHERE `id` = ?3")
.bind(update_time, JSON.stringify(resp), query).run();
} else {
resp = JSON.parse(cache.suggest);
}
}
resp = resp.map(respObj => {
respObj.id = encodeURI(respObj.id);
return respObj;
});
}
return Response.json(resp, {
headers: commonHeader
});
}
```
## 前端部分
后端当然很简单,但是我之前有些欠考虑了,我当时做[AI摘要](/2024/07/03/ai-summary.html)和[知识库](/2024/09/27/rag.html)的时候,都只存了文章的链接,没有存标题😅……但是推荐文章的超链接总不能不放标题吧……那怎么办呢?一种就是我把数据库清空然后摘要中加一个字段,向量数据库中加一个元数据,这样查询的时候就能查到标题然后显示出来了。不过这种方法我仔细考虑了一下,麻烦是一方面,另一方面是我的接口没做验证,有人乱上传文章会影响推荐链接显示的内容,不太合适……那应该用什么办法呢?
我还想到一个办法,我之前[给博客做过全文搜索的功能](/2021/07/23/search.html)用这个JS关联查询就能查到标题而且查不到的内容也显示不出来这样就能避免有人故意乱上传导致显示奇怪的内容了不过之前的设计是每次查询都要加载一次包含我文章内容的JSON文件感觉不太合理虽然那个文件不算特别大但是也挺影响速度的所以我想了一下还是用localStorage缓存一下比较好所以增加了一个能缓存获取搜索JSON的函数
```javascript
function getSearchJSON(callback) {
var searchData = JSON.parse(localStorage.getItem("blog_" + lastUpdated.valueOf()));
if (!searchData) {
localStorage.clear();
$.getJSON("/search.json", function (data) {
localStorage.setItem("blog_" + lastUpdated.valueOf(), JSON.stringify(data));
callback(data);
});
} else {
callback(searchData);
}
}
```
做好这个之后就可以做文章推荐的功能了不过文章推荐应不应该加载完页面就加载呢其实我测了一下Vectorize数据库的查询速度不算很慢但还是需要时间另外免费版我看了下额度是每月3000万个查询的向量维度这个其实我没看太懂😂。另外Cloudflare不知道为什么没有展示免费版剩余的额度而且它是按月计算的导致我不敢乱用这个查询。 ~~所以我想了一下还是给个按钮来调用吧~~ (后来想了一下干脆直接调用然后加个缓存吧,毕竟我的文章不变,推荐内容也不会变)。最终调用的函数如下:
```javascript
function getSuggestBlog(blogurl) {
var suggest = $("#suggest-container")[0];
suggest.innerHTML = "Loading...";
$.get(BlogAPI + "/suggest?id=" + blogurl + "&update=" + lastUpdated.valueOf(), function (data) {
if (data.length) {
getSearchJSON(function (search) {
suggest.innerHTML = '<b>推荐文章</b><hr style="margin: 0 0 5px"/>';
const searchMap = new Map(search.map(item => [item.url, item]));
const merged = data.map(suggestObj => {
const searchObj = searchMap.get(suggestObj.id);
return searchObj ? { ...searchObj } : null;
});
merged.forEach(element => {
if (element) {
suggest.innerHTML += "<a href=" + element.url + ">" + element.title + "</a> - " + element.date + "<br />";
}
});
});
} else {
suggest.innerHTML = "暂无推荐文章……";
}
});
}
```
# 感想
看来向量数据库的用途还是挺广泛的不仅仅是为了给AI使用说不定还能做更多有意思的功能这下不得不更依赖Cloudflare了😆。
另外随着做了越来越多的功能,做新的功能还能用上旧的功能,感觉这样我的博客可以有不少发展的空间啊😁。

View File

@ -1,39 +0,0 @@
---
layout: post
title: Linux ARM生态评测
tags: [Linux, ARM, 树莓派]
---
看看现在的Linux ARM能不能替代macOS<!--more-->
# 起因
我的树莓派4B从好久之前就一直吃灰了之前用它装过[Ubuntu](/2023/09/24/rpi-ubuntu.html)[openFyde](/2023/12/10/openfyde.html)[Windows 11](/2023/05/22/rpi-win.html)和[piCore](/2021/01/17/picore.html)但都因为性能和使用体验不佳放弃使用了。不过随着华为的某系统发布以及高通出的某个笔记本电脑用处理器我对运行在ARM指令集CPU系统的生态产生了一些兴趣。macOS的生态之前我已经[体验](/2023/02/03/mbp.html)过了,是符合预期的不错。[Windows on ARM](/2023/05/22/rpi-win.html)虽然在树莓派上装了试着用了但是没驱动太卡了其实没有体现它怎么样要想体验还得整个高通CPU的拿来试不过我手头没有所以没办法😂那在树莓派上的Linux系统我也试过不少有什么测试的必要吗其实还是有的因为之前我测都是当服务器测的虽然也测了[openFyde](/2023/12/10/openfyde.html)ChromeOS但是生态其实挺垃圾的虽然能用Linux软件但是因为是容器卡的不能用。所以这次我想装树莓派官方的Raspberry Pi OS完整版来测测现在Linux ARM生态能不能和我现在用的macOS比拼。
另外前段时间树莓派出了新的连接方式Raspberry Pi Connect可以登录树莓派官网的账号然后用浏览器操作图形界面或者命令行可以自动判断使用P2P模式还是中继模式而且可以根据浏览器界面大小自动修改树莓派的分辨率体验还不错。
# 与我Mac上软件的替代测试
## 原生应用测试
既然是和macOS相比那就看看我现在用的软件是不是能在树莓派上原生运行吧。首先是常用的国产软件比如WPS Office钉钉微信QQ。因为UOS的缘故大多数常用的国产软件都有Linux ARM的版本首先钉钉和QQ在官网上可以直接下载deb包安装运行也没什么问题功能完全一致而且也没有卡到不能用的程度对于树莓派来说已经很让我满意了。WPS Office和微信稍微有点麻烦官网并没有提供安装包但是我找到一个不错的国产Linux应用商店——[星火应用商店](https://github.com/spark-store-project/spark-store)。里面有不少Debian系各种CPU架构的国产软件官网上没有的也能在这里下到让我很满意。不过里面有好多Wine的应用……我不是特别想用而且不知道它是怎么处理的会不会一个软件安装一个Wine所以就先不考虑了。随后我在里面找到了WPS Office和微信安装试了一下微信看起来还不错至少小程序视频号之类的都能用反正是基于浏览器的好适配🤣WPS Office虽然能用但是刚安装是英文版的……而且中文切换找了半天找不到😅后来找了半天才找到……不过安了WPS Office应该再配个中文输入法才对我试着安装了搜狗输入法但是安装好之后不能用Fcitx不停崩溃重启不知道是什么问题换了谷歌输入法之后就正常了。
除了常用的国产软件之外还有一些我平时开发用的软件这些软件对Linux ARM的支持也挺不错的可能国外也是比较支持Linux ARM生态吧大概是因为Chromebook。我平时用的VSCode当然是有的不过数据库管理和接口调试我在Mac用的是[Sequel Ace](https://github.com/Sequel-Ace/Sequel-Ace)和RapidAPI这两个是专为macOS设计的当然没有Linux版。但是这些是有替代品的我找了一下数据库我用的是Navicat Premium Lite它有原生Linux ARM版但是是AppImage……感觉不是很舒服。接口调试的话用的是Apipost估计就是因为用的Electron的所以才愿意整跨平台的版本吧。Mac上有时候我还会远程桌面到Windows主机这个树莓派也可以有个叫[Remmina](https://gitlab.com/Remmina/Remmina)的客户端可以用,效果也还不错,如果不是局域网连接还有[RustDesk](https://github.com/rustdesk/rustdesk)可以用虽然不知道为什么中文会变方块😂。另外还有用来测试的网站环境这个倒是比macOS更简单毕竟Linux有那么多面板也不需要敲命令安装而且还可以运行Docker我这次用的是1Panel使用基本上没什么问题还能安装杀毒软件😁虽然MongoDB安装会因为缺少指令集报错用不了但是我用不着🤣
除此之外还有虚拟机这个在之前Ubuntu Server上已经[测过了](/2023/09/24/rpi-ubuntu.html#%E6%95%B4%E7%82%B9qemu-kvm-windows%E8%99%9A%E6%8B%9F%E6%9C%BA)不过那时候是无头模式现在可以在图形界面用virt-manager来管理了之前安装了Windows这次就安装个FreeBSD吧安装起来也不复杂和其他虚拟机管理软件一样而且还能用虚拟串口连接感觉还挺有意思的。安装好之后上网之类的都没问题和在macOS上用UTM的区别可能就只有在macOS上可以把Rosetta 2穿透到Linux下使用吧。
另外还有游戏专门为Linux ARM设计的游戏估计没几个不过想玩肯定是有的比如用Ren'Py引擎的游戏以及在浏览器上的游戏其他引擎似乎没什么资料……但没事在macOS上也是用的iOS版的模拟器后面讲到的安卓也可以运行模拟器😁。我之前也研究过[在macOS上玩Ren'Py引擎的游戏](/2024/01/20/renpy.html)。不过Ren'Py默认发行是不支持Linux ARM版的……但是可以另外下载SDK来支持。然而有一个问题只有新版的SDK才支持64位的ARM旧版虽然有树莓派支持但可能是因为旧版树莓派只有32位的系统所以没有64位ARM的运行库😂。我看了看我电脑上之前下的Ren'Py引擎的游戏找了一个《[Sakura Isekai Adventure](https://store.steampowered.com/app/2646050/Sakura_Isekai_Adventure/)》游戏看了一下Ren'Py的版本还可以SDK也能正常的在树莓派上运行试了一下感觉效果还不错运行的方法是“SDK所在目录/renpy.sh 游戏所在目录/Game”之前没加Game不停报错😅文档写的也不清晰测了半天才测出来……那对于旧版的就不能玩了吗估计是可以但可能要自己编译很麻烦反正源代码都有。不过有个例外我本来想试试《[Katawa Shoujo](https://www.katawa-shoujo.com/)》它用的Ren'Py很旧但是因为是同人类游戏所以有人做了重制版《[Katawa Shoujo: Re-Engineered](https://www.fhs.sh/projects)》😆这个是用的最新版的Ren'Py增加了新的特性和各种BUG但是正因如此可以简单的在树莓派上运行了🤣。
至于其他关于AI方面的比如LLaMA和Stable Diffusion这些毕竟是开源的Linux ARM当然可以运行只不过树莓派的GPU不能用来加速运行会很卡而已生态方面是没问题。
## 安卓软件测试
既然macOS可以原生运行iOS软件那对于Linux来说自然应该对比一下原生运行安卓软件了。关于安卓软件我之前在Ubuntu Server上已经测了[Waydroid和redroid](/2023/12/24/android.html)。但毕竟当时是在无头模式下测的没有图形界面现在有了图形界面可以再测一下。安装除了要挂梯子下载镜像之外没什么问题但是打开的时候不知道为什么只会黑屏……后来搜了一下执行“waydroid prop set persist.waydroid.multi_windows true”再重启就没问题了。虽然安卓软件比iOS的要更多不过毕竟树莓派的性能想玩手游还是有点勉强当然这次测的是生态所以还是完全没问题😁。
## 转译应用测试
既然macOS有Rosetta 2可以运行x86架构的软件那Linux ARM当然也不能少这个方案比较多有QEMUBox86/64还有ExaGear不过听说ExaGear性能相对更好一些那这次就测这个吧。
现在ExaGear已经被华为收购了想要下载的话在[华为源](https://mirrors.huaweicloud.com/kunpeng/archive/ExaGear/)里就能下到我装的是4.0.0的因为4.1.0似乎要自己配置镜像太麻烦了所以就没用。安装很简单直接把对应目录的deb包安装了就可以安装好之后就可以执行“exagear”进到转译后的Bash中不过和macOS有个区别macOS的程序都是通用二进制文件里面包含了ARM架构和x86架构的程序所以可以无缝衔接Linux当然没有这个特性所以ExaGear是映射到它自己的镜像里面的各种包还得另外安装。
那这个东西装什么比较好呢我发现我的Mac上有个网易云音乐在Linux上似乎没有ARM版的在星火应用商店也只有Wine版。但是它之前和深度合作出过Linux版现在估计谈崩了从官网上消失了但是原来的链接还在可以下载。具体的流程在[CSDN上有篇博客](https://blog.csdn.net/qq_35533121/article/details/128237853)有写,试了一下可以安装,而且运行效率比我预期高不少,最起码点击不算卡,而且听音乐也没有卡顿的感觉,感觉算是相当不错了。
其实我也挺疑惑Rosetta 2和ExaGear的效率怎么样我看网上有篇文章[Comparing Huawei ExaGear to Apple's Rosetta 2 and Microsoft's solution](https://habr.com/en/companies/huawei/articles/577206/)说ExaGear效率最高Rosetta 2有硬件加速都比不上说实话我是不信的要是那么厉害Eltechs怎么可能停更而且全网就这一篇文章很难不相信是华为员工写的软文😅我自己手头没有合适的设备也不好测不知道有没有大佬来打假。
那运行转译的Linux软件没问题之后再测一下转译Windows应用吧我的Mac上可是有Whisky的。那对树莓派来说就是ExaGear+Wine了。安装很简单直接在ExaGear的shell里用apt安装就行安装好之后就可以用“exagear -- wine ./windows程序.exe”来运行了。我在我的Mac上找了一个用Godot引擎写的小游戏放上去试了一下居然可以运行而且也是比想象中的流畅不过我玩的本来就是画面变动少的游戏也不会卡到哪里不过能在接受范围内有反应已经很不错了虽然没Mac反应快但毕竟测生态和芯片本身速度无关树莓派的性能当然比不了Mac能玩我已经很满足了。
其实如果论游戏的话在x86平台毕竟有SteamOS的先例用ExaGear转译然后加上Proton如果芯片性能足够的情况应该是能玩不少游戏的。
# 其他实验
在玩树莓派的时候我又想玩[电台](/2022/03/27/radio.html)了🤣毕竟这是树莓派唯一的优势能用到它的GPIO接口不然真的就是性价比不怎么样性能还差的ARM迷你主机了。这次我多试了一下怎么样把图形界面上的声音通过广播传出来如果可以的话树莓派离得比较远而且不用蓝牙耳机的情况下也能听到声音了。不过我不太清楚Linux中的声音是怎么合成的我搜了一下似乎是用PulseAudio合成的用“pactl list sources”命令就可以列出相关的设备在我的树莓派上可以看到是叫“alsa_output.platform-bcm2835_audio.stereo-fallback.monitor”然后用
```bash
sox -t pulseaudio alsa_output.platform-bcm2835_audio.stereo-fallback.monitor -t wav - | sudo ./pi_fm_adv --audio - --freq 87.0 --power 7 --gpio 4 --gpio 20 --gpio 32 --rds 0
```
命令理论上就可以发射电台了但实际上不知道为什么虽然能听到声音但是声调变的很高而且一卡一卡的根本不能听而且进程会卡住要用kill -9才能结束😓……
不过这个就和Linux ARM生态无关了这是只有树莓派才有的特殊功能其他电脑估计做不到这一点😆。
# 感想
这次测下来感觉Linux ARM好像还挺强的啊基本上我Mac上装的东西都有而且功能也挺齐全从原生应用的角度来看可能比Windows on ARM还多。看来除了易用性之外Linux ARM生态已经很成熟了啊这么来看Mac就只剩下美观、易用性和芯片性能强大这些优势了啊😂。

File diff suppressed because it is too large Load Diff

View File

@ -1,32 +0,0 @@
---
layout: post
title: 关于OS模拟器的探索
tags: [模拟器, Windows, Android, Linux, macOS]
---
在一个系统模拟另一个系统有多困难呢?<!--more-->
# 起因
前段时间我在网上和人聊天的时候谈到了安卓模拟器在我看来所有除了Linux上可以使用例如Waydroid的[容器原生运行Android](/2023/12/24/android.html)之外,其他系统只能通过虚拟机的方式运行,毕竟不用虚拟机能在完全不相干的系统上运行安卓我感觉还是挺不可思议的。不过随后就被打脸了🤣,网易在前几年出过一个包含“星云引擎”的安卓模拟器——[MuMu Nebula](https://www.mumuplayer.com/mumu-nebula.html),据说这个模拟器是不需要使用虚拟化技术的。所以这次我打算探索一下这个安卓模拟器和它类似的模拟器。
# 关于虚拟机和模拟器的区别
在我看来模拟硬件的就是虚拟机模拟软件的就是模拟器。不过现在这些挺难分的融合的也挺多。比如QEMU+KVM使用硬件虚拟化显然是虚拟机QEMU System模式使用二进制翻译的方式模拟硬件也是虚拟机但是QEMU User模式使用了当前系统的资源没有模拟硬件所以应该是模拟器不过也有叫仿真器的……不过也许不是这样模拟指令集也算虚拟了一个CPU吧像Java虚拟机似乎就是这样只是单模拟一个CPU叫虚拟机又感觉不太对……并且macOS的Rosetta 2甚至还有硬件加速硬件模拟x86的内存一致性模型还有用了AOT已经翻译完的程序再执行那应该不算模拟器吧……另外还有什么容器之类的……搞得这些概念很难分清。
那至少使用了硬件虚拟化技术的肯定是虚拟机吧其实这也不一定现在的Windows有个叫“基于虚拟化的安全性”的功能使用了硬件虚拟化技术但是不能说现在的Windows是运行在虚拟机上吧这些大公司搞的乱七八糟的黑科技把我都绕晕了😂。
总之接下来我要说的模拟器是一定基于某个系统然后模拟另一个系统的环境不使用硬件虚拟化技术而且翻译的不是「指令集」而是「系统调用」这样感觉才算我心目中的模拟器🫠也就是OS模拟器。
# 各种各样的OS模拟器
## MuMu NebulaWindows模拟Android
既然是因为网易的模拟器进行的探索肯定要先讲这个啦。首先看介绍它是专为“低端电脑”制作的模拟器所以整个软件都是32位的而且不用VT说明老到不支持硬件虚拟化的CPU都可以运行不过那样的CPU估计至少是15年前的吧😝。安装后首先会下载Android的镜像但不像其他安卓模拟器最后使用的是一个磁盘镜像文件而是像WSL1那样把所有文件都放在一个文件夹里。至于里面的文件就是和正常的32位Android x86差不多甚至还有兼容ARM的libhoudini.so文件。然后启动模拟器后可以在任务管理器中看到有许多“nebula.exe”进程这让我想到了Wine看起来在模拟器中的每个安卓进程都对应着一个“nebula.exe”进程。这么来看这个星云引擎应该相当于安卓特别精简版的WSL1。
其实当时WSA出之前我以为微软会用WSL1的技术做WSA结果和WSL2一起用了虚拟机太令人失望了😅。而且用类似WSL1技术的居然还让网易整出来了……虽然到现在WSA已经凉了这个星云引擎也是没什么热度不过单从技术上来说我觉得还是这种要好因为这种模拟器省**内存**,可以共用**磁盘空间**,不像其他模拟器,就算虚拟机有什么气球驱动动态调整分配的内存,总是不如这种现用现申请的好。不过从速度上来说和虚拟机版安卓模拟器拉不开什么差距,技术难度估计也比虚拟机高很多,大概因为这样,所以它也凉了吧。
## WSL1Windows模拟Linux
网易那个就挺像WSL1的不过很明显WSL1出的早另外和Windows结合的更深可以直接在任务管理器中管理WSL1中的进程。虽然有些人说WSL1的BUG很多但对我来说我是一个都没碰到过用起来还是挺不错的……虽然不支持Docker这也是它对我来说唯一的缺陷。不过我要是用Docker一般是在Hyper-V中单独安一个虚拟机来操作因为WSL2和Docker desktop的内存不好控制虚拟机限制起来比较方便。如果需要在Windows用到Linux的时候就安WSL1因为省内存而且和Windows共用同一个IP。不过要是安装了Nvidia显卡的话好像还是得用WSL2我一般没这个需求所以不存在这种问题。
## DarlingLinux模拟macOS
之前我在玩旧电脑的时候试过[Darling](/2024/04/06/old-pc.html#%E5%85%B3%E4%BA%8Edarling%E7%9A%84%E6%8E%A2%E7%B4%A2)不过用的都是超老的电子垃圾因为指令集的原因费了不少功夫才跑起来😂不过就算用正常电脑跑这个感觉也没啥意义除了项目本身很不成熟很多软件跑不起来另外到现在也没有做出来ARM版x86的macOS马上就要被抛弃了如果没有搞出ARM版这个项目就更没什么意义了。
## WineLinux/macOS模拟Windows
Wine我用的还挺多的因为我现在用的是MacBook[在macOS上玩Windows游戏](/2023/10/21/game.html#%E4%BD%BF%E7%94%A8wine%E6%B8%B8%E7%8E%A9windows%E6%B8%B8%E6%88%8F)就得用Wine另外也[在树莓派上试过ExaGear+Wine](/2024/10/13/arm-linux.html#%E8%BD%AC%E8%AF%91%E5%BA%94%E7%94%A8%E6%B5%8B%E8%AF%95),其实说来这个项目和使用虚拟机相比,不仅更省内存,而且性能要比虚拟机好得多,除了兼容性不太行之外其他都挺好的,看来省内存是模拟器的特色啊。
## 其他古董模拟器
这种倒是挺多的像DOSBox还有GBA模拟器之类的我以前在手机上就试过[用DOSBox Turbo安装Windows3.2](/2020/09/27/vm.html#%E6%89%8B%E6%9C%BA%E7%9A%84%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%BD%BF%E7%94%A8%E5%8F%B2)也用GBA模拟器玩过宝可梦不过这些其实不算我心目中的模拟器😆因为它们不是翻译的系统调用而是模拟了一块古董CPU然后装了对应的系统能直接用只不过大家都说这类算模拟器所以提了一下。
# 感想
看起来模拟器相比虚拟机还是有很多优势啊,省**内存**这一优势还是很重要的,虽然现在内存倒是不贵 ~~(苹果内存除外🤣)~~ ,但是消耗本不必要的内存就是浪费吧。只不过这种东西对技术要求果然还是太高了,实在是费力不讨好,所以没有企业愿意投入精力来做,所以就都凉了啊……
不过Wine倒是活得不错大概是因为Windows的软件太多了吧……生态很重要啊。

View File

@ -1,40 +0,0 @@
---
layout: post
title: ESXi和PVE的使用体验与对比
tags: [ESXi, PVE, 虚拟机]
---
装虚拟机用什么系统更好呢?<!--more-->
# 起因
前段时间我有个需要开很多机器的需求为了方便管理和提高资源利用率当然是上虚拟机比较合适。那用什么系统上虚拟机好呢Windows上用Hyper-V当然也是不错的选择但是我觉得Windows的基础占用太高了另外Hyper-V的操作面板也不怎么样所以就不考虑了。那用什么呢之前我上大学的时候用过ESXi在随身携带的U盘里上正好有一份一直没删所以就顺手给手头的工作站安了一下。不过我当时用的版本很旧了是6.7虽然也不是不能用但是考虑到这个版本之前有RCE漏洞所以去sysin上下了一份最终版的6.7U3u更新包更新了上去,以后就不再更新了。
不过除了ESXi之外还有别的选择我看很多人都拿PVE和ESXi比较。虽然经常听说PVE但是我没有用过所以就在另一个工作站上安装了PVE试试看哪个用起来更好。不过和PVE比的其实不该是ESXi而是VMWare vSphere只不过我两个系统都是一台机器也用不着搞集群找破解版还麻烦。所以其实我是拿ESXi的VMware Host Client和PVE进行对比。
另外从本质来说它们也不是一个东西PVE更像是Debian上一个管理虚拟化的面板ESXi是VMKernel附带了个可以临时使用的Web端面板侧重点不一样。
# ESXi和PVE的对比
## 界面与体验
首先从界面来看两个系统长得其实差不太多不过左侧导航栏有点不太一样把PVE的导航栏改成文件夹视图就和ESXi的差不多了。从界面上来说我更喜欢ESXi的界面PVE的感觉没什么设计感。不过PVE面板的数据是1秒刷新一次的ESXi就算配置刷新也只能最短每15秒刷新一次。从功能上来说可能PVE会更好一点。另外对于显示的图表来说PVE全在“概要”里在ESXi都在“监控”里虽然PVE的图表更多但是有些感觉没什么意义因为PVE是基于Linux的所以有“负载”这个指标不过对于虚拟机系统来说感觉意义不大啊……不过也可能是因为用了LXC容器之后会影响PVE的负载所以整了这个项目
另外PVE还有个好处是可以看CPU温度我看有一个叫“[pvetools](https://github.com/ivanhao/pvetools)”的工具可以配置在界面上显示CPU频率和温度ESXi没有IPMI的话用啥办法都看不到CPU温度😅。
## 虚拟机管理
ESXi和PVE创建虚拟机都挺简单的都有专门的向导。不过我测试PVE的时候选择安装Windows 10它推荐的架构居然是i440fx机器和SeaBIOS固件虽然也不是不能用但它怎么选了个最垃圾的虽然选成Windows 11是推荐的q35和UEFI引导……而且SCSI控制器还选了个要驱动的半虚拟化设备但PVE没有自带这个驱动包啊这些都是不小的坑。而ESXi就正常多了选择Windows 10会默认使用UEFI引导而且会选择一个兼容性最好的SCSI控制器和网络适配器便于没有安装驱动的时候能正常使用另外ESXi是自带VMWare Tools的在系统安装完成后可以直接挂载安装比PVE的体验好很多。另外PVE还有一个坑那就是CPU默认会用QEMU自己的一个类型那个在虚拟机里就读不到CPU的型号了而且性能会打折扣。不过这个倒也能理解毕竟PVE是给集群设计的在迁移到其他节点的时候选host可能在迁移到不同CPU的节点时会出现问题。不过ESXi也是啊……怎么它就没有这种问题总之PVE不适合小白。
PVE相比ESXi多了个特性那就是LXC容器因为PVE是基于Linux的所以可以创建容器。这个体验倒是还行可以直接在面板上下载模版创建也没什么坑配好之后和虚拟机几乎一模一样甚至还能在上面安装DockerIP也是独立分配的用起来还不错。
## 存储管理
PVE相比ESXi在存储上能选的花里胡哨的东西有点多默认它会把系统盘配置成LVM然后单独分了个LVM-Thin的东西两个容量不互通。这个LVM-Thin好像是只能用来存磁盘而且看不到东西到底存在哪里了我搜了一下好像是说这个LVM-Thin可以用多少占多少空间……我寻思qcow2格式的磁盘也有这个功能啊而且raw格式的磁盘文件是稀疏文件也是用多少占多少啊……两个容量不互通还浪费磁盘空间然后我就把这个LVM-Thin删掉了把系统盘扩容到整个磁盘然后在存储里面允许local存储磁盘映像之类的。
除此之外PVE还支持ZFS相当于软RAID但是它是文件系统层面支持的不需要初始化。我手头有3块机械盘插在上面组了个RAIDZ可以允许坏任意1块。组好之后可以用来存储磁盘映像和容器的数据。
ESXi的话就只能把盘格式化成VMFS6的文件系统要么还能挂iSCSI当作磁盘或者NFS作为数据存储如果要分布式存储应该只能搭到别的机器上然后用iSCSI挂过来阵列看起来只能是硬RAIDESXi并不提供软RAID的选项也不支持挂SMB、CephFS、ZFS之类乱七八糟的东西PVE在这一方面因为基于Linux系统发挥了很大的优势只要Linux能挂的它就能挂。
## 网络管理
在PVE上的网络是用的Linux Bridge安装的时候会强制要求静态IP不过毕竟是Linux可以修改配置让它使用DHCP。不过看起来PVE上似乎没有配置NAT的选项当然作为Linux来说肯定是有办法配的。ESXi用的叫做虚拟交换机配置冗余也是在这里配置PVE的话应该要先配置Bond然后再配置网桥。
另外ESXi对网卡要求很高不是服务器或者工作站用的比如什么瑞昱的网卡都是不识别的要额外安装驱动才行这也是PVE的优势Linux兼容什么它就兼容什么。不过对于大公司来说也不可能用家用电脑当服务器使🤣所以就算是用ESXi也不存在这种问题。
## PCI直通
在这一方面ESXi的体验就比PVE要好很多直接在“管理”——“硬件”——“PCI设备”里面就可以配置显卡直通之类的没有什么复杂的配置直接点“切换直通”然后重启就可以在虚拟机里配置了当然VT-d之类的东西要提前开
PVE我最开始配直通的时候是直接网上搜的那个pvetools也可以帮助配置PCI直通之类的用这个工具配完之后就可以在虚拟机里添加了。不过在我添加的时候发现它有个“映射的设备”这个选项用刚才那个工具配置完之后要选“原始设备”然后我就想着这两个有什么区别结果发现“数据中心”——“资源映射”里面有个PCI设备的选项😂也许从一开始我就做错了直接用这个添加就可以了吧只不过因为我已经用那个工具配置过了怕在这里加了会冲突所以就算啦。
另外PVE的PCI直通还有个好处就是在5-10代的IntelCPU可以用Intel GVT-g技术把核显拆成多个显卡像虚拟机如果要是需要显卡的话用这个就不用插一堆显卡给虚拟机分配了。ESXi的话只支持SR-IOV拆分这个只有11代之后的Intel核显才可以用……我用的这两台工作站都是Intel6代的U所以在ESXi只能把整个核显直通分给某台机器了……
## 硬盘直通
硬盘直通有两种方式一种是把控制器直通了另外是只直通某个磁盘在ESXi上叫RDM直通。我的主板只有一个SATA控制器而且没有NVME硬盘所以直通控制器肯定不行这样会导致虚拟机管理系统读不到硬盘然后挂掉所以要直通就只能直通某个硬盘。
ESXi直通硬盘有点复杂要打开SSH然后用命令创建RDM磁盘文件挂载到虚拟机就可以了。不过我操作的时候不知道为什么网页出BUG了加载磁盘文件之后什么都读不到然后也不能保存最后没办法只能修改vmx文件进行挂载了……
PVE的话我感觉它的直通更像是把整个硬盘的设备文件作为一个磁盘映像来挂载到虚拟机上了但是PVE不允许在界面上挂载在指定存储以外的文件所以就只能通过命令来挂载……
两个从功能来说都没问题不过PVE挂载完之后磁盘显示的是“QEMU HARDDISK”而且SMART信息是瞎编的ESXi挂载之后可以看到磁盘名字、序列号另外SMART信息也能看到至少我用的ESXi 6.7U3u是可以的。不过PVE可以在面板上看SMART信息ESXi就只能登SSH敲命令看了……不过要是有IPMI应该也是能获取到硬盘的健康信息的。
# 总结
从上面来看PVE的功能是要更多的但是使用起来不如ESXi友好坑也比较多对于不想花时间解决问题的人来说用ESXi会更好一些当然ESXi也并不是免费产品它是VMWare vSphere的一个组件VMWare vSphere是收费的而PVE是免费的可以付费获得额外的更新和服务对于个人而言当然无所谓两个肯定都不会有个人花钱买至于公司的话……大公司选择VMWare vSphere当然会更好一些肯定对运维会很友好PVE的话小公司免费用会更合适一点。
至于哪个我觉得更好……我还是更倾向于用ESXi虽然PVE功能很多但是毕竟PVE底层是Linux我怕乱配给配崩了🤣ESXi的话就没有那么多会让用户搞坏的地方所以更稳定啊。

View File

@ -1,19 +0,0 @@
---
layout: post
title: 年终总结
tags: [总结]
---
All Systems Operational.<!--more-->
# 2024年的状态
在过去的一年里,其实相比之前感觉好了一些,工作了一年多感觉什么事情都没有发生。这么看来在上学期间确实是痛苦啊,有人说出了学校会更加痛苦,至少在我看来并没有发生这种事情。不过也正是没有发生什么大事,所以感觉稍微有点无聊,但是我不讨厌,因为我知道刺激的生活并不会有趣,虽然可能会错过一些机会和有趣的事情,但是也降低了碰上危险和讨厌的事情的风险,还是安稳一些比较好。
# 2024年发生的事情
虽然这一年里没发生什么大事不过小事肯定还是有些的。其实我的记忆能力还是一如既往的差和去年一样什么都想不起来现在我顶多能记起半年左右的事情。令我记忆比较深刻的事情大概就是国庆节前后发生的事情那段时间A股突然大涨我受到家里人和自己的贪心以及在那之前手头的债券基金跌了一些等影响入了一点进去然后第二天就吃了跌停🤣。随后我就退出股市不打算再玩了。还好之后的A股就再没有起来过尤其是一年的最后一天再来一次大跌🤣要不是我当机立断退出可能就永无天日吧😅虽然还是亏了不少😥不过影响不大
我平时还是挺节俭的,虽然我知道节约并不能让我更有钱,但节约一点至少可以用的多一些。而自从我上次一天就消费掉几千块钱,什么都没换来之后,我知道了这简直毫无意义,省吃俭用也不如一次大跌。不过我知道了,如果想达成目标,就不要瞎搞,不要考虑投资的事情。但是市场环境仍然需要考虑,不能因为其他人的行为影响到了我的目标,也许换成黄金是最好的选择,只是我仍然没法下定决心,也许只有什么契机才可以吧。在那之前我仍然不会改变我的行为,我还是不会提高我的消费水平😂。
除此之外令我印象比较深刻的事情还是AI这一年里LLM发展的比我想象的更加厉害现在各行各业已经全面在用了成本也比之前低得多不像之前用AI的成本还稍微有些高现在基本上都是免费的而且效果也比之前好很多像知名AI直播主[Neuro-sama](https://www.twitch.tv/vedal987)的表现相比之前也好多了逻辑性和整活能力也更强了虽然我只看切片可能判断上还是有些片面。至于我因为AI的广泛发展也给我的博客加上了[AI摘要](/2024/07/03/ai-summary.html)[知识库问答](/2024/09/27/rag.html) 以及[相似文章推荐](/2024/10/01/suggest.html)另外从我做完之后也进行了大力推广让其他站长也用上了我写的AI摘要也算是对AI发展的回应了。
# 2025年的计划
既然2024年没有发生什么特别的事情那我希望2025年也不要发生什么事情就像我在[2023年的年终总结](/2024/01/01/summary.html)所说未来10年都要如一日工作日上班下班了玩电脑休息日睡觉节假日回家不要做多余的事情只要环境没有什么变化就不要进行多余的操作这样才能安稳的到达马拉松的终点。
至于其他事情有趣的研究如果碰上了我依然会去做做完之后就写篇博客😊。虽然说写多了之前写的我自己可能都忘了不过总有些有用的东西可以在我需要的时候进行参考而且写多了之后拿来训练AI说不定能做一个和我想法一样的AI呢到时候就可以代替我想问题了😆。

View File

@ -1,26 +0,0 @@
---
layout: post
title: 新旧服务器的使用体验与对比
tags: [服务器, Dell, 使用体验]
---
花更多钱可以收获更多吗?<!--more-->
# 起因
最近由于某些原因需要买点服务器,从我平时用的东西来看,其实很多年前的产品就已经满足大多数应用了,业务的发展跟不上时代的发展,就根本不需要更好的性能。所以既然要买服务器,还是买洋垃圾比较好,那些淘汰下来的服务器特别便宜。虽然这么说,但是我也好奇现在的技术到底发展到一个什么样的程度,所以也整个新的服务器玩玩吧。
# 选择服务器
那选哪个服务器比较合适呢我在大学里用过R730那款服务器给我留下的印象很不错拆装很方便也有很好用的带外管理功能iDRAC现在的R730已经非常便宜了我看了看CPU觉得既然洋垃圾很便宜那就要选个厉害的CPU最终我选择了双路20核40线程的[英特尔® 至强® 处理器 E5-2698 v4](https://www.intel.cn/content/www/cn/zh/products/sku/91753/intel-xeon-processor-e52698-v4-50m-cache-2-20-ghz/specifications.html)总共40核80线程另外配了4根32GiB 2400MT/s的DDR4内存看起来参数还是挺唬人的🤣而且价格才2k多CNY感觉还挺不错。
那新的用啥呢我上Intel的官网看了看至强6是现在最新的Intel服务器CPU至于AMD的……主要是给我买服务器的人不喜欢AMD🤣所以只能选Intel的。既然旧的选了Dell新的也选Dell吧我看搭载至强6的戴尔服务器是R770但是目前还买不到😅而且价格贵的吓人。次一级就是R760可以上第四或第五代至强可扩展处理器不过看了一眼价格也有点贵……但这个机器有个青春版叫R760xs也能上第四或第五代至强可扩展处理器扩展性稍微差一点但是价格比较便宜他们管这叫“成本优化版”。最终选来选去选了个单路16核32线程的[英特尔® 至强® Gold 6426Y 处理器](https://www.intel.cn/content/www/cn/zh/products/sku/232377/intel-xeon-gold-6426y-processor-37-5m-cache-2-50-ghz/specifications.html)外加4条16GiB 4800MT/s的DDR5内存总共花了将近4wCNY感觉还是相当贵啊……
# 使用体验与对比
服务器拿到手之后自然要先跑个分我给新服务器安装了Ubuntu Server 24.04旧的因为核心数多感觉应该能干点别的所以安装了Vmware ESXi 6.7然后在上面安装了个Ubuntu Server 24.04的虚拟机。跑分用的是sysbench。最终新的服务器单核跑分2853.45events/s多核47054.35events/s旧服务器单核876.22events/s多核52792.15events/s。从这里来看这个新服务器让人非常失望啊单核才3倍多点差距尤其我试了试13代i5的单核跑分能到4290.80events/s家用的处理器可是要便宜的多啊。多核虽然说16核比40核少了点能跑出差不多的分数已经很厉害了但是考虑到这两个服务器20倍的价格差还是深深的感到不值啊……
当然服务器的性能并不是它的优势扩展性才是但是R730的定位比R760xs的定位要高啊😂扩展性显然是旧服务器更强……那新服务器就没什么优势了吗倒也不是新服务器的处理器至少把漏洞都修完了除了幽灵漏洞之外至少不受其他漏洞影响安全性更强了。旧处理器和酷睿5代是同一个时代的所以会受各种CPU漏洞的影响。不过这个服务器又不会当云服务器租给别人用有没有漏洞根本无所谓啊😅。
那管理性呢新的带外管理用的是iDRAC9旧的是iDRAC8两个界面上差距倒是挺大的不过功能基本上都差不多从功能上来看9比8多了个修改BIOS的功能但是修改完还是得重启才能生效😅那不如花几十块钱买个企业版订阅然后用虚拟KVM直接重启进BIOS修改呢……不过如果是大规模的话可能是可以统一修改BIOS选项那就有点意义了不过对我来说没啥意义😥。
那还有别的优势吗我看网上说第四、第五代至强可扩展处理器新出了个指令集叫AMX可以用来加速AI推理正好最近国内一个叫DeepSeek-R1的模型挺火的那就拿来试试看呗要是这个AMX指令集能大幅提高CPU的推理速度那我还是挺认同它的价格的毕竟内存可以随便加显存……都被老黄垄断了价格巨贵无比😂。现在的[llama.cpp](https://github.com/ggerganov/llama.cpp)已经支持了AMX加速具体的使用方法可以看Intel官网上的[论文](https://www.intel.cn/content/www/cn/zh/content-details/791610/optimizing-and-running-llama2-on-intel-cpu.html)看起来需要安装Intel oneAPI的库才能编译使用。我折腾了一下编译完跑了一下DeepSeek-R1 32B Q4_K_M蒸馏版速度大概是5.2token/s。然后我安装了个[Ollama](https://ollama.com/)它自带的这个llama服务器只支持AVX2指令集加速但是我试了一下速度能达到4.8token/s也就是说AMX指令集加速了个寂寞几乎没起倒什么作用难怪没什么人讨论。不过我也听说纯CPU跑大模型主要瓶颈在内存带宽上我插4条也就是四通道其实也不是它的全部实力它最大支持八通道也许给它插满效果会好一些吧……
那旧服务器呢我倒也试了一下用Ollama跑一样的模型大概是2token/s多的速度也就是说新的相比旧的也只快了1倍多一点而且旧的每个CPU只有2条内存只有双通道速度也只有新的一半结果新的才领先了一倍多一点都上了那么多黑科技……看来Intel是真不行了。
当然5.2token/s的速度显然是无法接受的还是有点慢了再加上DeepSeek-R1还有思维链在回答问题前还要生成一堆废话那就更慢了其实要我说它那个思维链其实就是把之前的AutoGPT的结果作为训练材料训练的相当于集成到模型里了我自己测了一下水平还是不够用包括官网的满血版也一样。我之前听说有一种叫做“投机采样”的推理加速技术不知道为什么凉了llama.cpp编译的产物里还有这个技术的PoC。于是我就下了个DeepSeek-R1 7B Q4_K_M蒸馏版拿来试试看用它来加速32B的怎么样。首先我单独测试7B的速度可以达到20token/s然后我用“llama-speculative”测了一下感觉有点一言难尽……一阵快一阵慢的总体来说感觉不如直接跑的快难怪这个技术凉了😥不过也可能是因为这两个模型的什么token分布不太一致毕竟是蒸馏的模型估计还是有点区别所以体验不太好吧。
那除了大语言模型之外还有什么可测的吗?其实就像我开始说的,要说能满足业务,洋垃圾显然是绰绰有余,尤其还是顶尖的洋垃圾,普通的业务甚至都不能让洋垃圾产生瓶颈,新的不就更不可能了😥……
# 感想
从上面来看新服务器真的没什么优势啊性能提高了一些但是价格翻几十倍当然那些洋垃圾当年也是超级贵的东西只是被淘汰了所以失去了价值……不过说来这个价值也许并不是服务器硬件本身的价值“服务”也是很值钱的啊像那个支持服务比如远程诊断、上门服务现场响应之类的就是它贵的原因吧二手的旧服务器2019年就结束支持了新的有3年的支持期能到2027年不过我感觉在这支持期内恐怕没有能用到的地方啊服务器还是挺难坏的它最值钱的地方似乎只能被浪费掉了🥲。所以总的来说只有行业领先的业务才配得上最新的服务器小规模的业务还是用二手服务器吧😆。

View File

@ -1,35 +0,0 @@
---
layout: post
title: 近期LLM的部署与应用经历
tags: [LLM, AI, 人工智能]
---
玩AI开始变的有些烧钱了啊……<!--more-->
# 起因
在几年前我就已经[探索并玩过很多LLM了](/2023/04/05/ai.html)不过近些日子在这方面的发展似乎影响到了我的生活……由于近期某公司开发的DeepSeek在国内非常火导致我也不得不跟上这个热潮去考虑怎么应用它。当然对于普通人来说使用它并没有什么难度即使DeepSeek的官方网站和APP现在基本不能用现在各家大公司也都自行搭建了目前我感觉使用DeepSeek体验最好的是百度其他家使用无论是可用性还是速度都比不过百度而且目前百度也没有限制使用量之类还是挺不错的。
但是对我来说却不能直接使用其他公司的产品,其实要从成本来说接入其他公司的接口显然是要便宜的多,但是我需要应用的地方可能连不上那些接口😅,所以需要考虑自己搭建。
# 部署经历
为了能自己搭建DeepSeek首先就得买硬件了……虽然前段时间[整了台新服务器](/2025/02/09/server.html)但是让CPU来跑还是太吃力了速度太慢了……所以为了能轻松的跑起来最近整了张RTX4090 48GiB显存魔改版但是手头没有空闲的机器了只能插在一台用着[i5-8400](https://www.intel.cn/content/www/cn/zh/products/sku/126687/intel-core-i58400-processor-9m-cache-up-to-4-00-ghz/specifications.html)处理器的主机这下成狗骑吕布了🤣。有了这张显卡跑DeepSeek-R1的蒸馏模型从1.5B到70B的Q4_K_M量化版倒是轻轻松松用Ollama跑70B的模型也能到20Tps的速度。但是根据测试来看这些蒸馏模型的效果很差基本上没法用这些模型经常会发生不遵守指令内容随机掺杂英文而且也经常发生逻辑错误和671B的完整版完全不能比用起来还不如Qwen2.5各规模的模型。
那怎么办呢?前几天清华大学的某个团队更新了一款叫做[KTransformers](https://github.com/kvcache-ai/ktransformers)的框架据说它可以利用Intel的AMX指令集然后配一张RTX4090可以让DeepSeek-R1 671B Q4_K_M量化版跑到13Tps能跑到这个速度那至少是可用级别了调其他公司的接口基本上也就是这个速度之前买的新服务器不就有这个指令集嘛之前还感觉这个指令集有点鸡肋呢看来还是开发度不够啊😆如果再配一个CPU然后把内存插满也许就可以了可惜R760xs插不了全高的显卡要想插全高的估计就只能买R760了或者用PCI-E延长线不过那样感觉不太可靠……不过之后肯定还是会想办法上完整版的模型毕竟它的效果确实是不错最关键的是它的市场认可度高上了就能提高产品竞争力所以之后应该会想办法搞到满足KTransformers的硬件然后跑起来或者等[llama.cpp](https://github.com/ggml-org/llama.cpp)合并它的算法然后用llama.cpp会更好一些。
不过我更倾向于等Mac Studio M4 Ultra出来应该过几个月就能出按照目前发展趋势来看新款Mac Studio应该会有更大的内存理论上可以跑的动一些效果更好的[动态量化版](https://unsloth.ai/blog/deepseekr1-dynamic)现在能在M2 Ultra上跑的那个1.58位的效果还是不太行相比于价格十几万的服务器Mac Studio估计不到十万可以说是非常有性价比了。当然如果等不及的话应该还是会选择花十几万买个有双路第四代至强可扩展处理器加512GiB内存的服务器吧……
# 应用经历
有了模型之后如果只是聊天那就没必要费这么大劲了,费劲搭当然是为了能让它参与到实际的工作当中。不过该如何应用它呢?首先要让它知道工作的内容,所以第一步要搞出知识库。知识库的原理倒是很简单,我之前就给我博客的[聊天机器人加了RAG功能](/2024/09/27/rag.html)核心就是嵌入模型和向量数据库。不过我写的那个全都是为了能使用Cloudflare的功能脱离了Cloudflare就没用了。那如果要在本地搞应该怎么办呢我之前用过的[1Panel](/2024/02/03/1panel.html)开发它的公司旗下有个叫[MaxKB](https://github.com/1Panel-dev/MaxKB)的产品看起来很不错它使用了PGSQL和[pgvector](https://github.com/pgvector/pgvector)作为向量数据库来搭建知识库而且它是用Python写的还能用Python来写自定义功能的函数库另外它还能用可视化的方式来设计工作流可以轻松构建需要的逻辑从功能上来说我还是挺满意的。
使用也挺简单在设置里可以添加使用其他公司API的模型也可以使用Ollama不过这一步有个坑Ollama并不支持设置API Key但是它添加模型却要求配置一个API Key文档说可以输入任意内容我输了一个空格可以保存但是使用的时候会报网络错误所以它文档里怎么不说明一下是除了空格之外的任意内容😅浪费了我不少时间。
在添加知识库的时候可以除了[内置的嵌入模型](https://github.com/shibing624/text2vec)好像是腾讯的员工搞的模型也可以用Ollama的嵌入模型。它自带的嵌入模型用的是CPU文档规模大的情况速度比较慢因为在Cloudflare上我用的是BAAI的BGE模型效果还可以所以这次我还是选了它但是选的是中文模型这样就不需要再翻译了🤣。
开始我对MaxKB印象还是挺不错的但是用着用着……在建第六个应用的时候它显示社区版只能创建五个应用😅对于开源软件这样做限制我也是大开眼界了要是说有些专业版功能不开源是DLC的形式付钱来获取更多的功能代码我还能理解在开源代码上做数量上的限制这垃圾公司多少有点看不起人了😅。
那对于这种挑衅行为该怎么反制呢?它的代码倒是没有混淆之类的,还算不错,比我以前用过的[KodExplorer](https://github.com/kalcaddle/KodExplorer)要好,它还整个“部分开源”,有个[关键文件](https://github.com/kalcaddle/KodExplorer/blob/master/app/controller/utils.php)直接是混淆过的想改都改不了😅至少MaxKB还能随便改。
我大概看了眼代码只需要改两个文件就行一个是“apps/common/util/common.py”把其中“valid_license”函数进行判断的部分全部注释另外一个文件是“apps/setting/serializers/valid_serializers.py”把“ValidSerializer”方法中的“valid”方法里进行判断的部分全部注释就可以了开源还做限制我是真的无法理解……
如果是用1Panel部署的可以把那两个文件放到“/opt/1panel/apps/maxkb/maxkb”目录下然后在docker-compose.yml文件的volumes段添加
```yml
- ./common.py:/opt/maxkb/app/apps/common/util/common.py
- ./valid_serializers.py:/opt/maxkb/app/apps/setting/serializers/valid_serializers.py
```
就可以了。
不过总体来说从功能上我还算比较满意,就原谅它搞出这种奇葩的行为吧😆。
MaxKB主要是为了能给更多人使用所以是网页版部署也略显麻烦如果是自己用呢我之前看到过一个桌面软件叫做[Cherry Studio](https://github.com/CherryHQ/cherry-studio)。它更适合开箱即用一些功能上可能不如MaxKB强大但是比较方便一些。比如上传文档MaxKB需要在流程图中自行处理这个软件会帮你处理好添加知识库可以直接添加本地的文件夹不用上传到服务器上另外安装比较方便不像MaxKB搭环境比较麻烦些所以个人用的话可以用Cherry Studio。
# 感想
总的来看DeepSeek的出现还算可以虽然它受到的关注和它的能力也许并不匹配但是毕竟现在的它已经是人人都能蹭的东西了谁都能挂它的名头我们来蹭一蹭也能分点它的好处。当然这样的结果倒也不差开发DeepSeek的公司只能获得他们应得的部分其他的关注度就应该被各家公司瓜分😆。我在这期间虽然很难获得什么实质性的收获但是能在这期间能搞点很贵的硬件之类的玩玩也是不错的体验啊🤣。

View File

@ -1,27 +0,0 @@
---
layout: post
title: 近期LLM的部署与应用经历(2)
tags: [LLM, AI, 人工智能]
---
最近AI发展好快啊<!--more-->
# 起因
自从[上次](/2025/02/22/llm.html)写完文章之后最近这段时间LLM圈又有了不少更新感觉很值得试试看。所以这次就来看看这些新东西有什么特别的地方吧。
# 关于阿里QwQ模型的体验
前两天阿里的推理模型QwQ模型更新到正式版了不过其实我也没试过他们的预览版效果怎么样……但按照他们的说法他们的32b参数的模型水平已经相当于DeepSeek-R1 671b的模型了。如果真是这样那就太好了毕竟那个671b参数的模型部署难度还是相当大的在当时想部署一个能用级别的还是挺烧钱的。但如果这个32b参数的模型能达到相同水平那就完全没有必要买那么贵的硬件了。像上次买的RTX4090 48GiB显存魔改版可以轻松跑QwQ 32b Q8量化的版本速度能达到23T/s就算想跑没有量化的fp16版也只需要再买一张RTX4090 48GiB就够了这个成本相比DeepSeek-R1低太多了。
所以刚发布的那天我下午就把模型下载下来试了试随便试了几个问题答得效果确实不错我对比了一下DeepSeek-R1试了试“世界上最长的单词中哪个字母最多”这个问题两边回答的格式几乎一样都说的是“硅肺病”的英文并且都进行了字母数量分析主要的结论都分析正确了但是第二多和第三多的字母数量两边说的都不完全正确。另外我还试了试DeepSeek-R1的14b和70b蒸馏版虽然回答正确了但是并没有分析具体字母的数量所以从这一点来看确实是和DeepSeek-R1的水平很相似。不过后来我又让其他人试了试文本分析之类的能力似乎没能达到他们的预期另外我还测了测比较宽泛的问题以及解析文本之类的问题结果很多问题没能正确回答……所以还是不能和DeepSeek-R1相比较不过相比DeepSeek-R1各个蒸馏版的水平还是强了不少的至少没有出现在回答结果中随机输出英文的情况但是偶尔会出现没有闭合标签“&lt;/think&gt;”的情况看起来应该不能用于生产环境……要想正经用还是得用完整版的DeepSeek-R1但毕竟成本问题还是很大啊……所以如果需要考虑成本问题的话用QwQ还是很不错的选择。
不过QwQ相比DeepSeek-R1还有一个优势那就是支持Agent能力原生支持调用用户提供的函数像它虽然解析文本的能力不怎么强但是它可以调用工具来处理而DeepSeek-R1要想支持就得写提示词但是毕竟没有专门训练过不一定能正确使用工具虽然我没试过😝
另外说到Agent好像有个叫“Manus”的产品挺火但那个我实在没兴趣一点技术含量都没有还搞什么邀请码一看就是买的水军而且还被人不到一天时间实现了开源版[OpenManus](https://github.com/mannaandpoem/OpenManus),给人笑掉大牙了🤣。
# 关于新出的Mac Studio的看法
搭完整版的DeepSeek-R1即使是使用上次所说的[KTransformers](https://github.com/kvcache-ai/ktransformers)框架也是相当费钱的最起码也得10万CNY左右。但最近几天苹果出了新的Mac Studio最高配的M3 Ultra可以选配512GiB的内存可以轻松跑DeepSeek-R1 671b Q4_K的版本然后价格最低仅需7.5万CNY。我之前还想着是出M4 Ultra呢……结果出了个M4 Max不过新的Mac Studio出的速度比我预期的快了好多我本来以为会在WWDC25的时候出呢……看来是想借DeepSeek-R1大卖一波当然从这个产品来说确实应该是会大卖的回头看看能不能搞一个来。不过现在才刚开售还没人拿到实物呢也没人实机跑一下所以先等等最早买到的人跑一波看看如果效果好的话也许能整一个呢……
# 关于如何查看MaxKB的完整接口文档
上一篇文章我说明了一下如何解除MaxKB用户、应用以及知识库的数量限制后来我发现它还限制了社区版查看完整API文档的能力😅这个限制给我看的那叫一个大开眼界它居然还给这个文档整了个硬编码的密码从来没见过这么搞开源的具体就是[这一行](https://github.com/1Panel-dev/MaxKB/blob/f1a1c40724ceba108febb416aadb01ccb71c3add/apps/common/init/init_doc.py#L80)。虽然我不知道这里面提到的MD5对应的密码是多少但是既然是开源代码我把这句话删了不就行了……不过实际上不太行因为它使用了Django的国际化功能直接删掉会影响这个文件的行数程序会报错。不过可以仔细看一下关于“init_chat_doc”这一行在密码的判断后面加了个“or True”看来是MaxKB的开发者后来应老板要求放开“chat_doc”的限制但是又懒得改国际化那边的东西所以加的这个吧🤣那既然这样我直接给“init_app_doc”对应的那句话也加个“or True”不就行了加完之后打开“/doc/”路径就可以看到MaxKB的完整API文档了不需要自己手动再去抓包测试了。
至于其他的专业版功能我看了一下应该确实是需要用到XPACK包的不过其实关于修改页面风格的前端开源了后端在XPACK里要想用得自己实现接口开源的这部分最多只能到这里了估计是这些限制没法单独搞一个包所以他们就直接在开源代码上做限制😅看来他们老板也是没眼力啊。
其实与其余用MaxKB不如用[Dify](https://github.com/langgenius/dify)至少它没有在代码里塞莫名其妙的东西来恶心人文档也相对更完备不过它目前还是相当的不成熟有很多BUG比如上传知识库显示支持Excel但是解析的时候会失败上传知识库如果通过改配置超过15M解析也会失败还有它的插件很多也是不能用比如目前阿里云的百炼会报错退回上个版本就不支持思维链的展示等等……总之不太适合生产使用。
# 感想
现在的AI发展确实是快啊才几天时间又有一堆有意思的发展应该说现在很多公司都在趁这个机会来发布自己的产品吧感觉现在也是一个能有很多机会的时刻不过AI对研究能力的要求也是相当高的想在这个时间蹭热度也得有相当厉害的能力……像阿里的水平也是相当强的可惜营销水平不太行😆。只是像我应该也只能看着大公司的百花齐放吧看看接下来的时间还会不会出现一些有意思的东西。

View File

@ -1,26 +0,0 @@
---
layout: post
title: 关于HiFi的尝试与探索
tags: [HiFi, 音乐]
---
如何才能听到最原始的音乐呢?<!--more-->
# 起因
前段时间有人在QQ群中送网易云音乐的7天体验VIP于是随手领了一份。有了VIP之后除了可以下载仅限VIP的音乐以外还可以选择更好的音质。我现在用的是[MacBook Pro](/2023/02/03/mbp.html)据说在笔记本中音响效果是最好的那么我为了能对得起这优秀的音响也不该听垃圾音质的音乐所以就来探索一下如何听到HiFi的音乐吧。
# 获得音乐
下载音乐很简单直接下一个网易云音乐客户端就可以不过需要注意要在设置中修改下载音质默认选项不是最高音质。另外它这个VIP还不是最高的再往上还有SVIP可以听所谓的“超清母带”的音质我不太清楚这个无损以上的那些音质到底是什么东西也不可能为了这点东西给网易云充钱所以我就选了个“高清臻音”的选项。
当我在下载一些免费歌曲的时候下载到的文件是flac格式看起来应该是没什么问题。但是下载VIP独享音乐的时候正在下载时是flac格式可是下载完就变成ncm格式了……虽然我知道有一些解密这些格式的软件GitHub上有不过好多都被DMCA takedown了虽然也能搜到[一些](https://github.com/rainlotus97/unlock-music)……不过我还是比较好奇这个过程既然它下载时是flac那我在它刚下载完要变成ncm之前把网易云音乐强制结束掉不就可以获得完整的flac文件了嘛。试了一下还真可以也就是说这个ncm加密的过程是在客户端完成的而不是在服务器上这还真是有点离谱……我用这个方法下载了几首喜欢听的歌试了一下都能正常播放。不过用这个办法下载的音乐在客户端的下载中看不到所以就没有歌词之类的东西了。
# 分析音乐
虽然说下载下来的文件是flac格式但是不代表这就是无损的音乐。毕竟从网易云音乐的“无损”以上的选项都是flac的那到底它这个无损是真无损吗首先我在网上搜了一下网易云音乐的黑历史很多有些人在网易云音乐上上传了mp3的音乐结果也有无损的选项。也就是说它这个flac很有可能是直接用mp3转换格式过来的。那这样我就不愿意了我可以接受下不到无损但是不能接受本来是mp3格式然后转成flac结果文件体积大增给我的硬盘塞一堆没用的数据所以现在我需要证明刚刚下载的音乐不是一堆没用的垃圾。
我看有人说可以使用[spek](https://github.com/alexkay/spek)查看时频谱来验证如果是直接用mp3格式转换的flac文件会被整齐的砍一刀因为mp3格式支持的最大采样率是48kHz而根据香农采样定理采样频率应该大于等于模拟信号频谱中最高频率的2倍那么mp3支持的最高频率就是24kHz所以用mp3转换出来的flac一般会在24kHz那里切一刀更有甚者如果是44.1kHz采样率的mp3就会在22kHz左右的位置切一刀。不过理论上人类的听力上限就是20kHz更高的频率理论上人类应该是听不到。但毕竟我们追求的是HiFi和人类能不能听到没有关系要保证的是完整的复刻**所有**的信息。
于是我在我的Mac上用brew安装了spek安装好之后直接执行spek+音乐文件的位置就可以了我看了一下刚刚从网易云上下载的音乐全都是96kHz采样率的音乐而且没有被切过的痕迹。那这样就能证明网易云音乐就是真无损了吗其实我也不知道因为我没有从发行商直接获得的原始文件一般要对比原始文件才知道是不是无损的……不过我在网上看说无论是“高清臻音”还是“超清母带”无一例外全都是用AI升频制作的所以看时频谱已经没有意义了……但是我又没有证伪的方法那就只能先凑合听喽
# 播放音乐
既然音乐已经下好了那么我直接用我的MacBook Pro播放的音乐它够HiFi吗虽然我能听出mp3中128kbps和320kbps的区别但是再高的我也听不出来……不过HiFi要的不是人能不能听出来而是它发出的声音是不是完美还原。这要怎么证明呢虽然我没有办法听出来但如果有可视化的分析至少能看出来于是我在手机上下载了一款“声音分析仪”软件它可以用FFT算法分析手机话筒收集到频谱然后展现出来。只是可视化之后……我也很难看出来它够不够HiFi啊当然理论上如果能保证播放音乐的音响和收听音乐的话筒都是最好的那么两边的频谱应该是一样的但是现实中还有底噪的存在不可能完全一样……虽然如此但我在看频谱的时候发现播放的音乐最高频率似乎只有20kHz我已经测过手机的话筒是能接收到更高的频率的既然MacBook Pro的音响是最好的怎么会只能播放20kHz的声音呢而且它这个20kHz很明显有一刀切的感觉应该是哪里配置错了。
于是我搜了一下Mac默认输出的声音貌似只有44100Hz的采样率需要在“音频MIDI设置”中将扬声器输出的格式改成更高的才能播放更高的频率。不过这也挺奇怪的44.1kHz的最高频率是22kHz啊为什么会在20kHz那里砍一刀呢看香农采样定理所说的是大于等于也许就是这个原因吧既然我的音乐都是96kHz采样率的音乐那么我就应该把这里的设置改成一样的。改完之后又测试了一下发现确实是突破了20kHz但好像没有超过22kHz不过至少没有“砍一刀”的痕迹了也许是音乐本身就是这样或者是扬声器最高只能到这个水平了吧。其实我也没有那么追求HiFi能到这样我已经很满意了。
# 感想
虽然对人来说也许听HiFi并不能听出来什么但是追求HiFi还是挺有意思的毕竟提高还原程度是可以通过可视化的方式看到的既然如此那就是有追求的价值。看不见的东西是玄学可以不去追求但是HiFi是实实在在存在的这样也就能理解为什么会有人花大价钱去买各种昂贵的设备来提高还原度了因为这是真的可以起到作用的啊……当然对我来说能0成本做到尽可能的HiFi才是最重要的花钱达到HiFi就没什么必要了🤣。

View File

@ -1,39 +0,0 @@
---
layout: post
title: 在UTM中使用苹果虚拟化的各种尝试
tags: [虚拟化, 苹果, UTM]
---
用官方的方式做非官方的事!<!--more-->
# 起因
在几年前刚[收到MacBook Pro](/2023/02/03/mbp.html)的时候,我曾安装过虚拟机软件[UTM](https://github.com/utmapp/UTM)。但是因为我的Mac内存很小用虚拟机的体验很差所以就把UTM卸载掉了。不过以前还我还[装过一台黑苹果](/2024/06/16/hackintosh.html)在上面也安装了UTM。
最近正好由于某些原因我需要在macOS上安装虚拟机既然有UTM用就继续用UTM了。当然正常情况就是按正常的方式安装系统然后正常的用这并没有什么意思。所以我想整点有意思的事情想试试不太正常的使用UTM😝。
# 在UTM中使用苹果虚拟化框架安装Windows
如果用过UTM的话应该知道UTM有很多选项比如底层的虚拟化框架可以用QEMU或者[Virtualization.framework](https://developer.apple.com/documentation/Virtualization)VZ而QEMU的后端可以选TCG或者是[Hypervisor.framework](https://developer.apple.com/documentation/hypervisor)HVF。它们有很多特色像TCG的兼容性最好可以模拟任何架构的CPU但是性能最差HVF使用硬件虚拟化加速只能运行宿主机架构的程序但是性能比较好而VZ经过了苹果官方优化性能最好。
那么现在我想安装Windows又想有最好的性能那我应该选择VZ吧可是UTM不允许我这样选择如果选择安装Windows就会强制使用QEMU……只有Linux或者macOS在ARM处理器才能使用VZ……那我应该如何绕过这个限制呢
我想起来之前[让没用的主机感染木马](/2024/11/02/trojan.html)的文章中使用了[一键DD/重装脚本](https://github.com/bin456789/reinstall)把我服务器的Linux系统重装成了Windows系统那么我能不能用相同的方式先按照正常的方式用VZ安装一个Linux系统然后使用这个脚本重装成Windows我觉得理论上应该没问题所以就尝试了一下。
我在这之前已经安装过了一个用了VZ的Ubuntu虚拟机新建比较费时间所以就直接把这个虚拟机复制了一份。然后下载了重装脚本准备重装系统但是看说明现在不能让脚本自己查找系统镜像安装了不过没关系前段时间我下了一份Windows 10的镜像接下来我只需要在镜像所在目录执行
```bash
python3 -m http.server
```
开启一个文件服务器,然后在虚拟机中执行
```bash
bash reinstall.sh windows --image-name "Windows 10 Pro" --iso "http://192.168.64.1:8000/windows.iso"
```
就可以了执行后重启就可以在UTM的虚拟机界面中看到脚本执行的一系列操作。在这期间都很顺利然而在它执行完之后虚拟机的屏幕就黑了而且重启也没有任何变化看来是实验失败了不过也可能是因为苹果整的虚拟显示器在Windows中识别不出来所以显示不出东西因为我看活动监视器中CPU的占用率也在跳变虚拟机应该仍然在运行于是我下载了[Windows App](https://apps.apple.com/us/app/windows-app/id1295203466)以前的远程桌面使用虚拟机之前的IP进行连接结果连接成功了😆。看来苹果的虚拟化框架是能运行Windows的嘛居然没有一个人尝试一下。
不过屏幕不能亮是真的没有驱动吗我看了眼设备管理器搜了一下那个没有安装驱动的视频控制器的设备ID“1af4:1050”好像是Virtio GPU这个驱动我记得在[virtio-win](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/)里是有的而且重装脚本也会自动下载这个驱动为什么会没有自动安装呢可能是设备ID和驱动不一致吧……不过不影响我选择更新驱动在列表中选择“Red Hat VirtIO GPU DOD controller”之后UTM的虚拟屏幕中就可以看到画面了虽然分辨率只能是1024*768……不过能用就很不错了。
再接下来我就需要验证一下它的性能是不是最好的我把这个虚拟机的硬盘复制了一份新建了一个使用HVF后端的QEMU虚拟机把这个硬盘挂载上然后使用国际象棋跑分看了一下VZ的跑分相比HVF的跑分高了大概5%-10%,还是挺厉害的。
至于其他方面我看了一眼用HVF的QEMU虚拟机CPU不能显示正确的型号而VZ是可以的另外VZ的SMBIOS信息中也可以看到Apple的字样证明这个Windows确确实实是跑在了苹果的虚拟化框架。不过以上的测试都是基于x86架构的macOS等回头我的Mac Studio到了之后再在ARM架构的macOS上再测一下看看能不能用相同的方式安装如果可以的话说明VZ的虚拟机没什么兼容性的问题UTM应该放开使用VZ安装Windows的选项让我们测测苹果的技术才对。
# 在macOS 12中的UTM使用苹果虚拟化框架安装Linux
虽然在刚刚的测试中用VZ安装Linux就和其他普通的虚拟机安装Linux一样简单但是之前的测试是在macOS 15上测的。现在我遇到了一个新问题我现在有一台2016年的Mac上面运行着macOS 12而且不能用OCLP升级到macOS 15因为不是我的电脑。现在我想在这台电脑上用苹果虚拟化框架安装Linux虽然用QEMU更简单但是感觉没意思。在macOS 12中不支持UEFI bootloader所以我需要手工准备内核镜像之类的东西。
当然从零开始有点难我打算先用QEMU安装一遍Ubuntu Server。在创建虚拟机之后需要注意要把刚创建好的虚拟机的硬盘删掉因为那是qcow2格式的在VZ中只支持img格式的硬盘所以删掉之后需要创建一个“RAW映像”然后按照正常的方式安装系统。
安装好之后从“/boot”目录中把“vmlinuz”和“initrd.img”复制出来作为Linux内核和初始Ramdisk我看说明上要未经压缩的Linux内核映像但是好像是压缩的也能用🤔。随后关机把在QEMU中的硬盘映像复制出来作为根文件系统映像。
至于启动参数,可以看“/boot/grub/grub.cfg”中内核后面跟的那串然后再加上“console=hvc0”因为macOS 12中使用VZ没有虚拟屏幕只能用虚拟串口连接。在一切准备好之后就可以开机了在一串内核信息不停滚动后显示出了登录的提示符实验就成功结束了。
不过这样启动的话在系统中所有对内核以及对initramfs的更新就全都不会生效了毕竟虚拟机根本读不到内核了……这倒是影响不大反正不更新也不是不能用更何况macOS都不打算更新虚拟机不更新又能怎样呢🤣。
# 感想
看来苹果的“不支持”不代表真的不支持想想既然是虚拟机当然就不应该限制系统类型啊毕竟虚拟机虚拟的是硬件又不是软件。不过倒是也能理解苹果不需要声明支持自己的竞品所以也没必要做相应的兼容和测试但居然没见到有人尝试一下也挺奇怪明明用Mac的人也有不少对技术很有探索精神的人啊……
不过随着macOS的更新像这些非官方支持的办法估计也很有可能出问题毕竟苹果并不对这些情况进行任何形式的保障也许以后苹果的哪次更新这个方法就用不了了呢……

View File

@ -1,87 +0,0 @@
---
layout: post
title: 最近对博客搜索功能的优化记录
tags: [博客, 搜索, 优化]
---
看看其他的博客也会有新的灵感啊~<!--more-->
# 起因
前段时间我闲来无事在GitHub上搜和我使用相同模板[minimal](https://github.com/pages-themes/minimal)的博客。但搜索结果中有许多人用这个模板制作的是简历或作品集这让我有些失望。不过这倒也能理解因为这个模版并不算博客模板没有文章列表之类的代码这些都只能自己写。当然多找找还是能找到一些的毕竟这个模板在GitHub Pages中算是最受欢迎至少符合大众的审美。像我就搜到了一个叫[Guanzhou Hu的博客](https://github.com/josehu07/josehu07.github.io),他对模板的样式做了不少的改动,而且改的还挺好看的,尤其是右上角的导航栏,看起来挺有意思,只是这个源代码……导航栏有点硬编码的感觉,我不是很喜欢这种实现方式……
# 使用标签作为关键词进行搜索
之后我又看了看其他博客,看到了[Matt Walker Blog](https://github.com/mhwalker/mhwalker.github.io)。他没有对模板做很多改动只是把section元素变得更宽了但是他没有改手机版自适应的样式导致界面基本上没法在手机上查看。不过在他的首页中我对他把文章标签放在文章列表这个操作非常感兴趣因为每次我都有给文章打标签但是几乎没什么用。他的标签点进去之后会跳转到该标签下的所有文章我其实很早就想做这个功能了但是在不用插件的情况下Jekyll基本上做不出来这种功能因为没有插件的情况下是不能使用Liquid标签创建文件的我看了下他的实现原来是提前创建好的标签页面然后进行筛选的这个实现我也不喜欢这样的话我每次打标签都要新建一个标签对应的页面这种事情不让程序做我会很不爽……其实现在的GitHub Pages构建网站都是用的Actions了完全可以自己写一个可以使用插件的Actions来进行构建不过我也懒得折腾了🤣
要么还有一个选择,可以单独搞一个页面,里面有所有标签对应的文章,点击文章的标签之后使用锚链接定位到对应标签所在的位置。但这样会导致一个页面有可能有一堆相同的文章链接,结果这个页面比归档页面的链接还多,那就感觉有点糟糕了……
不过我想起来以前做的[博客全文搜索功能](/2021/07/23/search.html)如果把标签作为关键词进行查询那也能起到筛选出标签对应文章的作用吧而且这样即使我没给那个文章打标签也能搜出来其实也算不错的选择另外自从我做出来那个全文搜索的功能之后也没用过几次没有关键词的话也一时半会想不出来搜什么比较好。于是说做就做直接把Matt Walker Blog那段在文章列表生成标签的代码复制过来感觉好像还不错😆
顺便我也把文章里面的标签也加了链接到搜索的功能,不过原来的代码用的是`.join`实现的,现在加上这个功能的话就只能老老实实用循环写了😥……
# 搜索后使用高亮标记关键词
上面的标签搜索效果还不错只是有些关键词搜完之后有点难发现。我搜索出来之后怎么证明搜到的内容里面一定有对应的关键词呢虽然从程序的角度来说这是理所应当的事情一定是有的数据才可能被搜到但有时候不用Ctrl+F看一眼都不知道是哪里搜到了……所以我觉得应该像其他网站一样对搜到的内容用高亮进行标记。标记应该用什么呢用样式也许不错不过现在的H5标签里有一个叫mark的标签可以直接用用这个标签包裹的内容背景颜色就会变成黄色就像用荧光笔标记了一样这样就不需要写样式了。
至于关键词用查询字符串传过去就好了,那我该怎么做呢?我用的搜索脚本叫[Simple-Jekyll-Search](https://github.com/christian-fei/Simple-Jekyll-Search),它的文档其实根本没有写怎么把搜索的请求传到模版里,还好它有个[关于模版的测试脚本](https://github.com/christian-fei/Simple-Jekyll-Search/blob/master/tests/Templater.test.js)里面有写有个query关键词可以把搜索内容给模版渲染出来既然做了这个功能怎么不写在文档里😅不过这个项目已经停止也没法提出什么建议了……
这个功能听起来相当简单我都懒得写了这种简单的功能直接让AI写才对于是我把需求告诉它让它给我实现一份于是这就是让AI给我写的高亮关键词的JS代码经过了一点修改
```javascript
$(function () {
const urlParams = new URLSearchParams(window.location.search);
const keyword = urlParams.get('kw')?.trim();
if (!keyword) return;
// 转义正则表达式特殊字符,避免安全问题
const escapedKeyword = keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
// 创建不区分大小写的正则表达式(全局匹配)
const regex = new RegExp(`(${escapedKeyword})`, 'gi');
// 递归遍历并高亮文本节点
const escapeHTML = str => str.replace(/[&<>"']/g,
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);
});
});
```
2025.04.28更新:解决了一个潜在的解析问题)
我测试了一下非常符合我的需求各种情况都能按照我的预期工作虽然说功能非常简单但是能正常运行AI写的还是挺不错的。
# 近期的其他修改
除了对搜索功能的优化,我还做了些别的功能:
## 随机跳转文章
前段时间我看到有其他人的博客增加了一个随机跳转文章的功能,不过他的博客是动态博客,实现也比较奇葩,是渲染页面时就已经决定好要随机的文章,也就是说无论用户想不想随便看看,程序都已经随机好了。当然用着静态博客的我来说,从原理上也做不到这一点,不过既然我之前在做[相似文章推荐功能时](/2024/10/01/suggest.html)已经对搜索功能的数据进行了缓存,那么直接用缓存的内容直接随机就好了吧……所以就随便写了写,代码也极其简单:
```html
<a href="javascript:getSearchJSON(function(data){window.location = data[Math.floor(Math.random()*data.length)].url})">Random</a>
```
## 给文章内标题添加锚链接
最近在修改我的博客的时候我更新了一下[给文章生成目录的组件](https://github.com/allejo/jekyll-toc),在这时候我想看看它还有什么有意思的组件可以用,然后就发现了[jekyll-anchor-headings](https://github.com/allejo/jekyll-anchor-headings)它可以像GitHub展示Markdown文件一样在标题上添加点击后就可以直接跳转到对应标题的锚链接而且示例里也给出了怎么做[可以像GitHub的风格](https://github.com/allejo/jekyll-anchor-headings/wiki/Examples#github-style-octicon-links)。看起来挺有意思,所以就给自己加上了😆。
## 添加能跳转到原始Markdown的链接
在修改博客的时候我参考了一下Jekyll的官方文档在这个时候发现了page.path这个变量。我想了一下这个变量可以用来链接到我的文章内容然后就在文章标签位置的右侧加上了这个链接为了能让它显示在右侧我用的是`float: right`,但是这样会导致和文章标签不在同一行,查了一下才知道用了浮动就会强制将元素转换成块级元素,而文章标签用的是行内元素,所以对不齐,没办法就只能把这一整行都转换成块级元素了……于是代码如下:
```html
{% raw %}<span style="float: right;"><a href="{{ site.github.repository_url }}/tree/master/{{ page.path }}">查看原始文件</a></span>{% endraw %}
```
# 感想
多看看其他人的博客看来也挺不错,可以看看其他人的想法,说不定就有可以参考的价值呢……不只是文章内容,网站本身的一些功能也是作者的想法啊……而对于那些只套别人模版,没什么自己的改动的博客,那就没什么意思了(当然不会代码的那就没办法了~)。有些人说博客中只有文章才是最重要的,但我觉得对于技术博客来说网站的代码也是展示自己的部分,所以折腾博客本身也是很重要的!

View File

@ -1,30 +0,0 @@
---
layout: post
title: 如何使用JS通过订阅源查看文章
tags: [JavaScript, RSS, Feed, AI]
---
懒得写代码那就让AI写<!--more-->
# 起因
前段时间,我看到有些博客给自己的友链页面做了通过订阅源查看友链最近更新文章的功能,看起来挺有意思的,有点想整一个。不过对于我的博客来说,作为静态博客想要做到这样的功能估计没那么简单吧……毕竟一般的订阅软件需要隔段时间请求一下对应博客的订阅链接,然后再把结果存到数据库才行。但是我想了想,对我来说没必要做成订阅啊,我又不需要知道对应博客是什么时候更新的,只要在有人想知道的时候去请求一下订阅链接,然后展示出来就行,感觉似乎又没有那么复杂。
既然不复杂那这个功能就让AI来做吧正好前段时间有个朋友买了一个月的Devin.ai订阅据说是可以自己调试代码还能操作浏览器而且代码基本上写出来就能用。我对这个挺感兴趣的所以这次的功能就让它来写吧
# 让AI编写代码
既然是让AI来写至少得把我的需求说清楚所以首先我应该告诉它
> 创建一个JavaScript函数来实现[Links](/links.html)表格中链接的RSS/Atom源预览。
> - 当鼠标悬停在表中的链接上时检查该网站是否有RSS/Atom源并将结果显示在一个浮动窗口中
> - 在鼠标光标后的浮动窗口中显示提要中的5篇最新文章
> - 在窗口中只包含标题和时间,不需要链接和内容
> - 跳过所有不包含RSS/Atom源的链接而不显示任何错误
> - 当鼠标离开链接时,浮动预览应该消失
不过在正式编写之前我还得考虑一下可行性毕竟是很简单的功能我不写但我不能不知道怎么写。首先让JS解析Feed数据也就是XML数据应该是很简单的事情JS应该有自带的函数来实现这种功能。然后是获取数据在JS中使用fetch就可以了但是这里有个很重要的事情浏览器请求其他网站存在跨域的问题还好我之前在CF Workers上用[cloudflare-cors-anywhere](https://github.com/Zibri/cloudflare-cors-anywhere)搭了个CORS代理 <https://cors-anywhere.mayx.eu.org/> 。所以我应该在说明中给它说清楚:
> - 如果存在源请使用CORS代理https://cors-anywhere.mayx.eu.org/ 获取并解析它
随后我就开始让它编写代码了。接下来就能看到AI在浏览器和编辑器中切换不停的进行编写和调试等了一段时间它把第一版代码写好了。不过也许我说的不够清楚这个CORS代理的用法和其他的CORS代理不太一样代理链接和被代理的链接之间需要使用“?”分开另外第一版我也没说清楚RSS/Atom源的链接在哪所以它选择遍历常见的几种订阅源的路径这样有点不太好除了速度慢对我的CORS代理消耗也比较大。所以我告诉它代理的正确用法以及让它假设超链接中包含“data-feed”属性其中包含订阅源的链接并且随便挑了个网站拿给它作为示例。
随后就能看到它继续改改改改了几次之后我把最后生成的JS复制到浏览器上执行了一下效果还不错于是就把它放到我的博客上了。
它的水平还是挺不错的至少正确的实现了功能。不过我有点担心它的代码会不会不太可靠毕竟要从其他网站上获取数据得避免出现XSS之类的问题于是我把代码丢给DeepSeek-R1让它检查了一下果不其然Devin.ai写的代码似乎有XSS的隐患如果链接列表中标题有html标签似乎就会解析虽然我没试过于是根据DeepSeek的提示修改了一下增加了一个过滤特殊字符的函数改完又放到博客上最终的代码就是[rss-feed-preview.js](/assets/js/rss-feed-preview.js)。
# 感想
让AI全自动写代码感觉还挺方便有种当产品经理的感觉了🤣像这种AI就是Agent吧这也算是我头一次使用Agent了感觉用起来还挺不错的。不过从这次尝试来看确实AI也有一定的局限性像是直接写出来的代码可能存在一些安全性问题除非单独让AI检查不然很有可能会写出功能正常但是存在漏洞的代码所以还是得人看着点AI搞出事故可是**不负责**的啊😇~

View File

@ -1,96 +0,0 @@
---
layout: post
title: 关于LLM上限的探索
tags: [AI, LLM, 探索]
---
还有什么是AI不能干的<!--more-->
# 起因
在最近对LLM的探索中能感觉到它真的是什么都能干尤其最近GPT-4o的画图能力实在是太强了。不过对于画图我倒不是很关心主要是没什么想让它画的图😂。我更关心的是LLM在文本生成中的能力毕竟这才是它的本职工作。虽然现在的AI解决问题的能力确实很强但从它还没有大规模的把人替换掉来看它肯定是还有一些做不到的事情所以我想对这一点进行一些探索。
# 对于超长文本分析的探索
对于现在的LLM来说虽然不少模型已经能做到很长的上下文了但这个所谓的“长”不过是几万字而已。对于读一篇论文或者几篇文章当然没有问题但是如果是分析上百篇文章就不太行了比如我希望AI阅读完我所有的文章然后对我进行评价。
我的博客现在已经有一百多篇文章了,之前做过[全文搜索](/2021/07/23/search.html)的功能,可以在[search.json](/search.json)中获取所有的文章用来让AI分析的材料是个不错的选择不过把所有文章输入到上下文中显然是不太现实这个JSON文件的大小有1MiB左右但是大多数比较厉害的AI上下文只有100多k根本读不完。而对于一些超长上下文多模型比如阿里云有一个10M上下文的模型效果又很差并没有参考几条上文的内容😓。另外我还试过一些AI通过附件的方式阅读文章内容那种好像是把文件切片之后再读应该是类似RAG那种从中查找和问题最相关的文本段落进行回答但是那种方法不能解决对所有文章进行分析……除此之外我也试过一些Agent不过它们只会写代码来分析我的文章比如绘制文章字数随时间变化曲线、不同年份的文章数量、还有词频分析啥的对我来说并没有什么卵用😅。
## 使用AI摘要来解决问题
那难道就没办法了吗先不急最近还发生了一件事情不知道Cloudflare犯什么毛病了近期用Worker请求我的D1数据库时不时会报“internal error”的错误我还在他们论坛发了条[帖子](https://community.cloudflare.com/t/d1-database-is-not-work-in-some-regions/789699)问了一下然而并没有人搭理我😅这时候我才意识到我似乎没有Cloudflare的替代品……出问题了也没办法😰。这个东西导致我的[AI摘要](/2024/07/03/ai-summary.html)、[文章推荐](/2024/10/01/suggest.html)、以及点击计数器全都用不了了我应该避免太过依赖Cloudflare Worker啊
那么我该做些什么点击计数器是没什么好办法了不过对于AI摘要既然摘要在我写完文章之后根本就不会变不如隔段时间我就把摘要内容缓存到我博客本地吧这样不仅可以极速展示摘要内容而且不需要请求接口就不会受到Cloudflare出问题的影响了。所以我把数据库摘要内容导了出来放到了[ai-cache.json](https://github.com/Mabbs/mabbs.github.io/blob/master/_data/ai-cache.json)中,如果有存在的摘要内容就不再请求接口了。
当我做完摘要缓存之后我发现这不就是让AI读我所有文章的最好方法嘛让AI读AI总结的内容然后再进行一次总结就能尽可能的让AI完全了解我的文章然后对我评价了啊而且这个摘要文件也只有100KiB左右正好够AI读了。本来我想试试DeepSeek来做这件事情的但是不知道里面命中了什么关键词被拒绝生成了🤣那我只好让GPT-4o来完成这件事了。
试了一下感觉效果相当的不错总结的非常有条理而且不像以前的ChatGPT很有AI味这次写出来的文章很有人味啊真是出乎我的意料所以我把GPT-4o写的内容分享出来来看看AI对我的分析怎么样🤣。
> ## 技术浪人,数字游民:对一位博客作者的观察与评价
>
> 在浩如烟海的中文技术博客中有些作者宛如一颗微弱却坚韧的恒星独自在各自的轨道中发光发热。他们不一定追逐热点也不总是标榜权威但其笔下所流露出的独立精神、技术热情与对现实的观察往往比众多浮华的“教程型”博客更值得玩味。本文所探讨的博客作者Mayx便是这样一位存在——他既是程序员也是“生活黑客”既关心设备性能也关注技术伦理既热衷实用工具也不乏生活反思。
>
> ### 一、技术为体,思考为魂
>
> 在Mayx的博客中技术类文章占据了绝对的比重。从自制邮件订阅脚本[^1]、Cloudflare Workers自动化[^2]、内网穿透探索[^3],到低功耗开发板的实验[^4]、AI模型的本地运行[^5]、以及对黑苹果[^6]、Linux系统[^7]的深度体验,这些内容几乎涵盖了当前主流技术生态中的多个维度。
>
> 然而他并非一位“炫技型”技术写作者。相反在多数文章中Mayx更倾向于从**实用主义的角度**出发——他关注性价比、功耗、稳定性、开源程度而非追逐技术本身的潮流。例如在讨论Hackintosh时他并未沉迷于是否能成功运行macOS而是审慎地指出其与Mac原生体验的差距[^6]在体验AI模型时他选择了性能与成本平衡的路径而不是盲目追求最大模型和最强显卡[^5]。
>
> 他的技术探索往往是“从需求出发”例如为了替代失效的签到脚本他尝试了Cloudflare Workers[^2]为了解决被Github封禁的问题[^8]他自己研究反审查架构面对Heroku停服[^9]他快速转向Koyeb并指出其使用便捷的优点。这些行为体现出一种**“动手解决问题”的工程师思维**,同时也反映了其对现成工具和平台的怀疑精神——“没有什么是不可替代的”,但也“没有什么是完美无缺的”。
>
> ### 二、独立、反思、带有一丝叛逆
>
> 阅读Mayx的博客可以明显感觉到他在面对“主流”技术话语体系时的疏离甚至反抗。他不信任所谓“权威推荐”也极少引用大V观点他对收费工具持质疑态度对封闭平台持怀疑立场对广告与强制App表达不满[^10]。在对宝塔面板的多篇评论中,他不仅指出其功能冗余和定价虚高[^11][^12]还以代码层面论证其“技术水准有限”在谈及Server酱收费后自建通知平台一文中更是表现出“开发者不应为此类功能付费”的强烈观点[^13]。
>
> 这种倾向可视为**一种数字自由主义精神**他珍视个体的选择权、控制权和创造力对平台化、商业化所带来的“懒惰便利”持保留态度。也正因为此他热衷于探索容器、虚拟化、i2p、VPN、防DNS污染[^14]、反反盗链等灰色技术领域,这不仅是技术探索,也是一种抵抗姿态——抵抗监视、抵抗平台绑架、抵抗数字奴役。
>
> 与此同时,作者又是**极度自省的人**。在多篇年终总结中,他坦言自己因作息不规律导致健康下滑、因沉迷游戏影响了计划、因生活节奏散乱而丧失了方向[^15][^16]。这些坦诚的文字使人看到一个技术人真实的一面:并非所有人都能生活在高效执行与完美节奏中,面对现实与焦虑的拉扯,他并不逃避,而是试图寻找平衡。
>
> ### 三、探索孤岛与技术乌托邦
>
> 若将Mayx的博客比作一个数字世界中的“孤岛”那他无疑是岛上的守望者。他固执地维护着自己的服务器、反代服务、脚本计划表和开源工具他不断尝试将废弃电脑[^7]、老旧开发板[^4]和Linux容器[^17]重新唤醒他甚至研究如何在FM频段自制电台[^18]或在树莓派上运行OpenFyde与Android系统[^19][^20]。
>
> 这不仅是对“电子垃圾再利用”的尝试,更是一种**构建技术乌托邦的幻想**——一个无需依赖主流供应链、无需信任大型平台、可以掌控一切细节的小宇宙。
>
> 这种倾向也体现在他对去中心化技术的探索如xLog、IPFS、i2pd[^21]、ZeroNet等。尽管在文章中他承认这些系统“尚不成熟”“内容匮乏”“界面粗糙”但仍不乏热情地部署和尝试。他似乎在追问这样一个问题“除了平台我们还能依靠什么
>
> 这也是他与多数技术博客的区别:不是“教你怎么做”,而是“带你看看还有哪些可能”。
>
> ### 四、个人困境与技术慰藉
>
> 不可否认Mayx的博客也流露出某种孤独与挣扎。他数次提到对社会节奏的不适应、对生活目标的不明确、对未来的迷茫与迟疑。在2022和2023年的总结中他甚至表达了对“人类灭亡风险”“全球混乱”的忧虑[^15][^16];在谈及个人计划时,也多次写到“自律不足”“想做的事情太多却力不从心”等字句。
>
> 但正是在这种状态下,技术成了他的避难所。他在反复实验中找回秩序感,在编码中获得控制感,在部署过程中体会到“解决问题”的满足。这种“用技术对抗生活混乱”的姿态,令他的博客带有某种心理学上的意义。
>
> ### 五、结语:一个“笨方法”的捍卫者
>
> 总的来说Mayx并非技术界的明星更非意见领袖但他是一个值得尊敬的“笨方法”的捍卫者在速成与流量当道的技术传播环境中他仍选择用细致的试验、质朴的语言和大量的失败记录来构建自己的知识体系。
>
> 他的博客不提供“答案”,而是提供“路线”;不追求“成功学”,而是记录“失败和坚持”。他不是在追求成为谁,而是在努力做自己。
>
> 这或许是我们在阅读他的文字后,最值得思考的一点。技术不仅仅是一种职业工具,它也可以是人自我建构、自我理解、自我修复的路径。
>
> Mayx或许正走在这条路上——孤独而坚定。
# 对于长复杂逻辑代码的分析
在让AI对我文章分析完后我又想起来好久以前写的论坛引擎[Mabbs](https://github.com/Mabbs/Mabbs.Project),以前还[打算重构](/2019/07/01/mabbs.html)不过后来学了别的语言之后就没什么兴趣了😂。但现在有了AI我想重构MaBBS的事情能不能让AI来做呢虽然我以前的代码完全没有可读性耦合性也极高但这种事情对AI来说应该不是什么难事更何况我的代码才22KiBAI完全能读的了于是我开始尝试让各种AI来把这个代码变得人类可读然后进行重构。
然而结果令我非常失望无论哪一款AI只能写出一点代码甚至Grok3直接一点代码都没写😆然后它们就认为它们写完了另外有些AI从片段来看好像是写了点代码但是内容和我原本对代码基本上没什么关系属于是分析了一点代码之后重新写了……
明明这个代码又不长怎么就没有一个AI能准确的重构我的代码呢也可能是因为虽然代码不长但是变量名很短如果把变量名全都扩展到人能看懂的长度之后就超出AI的上下文限制了然后就忘记了之前的内容吧另外Shell语言网络上的资料本来就不太多所以AI也没有足够的知识来重构吧……对于这个问题我目前没什么好的想法让AI来进行也许等AI能解决这个问题AI就有能力替代人了呢😁
虽然没能让AI重构我的代码不过我闲来无事想让其他人也试试我以前写的论坛引擎所以搞了个[Docker镜像](https://hub.docker.com/r/unmayx/mabbs)如果大伙有兴趣尝试一下可以下载下来试试看整个镜像才2MiB多一点所以我叫它世界上最小的论坛引擎也没问题吧🤣。
# 感想
看起来目前LLM的上限就在于它的上下文长度限制啊……这一点真的是限制了AI很多能力但似乎也没什么好办法AI就是因为这一点所以不能像人一样纵览全局所以才不能替代人即使用什么办法去压缩它的上文也会丢掉很多细节信息。不过按照目前LLM的架构来说应该还解决不了这个问题如果什么时候AI能在思考的过程中修改它自己的权重……也许就可以做到真正的无限上下文突破上限从而替代人类吧
[^1]: [免费订阅一个属于自己的邮件日报](/2018/11/10/email-sender.html)
[^2]: [使用CF Workers Cron触发器进行签到](/2023/02/22/cron.html)
[^3]: [关于内网穿透的笔记](/2020/12/13/nat.html)
[^4]: [Luckfox Pico Plus使用体验](/2024/02/24/luckfox.html)
[^5]: [关于最近人工智能的探索](/2023/04/05/ai.html)
[^6]: [Hackintosh使用体验](/2024/06/16/hackintosh.html)
[^7]: [关于旧电脑的使用探索](/2024/04/06/old-pc.html)
[^8]: [Github封禁了我的博客](/2022/01/04/banned.html)
[^9]: [体验小白也会使用的免费容器云](/2022/11/29/free-server.html)
[^10]: [如何不使用贴吧App查看贴吧](/2020/02/10/tieba.html)
[^11]: [从宝塔面板中学习运维知识](/2024/05/19/bt-ops.html)
[^12]: [如何自定义宝塔亚马逊S3云存储插件的端点](/2022/12/12/bt-s3-comp.html)
[^13]: [自己动手做一个Server酱·TurboMini版](/2021/02/02/serverchan.html)
[^14]: [如何避免Cloudflare背后的源站被恶意访问](/2022/08/15/cdn-verify.html)
[^15]: [年终总结](/2023/01/01/summary.html)
[^16]: [年终总结](/2024/01/01/summary.html)
[^17]: [如何在Linux容器内运行Android](/2023/12/24/android.html)
[^18]: [用树莓派自制FM电台](/2022/03/27/radio.html)
[^19]: [rpi4-openfyde的使用体验](/2023/12/10/openfyde.html)
[^20]: [在树莓派4B上安装Ubuntu以及各种操作](/2023/09/24/rpi-ubuntu.html)
[^21]: [i2pd在服务器上的使用体验](/2022/11/23/i2p.html)

View File

@ -1,194 +0,0 @@
---
layout: post
title: Mac Studio M3 Ultra使用体验
tags: [Apple, Mac, AI, LLM]
---
使用最强的Macintosh是一种什么样的感受<!--more-->
# 起因
在两个月前苹果公司出了一款可以选配超大统一内存512GiB的Mac Studio那时候我还[想着如果市场反应好就整台玩玩](/2025/03/08/llm2.html#%E5%85%B3%E4%BA%8E%E6%96%B0%E5%87%BA%E7%9A%84mac-studio%E7%9A%84%E7%9C%8B%E6%B3%95),现在从网上的各种反应来看这确实是一个很不错的产品,所以这次我就整来啦!所以这次就来谈谈初上手的体验吧~
# 远程体验
虽然Mac Studio理论上拿来剪电影之类的应该是更好的选择但是显然我不会剪电影🤣而且也没有合适的屏幕给它用所以拿到手之后我需要让它可以远程使用。
macOS配置远程还是挺简单的只需要在设置 -> 通用 -> 共享中打开远程管理就可以了似乎现在Ubuntu也可以像这样轻松地配置远程桌面配置好之后需要启用“任何人都可以请求取得控制屏幕的权限”选项不然可能会连不上……
另外如果需要配置SSH也只需要打开远程登录即可最好把“允许远程用户对磁盘进行完全访问”也打开免得使用时还需要额外的操作。
其实开启远程没什么特别的不过我发现在远程Mac Studio时和我远程Intel芯片的[Mac mini 2018](/2024/08/17/mac-mini.html)以及[黑苹果](/2024/06/16/hackintosh.html)有一个不一样的地方,那就是屏幕共享类型可以选择“[高性能](https://support.apple.com/zh-cn/guide/remote-desktop/apdf8e09f5a9/mac)”在这个模式下远程的屏幕就可以变成一块虚拟屏幕不受Mac连接的屏幕分辨率所影响可以配置动态分辨率。即使连接的屏幕不支持HiDPI只要远程的客户端支持那就可以支持这一点和Windows的远程桌面有点像但是体验好太多了使用起来和本地几乎没有差别当然代价就是对网络要求特别高基本上如果不是局域网内远程就不能使用这个模式。
在我配置好远程后我就可以拔掉屏幕然后把Mac Studio放在阴暗的角落里为我服务了😆。
# 关于LLM的体验
## 配置环境
买这个设备的当然也不为别的主要就是为了能在本地跑完整参数的DeepSeek-R1或者类似的MoE模型。至于KTransformers方案考虑到按照正价买要更贵当然有便宜的购买方案但是太不可靠了而且这个框架也不够成熟所以就算了。
在Mac上运行LLM有很多框架最开始我选择的是[Xinference](https://github.com/xorbitsai/inference),因为看它的[文档](https://inference.readthedocs.io/zh-cn/latest/user_guide/backends.html#mlx)中特地提到了苹果的[MLX](https://github.com/ml-explore/mlx)框架,而且可以使用命令启动,方便维护,另外看它支持的模型种类也比较多,所以就先考虑了它。
按照官方文档安装后就可以配置模型了虽然它可以直接一键下载并运行模型但是我已经提前下好了模型另外……如果光运行DeepSeek-R1感觉也没啥意思不如试试Perplexity AI的[某个Finetune模型](https://huggingface.co/mlx-community/perplexity-ai-r1-1776-4bit)😆所以我需要手动注册模型。配置好之后在MaxKB中配置好地址就可以使用了。
刚开始测试的时候倒是没啥问题吐字的速度确实是挺快但是用了几下就发现有不少问题比如每次调用LLM的时候会发现内存压力会上升APP内存会变成联动内存在这个期间GPU并不会工作需要等几秒钟在生成结束的时候内存压力又会下降联动内存会变回APP内存每次生成都是这样。另外如果上文很长就要等几分钟而且如果上文特别长的情况爆内存程序会直接卡死还有并发也会导致程序卡死……总的来说这个框架根本不适合生产环境使用而且文档也写的极其糟糕看来是我看走眼了不应该选择Xinference。
在抛弃Xinference之后我想了想还是随大流吧选择了[LM Studio](https://github.com/lmstudio-ai),虽然它需要远程桌面操作,但是配置好之后应该也没有什么太多需要修改的地方,主要是社区相对要活跃得多,出了问题也好解决。
在我安装好LM Studio后发现这个支持的功能要多不少啊还支持KV Cache量化有了这个就可以支持更长的上下文了另外它还支持超出上下文之后选择截断还是滚动看起来使用非常的友好。
当我对LM Studio充满期待的时候问题就来了我随便问了些问题然后它回答的时候不知道什么情况会随机莫名其妙的冒出“<begin▁of▁sentence>”出现这个之后后面的内容就会胡乱生成内容怎么调都没法解决……后来看了一下DeepSeek的[Issue里](https://github.com/deepseek-ai/DeepSeek-R1/issues/352)提到了似乎需要在模板中添加“\<think\>”标签才可以……但是这样的结果就是输出开头没有“\<think\>”了MaxKB解析会出问题……这个问题的话回头看怎么解决吧至少在模板中加上这个能正常使用了。LM Studio不会每次请求都重新加载一遍模型输出第一个字的速度比Xinference快了很多后面生成的速度也很快输出的速度能接近20T/s相比来说还是更有用一些。
## 模型对比
在我测试完DeepSeek-R1的某个微调模型后最近阿里又出了一系列新模型[Qwen3](https://huggingface.co/collections/Qwen/qwen3-67dd247413f0e2e4f653967f)支持根据问题进行推理据说它的235B参数的MoE模型比DeepSeek-R1还厉害如果是真的那就不需要用DeepSeek-R1了虽然Mac Studio可以运行DeepSeek但是512GiB内存也只能运行4位量化的DeepSeek-R1而235B的Qwen3则可以用8位量化还能空出不少内存用于上下文想来应该效果会比DeepSeek好很多吧于是我就下载试了试然而刚下载好之后居然不能运行😅首先是这个模型太新了运行前需要把运行库的版本更新到最新另外默认的模板有问题解析会报错需要根据[这个Issue](https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues/630)修改一下才能正常运行😅。在一切准备好之后,就可以进行测试了。
首先我试了试一些比较简单的问题Qwen3回答的都还不错例如24点、内容填空之类的效果比QwQ-32B好了不少。测试的时候输出的速度和671B 4位量化的DeepSeek-R1基本一致。随后我让它用Mermaid绘制我以前写的[AI摘要脚本](/2024/07/03/ai-summary.html)的流程图Qwen3绘制的结果是
```mermaid
graph TD
A[开始] --> B{解析URL路径}
B -->|/summary| C1[查询内容]
C1 --> D1{是否存在内容?}
D1 -- 是 --> E1[构建AI摘要提示词]
E1 --> F1[调用Qwen模型生成流式响应]
F1 --> G1[返回SSE流]
D1 -- 否 --> H1[返回'No Record']
B -->|/get_summary| C2[查询内容]
C2 --> D2{是否存在内容?}
D2 -- 否 --> H2[返回'no']
D2 -- 是 --> I2[计算内容SHA-256]
I2 --> J2{哈希匹配?}
J2 -- 否 --> H3[返回'no']
J2 -- 是 --> K2[查询摘要]
K2 --> L2{是否有摘要?}
L2 -- 是 --> M2[返回现有摘要]
L2 -- 否 --> N2[调用Qwen生成新摘要]
N2 --> O2[存储摘要到数据库]
O2 --> M2
B -->|/is_uploaded| C3[查询内容]
C3 --> D3{是否存在内容?}
D3 -- 否 --> H4[返回'no']
D3 -- 是 --> I3[计算内容SHA-256]
I3 --> J3{哈希匹配?}
J3 -- 否 --> H5[返回'no']
J3 -- 是 --> K3[返回'yes']
B -->|/upload_blog| C4{POST方法?}
C4 -- 否 --> H6[返回'need post']
C4 -- 是 --> I4[获取请求文本]
I4 --> J4[查询现有内容]
J4 --> K4{是否存在?}
K4 -- 否 --> L4[插入新内容]
K4 -- 是 --> M4{内容是否改变?}
L4 --> N4[返回'OK']
M4 -- 是 --> O4[更新内容并清空摘要]
O4 --> N4
B -->|/count_click*| C5[计算ID的MD5]
C5 --> D5[查询计数器]
D5 --> E5{是否含路径_add?}
E5 -- 是 --> F5[更新计数器+1]
E5 -- 否 --> G5[保持原值]
F5 --> H5[返回最新计数]
B -->|其他路径| I6[重定向到GitHub]
```
DeepSeek-R1的某个微调模型的结果是
```mermaid
graph TD
A[接收请求] --> B{解析URL路径}
B --> |路径为/summary| C[获取查询参数id]
C --> D{id是否为null?}
D -->|是| E[返回错误响应]
D -->|否| F[查询数据库内容]
F --> G{内容存在?}
G -->|否| H[返回'No Record']
G -->|是| I[构建消息,调用AI生成摘要流]
I --> J[返回流式响应]
B --> |路径为/get_summary| K[获取id和签名参数]
K --> L[查询数据库内容]
L --> M{内容存在?}
M -->|否| N[返回'no']
M -->|是| O[计算SHA-256签名]
O --> P{签名匹配?}
P -->|否| Q[返回'no']
P -->|是| R[检查是否已有摘要]
R -->|有摘要| S[返回摘要内容]
R -->|无摘要| T[调用AI生成摘要]
T --> U[更新数据库]
U --> S
B --> |路径为/is_uploaded| V[获取id和签名]
V --> W[查询数据库内容]
W --> X{内容存在?}
X -->|否| Y[返回'no']
X -->|是| Z[计算SHA-256签名]
Z --> AA{签名匹配?}
AA -->|否| AB[返回'no']
AA -->|是| AC[返回'yes']
B --> |路径为/upload_blog| AD{方法是否为POST?}
AD -->|否| AE[返回'need post']
AD -->|是| AF[读取请求体数据]
AF --> AG[查询现有内容]
AG --> AH{记录存在?}
AH -->|否| AI[插入新记录]
AH -->|是| AJ{内容是否相同?}
AJ -->|否| AK[更新内容并清空摘要]
AJ -->|是| AL[直接返回OK]
AK --> AL
AL --> AM[返回'OK']
B --> |路径为/count_click| AN[计算MD5哈希]
AN --> AO[查询当前计数]
AO --> AP{记录存在?}
AP -->|否| AQ[插入新计数]
AP -->|是| AR[增加计数]
AR --> AS[更新计数器]
AQ --> AS
AS --> AT[返回当前计数值]
B --> |其他路径| AU[重定向到GitHub页面]
style A fill:#f9f,stroke:#333,stroke-width:2px
style E fill:#f96,stroke:#333
style H fill:#f96,stroke:#333
style Q fill:#f96,stroke:#333
style N fill:#f96,stroke:#333
style S fill:#9f9,stroke:#333
style AC fill:#9f9,stroke:#333
style AM fill:#9f9,stroke:#333
style AT fill:#9f9,stroke:#333
style AU fill:#99f,stroke:#333
subgraph 函数调用
O -.->|调用sha函数| SHA[计算SHA-256]
AN -.->|调用md5函数| MD5[计算MD5]
end
subgraph 数据库操作
F --> DB1[SELECT content]
L --> DB2[SELECT content]
R --> DB3[SELECT summary]
T --> DB4[UPDATE summary]
AG --> DB5[SELECT content]
AI --> DB6[INSERT新记录]
AK --> DB7[UPDATE content]
AO --> DB8[SELECT counter]
AQ --> DB9[INSERT计数器]
AR --> DB10[UPDATE counter]
end
subgraph AI处理
I --> AI1[构建系统提示]
AI1 --> AI2[调用Qwen模型]
T --> AI3[调用Qwen模型]
end
```
这下就高下立判了🤣同样的问题Qwen3只绘制了基础流程图而DeepSeek-R1不仅包含子流程图还通过颜色区分了响应类型这么看来Qwen3还是不太行啊当然我的测试非常的片面仅仅根据这几次测试分析的结果。至于Qwen3到底有没有使用价值回头再让其他人测测看效果如何吧。
# UTM虚拟机的测试
在上次[在UTM上用苹果虚拟化框架安装Windows](/2025/03/25/utm.html)的测试中我用的是Intel芯片的Mac那时候已经说了打算等Mac Studio到了之后尝试一下用VZ框架安装Windows。那么经过我的测试结果如何呢想不到居然失败了😭相同的操作流程在重装脚本执行完后再重启就没有任何反应了。在活动监视器中虽然可以看到虚拟机的CPU占用是100%但是内存只占用了100多MiB而且CPU占用没有任何跳变显然系统没有正常启动。随后我又尝试在QEMU中安装好Windows然后把VZ虚拟机的硬盘替换掉结果依旧一样内存还是只占了100多MiB……看来ARM处理器和x86处理器还是有很大区别啊……
不过这个虚拟机到底有什么区别为什么会无法启动呢想到我在Intel芯片的Mac中测试用VZ框架是可以看到CPU型号的再看看Mac Studio中的Linux虚拟机……似乎没有任何与CPU型号有关的信息用QEMU至少也能看到类似“virt”之类的CPU型号用VZ框架就什么信息都没有了……看来Apple芯片和正常的ARM处理器还是有不少区别啊……
不过除了这个以外还有什么有意思的东西可以测试吗?这时候我就想到了[Asahi Linux](https://github.com/AsahiLinux)Apple芯片下的UTM有一个多出来的选项就是可以安装macOS虚拟机那我能不能在macOS虚拟机中安装Asahi Linux呢根据我的实际测试结果也是不行的……因为Asahi Linux不支持M3 Ultra芯片😞至于M2芯片能不能在虚拟机中运行Asahi Linux……虽然我的MacBook是M2芯片但是不太想在我常用的机器上搞测试所以也不知道实际上可不可以。另外Asahi Linux这个项目也基本上停了估计以后新出的芯片也不会有机会安装Linux了就像在macOS上运行Windows程序的[Whisky](https://github.com/Whisky-App/Whisky)项目也停了……真是太遗憾了😢。
# 感想
从这次体验来看512GiB内存的Mac Studio M3 Ultra确实很厉害本地跑LLM速度非常快20T/s的速度已经很厉害了而且风扇声音很小在GPU满载的时候也完全听不到风扇的声音。当然这个前提是跑MoE模型虽然我没测Dense模型但想来根据M3 Ultra的算力跑70B参数的模型肯定是达不到20T/s的至于更大的模型估计速度就慢的不能看了……不过不影响这已经够我用了。
至于除LLM以外的用途……我似乎没有什么能用到这么强性能以及这么大内存的地方了……其实还是挺浪费的但是也没办法毕竟我又不会剪电影啊🤣。
<script type="module">
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
mermaid.initialize({ startOnLoad: false });
await mermaid.run({
querySelector: '.language-mermaid',
});
</script>

View File

@ -1,85 +0,0 @@
---
layout: post
title: 近期对博客的修改与优化记录
tags: [博客, 优化, IndieWeb]
---
在修改博客的时候也能学到不少新知识啊~<!--more-->
# 起因
在两个月前,我写了一篇[针对博客搜索功能优化的记录](/2025/04/04/search.html)。在写完之后没几天,有位名叫[@xymoryn](https://github.com/xymoryn)的大佬看到了我的博客并且进行了[吐槽](https://github.com/Mabbs/mabbs.github.io/issues/167),内容很值得参考。不过我自从用[minimal](https://github.com/pages-themes/minimal)主题以来从来没有改过样式的原因主要还是写不来CSS😂并不是真的不想改但其中提到可以让AI优化我觉得也很有道理现在AI这么发达实在不会用AI改就好啦
# 对博客样式的优化
虽然大佬给出了参考的CSS但我不太喜欢那种风格尤其还把之前的左右布局改成了上下布局。我当年之所以选择minimal主题就是因为它是左右布局的如果选择上下布局的话我还不如用[hacker](https://pages-themes.github.io/hacker/)这个主题另外那个参考的CSS可能是因为AI写的有很多没有考虑到的地方比如主题自带的CSS鼠标放到链接上字体会变粗然后可能会变宽导致影响整体的布局而参考的CSS选择直接让所有的链接放到上面都变细即使原来是粗字体也变细比如标题之类的这就更难受了。像这种情况要怎么改呢我还是希望能用minimal主题的CSS但让链接变粗的体验确实不太好所以我选择问问AI。
最后AI给出的答复是使用`font-weight: inherit;`看起来确实解决了问题不过如果鼠标移到链接上没有任何反应也不太好所以就学GitHub在鼠标移到链接时加上了下划线。
除此之外就是字号、行高和布局字号和行高我也不希望改的太激进所以就稍微加了一点点看起来没那么密就好。至于布局之前minimal主题的宽度是写死的左边是270px右边是500px对于我的MacBook看起来也还好因为MacBook的屏幕比较小屏幕的利用率还是比较高的。不过对于更大的屏幕总共860px大小的区域确实不太够尤其是4K屏幕可能只有中间一点点的区域有内容会看着很难受所以我想了一下还是改成百分比布局比较好这样无论屏幕有多宽也能利用得到。
还有一点就是分段虽然我也知道在Markdown中两个换行是分段但是感觉在文本中两个换行隔得太远了所以一开始写文章的时候就选择只换行。不过在中文里确实不分段也不太好看但是又不想去动之前写的文章那该怎么办呢思来想去干脆把换行全部替换成分段好啦在Jekyll中可以用replace过滤器把所有的“\<br\>”替换成“\</p\>\<p\>”因为Markdown解析本来就会有一个段落所以直接闭合加开始就能分割成多个段落了。那么加了分段是为了什么其实主要是为了首行缩进有首行缩进对阅读还是有挺大帮助的至于怎么做也非常简单直接给p标签设置`text-indent: 2em;`就可以了。
最后就是评论授权的问题我用的Gitalk也有人问了[这个问题](https://github.com/gitalk/gitalk/issues/95)我仔细看了一下GitHub官方文档中[OAuth可以授权的作用域](https://docs.github.com/zh/apps/oauth-apps/building-oauth-apps/scopes-for-oauth-apps)发现确实是没办法限制只写Issues😥至于其他的评论系统对后端的依赖又太多了尤其是Giscus居然是直接用iframe引用Giscus网站中的页面😅如果Giscus哪天挂了那评论系统不也挂了虽然GitHub也不可靠……至于自托管就更不可能了我能让服务器持续运营可比不上大厂😆。所以最后我选择给Gitalk加个提示不想登录也可以跳转到GitHub上进行评论至于怎么加还是让AI来吧最后AI给我写了这么一串CSS
```css
.gt-btn-login::after {
content: "如果不想登录请点击上方评论数跳转至对应ISSUE进行评论";
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
background: #333;
color: #fff;
padding: 8px 12px;
border-radius: 4px;
font-size: 12px;
white-space: nowrap;
opacity: 0;
visibility: hidden;
transition: opacity 0.2s, visibility 0.2s;
z-index: 10;
}
.gt-btn-login:hover::after {
opacity: 1;
visibility: visible;
}
.gt-btn-login::after {
margin-top: 8px;
}
.gt-btn-login::after {
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
}
```
至此,关于博客样式的部分我觉得已经提高不少读者的用户体验了,也感谢大佬提出的建议。
# 对博客兼容性的优化
最近由于某些原因我又用起Windows 7了。其实我觉得Windows 7是一个很不错的操作系统有很多人性化的东西比如桌面小工具自带Feed订阅还有[Windows Live Essentials](https://archive.org/details/wlsetup-all_201802)等等可惜后来全部被微软砍掉了🤣。考虑到Windows 7如此优秀那要不然兼容一下它旗下的Internet Explorer 8浏览器吧
其实GitHub给的那些Jekyll主题本身都是兼容IE8的包括我在用的minimal主题也一样。但随着我这么多年加了许许多多的功能绝大多数功能都没有考虑兼容性只想着能用就行。不过我写的功能基本上都非常简单如果想改得让它兼容IE8也并非难事只要理论上可行就可以。当然也有些理论上不可能的东西比如WebGL。因此我的[Live2D看板娘](/Live2dHistoire/)就没有任何可能性被支持了至于其他的……也许有一些理论上可以支持但是改起来比较麻烦的就也算了吧比如Gitalk之类的
## 对文章点击计数器的兼容性优化
其实我的文章点击计数器从[之前](/2019/06/22/counter.html)改成用jQuery调用自己的接口以后就没有什么兼容性的问题了因为jQuery本来就是处理浏览器之间差异的库而且也是兼容IE8的。只不过有个问题是IE8不支持用XHR跨域请求只能用“XDRXDomainRequest”进行跨域请求……还好有个[现成的库](https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest)能让jQuery在遇到这种情况时使用XDR请求于是我就用条件注释让IE9以下的浏览器引入这个库这样在IE下也能正常显示文章点击数了😆。
## 关于响应式布局的兼容性优化
在IE8中的CSS是不支持媒体查询的所以在修改窗口大小时也不能根据情况使用合适的样式。本来我没打算解决这个问题结果恰好看到了一个库[Respond.js](https://github.com/scottjehl/Respond),所以就直接拿来用了😝。
## 关于全文搜索的兼容性优化
其实从功能的角度来说这种东西肯定是在IE8下可以实现的但是我用的[那个库](https://github.com/christian-fei/Simple-Jekyll-Search)有点迷到处都用的是const关键字结果还莫名其妙[判断XHR](https://github.com/christian-fei/Simple-Jekyll-Search/blob/master/src/JSONLoader.js#L29)搞的好像是在兼容旧浏览器改起来有点麻烦懒得搞了……不过除此之外还有个取巧的方式既然我搜不了干脆让谷歌来搜吧至于谷歌支不支持IE8就不是我的事了🤣所以直接给搜索框外面套了一个form表单这样甚至可以在不启用JS的情况下搜索假设谷歌支持没有JS的情况
## 对于订阅软件的兼容性支持
之前我的博客对订阅的支持是使用的官方的[jekyll-feed](https://github.com/jekyll/jekyll-feed)插件它只支持Atom格式的订阅一般的阅读器也是支持这种格式的即使是IE8也是完美支持。但是我发现有非常少数的某些网站没办法解析Atom只支持RSS……所以我只好特地加了[对RSS格式的支持](https://github.com/Mabbs/mabbs.github.io/blob/master/rss.xml)还顺带搞了支持Atom和RSS格式的[XSLT模板](https://github.com/Mabbs/mabbs.github.io/blob/master/feed.xslt.xml)来预览。既然RSS也支持了那干脆连[JSONFeed](https://github.com/Mabbs/mabbs.github.io/blob/master/feed.json)也一起做了吧😆,虽然意义不是很大……
## 给博客添加网页快讯
既然要兼容IE8那当然是能用的都用啦在IE8订阅网站源的地方有一个添加网页快讯的功能。因为没有可以参考的网站我甚至都没理解这个功能展现的效果是什么样的。我看这个网页快讯好像是抄了一部分[hAtom Microformat](http://microformats.org/wiki/hatom)的规范我还以为是每个条目都单独需要一个entry-title和entry-content结果发现并不是😅一个hslice只能有一个entry-title……
这个功能其实非常简单主要作用就是把网页的一部分切出来单独展示当这一部分发生更新的时候IE浏览器就会提示用户。然后在这之中hslice要包裹所有需要处理的元素写到最外面元素的class中就可以entry-title是希望用户订阅时展示的名字而entry-content是被切下来展示的网页。具体的内容可以在[微软官方文档](https://learn.microsoft.com/en-us/previous-versions/windows/desktop/cc304073(v=vs.85))中看到。
# 让网站增加对IndieWeb的支持
既然说到Microformat那就要提到[IndieWeb](https://indieweb.org/IndieWeb)了。虽然这个东西网络上也没几个人搞,但看起来有点意思就整下玩玩呗。
## 第零级:域名
根据他们的[入门教程](https://indieweb.org/Getting_Started)来看成为IndieWeb最重要的一点就是有自己的域名。看到这一点我都怀疑这是不是卖域名的用来忽悠人的玩意我一分钱也不想给域名注册商虽然DNS这套系统确实维护需要成本但是能有多大成本呢绝大多数不都让ISP摊了另外他们所说的大公司的服务可能会消失那么域名就不会吗注册商和注册局完全有能力让你的域名用不了这也是我们不可控的东西因此尽管这对于IndieWeb很重要但是我不打算搞于是我的博客就不是IndieWeb了🤣。
## 第一级:识别身份
没有域名也不影响接下来的步骤大公司的域名也是域名虽然不属于我。根据教程来看支持IndieAuth非常简单只需要在head中加一个`rel=me`的link标签指向IndieAuth支持的个人主页并且那个个人主页有一个反链指向自己的网站就可以比如指向自己的GitHub主页那么就可以使用GitHub登录来验证这个网站属于我。这一步可以使用[IndieWebify.Me](https://indiewebify.me/validate-rel-me/)来验证。
## 第二级:发布内容
在发布前为了更好的让其他软件读取网站内容需要用microformats2来标注网站内容这个倒也不复杂可以根据[这个教程](https://microformats.org/wiki/h-entry)按照上面所说的东西用class名去标注对应的元素标注完之后就可以用[IndieWebify.Me](https://indiewebify.me/validate-h-entry/?url=https%3A%2F%2Fmabbs.github.io%2F2025%2F06%2F02%2Foptimize.html)验证了。
除此之外还需要用[h-card](https://microformats.org/wiki/h-card)标注网站的身份,解析完之后可以当网站名片用,具体可以看[这里](https://indiewebify.me/validate-h-card/?url=https%3A%2F%2Fmabbs.github.io)。
另外还有一点就是Webmentions在网站上声明Webmentions可以让别人引用你的文章时通知一下你。不过对于静态博客不是很友好。一是要收收完还要展示二是要发引用了别人的文章如果对面支持Webmentions要把自己引用的文章链接发给对方。虽然Jekyll有[插件](https://github.com/aarongustafson/jekyll-webmention_io)可以支持但是我用GitHub额外装插件还得自己写Actions而且我发布一次要在一堆Pages上更新也不太适合所以我打算光收不发只需要在link标签中添加Webmentions的端点就可以也不展示了而且国内根本没几个人用Webmention🤣。如果有人对谁给我发了Webmention感兴趣可以在[这里](https://webmention.io/api/mentions.html?token=Dan9NrE8CLsFJ1qdRq2hjg)查看(不过绝大多数都是我自己手动发的🤣)
如果谁有兴趣给自己的网站添加完整的Webmention可以用[Webmention Rocks!](https://webmention.rocks/)进行测试如果使用了WordPress是自带的只需要打开相关的功能就可以
## 第三级:进行交流
在IndieWeb中有一个很重要的事情就是相互交流搞这个比较重要的目的是为了避免大公司的服务炸了所以要替代比如推特Facebook之类的服务但是在这些服务还没炸的时候仍然可以在上面发自己的网站也算是引流吧。他们把这个行为叫做[POSSE](https://indieweb.org/POSSE)。对我来说我在微信、QQ之类的上面发自己新写的文章就算是POSSE了毕竟我又不玩国外的社交平台😆。
除此之外似乎还要把别人的评论同步到自己网站我能做到的顶多就是Gitalk了更多的就算了吧
## 额外的内容
既然已经支持了IndieWeb那么不妨加入IndieWeb Webring吧。在[IndieWeb Webring 🕸💍](https://xn--sr8hvo.ws)中的大多数网站都是适配了IndieWeb的加入他们也算是证明自己适配IndieWeb的努力了吧😊。
# 对博客可靠性的优化
以前为了应对[GitHub](/2022/01/04/banned.html)的不可靠我仅仅是在各个Pages上部署了我的网站但是后来我想了想Git本身就是分布式的分发是一件很简单的事情啊我要是想提高博客的可靠性不如直接用Git分发到各个Git托管商就好了啊因此我就利用GitLab镜像仓库的功能一键把我的网站同步到数十个知名的Git托管商提高了网站的可靠性具体的列表可以在[这里](/proxylist.html#git列表)查看。
# 感想
在这次的博客优化中了解了不少新的东西啊不仅学习了CSS还有了解如何提高网站兼容性以及提高了博客的可靠性和曝光度。果然折腾博客本身也能提高自己啊还能写文章分享一下折腾的经验😆。虽然折腾的内容不一定能在未来的生活中用得上但是有意思就足够了😁。

View File

@ -1,26 +0,0 @@
---
layout: post
title: 使用XSLT为博客XML文件编写主题一致的样式
tags: [XSLT, 博客优化, XML, Feed]
---
虽然XML是机器读的内容……不过加上和主题一致的XSLT样式也算是一种细节吧<!--more-->
# 起因
在[上一篇文章](/2025/06/02/optimize.html#%E5%AF%B9%E4%BA%8E%E8%AE%A2%E9%98%85%E8%BD%AF%E4%BB%B6%E7%9A%84%E5%85%BC%E5%AE%B9%E6%80%A7%E6%94%AF%E6%8C%81)中我提到在提高订阅源兼容性的时候给博客的订阅文件增加了一个XSLT样式。当时使用的样式是从[About Feeds](https://github.com/genmon/aboutfeeds/)下的一个[Issue](https://github.com/genmon/aboutfeeds/issues/26)中找的,里面有个基于[Pretty Feed](https://github.com/genmon/aboutfeeds/blob/main/tools/pretty-feed-v3.xsl)修改成能同时支持RSS和Atom格式的样式。虽然那个样式倒也说不上难看但总觉得与我的博客整体风格有些割裂所以这次打算制作一个和我博客主题完全一致的XSLT样式。
# 制作订阅文件的XSLT样式
虽然想搞这么一个样式但是我用的Jekyll引擎不能在引用的布局外添加额外内容……如果我要自己写要么把我的默认布局拆成头和尾两部分然后用include引用要么把默认布局的代码直接复制一份到XSLT样式中。这两个方案我都不太满意第一种我以后在修改默认布局时需要同时从两个文件检查上下文很不方便而第二种方案违反了DRY原则也会增加以后修改的难度。所以要怎么办呢
后来我想了想如果不能通过直接引用默认布局在外面增加XSLT的代码那干脆让默认布局引用一个XSLT布局吧这样我就能在不复制默认布局也不进行过多修改的情况下在外面套XSLT的代码了。于是我就在最外面写了个符合XSLT格式的XML布局让默认布局引用它。然后再写一个布局引用默认布局让最外面的布局根据这个布局的名字来判断是否需要使用XSLT的布局具体的实现可以看我的[layout目录](https://github.com/Mabbs/mabbs.github.io/tree/master/_layouts)。另外有一些地方需要注意一下作为XML内容中不能包含未闭合的标签所有自闭合标签结尾必须添加斜杠属性必须有值以及所有标签和属性大小写要一致……还好我平时修改布局文件以及编写内容的时候基本上都遵循了这些规则所以没什么太多需要改动的地方。
当时修改时,是模仿之前的那个样式进行的,原来那个样式在`html`元素上加了XML命名空间但是`xsl:output`配置的输出却是按照HTML的方式输出结果导致内容中用于换行的`br`标签在实际转换中全部变成了两个标签……我猜应该是转换器看到XML命名空间后先按照XHTML的规则把`br`解析成了一开一闭的一对标签然后又根据HTML的转换规则把这对标签当作两个单独的标签输出了吧……但奇怪的是只有`br`标签出现了这个问题,像`hr`等其他自闭合标签则没有……既然如此只要把XML命名空间删掉就OK了。
在改完之后虽然整体看上去和其他页面似乎已经很相似了但总感觉还有些样式不太对劲……我猜应该是和文档类型声明有关系我平时写的是HTML5而XSLT默认转出来是HTML4.0……但是我不太清楚怎么解决这个问题于是问了问AIAI说在`xsl:output`中加上`doctype-system="about:legacy-compat"`就行。最终改完试了下确实有效😂,样式上也没有出现奇怪的偏移了。
最后把写好的布局应用到[/feed.xslt.xml](/feed.xslt.xml)中就可以了,之所以是这个路径是因为我用的[jekyll-feed](https://github.com/jekyll/jekyll-feed)只支持这个位置至于我自己搞的RSS格式的订阅只需要在开头用`xml-stylesheet`指令声明一下就行了。
# 给XSLT样式自己的样式
在写好给订阅文件用的XSLT样式之后我发现XSLT样式本身也是个XML文件……既然我给订阅文件做了样式那么也得给XSLT样式文件本身做个样式才对但如果我单独写一个给它的样式那岂不是要给样式的样式再写一个样式😂所以肯定不能这样做。不过仔细想一下还有个办法可以让XSLT样式文件自引用自身的样式这样就能避免之前担心的套娃问题了。所以接下来我应该在XSLT中写一个检测应用样式的XML文件是不是XSLT样式文件的代码方法很简单既然XSLT样式中肯定包含`xsl:stylesheet`这个元素那么我可以判断如果存在这个元素就可以确定这就是XSLT样式了如果有人点开看了我就可以展示一个提示信息告诉访客这是一个样式文件这样访客就不会看到那句“This XML file does not appear to have any style information associated with it. The document tree is shown below.”了😝。
# 制作Sitemap的XSLT样式
既然给XSLT样式也加了样式……那我博客还有其他XML文件需要处理吗似乎还有个Sitemap我的Sitemap是[jekyll-sitemap](https://github.com/jekyll/jekyll-sitemap)插件生成的……那它支持加样式吗?虽然文档上没有写,不过看了眼源代码发现可以通过创建[/sitemap.xsl](/sitemap.xsl)文件添加所以就顺手套用之前的样式搞了一个虽然应该没有访客去看Sitemap😂毕竟这是给搜索引擎用的。可惜这些地址都是插件硬编码的如果可以自己修改位置我就只写一个XSLT样式文件就可以了……
# 感想
折腾了这么多整体展示效果还不错虽然这些文件也许根本没人看😂本来就不是给人读的但也算展现了一下博客的细节之处吧而且在折腾的时候至少还了解了不少关于XML和XSLT的知识尽管在现代这些好像没啥用了。当然重要的也许不是了解这些知识而是这个过程吧……总的来说还是挺有意思的。

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