mirror of
https://github.com/Mabbs/mabbs.github.io
synced 2025-09-28 16:35:42 +08:00
Compare commits
39 Commits
AR-Backup-
...
AR-Backup-
Author | SHA1 | Date | |
---|---|---|---|
09c88ebf18 | |||
2aed9e9d90 | |||
bfe05eef58 | |||
5713b1b477 | |||
52eb8cd0a7 | |||
c17b6f0971 | |||
e7ad732f8d | |||
8b6738dcef | |||
c52e7ded82 | |||
2df79d6a44 | |||
59688d1e1f | |||
86edb37efb | |||
d06229e705 | |||
385b842c80 | |||
1cd08a24bd | |||
c664d9e93a | |||
8dcfcaeb7b | |||
57f8e30bf4 | |||
ae5d4d5a8e | |||
7b2a1df6ef | |||
b7ec2f390f | |||
4da70fb10f | |||
3248be8d53 | |||
afc549167c | |||
8772648878 | |||
2d68e34467 | |||
dd5ab4867c | |||
033f7ce32b | |||
2d4609d0ab | |||
c61e461e5b | |||
5d1c867bf5 | |||
b2968c3001 | |||
e5e81ca40b | |||
4579da904a | |||
537c25eaa8 | |||
9f81162cb9 | |||
f87ba583aa | |||
28a80e08d5 | |||
93d07f16d4 |
10
BlogCard.svg
10
BlogCard.svg
@ -105,31 +105,31 @@
|
||||
<g class="stagger" style="animation-delay: 450ms" transform="translate(25, 0)">
|
||||
<line x1="12" y1="6.25" x2="19" y2="6.25"
|
||||
style="stroke:rgb(255,255,255);stroke-width:2"/>
|
||||
<text class="stat bold" x="25" y="12.5">{{ site.posts[0].title }}</text>
|
||||
<text class="stat bold" x="25" y="12.5">{{ site.posts[0].title | truncate: 18 }}</text>
|
||||
</g>
|
||||
</g><g transform="translate(0, 25)">
|
||||
<g class="stagger" style="animation-delay: 600ms" transform="translate(25, 0)">
|
||||
<line x1="12" y1="6.25" x2="19" y2="6.25"
|
||||
style="stroke:rgb(255,255,255);stroke-width:2"/>
|
||||
<text class="stat bold" x="25" y="12.5">{{ site.posts[1].title }}</text>
|
||||
<text class="stat bold" x="25" y="12.5">{{ site.posts[1].title | truncate: 18 }}</text>
|
||||
</g>
|
||||
</g><g transform="translate(0, 50)">
|
||||
<g class="stagger" style="animation-delay: 750ms" transform="translate(25, 0)">
|
||||
<line x1="12" y1="6.25" x2="19" y2="6.25"
|
||||
style="stroke:rgb(255,255,255);stroke-width:2"/>
|
||||
<text class="stat bold" x="25" y="12.5">{{ site.posts[2].title }}</text>
|
||||
<text class="stat bold" x="25" y="12.5">{{ site.posts[2].title | truncate: 18 }}</text>
|
||||
</g>
|
||||
</g><g transform="translate(0, 75)">
|
||||
<g class="stagger" style="animation-delay: 900ms" transform="translate(25, 0)">
|
||||
<line x1="12" y1="6.25" x2="19" y2="6.25"
|
||||
style="stroke:rgb(255,255,255);stroke-width:2"/>
|
||||
<text class="stat bold" x="25" y="12.5">{{ site.posts[3].title }}</text>
|
||||
<text class="stat bold" x="25" y="12.5">{{ site.posts[3].title | truncate: 18 }}</text>
|
||||
</g>
|
||||
</g><g transform="translate(0, 100)">
|
||||
<g class="stagger" style="animation-delay: 1050ms" transform="translate(25, 0)">
|
||||
<line x1="12" y1="6.25" x2="19" y2="6.25"
|
||||
style="stroke:rgb(255,255,255);stroke-width:2"/>
|
||||
<text class="stat bold" x="25" y="12.5">{{ site.posts[4].title }}</text>
|
||||
<text class="stat bold" x="25" y="12.5">{{ site.posts[4].title | truncate: 18 }}</text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
@ -27,7 +27,7 @@ if (daysold > 90) {
|
||||
|
||||
<hr />
|
||||
|
||||
{% include toc.html html=content sanitize=true %}
|
||||
{% include toc.html html=content sanitize=true h_max=3 %}
|
||||
|
||||
{{content}}
|
||||
|
||||
|
27
_posts/2022-10-19-web3.md
Normal file
27
_posts/2022-10-19-web3.md
Normal file
@ -0,0 +1,27 @@
|
||||
---
|
||||
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的项目,作为不受监管的平台只要知名度上来肯定会被滥用到死,希望他们能活得更长一些吧。
|
32
_posts/2022-11-08-cf-acc.md
Normal file
32
_posts/2022-11-08-cf-acc.md
Normal file
@ -0,0 +1,32 @@
|
||||
---
|
||||
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厂商了😆,果然还是良心厂商啊。
|
119
_posts/2022-11-16-tor.md
Normal file
119
_posts/2022-11-16-tor.md
Normal file
@ -0,0 +1,119 @@
|
||||
---
|
||||
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连接……
|
||||
|
||||
# 感想
|
||||
感觉洋葱网络其实还是对用户挺友好的,使用起来还是挺方便的,就像访问普通网络那样,大概也正是这种原因它才能成为匿名网络中最受欢迎的吧。
|
129
_posts/2022-11-23-i2p.md
Normal file
129
_posts/2022-11-23-i2p.md
Normal file
@ -0,0 +1,129 @@
|
||||
---
|
||||
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什么时候死啊😂)~~
|
77
_posts/2022-11-29-free-server.md
Normal file
77
_posts/2022-11-29-free-server.md
Normal file
@ -0,0 +1,77 @@
|
||||
---
|
||||
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这种小白都能免费用的容器云……只能说且用且珍惜了……
|
20
_posts/2022-12-12-bt-s3-comp.md
Normal file
20
_posts/2022-12-12-bt-s3-comp.md
Normal file
@ -0,0 +1,20 @@
|
||||
---
|
||||
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的依赖,啥都不支持还要装个全功能的依赖,实在是太垃圾了。不过小白不会写代码,再垃圾的东西该用还得用吧🤣。
|
44
_posts/2022-12-26-i2p-ssl.md
Normal file
44
_posts/2022-12-26-i2p-ssl.md
Normal file
@ -0,0 +1,44 @@
|
||||
---
|
||||
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证书(当然,也起不到验证网站身份的功能),不过由于这个网络的特点,也没办法中间人攻击,而且本来用的人就少,估计他们也是当玩吧😂,所以也没有认真搞。另外其实那个域名系统也一样,注册也很随便……
|
||||
不过搞的过程还是挺有意思的,如果有谁有兴趣也可以搞一个玩玩。
|
23
_posts/2023-01-01-summary.md
Normal file
23
_posts/2023-01-01-summary.md
Normal file
@ -0,0 +1,23 @@
|
||||
---
|
||||
layout: post
|
||||
title: 年终总结
|
||||
tags: [总结]
|
||||
---
|
||||
|
||||
</2022><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上整了备份,尽可能保证了博客能存活的概率。不过要是说不止发生了人类灭绝的问题,世界也毁灭了那当然所作的所有事情都失去了任何意义。当然如果考虑意义的话就没有意义了,其实就算啥也没有死了还是啥也没有,本来也看不见未来,期望其他人看到也只是活着的时候在做梦罢了。不过也不是完全没意义,毕竟这套方案除了在自己遇到问题保留信息之外还有反审查的的功能,当我整出一套成熟的方案时,其他人也可以用我曾经发现过的东西来做自己想做的事情。
|
||||
至于其他的事情……也快到毕业的时候了,最后只要能正常的毕业那就还能继续漂流下去(不然就只能靠接单养活自己了(可能也不完全是坏事))。
|
||||
总之接下来也没什么可期待的,我就想见证末日而已。
|
||||
|
||||
# 总结
|
||||
这下感觉……总之接下来无论是我还是其他人可能都不会变得更好吧。其他的我也想不出来什么了。
|
37
_posts/2023-02-03-mbp.md
Normal file
37
_posts/2023-02-03-mbp.md
Normal file
@ -0,0 +1,37 @@
|
||||
---
|
||||
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内存的版本,分配的时候只能分个4G,Windows11启动大概吃掉1~2G,现在软件吃内存也很厉害,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支持什么游戏,想了想我在Epicgames上白嫖了不少游戏,干脆下载下来看看都有啥支持吧。看了一圈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上,然后关键的东西用云电脑呢。
|
51
_posts/2023-02-22-cron.md
Normal file
51
_posts/2023-02-22-cron.md
Normal file
@ -0,0 +1,51 @@
|
||||
---
|
||||
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。
|
21
_posts/2023-03-12-php-async.md
Normal file
21
_posts/2023-03-12-php-async.md
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
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来做异步果然是难事啊,不如说大多数程序想要处理好多线程的问题都挺难的吧,也许如果项目经常遇到这种问题,应该考虑用其他语言来编写了呢。
|
26
_posts/2023-04-05-ai.md
Normal file
26
_posts/2023-04-05-ai.md
Normal file
@ -0,0 +1,26 @@
|
||||
---
|
||||
layout: post
|
||||
title: 关于最近人工智能的探索
|
||||
tags: [AI, LLM, 人工智能]
|
||||
---
|
||||
|
||||
最近人工智能发展的还真是不错啊……<!--more-->
|
||||
|
||||
# 起因
|
||||
最近ChatGPT为代表的人工智能发展的越来越好了,而且因为它对生产力的提升使得了解AI的人也越来越多了。虽然我也不算是对AI很感兴趣,但是我在Github Copilot刚出的时候就已经用上了,到现在一直在用(不过毕业了以后估计就用不了了吧😂)。不过那时候Copilot毕竟专业性比较高,知道的人也比较少,不像现在ChatGPT能在各行各业使用,甚至还有基于类似模型的Vtuber,比如[Neuro-sama](https://www.twitch.tv/vedel987),所以即使是普通人使用它,都能够减轻自己的工作压力,所以现在的人们都在讨论它。
|
||||
当然在这之前,还有一些很厉害的画图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的内存,所以只能跑7B(70亿参数)的模型,不过就这个模型也已经非常厉害了,虽然只能说英文,但是流畅程度,上下文关系的能力都非常不错,而且常见的知识都能正确回答,效果让我很满意。不过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吧,也能避免他们服务器出问题之类的原因导致生产力的下降吧。不过开源这种事情还是有点……毕竟还是不希望这些东西被人拿去商业化,更不希望出现国外一开源,国内就自研这种糟糕情况,也许开源产品比不上人家的商业产品也是正常的。
|
||||
|
||||
|
23
_posts/2023-05-22-rpi-win.md
Normal file
23
_posts/2023-05-22-rpi-win.md
Normal file
@ -0,0 +1,23 @@
|
||||
---
|
||||
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,他们不会真以为自己的芯片速度很快吧🤣?
|
301
_posts/2023-06-30-nucleic-acid.md
Normal file
301
_posts/2023-06-30-nucleic-acid.md
Normal file
@ -0,0 +1,301 @@
|
||||
---
|
||||
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技术
|
||||
API(Application 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 | | 组ID(1=普通用户,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.
|
33
_posts/2023-07-09-bitmo.md
Normal file
33
_posts/2023-07-09-bitmo.md
Normal file
@ -0,0 +1,33 @@
|
||||
---
|
||||
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)两个可以说是真的傻子才会相信,因为内容太离谱了,能上当的人太少了,而且我发完邮件他们还得回复,效率也很低下。这次遇到的这个诈骗就好多了,让被骗的人很有参与感,而且建好网站之后什么都不用做,只要等着有人打钱就好,效率非常高,而且做的还挺像回事,估计被骗的人不会少。
|
||||
不过之后想想也是,这种短信大概率就是那种群发的垃圾短信,实际上主动登录的人应该也不多吧😂。
|
129
_posts/2023-08-01-auth.md
Normal file
129
_posts/2023-08-01-auth.md
Normal file
@ -0,0 +1,129 @@
|
||||
---
|
||||
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厉害,一下子就解决了我的问题。
|
27
_posts/2023-09-06-satellite.md
Normal file
27
_posts/2023-09-06-satellite.md
Normal file
@ -0,0 +1,27 @@
|
||||
---
|
||||
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号通信,是不是觉得其实还好呢?
|
65
_posts/2023-09-24-rpi-ubuntu.md
Normal file
65
_posts/2023-09-24-rpi-ubuntu.md
Normal file
@ -0,0 +1,65 @@
|
||||
---
|
||||
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电台不能在普通电脑上操作其他不是和普通的电脑一样吗🤣?那买树莓派还有什么意义,不如买个二手手机,不过有了树莓派就感觉越垃圾越想挖掘它的作用,这可能就是它存在的意义吧🤣。
|
@ -4,7 +4,7 @@ window.onload=function (){
|
||||
o.imgRandom();
|
||||
}
|
||||
var o={
|
||||
aImg:['0001','0002','0003','0004','0005','0006','0007','0008','0009','0010','0011','0012','0013','0014','0015','0016','0017','0018','0019','0020','0021','0022','0023','0024','0025','0026','0027','0028','0029','0030','0031','0032','0033','0034','0035','0036','0037','0038','0039','0040','0041','0042','0043','0044','0045','0046','0047','0048','0049','0050','0051','0052','0053','0054','0055','0056','0057','0058','0059','0060','0061','0062','0063','0064','0065','0066','0067','0068','0069','0070','0071','0072','0073','0074','0075','0076','0077','0078','0079','0080','0081','0082','0083','0084','0085','0086','0087','0088','0089','0090','0091','0092','0093','0094','0095','0096','0097','0098','0099','0100','0101','0102','0103','0104','0105','0106','0107','0108','0109','0110','0111','0112','1001','1002','1003','1004','1005','1006','1007','1008','1009','1010','1011','1012','1013','1014','1015','1016','1017','1018','1019','1020','1021','1022','1023','1024','1025','1026','1027','1028','1029','1030','1031','1032','1033','1034','1035','1036','1037','1038','1039','1040','1041','1042','1043','1044','1045','1046','1047','1048','1049','1050','1051','1052','1053','1054','1055','1056','1057','1058','1059','1060','1061','1062','1063','1064','1065','1066','1067','1068','1069','1070','1071','1072','1073','1074','1075','1076','1077','1078','1079','1080','1081','1082','1083','1084','1085','1086','1087','1088','1089','1090','1091','1092','1093','1094','1095','2001','2002','2003','2004','2005','2006','2007','2008','2009','2010','2011','2012','2013','2014','2015','2016','2017','2018','2019','2020','2021','2022','2023','2024','2025','2026','2027','2028','2029','2030','2031','2032','2033','2034','2035','2036','2037','2038','2039','2040','2041','2042','2043','2044','2045','2046','2047','2048','2049','2050','2051','2052','2053','2054','2055','2056','2057','2058','2059','2060','2061','2062','2063','2064','2065','2066','2067','2068','2069','2070','2071','2072','2073','2074','2075','2076','2077','2078','2079','2080','3001','3002','3003','3004','3005','3006','3007','3008','3009','3010','3011','3012','3013','3014','3015','3016','3017','3018','3019','3020','3021','3022','3023','3024','3025','3026','3027','3028','3029','3030','3031','3032','3033','3034','3035','3036','3037','3038','3039','3040','3041','3042','3043','3044','3045','3046','3047'],
|
||||
aImg:['1001', '1002', '1003', '1004', '1005', '1006', '1007', '1008', '1009', '1010', '1011', '1012', '1013', '1014', '1015', '1016', '1017', '1018', '1019', '1020', '1021', '1022', '1023', '1024', '1025', '1026', '1027', '1028', '1029', '1030', '1031', '1032', '1033', '1034', '1035', '1036', '1037', '1038', '1039', '1040', '1041', '1042', '1043', '1044', '1045', '1046', '1047', '1048', '1049', '1050', '1051', '1052', '1053', '1054', '1055', '1056', '1057', '1058', '1059', '1060', '1061', '1062', '1063', '1064', '1065', '1066', '1067', '1068', '1069', '1070', '1071', '1072', '1073', '1074', '1075', '1076', '1077', '1078', '1079', '1080', '1081', '1082', '1083', '1084', '1085', '1086', '1087', '1088', '1089', '1090', '1091', '1092', '1093', '1094', '1095', '1096', '1097', '1098', '1099', '1100', '1101', '1102', '1103', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019', '2020', '2021', '2022', '2023', '2024', '2025', '2026', '2027', '2028', '2029', '2030', '2031', '2032', '2033', '2034', '2035', '2036', '2037', '2038', '2039', '2040', '2041', '2042', '2043', '2044', '2045', '2046', '2047', '2048', '2049', '2050', '2051', '2052', '2053', '2054', '2055', '2056', '2057', '2058', '2059', '2060', '2061', '2062', '2063', '2064', '2065', '2066', '2067', '2068', '2069', '2070', '2071', '2072', '2073', '2074', '2075', '2076', '2077', '2078', '2079', '2080', '2081', '2082', '2083', '2084', '2085', '2086', '2087', '2088', '2089', '2090', '2091', '2092', '2093', '2094', '2095', '2096', '3001', '3002', '3003', '3004', '3005', '3006', '3007', '3008', '3009', '3010', '3011', '3012', '3013', '3014', '3015', '3016', '3017', '3018', '3019', '3020', '3021', '3022', '3023', '3024', '3025', '3026', '3027', '3028', '3029', '3030', '3031', '3032', '3033', '3034', '3035', '3036', '3037', '3038', '3039', '3040', '3041', '3042', '3043', '3044', '3045', '3046', '3047', '3048', '3049', '3050', '3051', '3052', '3053', '3054', '3055', '3056', '3057', '3058', '3059', '3060', '3061', '3062', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100', '101', '102', '103', '104', '105', '106', '107', '108', '109', '110', '111', '112', '113', '114', '115', '116', '117', '118', '119', '120', '121', '122', '5410', '5491', '5510', '5511', '5512', '5543', '5546', '5547', '5548', '5549', '5550', '5551', '5552', '5656', '5685', '5798', '6406', '6525', '7728812653'],
|
||||
imgRandom:function (){
|
||||
var img=document.getElementsByTagName("img")[0];
|
||||
var b=Math.random()*10000;
|
||||
@ -14,5 +14,5 @@ img.src="https://nodejs.wikimoe.com:667/card/0/"+this.aImg[b]+".jpg";
|
||||
};
|
||||
</script> <body>
|
||||
<h1>您抽到了:</h1><hr>
|
||||
<img src="">
|
||||
<img src="" onerror="o.imgRandom();">
|
||||
</body></html>
|
||||
|
@ -58,8 +58,6 @@ title: 首页 - 我的文章
|
||||
|
||||
<a href="{% unless site.github %}https://mabbs.github.io{% endunless %}/pixiv-index/">Pixiv图片索引API</a><br>
|
||||
|
||||
<a href="/iwara.html">Iwara Download</a><br>
|
||||
|
||||
<a href="/card.html">抽卡</a> - 由<a href="https://github.com/eeg1412/">广树</a>大佬提供卡牌<br>
|
||||
|
||||
<a href="/message.html">留言板</a><br>
|
||||
|
35
iwara.html
35
iwara.html
@ -1,35 +0,0 @@
|
||||
<title>Iwara Downloader</title>
|
||||
<h1>Iwara Downloader</h1>
|
||||
URL: <input type="text" id="url" /> <button onclick="resolve()">Resolve</button>
|
||||
<table id="result-table" border="1" style="display:none">
|
||||
<tr><th>Resolution</th><th>URI</th><th>IP</th><th>Host</th></tr>
|
||||
<tbody id="result"></tbody>
|
||||
</table>
|
||||
<script src="/js/jquery.min.js"></script>
|
||||
<script>
|
||||
function resolve(){
|
||||
$("#result-table").css('display', "none");
|
||||
$("#result").empty();
|
||||
$.get("https://iwara.mayx.eu.org/api/video/" + $("#url")[0].value.split("/").pop(), function(data){
|
||||
if(!data.length){
|
||||
alert("Resolve Failed");
|
||||
return;
|
||||
}
|
||||
$("#result-table").css('display', "table");
|
||||
var hosts = new Set();
|
||||
console.log(data);
|
||||
data.forEach(function(downuri){
|
||||
var host = downuri["uri"].split("/")[2];
|
||||
hosts.add(host);
|
||||
$("#result").append("<tr><td>" + downuri["resolution"] + '</td><td><a href="' + downuri["uri"] + '">Download</a></td><td class="' + host.split(".")[0] + '">Loading...</td><td>' + host + '</td></tr>');
|
||||
});
|
||||
hosts.forEach(function(host){
|
||||
$.get("https://dns.mayx.eu.org/resolve?type=A&name=" + host, function(result){
|
||||
$("." + host.split(".")[0]).each(function(i, element){
|
||||
element.innerHTML = result["Answer"][0]["data"];
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
</script>
|
11
links.md
11
links.md
@ -8,15 +8,16 @@ tags: [links]
|
||||
|
||||
| Links | Introduce |
|
||||
| - | - |
|
||||
| [花火学园](https://www.sayhuahuo.com/) | 和谐融洽的ACG交流以及资源聚集地 |
|
||||
| [资源统筹局](https://gkdworld.xyz/) | 统筹保管用户分享的资源 |
|
||||
| [贫困的蚊子](https://qwq.moe/) | *No description* |
|
||||
| [花火学园](https://www.sayhuahuo.shop/) | 和谐融洽的ACG交流以及资源聚集地 |
|
||||
| [资源统筹局](https://gkdworld.com/) | 统筹保管用户分享的资源 |
|
||||
| [贫困的蚊子](https://mozz.ie/) | *No description* |
|
||||
| [极客兔兔](https://geektutu.com/) | 致力于分享有趣的技术实践 |
|
||||
| [维基萌](https://www.wikimoe.com/) | 萌即是正义!一名热爱acg的前端设计师的小站! |
|
||||
| [7gugu's blog](https://www.7gugu.com/) | 一个用来存放我爱好的地方,编程,摄影之类的空间 |
|
||||
| [云游君](https://www.yunyoujun.cn) | 希望能成为一个有趣的人。 |
|
||||
| [探索子](https://beyondstars.xyz/) | 迈向未知·探索边界 |
|
||||
| [云游君](https://www.yunyoujun.cn/) | 希望能成为一个有趣的人。 |
|
||||
| [Kingfish404](https://blog.kingfish404.cn/) | Stay curious,stay naive. WUT. Jin Yu's Blog |
|
||||
| [FKUN](https://blog.fkun.tech/) | *No description* |
|
||||
| [Sinofine](https://sinofine.me/) | *No description* |
|
||||
|
||||
|
||||
## Links申请
|
||||
|
@ -9,12 +9,12 @@ title: 代理列表
|
||||
考虑到中国对于Github Pages在很多地区都有一定程度的解析异常,所以我为我的博客做了很多反向代理。以下代理站均为官方授权:
|
||||
(根据可能的可用性排序)
|
||||
- <https://blog.mayx.workers.dev/>
|
||||
- <https://mayx.deno.dev/>
|
||||
- <https://mayx.cyclic.app/>
|
||||
- <https://mayx.glitch.me/>
|
||||
- <https://mayx.mabbs.repl.co/>
|
||||
- <https://blog.mayx.cf/>
|
||||
- <https://blog.mayx.tk/>
|
||||
- <https://yuki.gear.host/>
|
||||
- <https://mayx.tech/>
|
||||
|
||||
# 镜像列表
|
||||
由于[Github已经不再可信](/2022/01/04/banned.html),所以现在提供以下镜像站:
|
||||
@ -22,7 +22,9 @@ title: 代理列表
|
||||
- <https://mayx.pages.dev/>
|
||||
- <https://mayx.eu.org/>
|
||||
- <https://mayx.vercel.app/>
|
||||
- <https://mayx.netlify.app/>
|
||||
- <https://mayx.4everland.app/>
|
||||
- <https://xu4qy-yiaaa-aaaag-aa2iq-cai.raw.ic0.app/>
|
||||
|
||||
# 其他平台博客(备用)
|
||||
- <https://unmayx.blogspot.com/>
|
||||
@ -34,3 +36,4 @@ title: 代理列表
|
||||
- <https://mayx.cnblogs.com/>
|
||||
- <https://mayx.xlog.app/>
|
||||
- <https://mayx.proselog.com/>
|
||||
- <https://mayx.substack.com/>
|
||||
|
Reference in New Issue
Block a user