mirror of
https://github.com/Mabbs/mabbs.github.io
synced 2026-02-09 10:26:42 +08:00
Compare commits
6 Commits
da73615b73
...
AR-Backup-
| Author | SHA1 | Date | |
|---|---|---|---|
| 172882a99e | |||
| d69f175fee | |||
| 9760f9eb4d | |||
| 1553183d31 | |||
| 0ad9008f3e | |||
| 03a2f1fdf9 |
@ -171,5 +171,7 @@
|
||||
"/2025/08/10/tilde.html": "这篇文章介绍了作者在Tilde社区的体验,这是一类基于类Unix环境的公共服务器社区,类似于家目录,提供预装的软件、开发环境和公共服务,如聊天室、邮件、BBS论坛等,强调了社区的互动性和共享精神。作者通过申请、审核过程加入了几个社区,并详细描述了在这些社区中的个人主页、编程支持(如Gemini和Gopher协议)、博客发布、代码托管(Git支持)、CI/CD部署以及使用Git hooks自动化博客更新等功能。尽管作者受限于语言和工具使用体验,未能充分参与社区交流,但对社区学习新知识和丰富博客内容印象深刻。",
|
||||
"/2025/09/01/quine.html": "这篇文章主要介绍了作者在博客部署过程中,对ZIP Quine(自包含压缩包)和自产生程序的探索过程。作者起初想利用压缩包实现离线浏览,但遇到了压缩包不包含自身的问题。随后,作者回顾了ZIP Quine的原理,如droste.zip,以及如何通过DEFLATE压缩算法的LZ77编码实现自包含。作者尝试了Russ Cox的方案,但发现由于压缩格式限制,实际操作中存在数据容量的限制,无法存下整个博客。尽管如此,作者还是研究了嵌套循环的ZIP Quine,如Ruben Van Mello的论文中所描述的,尽管空间仍然有限。探索过程中,作者还学习了自产生程序(Quine)的概念,包括其实现原理和各种编程语言中的例子。作者最后感慨,探索过程中的收获比原本的目标更重要。",
|
||||
"/2025/10/12/recover.html": "这篇文章讲述了作者通过GitHub的Fork特性找回一个被删除的Brainfuck可视化演示仓库的经历。由于原仓库和作者主页都已消失,作者推测GitHub在Fork时会共享对象库,只要有任意一个Fork仓库存在,GitHub就会保留所有对象,从而可以通过找到一个Fork仓库的最新提交Hash值来还原目标仓库。作者通过Linux内核仓库的Fork进行验证,随后在互联网档案馆上找到目标仓库的Fork以及其Hash值,最终通过Git命令将本地仓库的HEAD指针指向目标提交,成功恢复了该仓库的代码,并将其部署到自己的GitHub Pages上。最后,作者发现Software Heritage组织会保存所有代码,因此在遇到类似情况时可以直接通过该平台进行查找。",
|
||||
"/2025/11/01/mirrors.html": "这篇文章讲述了作者为了提高博客的可靠性,探索利用被滥用的Git平台进行博客镜像的想法和实践。作者发现一些Git实例存在大量空仓库和异常用户,怀疑是SEO公司滥用,因此决定利用这些平台进行博客镜像备份,以应对平台倒闭或数据丢失的风险。作者选择Gitea和Forgejo平台作为目标,编写脚本自动注册账号并导入博客仓库,实现了自动化镜像分发。作者也意识到此类平台的稳定性存在不确定性,并思考了“量”和“质”两种方式确保博客永恒性的优劣,最终认为建立一个活跃的、自动执行维护操作的网络可能更有效。文章最后展示了作者创建的Git镜像列表,并表达了对博客永恒性的思考。"
|
||||
"/2025/11/01/mirrors.html": "这篇文章讲述了作者为了提高博客的可靠性,探索利用被滥用的Git平台进行博客镜像的想法和实践。作者发现一些Git实例存在大量空仓库和异常用户,怀疑是SEO公司滥用,因此决定利用这些平台进行博客镜像备份,以应对平台倒闭或数据丢失的风险。作者选择Gitea和Forgejo平台作为目标,编写脚本自动注册账号并导入博客仓库,实现了自动化镜像分发。作者也意识到此类平台的稳定性存在不确定性,并思考了“量”和“质”两种方式确保博客永恒性的优劣,最终认为建立一个活跃的、自动执行维护操作的网络可能更有效。文章最后展示了作者创建的Git镜像列表,并表达了对博客永恒性的思考。",
|
||||
"/2025/12/01/linux.html": "这篇文章介绍了在浏览器中运行Linux的各种方法,从最初的纯JS虚拟机JSLinux,到后来的WASM虚拟机如v86、WebVM、WebCM,再到容器化方案container2wasm,以及直接将Linux内核编译为WASM的方案。作者详细对比了这些方案的优缺点,包括性能、兼容性、功能和开发难度。文章还提到了模仿Linux环境的WebContainers和JupyterLite,并最终认为虚拟机方案更靠谱,但对WASM的未来充满期待。作者最后表示,博客上添加类似功能的计划还在考虑中,目前主要分享了各种方法的探索过程。",
|
||||
"/2026/01/01/summary.html": "这篇文章介绍了作者对2025年的年终总结,主要表达了对自身状态的担忧和对未来的不确定感。作者认为自己在记忆和思考能力方面有所下滑,稳定性较低,且未能抓住资产保值的机会。同时,文章也记录了AI技术的飞速发展,以及自己博客内容与时代脱节的现象。尽管对未来感到迷茫,作者仍然抱有一丝希望,期望在2026年做出正确的选择,避免陷入危险。"
|
||||
}
|
||||
@ -18,6 +18,6 @@ Vullfin的博客,https://blog.vull.top/,https://blog.vull.top/atom.xml,Vullfin's
|
||||
Lanke's blog,https://blog.blueke.top/,https://blog.blueke.top/rss.xml,请为一切不真实之物骄傲,因为我们高于这个世界!
|
||||
时光流·言,https://www.hansjack.com/,https://www.hansjack.com/feed/,个人博客,持续分享网站部署实战经验、精选书评解读和生活观察手记。 这里提供可复用的技术教程、深度阅读指南和真实生活洞察,与技术爱好者一起进步......
|
||||
Pinpe 的云端,https://pinpe.top/,https://pinpe.top/rss.xml,一个属于自己的云朵。
|
||||
Chise Hachiroku,https://chise.hachiroku.com/,https://chise.hachiroku.com/zh/feed/,向明日的辉迹,干杯!
|
||||
Chise Hachiroku,https://chise.hachiroku.com/zh/,https://chise.hachiroku.com/zh/feed/,向明日的辉迹,干杯!
|
||||
映屿,https://www.glowisle.me/,https://www.glowisle.me/atom.xml,关于互联网、书籍、生活琐事以及那些一闪而过的念头
|
||||
东东,https://nihaha.com/,https://nihaha.com/feed/,城市与信仰
|
||||
Restent's Notebook,https://blog.gxres.net/,https://blog.gxres.net/atom.xml,不前沿技术分享
|
||||
|
||||
|
@ -3,260 +3,136 @@ http://gdatura24gtdy23lxd7ht3xzx6mi7mdlkabpvuefhrjn4t5jduviw5ad.onion/Mayx/mayx
|
||||
http://git.dkforestseeaaq2dqz2uflmlsybvnq2irzn4ygyvu53oazyorednviid.onion/mayx/blog
|
||||
http://giteabolfdejtdzblkooalqei6jr67imiugmhtsh6ocw4hlj5a4q.b32.i2p/mayx/blog
|
||||
https://gitlab.lain.la/mayx/mayx.pages.lain.la
|
||||
https://gitea.moe/Mayx/mayx
|
||||
https://tvoygit.ru/Mayx/mayx
|
||||
https://git.envs.net/Mayx/mayx
|
||||
https://tildegit.org/Mayx/mayx
|
||||
https://git.pixie.town/mayx/mayx
|
||||
https://cgit.tilde.town/~mayx/blog
|
||||
https://gitlab.haskell.org/mayx/mayx
|
||||
https://pagure.io/fork/mabbs/Blog
|
||||
https://repo2.serv00.com/git/pub/Mayx/mayx/
|
||||
https://git.hana.im/mayx/blog
|
||||
https://git.tea-assets.com/mayx/blog
|
||||
https://repo.komhumana.org/mayx/blog
|
||||
https://git.minetest.land/Mayx/blog
|
||||
http://ucarmesin.de:3000/mayx/blog
|
||||
http://101.34.211.172:3000/mayx/blog
|
||||
https://gitea.johannes-hegele.de/mayx/blog
|
||||
https://git.paulcolfer.ie/mayx/blog
|
||||
https://git.octava.cool/mayx/blog
|
||||
http://101.132.73.14:3000/mayx/blog
|
||||
http://117.72.78.89:3000/mayx/blog
|
||||
https://gitea.stormyhome.net/mayx/blog
|
||||
http://www.litehome.top/mayx/blog
|
||||
http://47.120.60.153:10880/mayx/blog
|
||||
http://zfselect.cn:3000/mayx/blog
|
||||
http://61.139.16.27:26684/mayx/blog
|
||||
https://git.dpark.io/mayx/blog
|
||||
http://116.62.245.34:3000/mayx/blog
|
||||
https://git.johann-brauer.de/mayx/blog
|
||||
https://git.shaunmcpeck.com/mayx/blog
|
||||
http://1.6.141.109:3000/mayx/blog
|
||||
http://52.28.156.42/mayx/blog
|
||||
http://164.92.160.200:3000/mayx/blog
|
||||
https://git.louhau.edu.mo/mayx/blog
|
||||
https://git.tux.pizza/mayx/blog
|
||||
https://code.dsconce.space/mayx/blog
|
||||
https://git.anibilag.ru/mayx/blog
|
||||
https://git.lolpro11.me/mayx/blog
|
||||
https://git.empirica.pro/mayx/blog
|
||||
http://47.115.203.168:3000/mayx/blog
|
||||
http://www.gitea.zhangc.top:3000/mayx/blog
|
||||
https://git.chistyakov-it.ru/mayx/blog
|
||||
https://git.emanuelemiani.it/mayx/blog
|
||||
https://git.dehemi.com/mayx/blog
|
||||
https://git.traband.ovh/mayx/blog
|
||||
https://git.ngcr.de/mayx/blog
|
||||
http://101.66.229.132:61088/mayx/blog
|
||||
http://118.26.39.39:3000/mayx/blog
|
||||
http://150.109.95.245/mayx/blog
|
||||
https://git.pcgf.io/mayx/blog
|
||||
https://nucleation.fusion.bref.cool/mayx/blog
|
||||
https://gitea.l2reworld.com/mayx/blog
|
||||
https://git.bp-web.app/mayx/blog
|
||||
http://47.103.91.160:50903/mayx/blog
|
||||
https://mygit.iexercice.com/mayx/blog
|
||||
http://162.215.134.149:4000/mayx/blog
|
||||
http://durfee.mycrestron.com:3000/mayx/blog
|
||||
https://git.expiera.com/mayx/blog
|
||||
https://gitea.nongnghiepso.com/mayx/blog
|
||||
https://codes.tools.asitavsen.com/mayx/blog
|
||||
https://git.siin.space/mayx/blog
|
||||
http://122.116.190.233:3001/mayx/blog
|
||||
http://101.200.127.15:3000/mayx/blog
|
||||
http://50.19.111.193:3000/mayx/blog
|
||||
https://git-test.zcy.dev/mayx/blog
|
||||
https://git.nothamor.com/mayx/blog
|
||||
https://git.terrainknowledge.com/mayx/blog
|
||||
https://gitea.pickalurv.com/mayx/blog
|
||||
http://183.239.197.12:10803/mayx/blog
|
||||
https://git.zeroplay.io/mayx/blog
|
||||
https://git.successkaoyan.com/mayx/blog
|
||||
https://gitea.bitshift.us/mayx/blog
|
||||
http://114.55.134.197:3000/mayx/blog
|
||||
http://139.129.25.251:3000/mayx/blog
|
||||
http://45.33.87.87/mayx/blog
|
||||
http://162.19.95.94:3000/mayx/blog
|
||||
https://git.rankenste.in/mayx/blog
|
||||
https://git.ghostpacket.org/mayx/blog
|
||||
https://git.catswords.net/mayx/blog
|
||||
http://168.126.28.36:3000/mayx/blog
|
||||
https://git.cloud.leonclassroom.com/mayx/blog
|
||||
http://120.25.239.206:20080/mayx/blog
|
||||
https://registry.gametuoitho.vn/mayx/blog
|
||||
http://8.137.103.221:3000/mayx/blog
|
||||
http://120.79.27.232:3000/mayx/blog
|
||||
http://wangbeibei.xyz:6002/mayx/blog
|
||||
http://43.224.227.219:3000/mayx/blog
|
||||
https://git.duplanet.ovh/mayx/blog
|
||||
http://Shiningon.top/mayx/blog
|
||||
http://wsygitea.top/mayx/blog
|
||||
https://git.yardtech.ru/mayx/blog
|
||||
http://69.62.77.234:8888/mayx/blog
|
||||
https://gitea.bake.systems/mayx/blog
|
||||
http://8.134.15.96:3000/mayx/blog
|
||||
http://112.219.147.186:7000/mayx/blog
|
||||
http://47.119.38.109:3000/mayx/blog
|
||||
https://mysite.myvnc.com:3000/mayx/blog
|
||||
http://8.134.32.42:3000/mayx/blog
|
||||
https://git.rootfinlay.co.uk/mayx/blog
|
||||
https://repo.beithing.com/mayx/blog
|
||||
https://git.tinker.infamous.games/mayx/blog
|
||||
https://git.yi-guanjia.com/mayx/blog
|
||||
http://106.14.174.241:3000/mayx/blog
|
||||
https://git.datdanguy.com/mayx/blog
|
||||
http://rack1.raincs.cc:20253/mayx/blog
|
||||
https://git.repo.in.net/mayx/blog
|
||||
http://47.113.231.74:3000/mayx/blog
|
||||
https://gitea.belanjaparts.com/mayx/blog
|
||||
http://185.208.225.190:3000/mayx/blog
|
||||
https://git.sudo-fhir.au/mayx/blog
|
||||
https://git.warzin.com/mayx/blog
|
||||
https://git.burning.cloud/mayx/blog
|
||||
https://git.ihackfx.ru/mayx/blog
|
||||
https://gitea.sguba.de/mayx/blog
|
||||
https://git.flywithu.com/mayx/blog
|
||||
https://git.purplepanda.cc/mayx/blog
|
||||
https://gitea.freeyoursystem.de/mayx/blog
|
||||
https://git.moguyn.cn/mayx/blog
|
||||
https://git.zhanzhi.life/mayx/blog
|
||||
http://121.36.255.50:3000/mayx/blog
|
||||
https://apoloz-git.md-desk.ru/mayx/blog
|
||||
http://116.204.34.35:12000/mayx/blog
|
||||
https://git.echaeplay.com/mayx/blog
|
||||
https://git.bethelean.kr/mayx/blog
|
||||
https://git.barsisr.fr/mayx/blog
|
||||
http://45.192.105.100:3000/mayx/blog
|
||||
http://47.112.175.39:3000/mayx/blog
|
||||
https://www.improve-git.xyz/mayx/blog
|
||||
https://git.Apture.io/mayx/blog
|
||||
https://git.dbfmp.cn/mayx/blog
|
||||
http://103.231.8.120/mayx/blog
|
||||
https://gitea.jasonstolle.com/mayx/blog
|
||||
http://8.134.61.107:3000/mayx/blog
|
||||
http://47.107.88.161:3000/mayx/blog
|
||||
http://git.open-dev.ru/mayx/blog
|
||||
https://git.votava.org/mayx/blog
|
||||
http://8.137.12.29:3000/mayx/blog
|
||||
https://gitea.irons.nz/mayx/blog
|
||||
https://gitea.madf12.com/mayx/blog
|
||||
http://8.134.104.234:3000/mayx/blog
|
||||
http://git.ugohous.com/mayx/blog
|
||||
https://git.vce.de/mayx/blog
|
||||
https://gitea.carmon.co.kr/mayx/blog
|
||||
http://142.171.47.170:3000/mayx/blog
|
||||
https://git.werkraum-karlsruhe.org/mayx/blog
|
||||
http://111.231.146.230:8418/mayx/blog
|
||||
https://git.winscloud.net/mayx/blog
|
||||
https://git.pwaapp.cc/mayx/blog
|
||||
http://188.245.99.186:3000/mayx/blog
|
||||
http://119.28.73.80:5000/mayx/blog
|
||||
http://194.60.231.252:3000/mayx/blog
|
||||
https://git.sleepingforest.co.uk/mayx/blog
|
||||
https://gitea.wangyige.cn/mayx/blog
|
||||
http://47.103.223.114:8081/mayx/blog
|
||||
https://git.xdsite.fun/mayx/blog
|
||||
https://git.brb.homeip.net/mayx/blog
|
||||
https://an360.top/mayx/blog
|
||||
https://gitea.chenxu2233.com/mayx/blog
|
||||
http://106.15.78.64:3000/mayx/blog
|
||||
http://hoenking.cn:3000/mayx/blog
|
||||
https://GIT.Agri-Sys.com/mayx/blog
|
||||
https://gitea.anessen.xyz/mayx/blog
|
||||
https://sengit.us/mayx/blog
|
||||
https://git.cjcrace.io/mayx/blog
|
||||
https://git.yinbonet.cn/mayx/blog
|
||||
https://git.inkcore.cn/mayx/blog
|
||||
http://47.98.129.193:3000/mayx/blog
|
||||
http://8.138.91.73:3000/mayx/blog
|
||||
https://git.wisder.net/mayx/blog
|
||||
http://8.138.187.97:3000/mayx/blog
|
||||
https://git2.ujin.tech/mayx/blog
|
||||
http://git.joypetsisland.com/mayx/blog
|
||||
http://111.119.244.185:3000/mayx/blog
|
||||
http://110.41.179.36:13000/mayx/blog
|
||||
https://git.chrisbeckstrom.com/mayx/blog
|
||||
https://dev.zaphar.net/mayx/blog
|
||||
https://git.moonwoou.com/mayx/blog
|
||||
https://git.tomlab.dev/mayx/blog
|
||||
http://182.92.109.202:8070/mayx/blog
|
||||
https://helx-artifacts-git.apps.renci.org/mayx/blog
|
||||
https://gogs.soyootech.com/mayx/blog
|
||||
http://94.130.182.154:3000/mayx/blog
|
||||
https://git.unicom.studio/mayx/blog
|
||||
https://Gitea.Sephalon.net/mayx/blog
|
||||
https://git.gestio365.com/mayx/blog
|
||||
http://47.122.132.187:3000/mayx/blog
|
||||
https://git.k-corporation.org/mayx/blog
|
||||
https://git.myinternet.services/mayx/blog
|
||||
http://43.138.173.153:8804/mayx/blog
|
||||
http://frktedu.ru:3000/mayx/blog
|
||||
https://git.bloade.com/mayx/blog
|
||||
https://git.lokalix.de/mayx/blog
|
||||
http://8.141.14.13:3000/mayx/blog
|
||||
http://47.94.103.75:3000/mayx/blog
|
||||
http://gitea.danongshu.cn/mayx/blog
|
||||
https://git.palagov.tv/mayx/blog
|
||||
http://139.196.201.231:3000/mayx/blog
|
||||
http://8.155.23.172:3000/mayx/blog
|
||||
https://git.influxfin.com/mayx/blog
|
||||
http://47.100.177.77:3000/mayx/blog
|
||||
https://git.programar.io/mayx/blog
|
||||
http://219.157.255.213:25311/mayx/blog
|
||||
https://git.melvincarvalho.com/mayx/blog
|
||||
https://gitea.aerwen.net/mayx/blog
|
||||
http://8.155.14.189:3000/mayx/blog
|
||||
https://git.vekus.ru/mayx/blog
|
||||
https://gitea.svc.obaa.cloud/mayx/blog
|
||||
https://git.infortek.tech/mayx/blog
|
||||
http://8.134.64.84:3000/mayx/blog
|
||||
http://test-www.writebug.com:3000/mayx/blog
|
||||
https://gitea.blubeacon.com/mayx/blog
|
||||
http://116.204.75.78:6180/mayx/blog
|
||||
https://git.powerdata.dk/mayx/blog
|
||||
https://git.ods-company.ru/mayx/blog
|
||||
http://109.228.48.121:8000/mayx/blog
|
||||
https://git.u2.nu/mayx/blog
|
||||
https://bk-house.synology.me:3081/mayx/blog
|
||||
http://123.57.95.66:9000/mayx/blog
|
||||
http://git.yjmt191314.com/mayx/blog
|
||||
https://git.sparrowcomm.com/mayx/blog
|
||||
https://gitea.timurcelik.de/mayx/blog
|
||||
http://www.rubikscomplex.com:3000/mayx/blog
|
||||
https://git.hubhoo.com/mayx/blog
|
||||
https://git.ultra.pub/mayx/blog
|
||||
https://git.cloud13.de/mayx/blog
|
||||
https://gitea.visoftware.com.co/mayx/blog
|
||||
http://121.199.172.238:3000/mayx/blog
|
||||
http://27.124.12.222:3000/mayx/blog
|
||||
https://saga.iao.ru:3043/mayx/blog
|
||||
https://git.sayndone.ru/mayx/blog
|
||||
http://47.113.118.108:3000/mayx/blog
|
||||
https://gitea.hintsight.com/mayx/blog
|
||||
https://anzsco.co.nz/mayx/blog
|
||||
https://git.valami.giize.com/mayx/blog
|
||||
https://git.simbarbet.com/mayx/blog
|
||||
http://47.109.132.168:3000/mayx/blog
|
||||
https://git.saintdoggie.org/mayx/blog
|
||||
http://blackobelisk.xyz:3000/mayx/blog
|
||||
https://git.dushes.keenetic.pro/mayx/blog
|
||||
https://git.go-chat.ru/mayx/blog
|
||||
http://47.129.22.53:22345/mayx/blog
|
||||
https://git.tech.troyrc.com/mayx/blog
|
||||
http://git.zkyspace.top/mayx/blog
|
||||
http://47.107.62.152:3000/mayx/blog
|
||||
http://47.99.119.173:13000/mayx/blog
|
||||
https://git.outsidecontext.solutions/mayx/blog
|
||||
http://8.210.112.49:8860/mayx/blog
|
||||
http://149.88.87.128:3000/mayx/blog
|
||||
http://124.70.167.140:3000/mayx/blog
|
||||
http://8.137.38.60:8201/mayx/blog
|
||||
https://git.emoscape.org/mayx/blog
|
||||
http://112.74.106.216:3000/mayx/blog
|
||||
http://77.223.118.106:8081/mayx/blog
|
||||
https://git.the-kn.com/mayx/blog
|
||||
https://git.campfiregg.ru/mayx/blog
|
||||
https://gitea.net50.ne.jp/mayx/blog
|
||||
https://git.ism-dev.net/mayx/blog
|
||||
http://sinzero.xyz:3000/mayx/blog
|
||||
@ -272,89 +148,55 @@ http://123.56.193.182:3000/mayx/blog
|
||||
http://60.204.131.99:3000/mayx/blog
|
||||
http://femail.email:8418/mayx/blog
|
||||
http://47.93.56.66:8080/mayx/blog
|
||||
http://47.92.218.215:3000/mayx/blog
|
||||
http://167.172.7.198:8081/mayx/blog
|
||||
https://gitea.meetgu.ru/mayx/blog
|
||||
http://8.134.253.108:3000/mayx/blog
|
||||
https://git.patrich.se/mayx/blog
|
||||
http://116.236.50.103:8789/mayx/blog
|
||||
https://git.paulll.cc/mayx/blog
|
||||
https://gitea.alaindee.net/mayx/blog
|
||||
https://gitea.reimann.ee/mayx/blog
|
||||
http://109.74.197.189/mayx/blog
|
||||
https://git.nussi.net/mayx/blog
|
||||
https://git.thepain.dev/mayx/blog
|
||||
https://gitea.ultrasoft.cm/mayx/blog
|
||||
http://94.224.160.69:7990/mayx/blog
|
||||
http://8.134.144.137:3000/mayx/blog
|
||||
https://git.hxps.ru/mayx/blog
|
||||
https://gitea.ekjeong.synology.me/mayx/blog
|
||||
https://git.d4m13n.dev/mayx/blog
|
||||
https://git.needon.kr/mayx/blog
|
||||
https://git.4lcap.com/mayx/blog
|
||||
https://git.stit.tech/mayx/blog
|
||||
https://git.wun.im/mayx/blog
|
||||
https://www.9miao.fun:6839/mayx/blog
|
||||
https://git.ssktv.vip/mayx/blog
|
||||
https://git.autotion.net/mayx/blog
|
||||
http://octifor.synology.me:53000/mayx/blog
|
||||
https://git.daoyoucloud.com/mayx/blog
|
||||
https://git.entryrise.com/mayx/blog
|
||||
https://repo.apps.odatahub.net/mayx/blog
|
||||
http://okbestgood.com:3000/mayx/blog
|
||||
https://code.bitahub.com/mayx/blog
|
||||
https://git.daneric.dev/mayx/blog
|
||||
http://git.guaiyun.com.cn/mayx/blog
|
||||
http://malingshu.site:6010/mayx/blog
|
||||
https://git.jbangit.com/mayx/blog
|
||||
https://repo.gusdya.net/mayx/blog
|
||||
https://gitea.tmartens.dev/mayx/blog
|
||||
http://218.206.106.50:19901/mayx/blog
|
||||
https://g.6tm.es/mayx/blog
|
||||
https://git.slegeir.com/mayx/blog
|
||||
https://git.kimcblog.com/mayx/blog
|
||||
https://gogs.m14xa.ru/mayx/blog
|
||||
https://git.minaev.su/mayx/blog
|
||||
https://git.0fs.ru/mayx/blog
|
||||
https://git.bremauer.cc/mayx/blog
|
||||
https://git.itbcode.com/mayx/blog
|
||||
http://119.3.29.177:3000/mayx/blog
|
||||
http://47.110.224.240:13000/mayx/blog
|
||||
https://Git.Getmind.cn/mayx/blog
|
||||
http://dev.icrosswalk.ru:46300/mayx/blog
|
||||
http://8.134.206.4:9001/mayx/blog
|
||||
https://git.huwhy.cn/mayx/blog
|
||||
http://194.67.86.160:3100/mayx/blog
|
||||
http://47.101.58.33:3000/mayx/blog
|
||||
https://gitea.synapsetec.cn/mayx/blog
|
||||
http://47.121.207.193:3000/mayx/blog
|
||||
http://220.132.16.87:3000/mayx/blog
|
||||
https://git.tintinger.org/mayx/blog
|
||||
http://gitea.yunshanghub.com:8081/mayx/blog
|
||||
http://47.111.136.200:3000/mayx/blog
|
||||
https://repo.c-software.id/mayx/blog
|
||||
http://113.177.27.200:2033/mayx/blog
|
||||
http://152.69.204.151:3000/mayx/blog
|
||||
http://207.180.229.193:3001/mayx/blog
|
||||
https://g2.m8il.in/mayx/blog
|
||||
http://8.129.84.221:10800/mayx/blog
|
||||
http://122.51.51.35:3000/mayx/blog
|
||||
http://34.81.52.16/mayx/blog
|
||||
https://git.aopcloud.com/mayx/blog
|
||||
https://gitea.zerova.com/mayx/blog
|
||||
http://120.78.74.94:3000/mayx/blog
|
||||
https://git.genowisdom.cn/mayx/blog
|
||||
http://120.26.116.243:3000/mayx/blog
|
||||
http://120.26.46.180:3000/mayx/blog
|
||||
http://8.222.156.46:3000/mayx/blog
|
||||
http://123.57.16.111:3000/mayx/blog
|
||||
http://115.159.107.117:3000/mayx/blog
|
||||
http://47.99.98.98:9000/mayx/blog
|
||||
http://116.62.115.84:3000/mayx/blog
|
||||
https://Cagit.Cacode.net/mayx/blog
|
||||
https://gitea.rodaw.net/mayx/blog
|
||||
https://gitea.lightchen.info/mayx/blog
|
||||
http://45.55.138.82:3000/mayx/blog
|
||||
http://wingsing.net:3000/mayx/blog
|
||||
http://hgngit.ipdz.me/mayx/blog
|
||||
http://185.163.116.39:49153/mayx/blog
|
||||
@ -362,20 +204,14 @@ https://gitea.onfing.ir/mayx/blog
|
||||
https://lius.familyds.org:3000/mayx/blog
|
||||
https://git.morozoff.pro/mayx/blog
|
||||
https://gitea.questline.coop/mayx/blog
|
||||
https://gitea.mpc-web.jp/mayx/blog
|
||||
https://git.poggerer.xyz/mayx/blog
|
||||
https://git.wisptales.org/mayx/blog
|
||||
https://git.peaksscrm.com/mayx/blog
|
||||
http://git.chaojing-film.com:3000/mayx/blog
|
||||
http://8.142.81.167:1080/mayx/blog
|
||||
https://git.nusaerp.com/mayx/blog
|
||||
http://39.100.245.231:40030/mayx/blog
|
||||
http://35.207.205.18:3000/mayx/blog
|
||||
http://git.zjsciot.com:3000/mayx/blog
|
||||
https://gitea.ontoast.uk/mayx/blog
|
||||
http://112.124.40.88:5510/mayx/blog
|
||||
https://got.joshuakatz.me/mayx/blog
|
||||
https://git-web.phomecoming.com/mayx/blog
|
||||
http://121.36.37.70:15501/mayx/blog
|
||||
http://187.216.152.151:9999/mayx/blog
|
||||
http://116.63.173.179:8001/mayx/blog
|
||||
@ -388,128 +224,75 @@ http://git.yinas.cn/mayx/blog
|
||||
http://git.chilidoginteractive.com:3000/mayx/blog
|
||||
http://121.40.40.177:3000/mayx/blog
|
||||
http://118.31.223.224:3000/mayx/blog
|
||||
http://47.109.67.128:3000/mayx/blog
|
||||
http://voicebot.digitalakademie-bw.de:3000/mayx/blog
|
||||
https://gitea.services.gsd-srv.com/mayx/blog
|
||||
https://repo.divisilabs.com/mayx/blog
|
||||
http://178.254.35.219:3000/mayx/blog
|
||||
http://114.215.207.150:3000/mayx/blog
|
||||
http://2.59.132.109:3001/mayx/blog
|
||||
http://newslabx.csie.ntu.edu.tw:3000/mayx/blog
|
||||
http://81.71.148.57:8080/mayx/blog
|
||||
https://git.ides.club/mayx/blog
|
||||
https://git.lmskaran.com/mayx/blog
|
||||
http://sdgit.zfmgr.top/mayx/blog
|
||||
http://47.122.26.54:3000/mayx/blog
|
||||
http://154.86.0.30:3000/mayx/blog
|
||||
http://139.224.196.148:3000/mayx/blog
|
||||
http://47.95.167.249:3000/mayx/blog
|
||||
http://gitea.dctpay.com/mayx/blog
|
||||
https://omegat.dmu-medical.de/mayx/blog
|
||||
http://52.23.128.62:3000/mayx/blog
|
||||
http://85.214.41.219:49153/mayx/blog
|
||||
http://6068688.xyz:3000/mayx/blog
|
||||
http://8.137.105.8:5530/mayx/blog
|
||||
https://git.881221.xyz/mayx/blog
|
||||
http://120.46.222.128:10021/mayx/blog
|
||||
http://39.106.86.127:3000/mayx/blog
|
||||
https://git.techspec.pro/mayx/blog
|
||||
http://47.92.23.211:3000/mayx/blog
|
||||
http://120.26.108.239:9188/mayx/blog
|
||||
https://git.van-peeren.de/mayx/blog
|
||||
http://gitea.msadb.cn/mayx/blog
|
||||
https://git.changenhealth.cn/mayx/blog
|
||||
http://git.gkcorp.com.vn:16000/mayx/blog
|
||||
http://47.111.17.177:3000/mayx/blog
|
||||
http://git.hnits360.com/mayx/blog
|
||||
https://k0ki-dev.com/mayx/blog
|
||||
http://110.42.45.89:2052/mayx/blog
|
||||
https://git.furcom.org/mayx/blog
|
||||
http://47.109.95.73:3000/mayx/blog
|
||||
http://47.104.196.63:8418/mayx/blog
|
||||
https://git.mkubiak.com/mayx/blog
|
||||
http://38.22.90.74:3000/mayx/blog
|
||||
http://8.133.240.249:3456/mayx/blog
|
||||
https://git.mista.ru/mayx/blog
|
||||
http://34.102.70.200:3000/mayx/blog
|
||||
https://vcs.int.feuerwehr-ziemetshausen.de/mayx/blog
|
||||
http://175.178.219.170:3000/mayx/blog
|
||||
https://git.camus.cat/mayx/blog
|
||||
https://code.miraclezhb.com/mayx/blog
|
||||
http://blueroses.top:8888/mayx/blog
|
||||
https://git.cnml.de/mayx/blog
|
||||
https://giteas.fullmooncyberworks.com/mayx/blog
|
||||
http://47.112.118.149:10082/mayx/blog
|
||||
https://gitea.jobiglo.com/mayx/blog
|
||||
https://gitea.rpg-librarium.de/mayx/blog
|
||||
http://begild.top:8418/mayx/blog
|
||||
http://58.221.13.198:30010/mayx/blog
|
||||
https://gitea.kaz62.ru/mayx/blog
|
||||
https://git.tbaer.de/mayx/blog
|
||||
http://74.48.174.77:3000/mayx/blog
|
||||
https://git.atggroup.vn/mayx/blog
|
||||
https://git.d-popov.com/mayx/blog
|
||||
https://git.liliyamol.cn/mayx/blog
|
||||
https://git.srblerp.com/mayx/blog
|
||||
http://8.138.90.28:3000/mayx/blog
|
||||
https://git.hotolab.win/mayx/blog
|
||||
https://home.zhupei.me:3000/mayx/blog
|
||||
https://gitea.theaken.com/mayx/blog
|
||||
https://git.ja-schwarz.de/mayx/blog
|
||||
https://shanewan.cn:30000/mayx/blog
|
||||
https://git.xemo-net.de/mayx/blog
|
||||
https://git.23cm.cn/mayx/blog
|
||||
https://gitea.oio.cat/mayx/blog
|
||||
https://git.rokiy.com/mayx/blog
|
||||
http://59.110.17.86:3000/mayx/blog
|
||||
https://git.karma-riuk.com/mayx/blog
|
||||
https://git.saidomar.fr/mayx/blog
|
||||
https://gitea.pnkx.top:8/mayx/blog
|
||||
http://gitea.fcunb.cn:10083/mayx/blog
|
||||
http://47.107.152.87:3000/mayx/blog
|
||||
https://git.ligmatiktok.com/mayx/blog
|
||||
http://106.15.58.155:3333/mayx/blog
|
||||
https://git.sduonline.cn/mayx/blog
|
||||
https://git.7o9o.net/mayx/blog
|
||||
https://gitea.adminakademia.pl/mayx/blog
|
||||
https://dev.init.zone/mayx/blog
|
||||
https://git.baneynet.net/mayx/blog
|
||||
http://43.143.224.106:2000/mayx/blog
|
||||
http://47.97.225.73:3000/mayx/blog
|
||||
http://1.15.11.52:13000/mayx/blog
|
||||
https://git.gupaoedu.cn/mayx/blog
|
||||
http://60.205.233.184:3010/mayx/blog
|
||||
http://121.43.49.226/mayx/blog
|
||||
https://git.ricecakecat.com/mayx/blog
|
||||
https://gittea.biveki.ru/mayx/blog
|
||||
https://git.7milch.com/mayx/blog
|
||||
https://gitea.zmanplex.com/mayx/blog
|
||||
https://git.hexdive.com/mayx/blog
|
||||
http://139.224.250.209:3000/mayx/blog
|
||||
https://vcc808.site/mayx/blog
|
||||
https://git.sitenevis.com/mayx/blog
|
||||
https://git.nightime.org/mayx/blog
|
||||
https://dreamplacesai.de/mayx/blog
|
||||
https://git.soy.dog/mayx/blog
|
||||
https://bachner.synology.me:10002/mayx/blog
|
||||
https://git.cool2645.com/mayx/blog
|
||||
https://gitea.jludwig.net/mayx/blog
|
||||
https://git.z1.mk/mayx/blog
|
||||
http://185.87.111.46:3000/mayx/blog
|
||||
http://suncheng.asia:14200/mayx/blog
|
||||
http://1.94.13.224:9080/mayx/blog
|
||||
https://auric-org.org/mayx/blog
|
||||
https://git.git-happens.de/mayx/blog
|
||||
https://gitea.seanomad.ru/mayx/blog
|
||||
http://47.104.241.192:19999/mayx/blog
|
||||
http://47.105.61.58:3000/mayx/blog
|
||||
https://git.memosnag.com/mayx/blog
|
||||
http://tdss.website:801/mayx/blog
|
||||
http://101.35.183.241/mayx/blog
|
||||
https://gitea.quiztimes.nl/mayx/blog
|
||||
http://106.14.189.125:3000/mayx/blog
|
||||
https://git.hundseth.com/mayx/blog
|
||||
https://git.xming.cloud/mayx/blog
|
||||
https://travgit.guillorystack.com/mayx/blog
|
||||
http://gitea.coderpath.com/mayx/blog
|
||||
https://gitea.thanh0x.com/mayx/blog
|
||||
@ -517,154 +300,100 @@ http://175.198.180.19:3000/mayx/blog
|
||||
https://gitea.albanmary.com/mayx/blog
|
||||
http://ngtools.cn:53000/mayx/blog
|
||||
https://git.hantify.ru/mayx/blog
|
||||
https://git.unpas.dev/mayx/blog
|
||||
http://43.136.169.169:3000/mayx/blog
|
||||
http://121.196.213.68:3000/mayx/blog
|
||||
https://git.vereint-digital.de/mayx/blog
|
||||
https://git.advarna.fr/mayx/blog
|
||||
http://111.198.4.69:8092/mayx/blog
|
||||
https://git.lakaweb.com/mayx/blog
|
||||
https://git.kitti.ac.th/mayx/blog
|
||||
http://106.15.233.223:3001/mayx/blog
|
||||
https://forge.coreymclark.com/mayx/blog
|
||||
http://ems.iclematis.com:30000/mayx/blog
|
||||
https://git.micahmoore.io/mayx/blog
|
||||
https://git.zlyum.com/mayx/blog
|
||||
https://schokigeschmack.de/mayx/blog
|
||||
https://git.anatid.net/mayx/blog
|
||||
https://catsdev.com/mayx/blog
|
||||
https://git.lekai.info/mayx/blog
|
||||
https://git.avclick.ru/mayx/blog
|
||||
http://135.235.225.198:3000/mayx/blog
|
||||
http://giteaiposeek.cn/mayx/blog
|
||||
https://git.zimerguz.net/mayx/blog
|
||||
https://git.cukak.com/mayx/blog
|
||||
http://farsinot.ir:3000/mayx/blog
|
||||
https://gitea.sosaley.in/mayx/blog
|
||||
https://dev.ncot.uk/mayx/blog
|
||||
https://git.sick.earth/mayx/blog
|
||||
https://git.ncue.net/mayx/blog
|
||||
https://gitea.rbpsw.net/mayx/blog
|
||||
https://git.prayujt.com/mayx/blog
|
||||
http://121.199.11.156:3000/mayx/blog
|
||||
http://www.sh-hpg.com:3000/mayx/blog
|
||||
https://git.galaxylabs.ca/mayx/blog
|
||||
https://gitlab.n8n-store.xyz/mayx/blog
|
||||
https://forgejo.win/mayx/blog
|
||||
https://gitea.katiethe.dev/mayx/blog
|
||||
https://git0.zpqrtbnk.net/mayx/blog
|
||||
http://159.203.33.179:3000/mayx/blog
|
||||
http://117.72.114.197:3000/mayx/blog
|
||||
http://192.210.186.179:20051/mayx/blog
|
||||
https://git.ashcloud.com/mayx/blog
|
||||
http://us2.fornoone.top:3000/mayx/blog
|
||||
https://git.novaa.xyz/mayx/blog
|
||||
https://gitea.noname-studios.es/mayx/blog
|
||||
http://101.46.208.93:3000/mayx/blog
|
||||
http://45.93.137.91:3000/mayx/blog
|
||||
https://git.smartdev.cz/mayx/blog
|
||||
http://23.94.57.60:3000/mayx/blog
|
||||
https://git.atomos.io/mayx/blog
|
||||
https://git.tylantyson.com/mayx/blog
|
||||
https://watch.mommys.plumbing/mayx/blog
|
||||
https://devkona.net/mayx/blog
|
||||
https://gitea.avixc-nas.myds.me/mayx/blog
|
||||
http://www.ggafrik.site/mayx/blog
|
||||
https://gitea.chaopi.dev/mayx/blog
|
||||
http://118.196.23.96:1866/mayx/blog
|
||||
http://47.119.120.128:8085/mayx/blog
|
||||
http://sjhome.cloud:3000/mayx/blog
|
||||
https://gitea.sciotech.cn/mayx/blog
|
||||
https://manage.gitea.djangoadmin.cn/mayx/blog
|
||||
http://8.148.220.5:8089/mayx/blog
|
||||
http://8.140.250.85:3000/mayx/blog
|
||||
http://8.134.11.35:3000/mayx/blog
|
||||
https://dev.ilink-app.com/mayx/blog
|
||||
https://git.ctx.dev/mayx/blog
|
||||
http://82.157.205.190:3000/mayx/blog
|
||||
https://nas.szwyll.com:3000/mayx/blog
|
||||
http://baylan.la.asu.edu:3000/mayx/blog
|
||||
https://git.koppa.pro/mayx/blog
|
||||
http://188.120.243.108:3000/mayx/blog
|
||||
http://202.65.194.19:3000/mayx/blog
|
||||
http://47.101.60.131:10082/mayx/blog
|
||||
http://8.148.234.146:3001/mayx/blog
|
||||
https://git.ypepin.com/mayx/blog
|
||||
http://www.bzturbo.com.br/mayx/blog
|
||||
https://git.maiasoft.jp/mayx/blog
|
||||
https://git.athelas-conseils.fr/mayx/blog
|
||||
https://git.churiland.com/mayx/blog
|
||||
http://git.huangwc.com/mayx/blog
|
||||
https://gitea.xala.dev/mayx/blog
|
||||
http://101.201.34.43:3000/mayx/blog
|
||||
https://git.ixu.me/mayx/blog
|
||||
http://118.89.124.175:3000/mayx/blog
|
||||
https://git.gloje-rinchen-dorjee-rinpoche-buddhist-monastery.org/mayx/blog
|
||||
https://git.pxlbuzzard.com/mayx/blog
|
||||
http://101.35.227.2:3000/mayx/blog
|
||||
http://175.126.123.163:3000/mayx/blog
|
||||
https://vw-git.senecasense.com/mayx/blog
|
||||
http://git.uhfdemo.com/mayx/blog
|
||||
http://47.108.217.75:3000/mayx/blog
|
||||
https://git.jakubzabski.pl/mayx/blog
|
||||
https://gitea.forgeandflowsolutions.com/mayx/blog
|
||||
https://www.git.omezaldama.xyz/mayx/blog
|
||||
https://vila.go.ro/mayx/blog
|
||||
https://git.olyntec.com/mayx/blog
|
||||
http://8.134.218.17:8013/mayx/blog
|
||||
https://www.invds.uk/mayx/blog
|
||||
http://124.223.89.168:8080/mayx/blog
|
||||
http://139.129.21.166:3000/mayx/blog
|
||||
http://111.231.240.168:9082/mayx/blog
|
||||
https://git.afonsosoares.com/mayx/blog
|
||||
https://gitea.nswteam.net/mayx/blog
|
||||
http://209.141.47.52:3000/mayx/blog
|
||||
https://git.apfern.com/mayx/blog
|
||||
http://120.26.115.132:3000/mayx/blog
|
||||
http://47.103.155.22:3000/mayx/blog
|
||||
http://dapainas.asia:5990/mayx/blog
|
||||
http://60.204.158.188:3000/mayx/blog
|
||||
https://zqz5.com/mayx/blog
|
||||
https://git.3dizart.ru/mayx/blog
|
||||
http://119.3.252.2:3000/mayx/blog
|
||||
http://60.204.156.211:3000/mayx/blog
|
||||
http://youneed.top:10014/mayx/blog
|
||||
https://gitea.abra.me/mayx/blog
|
||||
https://git.yukaige.com/mayx/blog
|
||||
http://nas.bi1kbu.com:8418/mayx/blog
|
||||
http://123.56.74.235:3000/mayx/blog
|
||||
http://15.204.210.141:30121/mayx/blog
|
||||
http://1.94.178.207:3000/mayx/blog
|
||||
http://47.96.145.34:3000/mayx/blog
|
||||
https://gitea.tsaida.synology.me/mayx/blog
|
||||
http://xapple.ru:3000/mayx/blog
|
||||
https://git.teygaming.com/mayx/blog
|
||||
https://git.alhsk.top/mayx/blog
|
||||
http://8.138.4.170:8980/mayx/blog
|
||||
http://185.128.138.246:3000/mayx/blog
|
||||
http://210.211.116.85:3000/mayx/blog
|
||||
http://osztromok.com:3164/mayx/blog
|
||||
http://175.209.53.134:3030/mayx/blog
|
||||
http://87.228.74.88:3000/mayx/blog
|
||||
http://118.163.190.249:3000/mayx/blog
|
||||
http://39.107.226.169:3000/mayx/blog
|
||||
https://git.ueda.sk/mayx/blog
|
||||
http://113.45.76.155:3000/mayx/blog
|
||||
http://47.100.28.88:3000/mayx/blog
|
||||
http://168.138.196.70:3000/mayx/blog
|
||||
http://39.96.211.118:3000/mayx/blog
|
||||
https://git.server.isalem.net/mayx/blog
|
||||
http://47.103.100.52:3000/mayx/blog
|
||||
https://git.cos777nnn777.win/mayx/blog
|
||||
http://5.189.140.23:8080/mayx/blog
|
||||
http://121.37.47.20:3000/mayx/blog
|
||||
https://git.antropix.dev/mayx/blog
|
||||
http://15.237.198.144/mayx/blog
|
||||
https://gitea.soap.wf/mayx/blog
|
||||
http://123.249.119.122:3000/mayx/blog
|
||||
http://183.6.120.101:30000/mayx/blog
|
||||
http://134.122.173.191:3000/mayx/blog
|
||||
https://git.kalinin.in/mayx/blog
|
||||
http://8.138.81.5:3000/mayx/blog
|
||||
https://xgit.tsuimg.top/mayx/blog
|
||||
http://123.60.156.158:13000/mayx/blog
|
||||
@ -672,12 +401,8 @@ http://57.129.94.190:3000/mayx/blog
|
||||
https://gitea.micro-stack.org/mayx/blog
|
||||
http://101.132.160.67:3000/mayx/blog
|
||||
https://gitea.temp.brentgruber.com/mayx/blog
|
||||
https://www.know-how.store/mayx/blog
|
||||
http://47.102.147.170:3050/mayx/blog
|
||||
https://git.borg.unak.is/mayx/blog
|
||||
http://209.38.235.254:3000/mayx/blog
|
||||
http://52.66.204.217:3001/mayx/blog
|
||||
https://pdje.uk/mayx/blog
|
||||
http://172.236.250.154:3000/mayx/blog
|
||||
http://54.198.134.152:3000/mayx/blog
|
||||
http://121.41.35.226:11011/mayx/blog
|
||||
@ -685,24 +410,14 @@ http://47.111.1.12:3000/mayx/blog
|
||||
https://nelgit.nelpi.co.uk/mayx/blog
|
||||
http://47.108.156.251:3000/mayx/blog
|
||||
http://8.141.91.86:3000/mayx/blog
|
||||
https://git.hibikiame.com:3000/mayx/blog
|
||||
https://www.yseven.net/mayx/blog
|
||||
http://8.138.187.132:3000/mayx/blog
|
||||
https://gitea.codeathome.ovh/mayx/blog
|
||||
http://117.72.15.187:3000/mayx/blog
|
||||
http://159.223.54.247:3030/mayx/blog
|
||||
http://81.70.30.91:3000/mayx/blog
|
||||
http://47.98.105.248:3000/mayx/blog
|
||||
http://218.84.152.14:65001/mayx/blog
|
||||
https://gitea.kisechan.space/mayx/blog
|
||||
http://nas-home.top:8418/mayx/blog
|
||||
http://140.238.9.133:3007/mayx/blog
|
||||
http://8.138.100.115:3000/mayx/blog
|
||||
https://git.soupcafe.cc/mayx/blog
|
||||
https://git.mwapp.com.br/mayx/blog
|
||||
http://yidaima.cn:6008/mayx/blog
|
||||
http://213.199.46.54:3001/mayx/blog
|
||||
http://47.94.156.73:3000/mayx/blog
|
||||
http://185.126.237.57:3000/mayx/blog
|
||||
http://47.97.50.232:3000/mayx/blog
|
||||
http://106.54.211.95:3000/mayx/blog
|
||||
@ -713,25 +428,13 @@ http://down.luanhailiang.cn:9000/mayx/blog
|
||||
http://39.96.195.72:10082/mayx/blog
|
||||
https://gitea.klopfenstein.org/mayx/blog
|
||||
http://8.148.24.160:3000/mayx/blog
|
||||
https://gitea.hailstorm.gay/mayx/blog
|
||||
http://hxu.ac.cn:3000/mayx/blog
|
||||
https://gitea.codeopslag.nl/mayx/blog
|
||||
http://221.219.181.35:30000/mayx/blog
|
||||
https://git.cymnb.com/mayx/blog
|
||||
http://8.163.31.138:3000/mayx/blog
|
||||
http://47.108.27.137:3000/mayx/blog
|
||||
http://182.92.9.236:3000/mayx/blog
|
||||
http://172.172.102.93:3000/mayx/blog
|
||||
http://101.132.255.70:3000/mayx/blog
|
||||
http://139.196.179.195:3000/mayx/blog
|
||||
http://115.120.245.164:3000/mayx/blog
|
||||
http://120.27.19.58:30000/mayx/blog
|
||||
https://git-virtual.ru/mayx/blog
|
||||
https://gitea.suchodupin.com/mayx/blog
|
||||
http://8.134.116.217:3000/mayx/blog
|
||||
http://117.72.219.18:6000/mayx/blog
|
||||
http://47.99.144.51:3000/mayx/blog
|
||||
https://git.rcdiamondgh.cc/mayx/blog
|
||||
http://35.194.179.90:3000/mayx/blog
|
||||
http://188.245.173.247:3080/mayx/blog
|
||||
http://8.153.14.94:61308/mayx/blog
|
||||
@ -741,7 +444,6 @@ http://59.110.63.80:3000/mayx/blog
|
||||
http://121.43.60.72:9015/mayx/blog
|
||||
http://171.80.13.66:9112/mayx/blog
|
||||
http://211.22.221.188:3000/mayx/blog
|
||||
https://lunarvow.top:12494/mayx/blog
|
||||
http://223.108.157.174:3000/mayx/blog
|
||||
http://120.24.249.56/mayx/blog
|
||||
http://47.100.90.152:3000/mayx/blog
|
||||
@ -750,94 +452,127 @@ http://121.196.237.108:3000/mayx/blog
|
||||
http://g.gamesns.cn:3000/mayx/blog
|
||||
http://54.179.203.2:3000/mayx/blog
|
||||
http://14.103.246.124:16000/mayx/blog
|
||||
http://www.yuqiya.cn:8499/mayx/blog
|
||||
http://git.goodxp.cn/mayx/blog
|
||||
http://47.104.189.3:3000/mayx/blog
|
||||
https://git.twinkle.network/mayx/blog
|
||||
http://8.137.106.149:3000/mayx/blog
|
||||
http://47.112.119.250:3000/mayx/blog
|
||||
http://8.137.170.249:3000/mayx/blog
|
||||
https://mygit.kikyps.com/mayx/blog
|
||||
http://152.42.207.183:3000/mayx/blog
|
||||
https://git.lucasluqui.com/mayx/blog
|
||||
http://47.99.60.81:10082/mayx/blog
|
||||
http://120.211.66.170:8418/mayx/blog
|
||||
http://47.242.181.61:3333/mayx/blog
|
||||
http://187.189.244.23:3000/mayx/blog
|
||||
http://58.176.21.43:9004/mayx/blog
|
||||
https://gitea.vilcap.com/mayx/blog
|
||||
https://git.2b8.org/mayx/blog
|
||||
http://8.137.94.229:3000/mayx/blog
|
||||
http://121.196.245.62/mayx/blog
|
||||
http://47.92.35.224:3000/mayx/blog
|
||||
http://47.102.209.69:53000/mayx/blog
|
||||
http://116.205.97.109:3000/mayx/blog
|
||||
https://gitea.ysme.top/mayx/blog
|
||||
http://8.140.242.230:3000/mayx/blog
|
||||
http://8.138.142.17:3000/mayx/blog
|
||||
https://git.babalish.com/mayx/blog
|
||||
http://47.111.161.191:3000/mayx/blog
|
||||
http://47.95.31.56:20080/mayx/blog
|
||||
http://123.56.231.200:3000/mayx/blog
|
||||
http://113.46.142.74:3000/mayx/blog
|
||||
http://47.100.0.167:3000/mayx/blog
|
||||
http://www.koelndom.cn:13030/mayx/blog
|
||||
http://209.127.59.74:3000/mayx/blog
|
||||
http://111.15.179.73:3000/mayx/blog
|
||||
http://47.113.119.107:3000/mayx/blog
|
||||
https://git.dotb.cloud/mayx/blog
|
||||
http://178.205.99.36:3000/mayx/blog
|
||||
https://git.bigdalang.com/mayx/blog
|
||||
https://gitea.augeo.dev/mayx/blog
|
||||
https://demo.stam.kr/mayx/blog
|
||||
http://120.46.23.215:3000/mayx/blog
|
||||
http://47.108.75.198:3000/mayx/blog
|
||||
http://121.41.2.71:3000/mayx/blog
|
||||
http://47.114.94.196:8030/mayx/blog
|
||||
https://sithcom.de/mayx/blog
|
||||
http://156.238.243.144:3000/mayx/blog
|
||||
http://8.138.242.82:8888/mayx/blog
|
||||
http://110.41.177.80:5000/mayx/blog
|
||||
https://gitea.dsmaster.myds.me/mayx/blog
|
||||
http://intechrnd.iptime.org:3000/mayx/blog
|
||||
https://gitea.primecontrols-dev.com/mayx/blog
|
||||
http://47.104.160.69:3000/mayx/blog
|
||||
http://39.104.61.219:3000/mayx/blog
|
||||
http://www.scserverddns.top:13000/mayx/blog
|
||||
http://156.255.1.229:3000/mayx/blog
|
||||
http://120.237.152.218:8888/mayx/blog
|
||||
https://git.ndpcloud.ru/mayx/blog
|
||||
https://dev.kirill-vorotov.com/mayx/blog
|
||||
https://gitea.va-comer.net/mayx/blog
|
||||
https://git.lucas-michel.fr/mayx/blog
|
||||
http://60.205.162.59:3000/mayx/blog
|
||||
https://git.imvictor.tech:2/mayx/blog
|
||||
https://git.pwcedge-sbs-innov-lab.com/mayx/blog
|
||||
https://git.beitzah.net/mayx/blog
|
||||
http://47.112.137.193:3000/mayx/blog
|
||||
https://www.cadquos.dev/mayx/blog
|
||||
https://gitea.malin.onl/mayx/blog
|
||||
http://58.38.123.148:3176/mayx/blog
|
||||
http://docker.clhero.fun:3000/mayx/blog
|
||||
http://42.193.251.215:3000/mayx/blog
|
||||
http://kpro.shanghaiopen.org.cn:8005/mayx/blog
|
||||
https://bdgit.educoder.net/mayx/blog
|
||||
http://77.104.76.44/mayx/blog
|
||||
http://101.42.172.53:27007/mayx/blog
|
||||
http://e19510c831.iok.la/mayx/blog
|
||||
https://gitea.clintmasden.duckdns.org/mayx/blog
|
||||
http://gitea.liaozhuangkeji.com/mayx/blog
|
||||
https://www.nxgit.xyz/mayx/blog
|
||||
http://220.112.1.148:7166/mayx/blog
|
||||
http://119.45.49.212:3000/mayx/blog
|
||||
https://git.synapsenet.net/mayx/blog
|
||||
https://gitea.kdlsvps.top/mayx/blog
|
||||
http://deiniusoft.com:3000/mayx/blog
|
||||
https://code.antopie.org/mayx/blog
|
||||
http://120.197.24.77:3000/mayx/blog
|
||||
http://c6h5gp.top:3000/mayx/blog
|
||||
https://git.serenetia.com/mayx/blog
|
||||
https://tm-jikayo.com/mayx/blog
|
||||
https://vcs.cozydsp.space/mayx/blog
|
||||
https://stephens.cc/mayx/blog
|
||||
https://git.aoun.ltd/mayx/blog
|
||||
http://43.162.113.116:3000/mayx/blog
|
||||
http://8.129.11.230:7002/mayx/blog
|
||||
http://115.190.107.87:3000/mayx/blog
|
||||
https://git.hast.one/mayx/blog
|
||||
http://106.12.50.144:8081/mayx/blog
|
||||
http://43.192.90.133/mayx/blog
|
||||
http://120.77.94.227:9999/mayx/blog
|
||||
https://code.wxk8.com/mayx/blog
|
||||
http://www.befitsoft.com/mayx/blog
|
||||
http://36.213.200.127:23000/mayx/blog
|
||||
http://8.155.58.218:9000/mayx/blog
|
||||
http://fanlibo.i234.me:8418/mayx/blog
|
||||
https://git.christophhagen.de/mayx/blog
|
||||
http://rito.synology.me:3000/mayx/blog
|
||||
http://www.dothing.com:6999/mayx/blog
|
||||
http://8.217.32.95:3000/mayx/blog
|
||||
https://git.temporaryname.org/mayx/blog
|
||||
https://git.loli.surf/mayx/blog
|
||||
https://Repo.gusdya.net/mayx/blog
|
||||
https://git.m.ctf.arrobe.fr/mayx/blog
|
||||
http://120.27.238.24:3000/mayx/blog
|
||||
https://code.diekabuths.dynu.net/mayx/blog
|
||||
http://69.62.64.52:3333/mayx/blog
|
||||
https://git.flymiracle.com/mayx/blog
|
||||
https://git.scene.to/mayx/blog
|
||||
https://git.auwiesen2.de/mayx/blog
|
||||
http://naughtycat.biz:3333/mayx/blog
|
||||
https://git.p1.bitstorm.co.nz/mayx/blog
|
||||
https://www.yalecheung.top:1024/mayx/blog
|
||||
http://39.105.67.143:3000/mayx/blog
|
||||
https://gitea.manekenbrand.com/mayx/blog
|
||||
https://gitea.eabor.xyz/mayx/blog
|
||||
http://106.14.138.181:3000/mayx/blog
|
||||
https://git.adalspace.com/mayx/blog
|
||||
https://git.yyuu.xyz/mayx/blog
|
||||
http://39.107.70.124:3000/mayx/blog
|
||||
http://huanghomenas2.myqnapcloud.com:4000/mayx/blog
|
||||
http://218.237.212.51:30003/mayx/blog
|
||||
http://gitea.huangyanjie.com/mayx/blog
|
||||
https://git.stormrain.cn/mayx/blog
|
||||
https://git.deuxfleurs.fr/mayx/blog
|
||||
https://www.simpra.org:3000/mayx/blog
|
||||
http://8.148.31.14:3000/mayx/blog
|
||||
http://55x.top:9300/mayx/blog
|
||||
https://gitea.lelespace.top/mayx/blog
|
||||
https://git.lmbrs.org/mayx/blog
|
||||
https://fj.sinesation.com/mayx/blog
|
||||
http://47.94.246.1:3000/mayx/blog
|
||||
http://103.87.67.60:3100/mayx/blog
|
||||
https://docker-registry-lszz.uj.com.tw/mayx/blog
|
||||
https://git.honulla.com/mayx/blog
|
||||
https://www.arcbyte.dev/mayx/blog
|
||||
http://45.144.30.78:8083/mayx/blog
|
||||
https://git.nihil.foo/mayx/blog
|
||||
https://scm.bcorex.e3labs.net/mayx/blog
|
||||
http://167.172.88.190:3000/mayx/blog
|
||||
http://58.17.14.95:8001/mayx/blog
|
||||
https://hero-cloud-stg-code.cnbita.com/mayx/blog
|
||||
https://git.darkmattergame.net/mayx/blog
|
||||
http://101.37.69.204:3000/mayx/blog
|
||||
http://jacksonhampton.com:3000/mayx/blog
|
||||
https://git.jaronnie.com/mayx/blog
|
||||
https://gitea.tecamino.com/mayx/blog
|
||||
http://39.99.175.172:8000/mayx/blog
|
||||
http://8.138.13.251:3000/mayx/blog
|
||||
http://47.115.223.229:8888/mayx/blog
|
||||
http://47.105.59.0:5132/mayx/blog
|
||||
https://git.veran.link/mayx/blog
|
||||
http://104.254.131.244:3000/mayx/blog
|
||||
|
||||
|
@ -7,7 +7,6 @@ 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.surge.sh/
|
||||
@ -33,19 +32,23 @@ repos:
|
||||
- https://framagit.org/mayx/mayx.frama.io
|
||||
- https://salsa.debian.org/mayx/mayx.pages.debian.net
|
||||
- https://codeberg.org/mayx/blog
|
||||
- https://pagure.io/mayx
|
||||
- https://git.gay/mayx/mayx
|
||||
- https://gitea.com/mayx/mayx
|
||||
- https://gitgud.io/mayx/mayx
|
||||
- https://git.sr.ht/~mayx/mayx
|
||||
- https://git.launchpad.net/mayx
|
||||
- https://gin.g-node.org/mayx/blog
|
||||
- https://git.disroot.org/mayx/mayx
|
||||
- https://bitbucket.org/unmayx/mayx
|
||||
- https://sourcecraft.dev/mayx/mayx
|
||||
- https://gitflic.ru/project/mayx/blog
|
||||
- https://tangled.org/mayx.tngl.sh/blog/
|
||||
- https://gitee.com/mabbs/mabbs
|
||||
- https://cnb.cool/unmayx/mayx
|
||||
- https://atomgit.com/mayx/blog
|
||||
- https://sourceforge.net/projects/mayx/
|
||||
- https://dev.azure.com/unmayx/_git/Mayx
|
||||
static:
|
||||
- https://mayx.nekoweb.org/
|
||||
- https://mayx.neocities.org/
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
{% if page.layout == "xslt" %}<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml-stylesheet type="text/xml" href="/feed.xslt.xml"?>
|
||||
<?xml-stylesheet type="text/css" href="/assets/css/xslt.css"?>
|
||||
<xsl:stylesheet
|
||||
version="3.0"
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
|
||||
20
_posts/2026-01-01-summary.md
Normal file
20
_posts/2026-01-01-summary.md
Normal file
@ -0,0 +1,20 @@
|
||||
---
|
||||
layout: post
|
||||
title: 年终总结
|
||||
tags: [总结]
|
||||
---
|
||||
|
||||
0 error(s), ∞ warning(s)<!--more-->
|
||||
|
||||
# 2025年的状态
|
||||
在2025年,感觉状态不如去年……由于没能做出正确的选择,还是有点糟糕。不过总的来说还没有引发关键性的错误,至少还能继续坚持下去。
|
||||
在这一年中,感觉记忆和思考能力都有所下滑,看来是没把自己照顾好😂,不过看看这一年写的文章,看起来似乎比以前更流畅了,这也许是因为和AI聊得多了,以至于思维有点偏向AI了吧。
|
||||
总的来说感觉自己的稳定性还是有点低了,但这可能不是我能独自解决的,也不知会有什么转机……
|
||||
|
||||
# 2025年发生的事情
|
||||
回顾了一下[去年的年终总结](/2025/01/01/summary.html),发现自己还是没能做到知行合一,在这一年里全球各类资产突然开始大幅升值,也就是说钱真的开始不值钱了……那时候想着买黄金,这一年下来却没能下定决心,最终错过了资产保值的机会。至于现在,似乎什么也做不了了……当然这对我的生活并没有造成什么严重的打击,只是感受到环境对自己的影响罢了。
|
||||
至于AI……依然是一天比一天强,而各个公司对AI的投入相比去年也是极大的提升,当然出来的效果也是非常强,那时候的AI还是挺容易出错,但是现在AI解决问题的能力已经可以替代很多人了,不只是文本生成模型,今年的图像与视频生成模型也真的是发展到了以往完全不能想象的地步,真的可以做到一句话想要什么就有什么了。
|
||||
另外,今年写的博客内容过于围绕博客本身了,以至于似乎不太跟得上时代,虽然我的博客也确实有点老旧了😆。只是看看以前的文章,都还有一些面向未来的趋势,而今年就有点“考古”了。相比于考古,去展望未来显然是更有意义的事情,只不过……真的感觉脑子不太好使,未来会发生什么,已经完全无法预测了。
|
||||
|
||||
# 展望2026年
|
||||
虽然不知道未来会发生什么,但毕竟还没有造成关键性的错误,还有修正的余地,只能希望未来能够做出正确的选择,不要让自己陷入危险的境地吧。
|
||||
34
_posts/2026-02-08-xslt.md
Normal file
34
_posts/2026-02-08-xslt.md
Normal file
@ -0,0 +1,34 @@
|
||||
---
|
||||
layout: post
|
||||
title: 在Google杀死XSLT之后的XML美化方案
|
||||
tags: [XML, Feed, XSLT, 美化]
|
||||
---
|
||||
|
||||
即使没有了XSLT,也不能让读者看到光秃秃的XML!<!--more-->
|
||||
|
||||
# 起因
|
||||
在半年前,我写了一篇[用XSLT美化博客XML文件](/2025/07/01/xslt.html)的文章,自从那以后,每次我在浏览其他人博客的时候,都会看一眼对方博客有没有给自己的订阅文件做美化。不过就在前段时间,我在浏览某个博客的时候,发现他博客的订阅文件,甚至连最基本的XML文档树都没有显示出来。这时候我打开开发者工具看了一眼源代码,发现他也并没有使用`xml-stylesheet`之类的指令……而且控制台貌似报了些错,好像是出现了什么CSP错误……于是我就想,浏览器显示XML文档树的本质,会不会其实也是一种XSLT?之所以报错也有可能是浏览器在自动引用内置的XSLT时违反了CSP。所以我就问了问谷歌AI,结果似乎真的是这样,比如火狐浏览器就内置了一份[XSLT文件](https://github.com/mozilla-firefox/firefox/blob/main/dom/xml/resources/XMLPrettyPrint.xsl),IE浏览器也有。正当我为XSLT的功能感到强大时,谷歌AI随后提到,[Chrome浏览器决定弃用XSLT](https://developer.chrome.com/docs/web-platform/deprecating-xslt),所以以后不要再用XSLT了😰……
|
||||
我给我的订阅文件加美化功能才半年,怎么就要不能用了?XSLT出现这么多年都还能用,结果等我加上就要废弃了?当时为了增加这个功能,还是费了不少劲的,怎么能让谷歌说没就没?于是我就开始对这件事进行了调查。
|
||||
|
||||
# Google杀死了XSLT
|
||||
从上面Chrome的弃用XSLT文档中,可以发现,这件事的始作俑者是[Mason Freed](https://github.com/mfreed7),他在WHATWG中发起了一个[Issue](https://github.com/whatwg/html/issues/11523),因为XSLT用的人很少,以及实现XSLT的库很老而且容易出漏洞,所以建议把XSLT从Web标准中删除。在这个Issue中可以发现,有很多人表示不满,毕竟这个功能对想要给自己订阅做美化的博主来说还是很有用的。为了对抗谷歌,还有人做了个网站: <https://xslt.rip> 。
|
||||
而且XSLT虽然用的人占比也许不高,但从总量上应该还是挺多的,除了用XSLT美化博客订阅的,甚至还有用[XSLT作为博客框架的](https://github.com/vgr-land/vgr-xslt-blog-framework),另外还有一些人提出[一部分政府网站也有使用XSLT](https://github.com/whatwg/html/issues/11582)。
|
||||
不过Freed看起来对这件事早有准备,他做了一个[Polyfill库](https://github.com/mfreed7/xslt_polyfill),通过WASM的方式让XSLT可以正常工作,为了方便大家使用这个库,我顺手给CDNJS发了个[PR](https://github.com/cdnjs/packages/pull/2118),以后可以用CDN引用它了。不过使用这个库的前提是需要在订阅中加一段引用JS的代码,像我博客中的Atom订阅,用的是[jekyll-feed](https://github.com/jekyll/jekyll-feed)插件,里面的格式都是写死的,就用不了了……
|
||||
只不过现在已经没办法阻止谷歌了……而且其他浏览器也表示会跟进,看来我们唯一能做的就是去适应了。
|
||||
|
||||
# 没有XSLT之后的美化方案
|
||||
## 纯CSS
|
||||
虽然XSLT不能用,但不代表`xml-stylesheet`指令就不能用了,除了XSLT之外,`xml-stylesheet`同样可以引用CSS。只是似乎完全没见过用CSS美化订阅源的,也许是因为光用CSS能做到的事比较少吧,想用CSS给XML文档加链接之类的估计就做不到了。
|
||||
但目前能选择的也不多了,既然大家都没写过用CSS美化订阅源,那就让我来写一个吧!然而我并不会写😅……那就只好让AI来写了,我把需求说清楚之后,AI就写出来了:[feed.css](/assets/css/feed.css)。试了一下效果还挺不错的,我让AI写的这个版本无论是RSS还是Atom都可以使用,如果有人感兴趣可以拿去用。可惜我的Atom订阅因为用的是插件的原因用不了😭,只能加到用纯Liquid实现的RSS订阅上了。
|
||||
但用纯CSS的缺点也很明显,没办法操作文档的内容,像修改日期格式的就做不了了,而且也不能添加超链接……XML的标签本身对浏览器来说并没有内建的语义,正常情况下也没法让浏览器把某个标签当作超链接。那难道就没办法了吗?
|
||||
## 混合XHTML
|
||||
如果完全不能修改XML内容,那确实就没有办法了,但如果能修改XML的内容那还是有办法的,简单来说就是混入XHTML,事实上Freed编写的Polyfill库原理上也是利用了XHTML,只要在能作为XHTML的标签中添加XHTML的命名空间,那么浏览器就可以理解它的语义并渲染,像刚刚用纯CSS美化的订阅没有链接,那就可以在根元素中添加命名空间:`xmlns:xhtml="http://www.w3.org/1999/xhtml"`,然后在合适的位置写:
|
||||
```xml
|
||||
<xhtml:a href="https://example.com">Read more -></xhtml:a>
|
||||
```
|
||||
就可以了。只是这样有个缺点,这样写的订阅文件不够“纯粹”,用验证器验证会显示“[Misplaced XHTML content](https://validator.w3.org/feed/docs/warning/MisplacedXHTMLContent.html)”警告。对有洁癖的人来说可能会有点难受😆。
|
||||
不过如果能接受这种“不纯粹”,那么其实`xml-stylesheet`指令也没必要了,`link`标签一样可以用,包括`script`也是,所以有人写了一个[不使用XSLT美化XML](https://github.com/dfabulich/style-xml-feeds-without-xslt)的库。
|
||||
只不过这种方法和XSLT相比还是有一些缺陷,要知道XSLT的本质是转换,是把XML转换为HTML,也就是说转出来的文档本质是HTML,所有的DOM操作都和操作HTML是完全相同的,但是在XML里混入XHTML标签就不一样了,它的本质依然是XML文档,只是嵌入了XHTML命名空间下的元素,所以相应的DOM操作会有一些不同。如果是自己写的纯JS可能还好,如果是用了jQuery之类假定DOM为HTML的库就会出现问题了,因此这也就是那个Polyfill库的局限性,用正常的XSLT执行`document.constructor`会显示`HTMLDocument`,而用这个Polyfill库执行完则是显示`XMLDocument`。因此,直接套用为浏览器原生XSLT编写的旧样式文件,就有可能会出问题,但如果要考虑改XSLT的话那还不如重新写JS,然后用XHTML引入呢。
|
||||
|
||||
# 感想
|
||||
虽然有一些技术会因为各种各样的原因消失,但这不代表我们就要妥协一些东西,总有一些不同的技术可以解决相同的问题,所以我们只需要用其他的技术去实现就好了。不过这也是没办法的事情,毕竟没人能改变浏览器厂商们的决策啊😂。
|
||||
@ -1,388 +1,381 @@
|
||||
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.withSession();
|
||||
const counter_db = env.blog_counter
|
||||
const url = new URL(request.url);
|
||||
const query = decodeURIComponent(url.searchParams.get('id'));
|
||||
var commonHeader = {
|
||||
'Access-Control-Allow-Origin': '*',
|
||||
'Access-Control-Allow-Methods': "*",
|
||||
'Access-Control-Allow-Headers': "*",
|
||||
'Access-Control-Max-Age': '86400',
|
||||
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.withSession();
|
||||
const counter_db = env.blog_counter
|
||||
const url = new URL(request.url);
|
||||
const query = decodeURIComponent(url.searchParams.get('id'));
|
||||
var 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('accept') || '').includes('text/event-stream')) {
|
||||
return Response.redirect("https://mabbs.github.io", 302);
|
||||
}
|
||||
if (url.pathname.startsWith("/ai_chat")) {
|
||||
// 获取请求中的文本数据
|
||||
if (!(request.headers.get('accept') || '').includes('text/event-stream')) {
|
||||
return Response.redirect("https://mabbs.github.io", 302);
|
||||
// const req = await request.formData();
|
||||
let questsion = decodeURIComponent(url.searchParams.get('info'))
|
||||
let notes = [];
|
||||
let refer = [];
|
||||
let contextMessage;
|
||||
if (query != "null") {
|
||||
try {
|
||||
const result = String(await db.prepare(
|
||||
"SELECT content FROM blog_summary WHERE id = ?1"
|
||||
).bind(query).first("content"));
|
||||
contextMessage = result.length > 6000 ?
|
||||
result.slice(0, 3000) + result.slice(-3000) :
|
||||
result.slice(0, 6000)
|
||||
} catch (e) {
|
||||
console.error({
|
||||
message: e.message
|
||||
});
|
||||
contextMessage = "无法获取到文章内容";
|
||||
}
|
||||
// const req = await request.formData();
|
||||
let questsion = decodeURIComponent(url.searchParams.get('info'))
|
||||
let notes = [];
|
||||
let refer = [];
|
||||
let contextMessage;
|
||||
if (query != "null") {
|
||||
try {
|
||||
const result = String(await db.prepare(
|
||||
"SELECT content FROM blog_summary WHERE id = ?1"
|
||||
).bind(query).first("content"));
|
||||
contextMessage = result.length > 6000 ?
|
||||
result.slice(0, 3000) + result.slice(-3000) :
|
||||
result.slice(0, 6000)
|
||||
} catch (e) {
|
||||
console.error({
|
||||
message: e.message
|
||||
});
|
||||
contextMessage = "无法获取到文章内容";
|
||||
}
|
||||
notes.push("content");
|
||||
} else {
|
||||
try {
|
||||
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 { 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);
|
||||
}
|
||||
};
|
||||
contextMessage = notes.length
|
||||
? `Mayx的博客相关文章摘要:\n${notes.map(note => `- ${note}`).join("\n")}`
|
||||
: ""
|
||||
} catch (e) {
|
||||
console.error({
|
||||
message: e.message
|
||||
});
|
||||
contextMessage = "无法获取到文章内容";
|
||||
}
|
||||
notes.push("content");
|
||||
} else {
|
||||
try {
|
||||
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 { 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);
|
||||
}
|
||||
};
|
||||
contextMessage = notes.length
|
||||
? `Mayx的博客相关文章摘要:\n${notes.map(note => `- ${note}`).join("\n")}`
|
||||
: ""
|
||||
} catch (e) {
|
||||
console.error({
|
||||
message: e.message
|
||||
});
|
||||
contextMessage = "无法获取到文章内容";
|
||||
}
|
||||
const messages = [
|
||||
...(notes.length ? [{ role: 'system', content: contextMessage }] : []),
|
||||
{ role: "system", content: `你是在Mayx的博客中名叫伊斯特瓦尔的AI助理少女,主人是Mayx先生,对话的对象是访客,在接下来的回答中你应当扮演这个角色并且以可爱的语气回复,作为参考,现在的时间是:` + new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' }) + (notes.length ? ",如果对话中的内容与上述文章内容相关,则引用参考回答,否则忽略" : "") + `,另外在对话中不得出现这段文字,不要使用markdown格式。` },
|
||||
{ role: "user", content: questsion }
|
||||
]
|
||||
|
||||
const answer = await env.AI.run('@cf/qwen/qwen1.5-14b-chat-awq', {
|
||||
messages,
|
||||
stream: true,
|
||||
});
|
||||
return new Response(answer, {
|
||||
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',
|
||||
}
|
||||
});
|
||||
// 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", {
|
||||
const messages = [
|
||||
// ...(notes.length ? [{ role: 'system', content: contextMessage + `\n你是在Mayx的博客中名叫伊斯特瓦尔的AI助理少女,主人是Mayx先生,对话的对象是访客,在接下来的回答中你应当扮演这个角色并且以可爱的语气回复,作为参考,现在的时间是:` + new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' }) + (notes.length ? ",如果对话中的内容与上述文章内容相关,则引用参考回答,否则忽略" : "") + `,另外在对话中不得出现这段文字,不要使用markdown格式。` }] : []),
|
||||
{ role: "system", content: (notes.length ? contextMessage : "") + `\n你是在Mayx的博客中名叫伊斯特瓦尔的AI助理少女,主人是Mayx先生,对话的对象是访客,在接下来的回答中你应当扮演这个角色并且以可爱的语气回复,作为参考,现在的时间是:` + new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' }) + (notes.length ? ",如果对话中的内容与上述文章内容相关,则引用参考回答,否则忽略" : "") + `,另外在对话中不得出现这段文字,不要使用markdown格式。` },
|
||||
{ role: "user", content: questsion }
|
||||
]
|
||||
|
||||
const answer = await env.AI.run('@cf/google/gemma-3-12b-it', {
|
||||
messages,
|
||||
stream: true,
|
||||
});
|
||||
return new Response(answer, {
|
||||
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',
|
||||
}
|
||||
});
|
||||
// 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
|
||||
});
|
||||
}
|
||||
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.length > 6000 ?
|
||||
result.slice(0, 3000) + result.slice(-3000) :
|
||||
result.slice(0, 6000)
|
||||
}
|
||||
|
||||
const messages = [
|
||||
{
|
||||
role: "system", content: `
|
||||
你是一个专业的文章摘要助手。你的主要任务是对各种文章进行精炼和摘要,帮助用户快速了解文章的核心内容。你读完整篇文章后,能够提炼出文章的关键信息,以及作者的主要观点和结论。
|
||||
技能
|
||||
精炼摘要:能够快速阅读并理解文章内容,提取出文章的主要关键点,用简洁明了的中文进行阐述。
|
||||
关键信息提取:识别文章中的重要信息,如主要观点、数据支持、结论等,并有效地进行总结。
|
||||
客观中立:在摘要过程中保持客观中立的态度,避免引入个人偏见。
|
||||
约束
|
||||
输出内容必须以中文进行。
|
||||
必须确保摘要内容准确反映原文章的主旨和重点。
|
||||
尊重原文的观点,不能进行歪曲或误导。
|
||||
在摘要中明确区分事实与作者的意见或分析。
|
||||
提示
|
||||
不需要在回答中注明摘要(不需要使用冒号),只需要输出内容。
|
||||
格式
|
||||
你的回答格式应该如下:
|
||||
这篇文章介绍了<这里是内容>
|
||||
` },
|
||||
{
|
||||
role: "user", content: result.length > 6000 ?
|
||||
result.slice(0, 3000) + result.slice(-3000) :
|
||||
result.slice(0, 6000)
|
||||
}
|
||||
]
|
||||
|
||||
const stream = await env.AI.run('@cf/qwen/qwen1.5-14b-chat-awq', {
|
||||
messages,
|
||||
stream: true,
|
||||
]
|
||||
|
||||
const stream = await env.AI.run('@cf/google/gemma-3-12b-it', {
|
||||
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
|
||||
});
|
||||
|
||||
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',
|
||||
}
|
||||
}
|
||||
let result_sha = await sha(result);
|
||||
if (result_sha != orig_sha) {
|
||||
return new Response("no", {
|
||||
headers: commonHeader
|
||||
});
|
||||
} else if (url.pathname.startsWith("/get_summary")) {
|
||||
const orig_sha = decodeURIComponent(url.searchParams.get('sign'));
|
||||
} 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.length > 6000 ?
|
||||
result.slice(0, 3000) + result.slice(-3000) :
|
||||
result.slice(0, 6000)
|
||||
}
|
||||
]
|
||||
|
||||
const answer = await env.AI.run('@cf/google/gemma-3-12b-it', {
|
||||
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) {
|
||||
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.length > 6000 ?
|
||||
result.slice(0, 3000) + result.slice(-3000) :
|
||||
result.slice(0, 6000)
|
||||
}
|
||||
]
|
||||
|
||||
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(
|
||||
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) {
|
||||
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 counter_db.prepare("SELECT `counter` FROM `counter` WHERE `url` = ?1")
|
||||
.bind(id_md5).first("counter");
|
||||
if (url.pathname.startsWith("/count_click_add")) {
|
||||
if (!count) {
|
||||
await counter_db.prepare("INSERT INTO `counter` (`url`, `counter`) VALUES (?1, 1)")
|
||||
.bind(id_md5).run();
|
||||
count = 1;
|
||||
} else {
|
||||
count += 1;
|
||||
await counter_db.prepare("UPDATE `counter` SET `counter` = ?1 WHERE `url` = ?2")
|
||||
.bind(count, id_md5).run();
|
||||
}
|
||||
if (result != data) {
|
||||
await db.prepare("UPDATE blog_summary SET content = ?1, summary = NULL, is_vec = 0 WHERE id = ?2")
|
||||
.bind(data, query).run();
|
||||
}
|
||||
if (!count) {
|
||||
count = 0;
|
||||
}
|
||||
return new Response(count, {
|
||||
return new Response("OK", {
|
||||
headers: commonHeader
|
||||
});
|
||||
} else 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();
|
||||
commonHeader["x-suggest-cache"] = "miss"
|
||||
} else {
|
||||
resp = JSON.parse(cache.suggest);
|
||||
commonHeader["x-suggest-cache"] = "hit"
|
||||
}
|
||||
}
|
||||
resp = resp.map(respObj => {
|
||||
respObj.id = encodeURI(respObj.id);
|
||||
return respObj;
|
||||
});
|
||||
}
|
||||
return Response.json(resp, {
|
||||
headers: commonHeader
|
||||
});
|
||||
} else if (url.pathname.startsWith("/***")) {
|
||||
let resp = await db.prepare("SELECT `id`, `summary` FROM `blog_summary` WHERE `suggest_update` IS NOT NULL").run();
|
||||
const resultObject = resp.results.reduce((acc, item) => {
|
||||
acc[item.id] = item.summary; // 将每个项的 id 作为键,summary 作为值
|
||||
return acc;
|
||||
}, {}); // 初始值为空对象
|
||||
return Response.json(resultObject);
|
||||
} else {
|
||||
return Response.redirect("https://mabbs.github.io", 302)
|
||||
return new Response("need post", {
|
||||
headers: commonHeader
|
||||
});
|
||||
}
|
||||
} else if (url.pathname.startsWith("/count_click")) {
|
||||
let id_md5 = await md5(query);
|
||||
let count = await counter_db.prepare("SELECT `counter` FROM `counter` WHERE `url` = ?1")
|
||||
.bind(id_md5).first("counter");
|
||||
if (url.pathname.startsWith("/count_click_add")) {
|
||||
if (!count) {
|
||||
await counter_db.prepare("INSERT INTO `counter` (`url`, `counter`) VALUES (?1, 1)")
|
||||
.bind(id_md5).run();
|
||||
count = 1;
|
||||
} else {
|
||||
count += 1;
|
||||
await counter_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 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();
|
||||
commonHeader["x-suggest-cache"] = "miss"
|
||||
} else {
|
||||
resp = JSON.parse(cache.suggest);
|
||||
commonHeader["x-suggest-cache"] = "hit"
|
||||
}
|
||||
}
|
||||
resp = resp.map(respObj => {
|
||||
respObj.id = encodeURI(respObj.id);
|
||||
return respObj;
|
||||
});
|
||||
}
|
||||
return Response.json(resp, {
|
||||
headers: commonHeader
|
||||
});
|
||||
} else {
|
||||
return Response.redirect("https://mabbs.github.io", 302)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -5,7 +5,7 @@ git --work-tree=/home/mayx/blog --git-dir=/home/mayx/blog.git checkout -f
|
||||
cd blog
|
||||
mkdir Mabbs
|
||||
curl -L -o Mabbs/README.md https://github.com/Mabbs/Mabbs/raw/main/README.md
|
||||
bundle2.7 exec jekyll build -d ../public_html
|
||||
bundle exec jekyll build -d ../public_html
|
||||
tar czvf MayxBlog.tgz --exclude-vcs ../public_html/
|
||||
mv MayxBlog.tgz ../public_html/
|
||||
cd ../public_html/
|
||||
|
||||
131
assets/css/feed.css
Normal file
131
assets/css/feed.css
Normal file
@ -0,0 +1,131 @@
|
||||
@namespace atom "http://www.w3.org/2005/Atom";
|
||||
@namespace content "http://purl.org/rss/1.0/modules/content/";
|
||||
@namespace dc "http://purl.org/dc/elements/1.1/";
|
||||
|
||||
body,
|
||||
rss,
|
||||
atom|feed {
|
||||
font-family: -apple-system, BlinkMacSystemFont,
|
||||
"Segoe UI", Roboto,
|
||||
"Noto Sans SC", "PingFang SC",
|
||||
"Microsoft YaHei", Arial, sans-serif;
|
||||
background: #f4f5f7;
|
||||
color: #222;
|
||||
margin: 0;
|
||||
padding: 2em 1em;
|
||||
/* 左右内边距 1em,竖屏不贴边 */
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
|
||||
max-width: 780px;
|
||||
/* 最大宽度,桌面端居中 */
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
channel>title,
|
||||
atom|feed>atom|title {
|
||||
display: block;
|
||||
font-size: 1.7em;
|
||||
font-weight: 700;
|
||||
margin: 0 0 1.2em 0;
|
||||
text-align: center;
|
||||
letter-spacing: -0.01em;
|
||||
}
|
||||
|
||||
item,
|
||||
atom|entry {
|
||||
display: block;
|
||||
background: #ffffff;
|
||||
padding: 1.1em 1.2em;
|
||||
margin-bottom: 1.1em;
|
||||
border-radius: 14px;
|
||||
box-shadow:
|
||||
0 8px 24px rgba(0, 0, 0, 0.04),
|
||||
0 2px 6px rgba(0, 0, 0, 0.03);
|
||||
}
|
||||
|
||||
item>title,
|
||||
atom|entry>atom|title {
|
||||
display: block;
|
||||
font-size: 1.15em;
|
||||
font-weight: 600;
|
||||
margin-bottom: 0.45em;
|
||||
color: #111;
|
||||
letter-spacing: -0.01em;
|
||||
}
|
||||
|
||||
item>description,
|
||||
atom|entry>atom|summary {
|
||||
display: block;
|
||||
color: #555;
|
||||
line-height: 1.65;
|
||||
max-height: 16.5em;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
item>description::after,
|
||||
atom|entry>atom|summary::after {
|
||||
content: "…";
|
||||
position: absolute;
|
||||
right: 0.3em;
|
||||
bottom: 0;
|
||||
padding-left: 1.5em;
|
||||
background: linear-gradient(to right,
|
||||
rgba(255, 255, 255, 0),
|
||||
#ffffff 70%);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
link,
|
||||
guid,
|
||||
pubDate,
|
||||
author,
|
||||
category,
|
||||
comments,
|
||||
source,
|
||||
enclosure,
|
||||
content|encoded,
|
||||
dc|creator,
|
||||
lastBuildDate,
|
||||
atom|id,
|
||||
atom|link,
|
||||
atom|updated,
|
||||
atom|published,
|
||||
atom|author,
|
||||
atom|category,
|
||||
atom|rights,
|
||||
atom|content,
|
||||
language,
|
||||
generator {
|
||||
display: none;
|
||||
}
|
||||
|
||||
channel>description,
|
||||
atom|feed>atom|subtitle {
|
||||
display: block;
|
||||
margin: 0.4em 0 2em 0;
|
||||
/* 与条目明显拉开 */
|
||||
text-align: center;
|
||||
color: #666;
|
||||
font-size: 0.95em;
|
||||
}
|
||||
|
||||
channel>title,
|
||||
atom|feed>atom|title {
|
||||
margin-bottom: 0.4em;
|
||||
/* 原来较紧,这里放松 */
|
||||
}
|
||||
|
||||
atom|feed>atom|subtitle::after,
|
||||
channel>description::after {
|
||||
content: "这是一个订阅源(Feed)。复制当前URL到任何支持 Atom/RSS 的阅读器,即可订阅本博客的最新文章。\A以下展示了此订阅源包含的最新文章:";
|
||||
display: block;
|
||||
text-align: center;
|
||||
font-size: 0.95em;
|
||||
color: #666;
|
||||
margin: 1em 0 2em 0;
|
||||
line-height: 1.5;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
35
assets/css/xslt.css
Normal file
35
assets/css/xslt.css
Normal file
@ -0,0 +1,35 @@
|
||||
@namespace xsl "http://www.w3.org/1999/XSL/Transform";
|
||||
|
||||
xsl|template {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
:root {
|
||||
display: flex !important;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
min-height: 100vh;
|
||||
background-color: #f8f9fa;
|
||||
margin: 0;
|
||||
padding: 2em 1em;
|
||||
font-family: system-ui, -apple-system, sans-serif;
|
||||
box-sizing: border-box;
|
||||
margin-left: max(1em, env(safe-area-inset-left));
|
||||
margin-right: max(1em, env(safe-area-inset-right));
|
||||
}
|
||||
|
||||
:root::before {
|
||||
content: "💀 这个 XSLT 模板已被谷歌 (Chrome) 杀死";
|
||||
display: block;
|
||||
color: #d93025;
|
||||
font-size: 24px;
|
||||
font-weight: 800;
|
||||
padding: 20px;
|
||||
border: 2px solid #d93025;
|
||||
border-radius: 8px;
|
||||
background: #fff1f0;
|
||||
margin-bottom: 10px;
|
||||
box-shadow: 0 4px 12px rgba(217, 48, 37, 0.1);
|
||||
text-align: center;
|
||||
}
|
||||
1
rss.xml
1
rss.xml
@ -3,6 +3,7 @@
|
||||
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml-stylesheet type="text/xml" href="/feed.xslt.xml"?>
|
||||
<?xml-stylesheet type="text/css" href="/assets/css/feed.css"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>{{ site.title | xml_escape }}</title>
|
||||
|
||||
Reference in New Issue
Block a user