在指南开始之前,请确保你有一颗聪明的头脑和可以折腾的时间,否则请等时机合适再进行配置!
在使用过程中如果遇到什么问题,请前往Issues · GamerNoTitle/SRCloud-AutoCheckin (github.com)发起新的issue来提出,不要在本页面的评论区提出问题(因为追踪性太差了)
原图链接:https://t.me/PaffChannel/253
⚠️请不要进行宣传,谢谢!一旦发现宣传就删库跑路!使用过程中如果出现bug可能会使用您的日志进行错误追踪
先点个STAR,我们马上开始我们的教程:D
如果你选择使用青龙面板,那么你需要执行以下操作
首先点开订阅管理,把这个命令粘贴进去
1 | ql repo http://git.bili33.top/GamerNoTitle/SRCloud-AutoCheckin.git "main" |
然后他会自动识别,并填入相应的内容,你只需要修改定时规则即可,名称按照自己需要修改
你可以改成下面这个(Github链接,国内可能访问不了)
1 | ql repo https://github.com/GamerNoTitle/SRCloud-AutoCheckin.git "main" |
保存以后点击运行按钮更新一下订阅
在定时任务中你就能找到刚刚更新的内容,但是还不能够使用,我们还需要配置依赖和环境变量
我们需要三个python3依赖,分别是requests
、sentry-sdk
和pyyaml
,分别把他们装好
然后点到环境变量,新建名为SRC_CONFIG
的变量,把我们的配置填进去,点击保存
非常不推荐使用此方法,容易导致整个项目(不仅是你的Fork,还有我的源仓库)被封禁
首先你需要先打开本脚本的仓库GamerNoTitle/SRCloud-AutoCheckin: 云·星穹铁道自动签到脚本 (github.com),点击右上角的fork按钮,接着点击下面绿色的Create fork
来创建一个分支
然后点击上面的Settings
,导航到Secrets
->Actions
页面下,点击New repository secret
将配置填充入名字为SRC_CONFIG
的Secret中(内容获取请参照配置内容获取一节)
事实上,对于现版本的Github Action,只需要把KeepActionAlive
打开即可,下面的这些操作是旧版本的Action所需要的
因为Github在仓库没有push三个月后会停用仓库的一切Action,所以说我们需要进行保活。
在启用KeepActionAlive
之前,你需要创建一个用来push更改的GITHUB_TOKEN
右上角点击自己的头像,然后点击Settings
,然后在左侧的导航栏找到Developer Settings
然后在左边找到Personal Access Tokens
,点击Generate new token
生成一个token,名字填写为GITHUB_TOKEN
把过期时间设置为No expiration
,然后依次勾选下面内容
然后点最下面的绿色按钮Generate token
即可
在Action页面启用KeppActionAlive
即可!脚本会在每个月的1号自动推送更新从而达到保活的目的。
你填入环境变量的配置应该具有下面这样的格式(解释请看注释)
1 | # 使用前请阅读文档:https://bili33.top/posts/SRCloud-AutoCheckin-Manual |
如果你只需要一个账号,那就直接把标着第二个账号那一行及以下全删掉就行了,例如(下面的例子删除了注释)
1 | # 使用前请阅读文档:https://bili33.top/posts/MHYY-AutoCheckin-Manual-Gen2 |
但如果你需要多个账号(例如我需要三个账号),那就需要把重复的部分复制粘贴(有几个账号就有几个相同的配置项),例如(下面的例子删除了注释)
1 | # 使用前请阅读文档:https://bili33.top/posts/MHYY-AutoCheckin-Manual/ |
合法的配置内容是完全符合yaml的文档格式的,容易被忽略的一点是:配置项的冒号后面需要带有空格
1 | # 使用前请阅读文档:https://bili33.top/posts/SRCloud-AutoCheckin-Manual |
而冒号后不带有空格的是不符合要求的,如
1 | # 使用前请阅读文档:https://bili33.top/posts/SRCloud-AutoCheckin-Manual |
当你在运行脚本的时候,如果看到了如下的提示
1 | Traceback (most recent call last): |
并且你确信自己已经加好了变量,那么请考虑一下你的的每个配置项的冒号后面是不是加上了空格
打开云原神网页版的链接云·星穹铁道 (mihoyo.com),完成登录,完成后应该会是下图的样子
这时候按一下键盘上的F12把开发者工具打开,然后点击顶上的网络(Network
),按下键盘上的F5进行刷新页面操作
开发者控制台会弹出很多的请求,在左上角的搜索框里面搜索login
,点击最下面的一个条目
在右侧会显示很多的信息,拉到最底下,就可以看到我们所需要的信息了
里面的内容具有以下对应关系
token
是里面的x-rpc-combo_token
type
是里面的x-rpc-client_type
sysver
是里面的x-rpc-sys_version
,一般为电脑的系统(Windows 11会写作Windows 10,不用管,写什么填什么)deviceid
是里面的x-rpc-device_id
,一般为UUIDdevicename
是里面的x-rpc-device_name
,应该固定为Unknown
devicemodel
是里面的x-rpc-device_model
,应该固定为Unknown
appid
是里面的x-rpc-app_id
,留空
你需要安装一个手机上的抓包软件(例如HttpCanary,或者如果你能够用fiddler电脑运行去抓也行)
一定要记得装抓包软件提供的证书,要不然解不了SSL连接,一定要先登录并成功进去了再启动抓包软件!!!
这里面只要是个HTTP链接,随便一个里面都有我们所需要的东西
token
是里面的x-rpc-combo_token
type
是里面的x-rpc-client_type
sysver
是里面的x-rpc-sys_version
,一般为安卓的版本deviceid
是里面的x-rpc-device_id
,一般为UUIDdevicename
是里面的x-rpc-device_name
,一般为手机厂商名(如Xiaomi)
+设备入网型号
devicemodel
是里面的x-rpc-device_model
,一般为设备入网型号
appid
是里面的x-rpc-app_id
,固定为1953445976
具体如图所示,这个要得益于昨天Github的一个更新GitHub Actions - Updating the default GITHUB_TOKEN permissions to read-only | GitHub Changelog
在仓库里面点击Settings
=> Actions
=> General
,往下拉找到Workflow permissions
,把原来的Read repository contents and packages permissions
改为上面的Read and write permissions
,然后点击下面的Save
键就可以了
请前往Issues · GamerNoTitle/SRCloud-AutoCheckin (github.com)发起新的issue来提出,不要在本页面的评论区提出问题(因为追踪性太差了)
]]>在指南开始之前,请确保你有一颗聪明的头脑和可以折腾的时间,否则请等时机合适再进行配置!
在使用过程中如果遇到什么问题,请前往Issues · GamerNoTitle/MHYY (github.com)发起新的issue来提出,不要在本页面的评论区提出问题(因为追踪性太差了)
⚠️请不要进行宣传,谢谢!一旦发现宣传就删库跑路!使用过程中如果出现bug可能会使用您的日志进行错误追踪,详情请见隐私政策
先点个STAR,我们马上开始我们的教程:D
如果你选择使用青龙面板,那么你需要执行以下操作
首先点开订阅管理,把这个命令粘贴进去
1 | ql repo http://git.bili33.top/GamerNoTitle/MHYY.git "main" |
然后他会自动识别,并填入相应的内容,你只需要修改定时规则即可,名称按照自己需要修改
你可以改成下面这个(Github链接,国内可能访问不了)
1 | ql repo https://github.com/GamerNoTitle/MHYY.git "main" |
保存以后点击运行按钮更新一下订阅
在定时任务中你就能找到刚刚更新的内容,但是还不能够使用,我们还需要配置依赖和环境变量
我们需要三个python3依赖,分别是requests
、sentry-sdk
和pyyaml
,分别把他们装好
然后点到环境变量,新建名为MHYY_CONFIG
的变量,把我们的配置填进去,点击保存
原仓库在2023/02/03收到Github通知封禁,镜像仓库在GamerNoTitle/MHYY: Disabled Action, if you need it, enable it by yourself (github.com),本项目仓库的Github Action已经被我手动禁用,如果需要使用Action版本,请将~/.github/workflows
文件夹内的两个文件后面的.disabled
删掉!
首先你需要先打开本脚本的仓库GamerNoTitle/MHYY: 米哈云游(云原神)自动签到脚本,让你每天都拿到15分钟~ (github.com),点击右上角的fork按钮,接着点击下面绿色的Create fork
来创建一个分支
然后点击上面的Settings
,导航到Secrets
->Actions
页面下,点击New repository secret
(如图)
将配置填充入名字为MHYY_SECRET
的Secret中(内容获取请参照配置内容获取一节)
事实上,对于现版本的Github Action,只需要把KeepActionAlive
打开即可,下面的这些操作是旧版本的Action所需要的
因为Github在仓库没有push三个月后会停用仓库的一切Action,所以说我们需要进行保活。
在启用KeepActionAlive
之前,你需要创建一个用来push更改的GITHUB_TOKEN
右上角点击自己的头像,然后点击Settings
,然后在左侧的导航栏找到Developer Settings
然后在左边找到Personal Access Tokens
,点击Generate new token
生成一个token,名字填写为GITHUB_TOKEN
把过期时间设置为No expiration
,然后依次勾选下面内容
然后点最下面的绿色按钮Generate token
即可
在Action页面启用KeppActionAlive
即可!脚本会在每个月的1号自动推送更新从而达到保活的目的。
你填入环境变量的配置应该具有下面这样的格式(解释请看注释)
1 | # 使用前请阅读文档:https://bili33.top/posts/MHYY-AutoCheckin-Manual-Gen2 |
如果你只需要一个账号,那就直接把标着第二个账号那一行及以下全删掉就行了,例如(下面的例子删除了注释)
1 | # 使用前请阅读文档:https://bili33.top/posts/MHYY-AutoCheckin-Manual-Gen2 |
但如果你需要多个账号(例如我需要三个账号),那就需要把重复的部分复制粘贴(有几个账号就有几个相同的配置项),例如(下面的例子删除了注释)
1 | # 使用前请阅读文档:https://bili33.top/posts/MHYY-AutoCheckin-Manual/ |
合法的配置内容是完全符合yaml的文档格式的,容易被忽略的一点是:配置项的冒号后面需要带有空格
1 | # 使用前请阅读文档:https://bili33.top/posts/MHYY-AutoCheckin-Manual-Gen2 |
而冒号后不带有空格的是不符合要求的,如
1 | # 使用前请阅读文档:https://bili33.top/posts/MHYY-AutoCheckin-Manual-Gen2 |
当你在运行脚本的时候,如果看到了如下的提示
1 | Traceback (most recent call last): |
并且你确信自己已经加好了变量,那么请考虑一下你的的每个配置项的冒号后面是不是加上了空格
打开云原神网页版的链接云·原神 (mihoyo.com),完成登录,完成后应该会是下图的样子
这时候按一下键盘上的F12把开发者工具打开,然后点击顶上的网络(Network
),按下键盘上的F5进行刷新页面操作
开发者控制台会弹出很多的请求,在左上角的搜索框里面搜索login
,点击最下面的一个条目
在右侧会显示很多的信息,拉到最底下,就可以看到我们所需要的信息了
里面的内容具有以下对应关系
token
是里面的x-rpc-combo_token
type
是里面的x-rpc-client_type
sysver
是里面的x-rpc-sys_version
,一般为电脑的系统(Windows 11会写作Windows 10,不用管,写什么填什么)deviceid
是里面的x-rpc-device_id
,一般为UUIDdevicename
是里面的x-rpc-device_name
,应该固定为Unknown
devicemodel
是里面的x-rpc-device_model
,应该固定为Unknown
appid
是里面的x-rpc-app_id
,留空
你需要安装一个手机上的抓包软件(例如HttpCanary,或者如果你能够用fiddler电脑运行去抓也行)
一定要记得装抓包软件提供的证书,要不然解不了SSL连接,一定要先登录并成功进去了再启动抓包软件!!!
这里面只要是个HTTP链接,随便一个里面都有我们所需要的东西
其中,这里面的东西与变量有如下的对应关系
token
是里面的x-rpc-combo_token
type
是里面的x-rpc-client_type
sysver
是里面的x-rpc-sys_version
,一般为安卓的版本deviceid
是里面的x-rpc-device_id
,一般为UUIDdevicename
是里面的x-rpc-device_name
,一般为手机厂商名(如Xiaomi)
+设备入网型号
devicemodel
是里面的x-rpc-device_model
,一般为设备入网型号
appid
是里面的x-rpc-app_id
,固定为1953439974
具体如图所示,这个要得益于昨天Github的一个更新GitHub Actions - Updating the default GITHUB_TOKEN permissions to read-only | GitHub Changelog
在仓库里面点击Settings
=> Actions
=> General
,往下拉找到Workflow permissions
,把原来的Read repository contents and packages permissions
改为上面的Read and write permissions
,然后点击下面的Save
键就可以了
请前往Issues · GamerNoTitle/MHYY (github.com)发起新的issue来提出,不要在本页面的评论区提出问题(因为追踪性太差了)
]]>省流:一年不活动的原因是复读,如果你还想详细了解的话请往下看
我想了很久,但还是决定写这样的一篇文章,同时这也能够解答本站的各位访客和QQ上的好友们:为什么身为大学生的我不经常在线?又或者是:为什么我只有周末才冒泡?
此文章带有很强的主观性,或许我本人是在心理有问题的情况下写下此文章也说不定,肯定有些人看了本文章会觉得“怎么会有这么傻的人放着好好的大学不读自己选择退学复读”这样的,但说白了这个选择是我自己做出的,是我自己权衡了很多方面才做出的,我也不是说要别人去理解我什么的,或许就是在发牢骚,但是我不希望有人在这里进行网络攻击,毕竟网络攻击的成本很低,维权的成本很高,对别人造成的伤害那是不可计量的。如果你是带着“键盘侠”的身份来到本站,那么对不起,本站不欢迎你,你现在就可以点击右上角的×退出了!
本文将按照时间顺序,从高考拿到成绩那个时候起,叙述我从报考大学
=>在大学学习
=>选择退学
=>目前状态
的整个过程,需要再次强调此文章带有很强的主观性,或许我本人是在心理有问题的情况下写下此文章也说不定,但是我不希望有人看了以后以此来攻击我
本文中含有大量的职场PUA,而且是因为你所在的环境无法反驳的那种,请控制好自己的情绪
我是2021年的高考考生,在2023年选择了退学,退学的原因有多个方面,下面会讲。目前已经报名了某学校的复读班,将于2023年7月31日入学。在入学之后,直到2024年高考结束之前,我都会处于“隐身”的状态。请大家尽量减少找我的次数,找我我也不能够及时回复;本站会一直存在,只不过会沉寂一年时间。
我的成绩算不上很出彩,甚至处于一个很尴尬的位置:分数559
,排名600xx
,想上985没戏,想上好的211很难,想要随便挑专业的211那都是211的末尾了;一本是肯定没问题的。
我承认,我的大三科问题很大,特别是英语本该拿高分的,但是最后出来只有114,但这都是后日谈了
在填志愿上,我们花费了很长时间,但是在这里,容我先插入一小段内容
高考完的那一周,我妈问我政审的事情,其实我本来就没想着去弄这个东西,因为就没有考虑过提前批;我妈说跟我玩得好的那个同学(以下简称F)他都弄了政审了,让我也去弄一个,说多一个选择。我向来是顺着我妈的意思走的(后日谈:我对我个人评价是极其容易受到他人影响,只能说这次是个教训),所以我就去弄了一下政审。还记得当时政审的最后一个环节是要到居委会那里签字然后送去高中,正巧当时我们这里被封小区了。就是有一名新冠患者他出入过我们小区这附近,然后给我们封了,虽然封的时间不长,但是时间点很尴尬。
得到封小区的消息是下午,打算第二天去跑最后一个步骤然后送表的。当时也是接近DDL(死线Deadline)了,很紧急,正巧我爸当天晚上加班没回来,所以第二天就隔着小区的门,把表给我爸去跑这最后一步,才成功送上去的。这样才有了报考提前批的资格。
就像我上面说的,填报志愿是很麻烦的一件事情,要斟酌很多东西。讲真,我是一个重度的专业控,我是倾向于计算机类的专业的,所以提前批那边,都填的是计算机类的那些,不过填的都是什么陆工大、空工大之类的那种,毕竟搞工科的军校这种专业才多一点,然后翻着翻着,看到一个陆军的学院,分数还比较低,叫做陆军特种作战学院(没错特种这两个字给我坑惨了),然后我就填在了最底下(广东提前批可以填8个专业组)
本科批这边都是抱着冲一冲的心态填的,所以填的是一些看起来不错的院校,不过现在谈这个也没啥用,毕竟本科批就没用上,当时想的是最低是黑龙江大学(别问为什么,问就是有熟人在那里读大学)来保底的,不过到最后都是没用的
填完了以后,点击保存,锁定了专业
我妈拍了我的专业,然后跑去武装部,问她认识的人说我这个录取怎么样,结果武装部的那位大哥说:你把最底下那个“陆军特种作战学院”放在第一个可能会好录一点,然后我妈回来就跟我说把它放在第一个。我上面也说过了,我是一个比较随我妈的人(我现在恨不得抽死我自己),然后就……就……就放了。我没想着给提前批录取的,本来对军警院校就没什么想法,我只是单纯听我妈的试试水而已
没错,提前批是要体检的。我参加的是军队院校选拔体检。去到指定的医院后,首次体检是不让你带任何电子产品的(我估计是怕耽误进程,时间紧任务重),我就进去查完该查的东西,然后就回家了;过了几天,广东省教育考试院的微信公众号发了体检结果,然后我点进去看,说让我复检一次,然后就在那一周晚些时候又去了一次,就只让查了血液一项,可能是因为我的血液第一次不太达标,然后想确认一下???
又过了几天,还是那个公众号发布了复检结果——我过了
广东省的录取是先提前批录取,提前批录取完了以后就本科批录取,我还在家里打五把CSGO呢,结果我妈过来说录取结果出了,我给陆特录走了
我当时是很懵逼的,就像我说的,我没想着能被提前批录取,就我这烂成绩基本上抢不到的。事后我想:应该是写着特种两个字,然后没人报……当我拿到提前批的录取情况的时候,我看到我那个专业广东省录取2个人,他那里写的录取最低分:559
,录取最低名次:600xx
,我就知道我是那个里面的第二个……
高考报考军校——陆军特种作战学院 - 知乎 (zhihu.com) 这个链接里面有当年录取最低分的图
当时我妈问我:你确定要去军校了嘛?我当时回复是:都被录了,能不去嘛,不去算不服从兵役那我咋办……
那没办法,录取都录取了,就只能去了
过了几天,一份毫无诚意的录取通知书送到了家里。为什么说是毫无诚意?因为它就像是一张贺卡那样,然后里面就简短的几句话。说实话,我当时脑袋很空白,我也不知道该怎么办。
就如大家看到的平时的我,一个标准的二次元OTAKU(肥宅),然后研究着自己的代码,身体真的不硬朗,而“特战”两个字,说明这个东西纯纯靠身体吃饭,我还是很担忧……
因为我们开学去的学校是它的分校,就在广州里面,然后当时广州的疫情有点严重,于是就……推迟了十天开学,最后我们在八月底进行入学了……
就像我上面说的,那个时候是新冠肺炎的疫情期,所以当时过去就让我们理所当然的隔离了。我是第二天中午到的(报到时间是两天),在那之前已经有很多人陆续抵达了这个地方,然后隔离的时候住的地方就没有按照原来给我们分的班级来分,就来一个人就随便丢,我过去的时候给我丢在了二楼的应该是库房的地方,反正这里很空,就什么东西都没有。在那里管我们的人让我们叫他们“班长”(其实这个在同级的人之间实在不知道怎么称呼就是这么叫的),他们肩章是一杠(学员衔,军衔相关内容请阅读百度百科),然后他们跟我们说“带星星的要叫首长”,说白了就是人军衔比你高,所以直接叫首长
这个隔离期持续了好像是两天,过去了以后就上交手机了,然后他会让你把手机密码去掉(事实上只要你是基层兵你就不能设置密码,他要查),然后会开始翻你手机里面的东西,所以小蓝鸟啦、TG啥的东西得提前删掉。
住的地方里面没有独立的厕所和卫浴,需要到走廊尽头的“水房”里面解决,浴室就像是华附那种(实在想不出来可以百度一下华附的浴室是咋样的)
过了隔离期就像正常进入基层那样子有新训(新兵集训),不过里面是三个月而已;内容嘛:跑的、爬的、站的、走的等等都有(不能细说请理解);带领我们训练的是大三的学员(高年级带新生新训的机制);当时我记得让我们填过基本信息表,里面有爱好那一栏,然后我填的是“编程”(毕竟我就是做这个的),可能就是这一栏,让我楼下的教导员印象比较深吧
我们楼下有两个人,一个叫做队长(下面简称C某
),一个叫做教导员(下面简称L某H
),是专门管我们整个队的(我们这个年级是1、2、3队,我是1队)
新训其实过得比较快,但是说白了都是靠身体吃饭,身体素质不好真撑不住,所以对我这个Otaku来说还是挺那啥的……
新训过去后,我们就进入正式学习的时候了,跟地方大学(我们这个地方管非军队院校都叫做地方大学
)比就是:科目更多、时间更少、学的不深。科目多主要是因为你不仅要学地方大学学的文化知识,你还得有技能训练(真的是要了老命的东西);时间少体现在下面及格方面:技能训练占用平时的空闲时间、队内管理有事情会占用你的空闲时间、规章制度会打乱你的时间。对内管理这一块下面再讲;学的不深是我觉得我不能在这里呆着的重点原因之一:这个地方的学业水平连专科都不如(这里说的不是陆工大啥的那些,仅限于我在的这个地方,军队院校名单见【知乎】),如果到时候真的在这里毕业了然后退出军队,去外面找工作的话,完全就没有优势,而且别人会的你完·全·不·会。
因为我个人还是在计算机这一块特长的,结果结果,队里的设计全都丢给了我。歪,我会的是编程不是设计啊!!!
但是我们队里的L某H
还是把这个工作给了我,给就给吧,于是我就比别人多了更多摸鱼的机会
第一次做展板工作的时候,因为PS我用得其实不是很熟,在那个时候,所以做得还是比较慢的;但是后面越来越熟,而且逐渐有了自己的一套设计的体系和概念,就可以开始摸鱼啦~
具体来说就是:先以极快的速度做好他要的内容,然后开启B站,开始刷视频,或者就写我自己的程序;然后在他给我的时间临近DDL的时候,拿去把稿件给他看,合适就通过,不合适回去改了继续摸鱼~
C某
这个人他身在学院,一个学习的地方,但是他不看重你的学习,他反而看你队列走得好不好,屋子弄得干不干净。我说白了,这种看法在基层是通吃的,但是在学院真不通吃。学院是学习的地方不是给他拿来讨好上级的地方。他这样子干了以后,考试成绩出来就说“啊?没时间学习吗?时间都用到哪里去了?晚上别睡觉了,加班到十一点半,强制!”,然后平时把你的空闲时间拿来搞卫生和练队列(队列在他眼里就是形象,形象好了内在不重要),不让你学习,你的学习成绩又会继续烂下去;你就试着想你的上级想要你有业绩,然后不让你做工作,让你天天打扫自己的工位、打扫办公室什么的,然后你业绩不好,让你加班,加班完了以后,平时的上班时间又开始让你弄表面功夫,如此一个恶性循环
我也说过,我是个标准的Otaku,我身体确实不行。当时我们队里的傻逼管理弄了一个什么“补差班”,说白了就是把他们认为不行的人丢进去,然后让领头的带着训。领头的那个是基层考学上来的,是海军陆战队的。一上来那个训练强度大得很,说白了真受不住。我自己个人本身就是容易受伤的体质,然后在一次训练过后(那天训练的是跑步,(1+2+4+8+4+2+1)*400,中间休息2分钟,但是按我的速度人跑完了在休息了我还没跑完,我跑完了人就上去了我又要跟着上去,几乎没有休息的时间)膝盖略感不适,然后后来去医院查说是膝盖有问题,我就没有怎么参与训练了
军校是有寒假的(过年不让你回去他还是不会的,但是基层是过年回不去的),也就一个月,当时我记得很清楚,我妈在我隔壁邻居来我家的时候说我在军校,我当时我就说了一句:我要哪天不高兴不想呆在那里我就溜了。我妈估计也认为我是给她开玩笑,没在意,但是我当时是有这个想法的
后来没考虑太多,毕竟该玩玩嘛
这一学期,我们跑路了一个人(海南的,他个人学习能力确实不行)
开学的时候,当时就说有上面的人下来检查,然后要我们把电脑啥的东西全给弄走
我说白了这种检查这个B地方就是在做表面功夫,做那种,形式主义。有一说一,形式主义在这里面很严重,至少在“一队”里面很严重
我是两台电脑,我家里不是住在广州吗,然后当时就是我这边兄弟说把电脑寄放在我家里,于是让我妈过来拿
当时那个时候队里很操蛋,就是下面那个C某
没事找事,天天搞那些有的没的,直接就不让你学习。主要体现在你走队列,你自己明明是几乎”夹着尾巴“做人“,走得很标准,但是人就是要没事找事情做,天天骂你,“啊?学什么习?队列走不好还学?”,然后晚上睡前点名(每天晚上要点名)的时候,给你讲个一小时,留下十分钟给你洗澡刷牙什么的,你根本就不够时间。自己的生活都料理不好,谁还去管他那个东西。所以我对C某
是完完全全没有信任的,不相信他会干出人事
所以当时我妈过来的时候,我就明确地说了我想要溜,我妈就开始做心理工作,我说白了说着说着表面上是没那个想法了,其实说白了完全脱离不了这个想法。这个学期我们队里有一个人明确地说了他想要跑路
有一个星期,我做了院内的大巴去医院复查我的问题,照了核磁共振以后医生的意思就是说很严重,要手术。军内手术是需要报告的,回去就跟底下那两个说了,那两个的意思是保守治疗,但是医生的意思是要立即治疗。然后让我们打一个情况说明通过内部的即时通讯发给L某H
,但是发了,发了以后就没下落了,直到后来忘了哪一天,我们参保的医院出现了疫情,然后把我们去过医院的隔离了,我跟我妈联系了然后我妈去问上面的人,人一级一级追下去才弄出来的报告通过。
当时把我和我一个兄弟丢去医院手术,医院的规定是病人只能有一个陪护,我妈当时上班,第一天去的时候是办入院,晚上我妈才过来的,第二天就上手术台了。上完手术台下来,在医院休息了一天,第三天我们学院里面告诉我们封了,不让进出,我们回不去了,结果我们那里的医生已经给我们办好了出院。后来是L某H
联系了医院给我们康复科留了一个床位。但问题是我们在骨科要搬到康复科,人还催着我们走(病床不够),我们没有人陪护。只能是我伤的没有那么重的推着个轮椅先把我兄弟送过去,然后再用轮椅把东西一点一点搬过去。过去以后,因为人伤的重,我就把病床让给了人家,结果人有看护,我没有看护。我该打的消炎针什么的东西都没有打,这也导致了后面恢复不好。
在医院呆了两周,找了个机会回去了,回去了以后上课是正常去上,但是不参加训练,养着。但是我本身就术后没处理好,而且学院里面没有会看护的人,就导致了一系列的麻烦。而且下面那两个人,特别是C某
看我们两个特别不爽,就好像我们欠他钱似的,看着我们两个在队里养着,其他人照常训练,他自己认为我们两个搞特殊,问题是这不是我们搞特殊,是有这个必要,但是他就是一直类似于“被害妄想症”那样有他的癔症,天天在那里猜疑
所以就导致了手术后甚至到此学期的期末,实在是生活在所谓的猜疑之中,没有心情去学,也学不下去
说是表彰典礼,但是我人在医院躺着没去,然后等我回去,说给我了一个什么“宣传先进个人”,我说白了这个东西谁都知道是拿来打发人的;此外我还听说了当时的指导员(以下称作Z某X
)把我做设计的那些还有做视频的那些功劳全部拿走了,本来是我的“四有”(有灵魂、有本事、有血性、有品德,有点类似于学校的“三好学生”,但是含金量高一些,而且有勋章)给它拿走了(没打错字,这个人不配称作人)。这个人完全背叛了我的这些工作,说白了在我这里就失去了信任。
因为腿伤了嘛,所以下午不去参加体能训练,我就在宿舍里面弄东西,然后就弄了云原神的那个脚本和Steam自动卡牌的那个东西,这都是题外话
说是ACM比赛,其实就是蓝桥杯。我们队里的L某H
还是很支持下面人的爱好的,所以当时我去参加,人也没有说阻止。因为我这个学校的总部是在广西,所以当时参加蓝桥杯是参加广西省的省赛。也是运气好,当时拿了一个广西省的二等奖。
CTF这个东西,其实是在我高考完的第二天,我那天在打第三针的新冠疫苗,然后I-Info这位小兄弟在QQ找我问我对CTF有没有兴趣,在那个时候我才接触到这个东西的
后来在大一的下学期有所谓的俱乐部(说白了就是选修课,但是选修课1学分一门,俱乐部2学分,二者占用的时间相同),我选了网络攻防俱乐部,虽然吧里面的教员都是半斤八两,大家都是玩这个的同时在学,我也稍微学了一点点东西,但说白了也没学多少,可能社工自学的比较多
当时就有CISCN的报名,就去报了,想着去试试水。
当时在定我们的团队名,我们是三个人,一个叫做JIO(因为名字读起来很像JOJO),一个叫侯(也跑路了),另一个就是我。我说白了,其实JIO就是个老司机,只能说懂得都懂,然后当时因为听说玩偶姐姐做空以太坊退圈了(我到现在都不知道是不是真的),然后它就灵机一动,把队名定成了hkd01l
(你现在在CSDN搜这个名字出来的那个用户就是他)
那天因为是第一次打,而且这个比赛分为答题和实践,答题是2小时120题(我记得是这个数),然后取队内成员的平均分加权,加上实践赛的分数加权算排名来算复赛资格的
答题满分我记得是1k2,我拿了1k出个头(百度大法好),然后他俩是大概八九百的样子;到了实践赛,但是有一道是叫做签到电台(说白了就是签到题),然后我就给做了出来(链接在这里 -> 2022年全国大学生信息安全竞赛创新实践能力赛初赛 —— 部分WriteUp),结果我们非常好运进了复赛
复赛那就是大佬的舞台了,不过复赛是分区域的,我们算作华南赛区。
复赛分为break
和fix
,说白了就是先打再修
进去以后首先发现:没有签到题!!!也就是说如果我们没有能够解出任何题目的话,我们就拿不到分
在break
环节,我是在反复看哪些题目是有缺口能够被我们打进去的,但是说白了我们三个人都不会什么东西,所以break真的是一分没拿,但是JIO桑给了一个很关键的信息:在题目Try2ReadFlag
里面,有一个SSRF漏洞
到了fix
环节,他是有web题目和pwn题目进行修复。pwn啥都不会就完全没看。
在Try2ReadFlag
这个题目,我就逮着SSRF来修,然后没想到真给我修到了。fix环节的机制是修好的记为100分,有3次检测环节,在第一环节检测修复后,后面默认为修复完成,直接+100,也就是这个机制,最后让我们拿到了300分的“高分”,拿了一个华南赛区三等奖
然后他们后来就开玩笑说:这把是我carry全场,事实上也确实,初赛是用我1k出头的分数拉上去的,复赛是我修的:<
复赛相关文档 -> 2022年全国大学生信息安全竞赛创新实践能力赛 —— 复赛WriteUp
主要就做了个签到题和一个加密题(爆破大法好!),还是我做的:<,当然因为网鼎的技术含量比较高,里面的都是大佬,所以基本上就是被完虐了
网鼎相关文档 -> 2022网鼎杯青龙组——个人WriteUP
因为CTF比赛的机制是flag为独一无二的,也就是说个别队伍的flag你是不能直接拿来用的,结果在违规通报里面,有人在签到题,用了别人队伍的flag,然后就理所当然的两个队伍违规处理了 :>
对,记得我们是那一周的周二还是周三得到的消息,然后周五就跑路了,直接就升职了,跑去总部去做领导去了。这个人我还是比较尊敬的,人确实为了下面的人着想,不过说句实在话,他应该是知道我会跑路的
我当时住院回来,跟JIO聊天的时候,他就说过这个教导说我不适合在这里,所以他应该是预料到了的
我是手上有两个手机的,一个放楼下(红米NOTE11)给查,一个自己平时放在电脑包里(红米 K40),我经常用K40跟我妈发微信,考前两周那个时候C某
又在弄有的没的那些东西,不让你好好复习。“复什么习?空闲时间拿来练队列!还复习?”加上从这个学期开始,我就已经不是很想学习了,在这里是真的学不下去,我就在微信里面跟我妈说了我想跑路,但是这个学期没跑成,因为各种原因,包括准备不足什么的
对没错,一开始报考的时候说有暑假(你有个几天那也叫有啊,这个是连几天都没有),结果实际上给我们扣了,说是“暑期强化训练”也叫暑假,我呸
然后两个月就练那点东西,一半还是新训学过的,唉,一言难尽
因为第二学期有两个小老弟跑路了,他们在办手续(跑路的手续),但是事实上,放暑假,人机关的放假了(没错机关还能放假,我们不配当人),办不了,最后还是第三学期开学一个月了才走的
新的教导员是我们暑训的时候来的,它叫做J某K
,以下简称K子
。K子
在来的时候还是很沉默的,就是放养。暑训的上半段是C某
休假,所以就他一个,一个星期过了以后就开始不当人了
他在晚上点名的时候开始训斥人,说“你们以前的教导员和你们队长是怎么带你们的带成这样”(他是士官队上来的,也是跟C某
一样完全不懂学员队而非基层连队,这两个是不能一概而论的,带人的方法是不能一样的)
等到C某
回来的时候,人还直接当着C某
的面说“你们带的什么样”巴拉巴拉的,唉,只能说大言不惭,唯我独尊吧
反正这个学期要走了,不如就当一个老咸鱼吧,反正我还是作为病号生活的
嗯没错,这东西甚至是一学期一次,结果第二学期的指导员(以下称作Z某F
)跟上面的Z某X
一样,也是个抢别人功劳的人,还是抢走了我的那些东西,我都服了,第二次啊,这是第二次啊!!!
说到这里,因为我不是搞队内的宣传工作吗,然后他们让我做个视频在表彰典礼上面放。一开始说没有任何要求,我堆了个12分钟的视频,拿去三队跟他们友好交流,然后人告诉我不能超过三分钟,诶但是你一开始没说啊,爬!
然后回去搞,搞到凌晨4点(对,时间给的甚至不多),实在搞不下去了,草草弄了一点,睡觉去了
早上起来,Z某F
来看,说小改一下就可以了,然后就改了嘛
改了以后到了典礼当天
这东西是在正式开始之前放的,然后我们的其实没啥问题吧,就……短了点。过去后发现人三队背叛了我们,人做了快二十分钟的视频,基本上整个放视频的时间段给人占了
然后还是办了个什么宣传先进个人给我,麻了
在某一天吃早餐的时候,C某
叫我过去,又说了一堆,说人三队的那么长我们的那么短,他都不知道我们的是在哪里,然后又开始说什么竞争不过别人之类的话,然后又开始PUA,我都服了
我还是报了个计算机二级来考的,反正一定能过,拿个证呗
K子
的两面派在某一天,K子
说有个活动要我们参加,就是那种大会,然后让我们队去参加
到了晚上,他就开始骂人了:“我给你们争取那么好的机会,你们不珍惜,坐的跟个什么鬼样。别人队都没有这种机会,就我们队有,你们还不好好珍惜!”
这里需要对两点做出说明:
规则:
- 一个学期挂4科,或者挂3科且补考均不过,或者连续两学期挂4且补考均不过进行退学处理
- 期末考试分数小于60直接算挂科,大于60则跟平时分加权,相加小于60也算挂科
这次期末考试我就开始我的计划了,我们总共考好像是6门,我是挂了英语、概率论、近现代史、电工、还有个啥东西忘记了。按照规则,一个学期挂4科,或者挂3科且补考均不过,或者连续两学期挂4且补考均不过
进行退学处理,至于为什么是五科,因为我怕教员给我拉回来。我们内部有一科目,就是那种背背就能过的,我每道题目(开放题)我就写了一句话,人甚至给我拉了回来,这个科目的成绩在这几科前面出的,所以我就直接挂5了
回去以后就开始填各种东西,然后因为某些原因导致我推迟了很久才成功退了出来。这些不是重点,重点是他们处理问题的方式
我回去其实是压点到的,因为路上出了交通事故
到了以后,那两个傻逼把我和另一个广西的叫过去(以下简称老表
),然后就说了一下要办手续之类的东西,然后把老表放上楼了
我一个人在那里,然后他们说我什么都不跟他们说,按他们的意思就是整个队里你最能信任的就是你队长我和你教导我。放屁!你们什么骚操作没做过,你们早就在手下的人这里失去了信任,还跟你们说?我说白了,一旦有这个苗头的话早就进入整顿模式了,说个屁。真把自己当成所谓的“知心大姐姐”吗?甚至这两个人还想把我留着,真是TMD🐶
接下来,C某
将被我们叫做C狗
,我会用🐶表示,这个人真的不配当人
按照现行的退役军人安置方法,我的接受地应该是白云区,但是当时机关那边让我开的是黄埔区的保险信息(要交社保),然后我去问K子
,人就翻我档案,说我是黄埔区入得伍,所以是黄埔区接受。那人都这么说了,就当是黄埔区吧,又去黄埔区开了保险信息。
我走了以后,去黄埔区的退役军人事务局报道,人家看了我的信息表,说我应该是白云区接受,而不是黄埔区。然后后来他们去问了他们的上级,让我等两天
我把情况跟🐶说了,他说我去问。诶不是,我都问了,人家说得请示上级,你自己都知道请示是个什么流程,你让我问,我问什么?问了就能出来啊?
不过我当时没有去怼他,因为毕竟事情没办完,还“有求于人”
过了两天,🐶又打电话给我,说确定没,人那边没有给我回复肯定没有确定嘛。然后”他🐶了一句逆天发言
明天确定不下来你就回来,你不能呆在家里
WTF我人都跑路了你还要我回去?你在公司里把人辞退了还能把人叫回来的?这人一定要听你的,你想让他回来他就回来?你想让他走他就走?搞笑!
次日,🐶又打电话给我,那肯定是没确定嘛。然后他说
那你收拾收拾东西,跟你父母说一下,晚上回来!
谁TM回去!我才不惯着你,这种人是没有上级去压制他他就不会安分的,一个不当人的🐶!
我打电话给我们政委,政委给了大队长的电话给我,我跟大队长说了情况,大队长说“哪有他这种道理,你不用回来,我去跟他说”
到了第三天,终于确定下来是白云区。人那边给我重新开了《行政介绍信》,然后让我去拿
我总共回去了两次,因为拿资料。我第一次回去就是上面说到的拿白云区的行政介绍信。在那之前他们说有两个包要还,不是给我的,然后顺带给人带回去。
第一次还很顺利,就回去呗,我本来想的是人给我拿出来,我又不是属于你那个单位的了,我没有什么理由进去
然后K子
让我进去,那拗不过人家就进去呗,进去拿了就跑,然后他俩还假装“嘘寒问暖”了几句
当天下午,我就去白云区那边报道了,人因为我没有退伍证(现在叫退伍证书),然后报道不了,我又把情况跟他们说了,然后K子
咬定了说我就是没有这个东西
问题是人正常退伍怎么可能没有?你自己不想去问而已,就直接一句话搪塞过去
后来是退役军人事务局那边跟他说了,然后我回家又跟他说了,他才说开一个证明说目前没有,后面补发
然后当天打电话的时候,我又开的扬声器,然后我爸听到他说的就是骂人很难听,然后就跟人吵了一架
第二次拿资料是快四月了(三月底,记得应该是3.31),又是他那边让我进去拿的(说实话我都不想进去),当天另一个跑路的人(选择补考不过跑路,手续办的晚)让我给他带份饺子(门口有清真面馆)
我进去了以后,在K子
那边拿走了以后,不知道这个人发什么神经,又说我把无关的人拉进来吵架(我爸),然后又哔哔叭叭跟我在那里说他所谓的大义,说什么他都不想待在家里,因为家里有矛盾,他处理不好家里的矛盾,然后说我把家里的矛盾延伸到外面来,我都无语了,我不想跟她吵,因为那天下午是有计划要出去见亲属的
他说完了,我上去把饺子跟人家送一下,然后🐶又在楼下喊我,一开始我也没听到,在人家房间里面听个鬼
后面我下去了,又说我跑路了就不听他们的了(这是什么道理我跑路了当然不听你的呀,你是什么东西),跟他们打电话就只会哎,哦(我难不成还要你在喊我名字的时候我到一个不成?),说我不讲礼貌(你们两只🐶都不值得我尊重我凭什么);讲完这些又说我找人压他(指我找大队长来摆平他那个让我回去的事情),说我回去是本分(你放屁,你试试叫一个辞退的员工回来?),又耽误了我一小时,后面我才走的
最后只能在白云区那边预报到(因为没有证)
很多人都跟我说:你好不容易考上军校了就这样不读了,不是很浪费吗?多少人想去军校考不上的?
对于这个观点,我想说的是:
回到家里主要有几个改变:
总结:自由
是,我是一个很不受管的人,管理你相对轻松我可以睁一只眼闭一只眼,但你要PUA我,我不能接受
你说算不算00后整顿职场,我也不好说,但是我看来好像是有点那种意思
嗯没错,作为FPS玩家,我开始玩起了瓦罗兰特
最开始我是用我的LOL PBE账号玩的,然后后来说缅甸号比例高,我就去开了个缅甸号,那天是2023.4.11
在我在家里呆着的这几个月,我做了我人生中的第一个大项目——Valora,当时是心血来潮做的,做到现在三个月,功能已经完善好了,是个成熟的项目了
在6月末的时候,我去了要复读的学校报名(现在先不说),这个学校是全日制的,而且管理也相对严格,不过没有特院那样
7月31日要入校了,所以接下来一年我都不会露面了。不管项目出现了什么bug,我也不会去修的了,一年后积累了多少问题,到那个时候我们再慢慢修吧
人总要对自己的选择负责的
到此,结束!
]]>熟悉我的小伙伴应该知道,我的网站的评论系统经历了几次更换,最开始我用的是Gitalk,但是因为要登录Github账户,而且不是所有人都有Github账户,所以就更换了
后面用上了Valine,Valine用得很舒服,yysy,配置好Valine-Admin后基本上可以撒手不管了,但是后来Valine停止更新了,就想着去用下Waline
Waline用了没多久,发现这东西后端一直连接不上,然后就又更换了
最后换成了Twikoo,这个东西跟Waline一样是要用MongoDB的,所以直接把Waline的MongoDB给它用,没一会就搞定了
你以为到这里就这么简单了嘛?如果真的是的话我就不会发这篇文来吐槽了
最开始我是部署在Vercel上面的,这种方式就是很方便,因为Vercel本来就是一个很便捷的平台,没有很多繁琐的操作,再说,Twikoo支持一键部署,所以就部署在了Vercel里面
用了两周以后发现一个很大的问题:Vercel链接微软服务器会超时!我的域名邮箱是在Office365上面的,自然邮件提醒功能就要链接微软的服务,然后Vercel使用邮件提醒的时候,就会超过Vercel规定的10秒上限,导致函数运行直接超时,然后发不出邮件
幸好,Twikoo不只是能够在Vercel部署,我又把目光投向了Zeabur这个平台
我不能说Zeabur不好用,他确实很好用,非常好用,几乎完美解决了我的容器需求,但是凡事都有个但是,Zeabur在2023年七月初上线了签到延长使用期限的功能,也就是说如果我不签到,我的应用会自动被停机
我在Zeabur部署Twikoo的时候,那还是Zeabur平台的早期,当时的设定是MongoDB会部署在Twikoo容器的内部,这就导致了但凡Twikoo进行了一次重启,所有的数据都会丢失
很不幸,我的数据正是在这种情况下丢失了,一点都没有剩下。幸好,在我之前部署Vercel的Twikoo的时候,里面的MongoDB的数据是还在的,尽管它不是最全的,但是能恢复一部分已经是很不错的事情了
或许你会问我:现在Zeabur的付费机制可以绑定支付宝,为什么不用呢?我只能说数据丢了一次以后,我在想尽各种办法来避免这种情况,所以目前Zeabur不在考虑范围内
当我把Zeabur上的应用迁移,特别是Valora迁移的时候,我尝试找一个能够连续不断跑容器的平台,最后选择了Render这家,它可以在新加坡部署容器,且一个月有750小时的运行时间,完全够一个容器跑一个月的了,所以我也把Twikoo丢到了这个地方
当我搬上去以后,进行了一系列的配置,然后再次尝试邮件的时候,发现还是发不了,这不是配置上的问题,就是Twikoo发不出去
发现了以后,我又尝试用了Valine-Admin来发送
放弃使用Valine其实还有一个原因,就是Leancloud的国际版禁止国内IP访问了(业务域名和自带的引擎域名),我是搬到了国内版去用的,但是国内版要求备案,搞得我很烦(后来找了代备案搞定的)
这次重新接入Valine,我选用的是国际版,国际版之前的数据我都没删掉,就是换用Twikoo以后的新增数据没有了,这个没办法,最后就只要解决国内不能访问业务域名的问题就可以了
这里我用了Vercel作为反代,然后把serverURL设置为了我的反代域名,才解决了国内访问不了的问题
我重新部署了一次Valine-Admin,来避免一些遗留下来的问题,部署完成后,在我的网站匿名发送了一条测试评论,邮件顺利送达
最后我恢复了Valine的使用,尽管它现在已经不更新了,但是它能够满足我的基本需求,所以我还是选用它
最后我改了一下我导出的MongoDB的数据,发现可以被Valine正常识别,只需要修改一下数据的类型就可以正常被导入了
导入以后发现……这个邮件它以前没发的全给我发了
对不起对不起对不起!!!我没想到它会自己发出去
就像我上面说的,我的Valine数据是导入进去过Twikoo的,现在Twikoo导出的数据是json(用管理面板里面的那个导出),直接导入Leancloud是没问题的,但是珲面临下面的问题:
uid
、master
、top
什么的标记需要去除经过我在火车上的一小时奋战,我终于弄出了这个脚本(Twikoo导入Leancloud后在Leancloud导出数据库)
1 | import json |
运行完后在Leancloud导入Comment.json
文件后,就完成了!
之前因为Valora这个东西部署在Zeabur上面,然后Zeabur被我用超了,给我发邮件了,让我升级我的套餐,那既然这样我肯定得寻找更好的服务器去搭建Valora了;前些阵子我问了@CyanFalse想问问有没有什么好的服务器,结果人家很大气啊,直接给了一台12H48G的Windows服务器(没错是Windows不是Linux),虽然说Windows做服务器没啥问题,又不是不会用,天天用着这个视窗11怎么可能不会用,不过Windows还是有点不方便,然后我就装了WSL来跑我的服务
但是但是,Windows的WSL是有防火墙加持的,这个防火墙是Windows自己的防火墙,会阻挡Windows访问WSL的服务,也会阻挡WSL访问Windows的服务,这很不方便,所以就有了这个文章
首先得搞清楚我们要访问的IP,要不然关了防火墙访问错IP也是没用的,不过这一部分很简单,甚至可以跳过
直接在设置里面找到自己当前使用的网络驱动器,里面就有(这里用我自己电脑截个图,我自己电脑是设置了静态IP的,一般来说上面IP分配那里会写自动,要看下面那个IPv4地址的IP)
当然如果你更习惯用命令行(例如我),那可以使用以下命令获取
1 | ipconfig |
然后会有一堆的输出(取决于你有多少个网卡)
1 | PS C:\Users\GamerNoTitle> ipconfig |
我这里网卡是用的以太网适配器 以太网
,所以我的IP就是192.168.0.233
首先你得安装net-tools
(一般来说正常的Linux都会有,但指不定你用的WSL它没有呢?)
1 | sudo apt install net-tools -y |
安装完以后输入Linux的经典命令
1 | ifconfig |
然后就会有你所有网卡的输出
1 | gamernotitle@DESKTOP-HRHFRVI:~$ ifconfig |
这里要看的是eth0
,看里面的inet
写的啥,这里可以得到IP地址为xxx.xx.xx.123
(因为用的是公网服务器,所以码一下)
这里就得打开一个管理员终端了,按下Win + X,选择终端(管理员)
然后输入以下命令,添加防火墙规则,放行两端访问的流量
1 | New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow |
会弹出这样子的提示
1 | Name : {规则的UUID} |
就说明已经打通了,现在你试试访问WSL的服务,是不是已经可以访问通了呢
因为我是使用公网服务器,但是服务跑在WSL里面,所以得让Windows来转发一下,幸好Powershell可以直接做到
1 | netsh interface portproxy add v4tov4 listenport=<"Windows监听的端口"> connectaddress="<WSL的IP地址,前面获取过的>" connectport=<"WSL中的服务端口"> listenaddress=* protocol=tcp |
协议这个地方,如果你是UDP服务的话,记得把tcp
改为udp
打完后按回车,添加转发不会有任何的提示;然后在公网访问服务器,就可以发现已经访问到WSL中的服务了
]]>本文只是通过我的各种经验,去讲述我玩Beat Saber的时候踩过的坑。如果你需要更完整的Beat Saber萌新教程,请访问Beat Saber新手教程、问题解答、曲包网盘 - Steam / Oculus / Quest (wgzeyu.com)
我端午的时候,去了一趟SMU,然后从别人那里捞了一台Pico Neo 3回来玩,VR这个东西我一直是很粉的,自从高一那一年第一次玩就戒不掉了。既然捞到了一台PICO,那肯定要玩起来的嘛
游玩VR游戏之前,请把手柄的手绳戴好,要是手柄甩出去了那就尴尬了撒
串流相关请阅读 -> 串流方法
这个用过Steam的应该都懂吧,直接访问Beat Saber的产品页面,然后花90大洋(阿根廷人和土耳其人可能会便宜点)购买游戏就是了
安装的话,如果你不需要安装Mod就直接安装就是了,如果你需要装mod,那么请往下看
因为最新版的BS还没有Mod适配,所以我们要装回旧版本
这里有两种方法,第一种是来自于知乎某大佬的方法,稍微繁琐一点,但是通用,请去他的帖子看 -> 【游戏教程】Beat Saber 安装mod并实现换角色模型与设置相机位置 - 知乎 (zhihu.com)
这里我讲一下第二种方法,也是近期出现的方法
Oculus工作室这边因为升级了Unity的版本,所以他们把旧版本Unity打造的BS归档成了一个测试版,这个测试版的版本号是1.29.1
,这个版本的mod是有适配的,所以我们可以直接安装这个版本
右键你的Beat Saber,选择属性
-> 测试版
,在参与测试
里面选到legacy1.29.1_unity_ver2019.4.28f1 - pre unity upgrade build
这一项,然后直接关闭这个窗口就行了
接着按照正常的流程安装Beat Saber,你会看到你的库存里Beat Saber的后面有个中括号[]
写着当前参与的测试
装好了以后,先打开一次游戏,让BS初始化一下,然后再进入安装MOD的阶段
首先,你得去BS中文站下一个ModAssistant
,当然你要是喜欢用国外源或者是肉身出国了,你也可以去Github下载
BS中文站的ModAssistant
是经过了修改的,增加了两个国内源 一键直达
我就直接用BS中文站的那个了,下载后打开是像下面这样的
在左下角那里先切换一下自己的下载源,换好了以后先阅读一下首页的内容,阅读后点同意
(不同意的可以我的网页了,不同意咋装mod)
下面提示可以安装mod
后,就可以点击左边的mod
标签卡了,在里面选择自己喜欢的mod装上(注意左下角的游戏版本是否正确识别了)
点击ModAssistant
左边的选项,设置一下OneClick
安装,如果你想手动安装也可以,请阅读BS中文站的指引
你需要去ModelSaber
网站去找到自己喜欢的东西,然后直接点一键安装就行了,也可以下载了手动安装 ModelSaber
你需要去BeatSaver.com这个地方去找到自己喜欢的谱面,然后安装
有,就像我们使用网易云的过程中,网易云有歌单的概念,BS里面也有这个概念,在BeatSaver.com有别人整理好的歌单,当然,BS中文站也有,你可以在这里找到Beat Saber曲包资源同步 - ResilioSync (wgzeyu.com)
这个功能应该是直播用的比较多,这里会用到一个Steam上的软件叫做OVR Toolkit
(国区售价41RMB,不想买就去三大妈下一个)
安装好了后在SteamVR启动之前启动这个东西,就能在SteamVR里面看到它的设置了,在你的左手手腕上(相当于一个手表)
按下扳机键就相当于点一下,建议按照里面的指引进行设置,设置的效果是这样的
当然因为我直播的时候是捕获的Beat Saber窗口,所以观众是看不到我这三个窗口的
OVR的优先级高于VR游戏,也就是说在窗口叠加的时候,它会叠在最高层
因为Pico不像Valve Index和Meta Quest那样可以直接用SteamVR,所以我们要先下载Pico官方的串流助手
PICO Link Windows 软件 | PICO中国 (picoxr.com)
我是直接下载了跟Pico 4一起的那个版本(事实证明如果Neo 3下错了版本的话会爆音,虽然到最后我都没有解决音频问题)
下载好了安装就是了,然后打开就是像我这样的东西
根据自己的需要选择串流的方式就行了(个人观点:优先有线连接),在头显里面要打开串流助手去连接(注:PICO内置截图出来的图片不清晰,凑合着看吧)
连接好了会自动打开SteamVR,然后就会看到经典的SteamVR空间(性能面板是PICO的)
到这里,你已经完成串流的连接啦!
Pico Neo 3确实像网上说的有手柄漂移,有的时候打着打着手柄飘了就很难受。另外,平时不运动的人最好一开始别玩太猛,要不然你可能会受到腰酸背痛连续要几天的侵蚀,着实很难受。
]]>附上可用于参考的文档(在别人的文档上改的,我的文档里附了源文档链接):https://gamernotitle.notion.site/Valorant-API-baffa2069fb848a781664432564e94d0
出现这个Idea是因为最近从Go转瓦去玩了,然后每天商店会刷4个皮肤(玩过瓦的都知道每天8点蹲商店),能实现这个的有很多应用,其中不乏国产的小黑盒、游民星空;Google Play商店上面还有Vshop(因DMCA被暂时下架了),在这些应用中除了Vshop,其他的我用过的都存在一个问题:每天都要重新登陆,就会弄得,很烦。特别是我这种账号开了二次验证的玩家,还要天天跑邮箱收验证码。
然后我就去搜了一下拳头的API文档:Riot Developer Portal (riotgames.com),但是并没有发现相关的API(特别是瓦的API需要的APIkey的权限比较高,个人开发者拳头不给这么高的权限)
拳头的门槛太高了,搞得我被劝退了一段时间,直到我在网上搜索到了这个Notion文档(我的参考文档是从这里改的):新增模块:UAIOSC-valorant;新增功能:每日商店刷新检测等(使用GitHub上从Valorant客户端扒出来的API) (notion.site)
既然有了别人整理出来的文档,那么就着手开始做吧!
搭建网站用到的所有东西:
我一人就是一支军队哒!!!!!
因为个人用Python用的比较多(说白了就是其他的不熟,真不熟吧),所以第一反应是用Flask作为网站的引擎去开发。但是在做后端之前,得先把前端的框架大概搭建一下。为了把网站做的好看一点,我就去找模板去了。
之前做哔哩CDN的时候,用的是Creative TIM的Argon设计语言(creativetimofficial/argon-design-system),这次我本来想在TemplateMonster上面找的,但是这网站上面的模板那叫一个鱼龙混杂呀,所以我还是找回老东家Creative TIM的设计语言,自己去搭建框架,然后看到Soft UI这一套就挺不错的(毕竟总不可能网站都用一个风格嘛),就拿来用了
在大概花了三个小时把网站的前端框架给弄好(第一版只做了首页(登录页)、EULA和市场页面),然后当天晚上就开始做后端的逻辑
登录部分我最开始就想的是用轮子(倒不如说整个网站能用轮子的都用轮子),在Ultronxr大佬的文档中提到了三个登录库(最下面那个是大佬自己改了的,第一个是大佬用Java写的,但是404警告):
- https://github.com/Ultronxr/ValorantApp/blob/1e4d0e314cc5d7200e4da4a13e12a6552df3a414/src/main/java/cn/ultronxr/valorant/service/impl/RSOServiceImpl.java#L37
- floxay/python-riot-auth: A Python 3 library to get various Riot tokens and get around Cloudflare’s filter during auth. (github.com)
- Ultronxr/python-riot-auth: A Python 3 library to get various Riot tokens and get around Cloudflare’s filter during auth. (github.com)
我试了一下底下两个(毕竟能不用Java就不用Java嘛),然后发现很尴尬的事情:登录不上。不知道是不是我的打开方式不对,但是我试了半个小时都是不行,那没办法啦,只能另寻他路
我用关键词Riot Auth
在交友平台上面进行搜索,结果找到了这个仓库:ohlunaaa/Riot-auth (github.com)
我先Clone了下来,然后尝试用里面的example.py
进行登录,不管是开了2FA(二步验证,下同)还是没开的都能够登上,并且返回access_token
和entitlement_token
,然后我就用它了(这里登录用的我朋友的号,不是我的)
着手把这个轮子改一改,进行亿点点改动,首先登录操作改成一个函数,然后把二步验证也打包成函数,这样输入验证码的时候就调用这个函数就行了,改着改着就给我改成了现在的样子:VSC/RiotLogin.py at master · GamerNoTitle/VSC · GitHub
然后在后端,接收前端传来的form数据,构建了一个登录函数
1 |
|
你可以发现这里面是有服务器选择的选项接收的,只不过被我注释掉了,其实我一开始以为登录的API需要用户根据自己账号所在地区选择(有的人打美服那就得选NA
,同理,打欧服就得选EU
,不过国区大部分人是港区、台区、缅甸区啥的,这都属于AP
的范围),后来发现在登录的时候会返回地区(见上图),所以就给我注释掉了,后面更是删掉了。
至于二步验证,那是后面干的事情,让我们先进入商店获取阶段
获取商店是一个很麻烦的事情,特别是要对武器啥的进行解析,让我们从获取开始
首先根据Ultronxr大佬的文档,有这样的一个API的端点表格(下图)
表格里面写的很详细,我们用到的API为这个(以亚太服为例) -> https://pd.ap.a.pvp.netstore/v2/storefront/
通过初始化一个player
对象,来获取玩家的每日商店,并保存到自身的shop
变量中,以供后续使用(该版本文件)
1 | class player: |
从这个API我们能够获取到很详细的商店数据(见文档,这里不贴了,太长了),其中对我们有用的是SkinsPanelLayout
和BonusStore
这两个东西,分别对应了每日商店(每天4个皮肤)和黑市(赛季结束前20天的商店,里面有6个皮肤)
根据获取到的字典,我们可以提取到皮肤的UUID,例如文档中给的示例紫金狂潮 暴徒
的皮肤ID是b9ee2457-481c-6776-3f5b-0ca8e8f90c89
,当我使用这个UUID去https://valorant-api.com/
查询的时候,根据文档给出的格式https://valorant-api.com/v1/weapons/b9ee2457-481c-6776-3f5b-0ca8e8f90c89
访问后发现提示
1 | { |
然后我就直接访问https://valorant-api.com/v1/weapons/skins
,把里面的所有内容扒了下来,做了一个缓存,里面写了所有皮肤名字对应的皮肤UUID(见这里)
通过自己做的这个缓存作为索引,去Valorant-API
网站上调用到这个皮肤的所有信息,然后进行解析,得到这个皮肤的所有等级和炫彩数据,构成一个对象(下面代码是最初版本,该版本文件)
1 | class weapon: |
然后直接在主程序里面创建weapon
对象的变量,直接调用对象中的数据(该版本文件)
1 |
|
接着再把所有数据返回给jinja2进行渲染,把东西填入表格,然后我就写了好大一堆render_template
因为刚好做这个项目的时候夜市是开着的,所以我也把夜市部分给做完了
1 | return render_template('myMarket.html', market=True, weapon0={"name": weapon0.name, "cost": weapon0.cost, "img": weapon0.base_img}, |
这个缓存不是传统意义上的缓存,是我把所有的皮肤数据扒下来存到文件里当缓存,每30分钟更新一次
我是开了一个新的线程去做的这个东西(下面为更新缓存的函数)
1 | import requests |
下面是我在主程序里面调用新线程
1 | import _thread |
启动信号我是放在flask服务器启动之前,主函数里面,这样就可以启动这个线程,并且每30分钟自动更新一次皮肤的数据缓存
在弄完电脑端的页面后,我发现图片太小了,而且帮我测试的同志(@Vanilluv)给我提出了这个建议
我估计他说的是这种(图示为Pixiv的一个浏览器插件 PixivBatchDownloader)
但是但是,我实在想不出什么库可以达到这个效果,我就想到我的Blog的主题hexo-theme-butterfly用的fancybox,可以做到点击查看大图的效果,所以我就想做成这种
这个时候,我就开始求助ChatGPT了(因为懒得写html了,写起来真的很烦)
直接按照它给我的做法,往里面写,不一会就做好了√
上面说到,一开始的登录部分是不支持二步验证的,但是轮子本身是支持二步验证的。我自己在测试的过程中,一开始如果是点击登录后,然后反弹回去登录页面加多一个验证码框框,让用户输入验证码后再点登陆,发现这样会导致会话终结,也就是说这个时候在拳头那里已经算是一个新的会话了。于是我又去问ChatGPT
Q: 我想在flask服务器中保存requests的session,该怎么做
A: 在 Flask 服务器中,您可以使用 Flask-Session 扩展来保存 requests 的 session。Flask-Session 提供了一个简单的方法来将 Flask 应用程序连接到服务器的会话存储。
诶,这刚好给了我方向,而且它也给了我代码,我把它给我的代码放进去,小改一下登录部分,不一会就做好了,但是下面坑就来了(等会说,记住GPT给我的建议,下面要考)
关于手机和电脑的判断,我是通过UA进行判断的
电脑端的UI是像下面这样(Edge电脑端)
1 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.35 |
而手机的像是下面这样(Edge移动端)
1 | Mozilla/5.0 (Linux; Android 13; M2012K11AC) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36 EdgA/112.0.1722.59 |
很明显里面有系统的这个字段,手机会有Android
字样,虽然不知道iPhone是咋样的,但是把iPhone
字段加入判断准没错,这就是我手机和电脑端的判断依据
我一开始的想法是说把表格弄成竖直的样式,就是一个表格,从上到下是名称
、图片
、价格
这样的顺序,这样想了以后,发现表头是不必要的东西,你想嘛,手机的宽度就那么小,再弄个表头在左边不是显得很多余嘛
然后我又去求助《万能的》GPT,GPT跟我说Soft UI这一套是用Bootstrap5制成的,里面有card这一class(就是我们平常见到的卡片式),然后我就直接把我的代码给GPT,它给我生成了card的代码,直接贴进去,SO EASY~
刚好做手机端适配的那一天我跟我爸出去了,所以我是抱着我的苏菲在外面写的代码,好不容易在codespaces里面调试完成了,git push
一下,结果就直接BOOM了,提示如下
1 | 127.0.0.1 - - [10/May/2023 16:55:53] "GET / HTTP/1.1" 500 - |
这一个提示直接给我干懵了,因为我在codespaces里面是调试成功的,就没遇到500的问题,结果部署就出了问题,最最最关键的事情是,我当时没有分master
和dev
分支,也没有分production
和dev
分支(指部署上),然后直接让我的服务炸裂,不管谁访问都是500。不过当时我也没有发出去,用的人也就我群里的老朋友们,然后我就在群里发了条消息
这个时候刚好准备回家了,我就收拾了一下东西,先回家去
回到家里,我做的第一件事情就是回滚版本(就是把手机端页面适配先去掉),结果还是给我报一样的错误
接着我去问了ChatGPT(这个时候我就要划掉万能这两个字了,完全就是在胡说嘛)
我就很懵逼,我明明是配置了SECRET_KEY
的,怎么还出现这种问题呢,我以为是PaaS平台(Zeabur)没有读入我的环境变量,我当时是这么写的
1 | app.config['SECRET_KEY'] = 'A7C55959-3577-5F44-44B6-11540853E272' if not os.environ.get('SECRET_KEY') else os.environ.get('SECRET_KEY') |
这里很明显就是说没有读取到SECRET_KEY
也有一个缺省值,这样写了以后还是死活打不开,我甚至去问了Zeabur的管理员(真的要给他点赞他真的每次都在解答群友的问题)
就是说我写法是没问题的,而且我后来开了个简单的应用试了一下,代码是这样的
实测这个变量env
确实进去了,不过端口没有进去是因为它用了Gunicorn
开服务,所以端口不是在这里设置的
所以说,不是我代码的问题,应该是其他的原因
我重新开了一个Codespaces(为了重新开一个环境),然后按照我之前的配置方法去配置,诶,也出现了这个问题
这更加印证了代码不是这个问题的锅,应该是其他的原因
后来我去翻flask
的文档和flask-session
的文档,结果在flask的文档里面找到了这个更新 -> Update 2.3.0
注意我选定的位置,没错flask 2.3.0
更新把session_cookie_name
给删掉了,且Flask-Session
没有对此进行适配,导致了这个错误
于是我赶紧在requirements.txt
里面固定了flask的版本
1 | flask==2.2.4 |
重新部署后发现没问题了,这才安心了
从此刻开始,我开了Dev分支,在Zeabur也设置了Dev环境,用来开发用(省得又bug了导致服务中断)
嗯没错,崩铁开服了,于是玩了一天的崩铁(开服冲级嘛),但我没想到8点就开服了,我是8点多准备开鼠标连点器抢UID的,因为当天九点半我要学车,月底要考科目二,结果本来想定位那个开服提示的确定键的,自己先点击了一下,然后进去了(捂脸),就变成UID前排了(100头,UID100201759,图为2023/5/10截的,崩铁我是手柄玩家)
这个建议是@Vanilluv提出的,因为这个网站毕竟是看国际服的,又不是看国服的,国际服最多是繁中而不是简中,所以推荐更换为繁中。这个也简单,更改了一下请求API的参数和访问缓存的语言就搞定了
就是字面意思啦,上面也提到了拳头给的access_token
和entitlement_token
只有一小时的寿命,如果不进行重新获取的话,就会需要重新登陆
但其实这一节做了我很久,因为在我的登录模块的轮子里面有这样的内容
1 | data2 = {"language": "en_US","password": self.password,"remember": "true","type": "auth","username": self.username,} |
这是登录的POST请求体,我天真地以为直接把remember
设置为true
就可以了,但是经过两天的测试发现这东西基本就是摆设……
本来我是不报什么希望了,然后在我翻Vshop(因为Vshop有自动更新token的机制,所以去翻了一下看看能不能找到什么线索)的时候,找到了它的官网,在它的Credit页面,有一项引起了我的注意
因为我一开始在Github上没找到什么好的文档,找到的API就是他这里面写的这个valorant-api.com
,而且我也用上了,但是这个库我是真的没有看见过,回到家我就直接查看这个库,果不其然里面有我们需要的东西
在文档里面有一项叫做Cookie Reauth
,就是利用Cookie进行重新认证
这里的cookie按照我的理解是登陆时用的cookie,我先用浏览器进行访问,直接GET这个链接
然后发现它会重定向到一个404页面(这404真好看哪天我要给他扒下来),但是但是,网址栏里面有我们需要的东西
完整链接如下(账号已登出,现在是无效的)
我们进行拆分,可以分为一下这几个东西
access_token
:认证用的tokenid_token
:不知道是个啥token,但我们不用session_state
:应该是session的标识符现在是有了access_token
,我们还需要获得entitlement_token
才能凑齐七颗龙珠(bushi)
在上面提到的那个文档中,还有这样的一个项目
这个给我们展示了如何获取entitlement_token
,这里headers是需要把认证用的token填进去的,这就是为什么要先获取access_token
,访问后会获得文档给我们展示的json,从中提取entitlement_token
就行了
那么最后的问题来了,如果你是用Python直接访问拳头的链接,会被Cloudflare给挡住(因为你即使有Cookie,但也没有会话Session的存在),就像我调试的这样
所以非常有必要把之前的session给保留,然后我就把之前登录用的session存入用户与我的服务之间的Session里面了,方便调用
然后推入Dev分支,Dev环境,调试了几天(那几天还是51放假),没问题后并入了master
分支
做这个的原因是,既然Vshop有这个功能,那我肯定也要嘛(别人有的我们也得有,毕竟本来想法就是对标Vshop的)
因为我对JavaScript不熟,所以一开始是打算点击按钮以后打开一个新的页面,里面只有一个视频的,结果被@Vanilluv狠狠地吐槽了说不好看
最后还是选择了弹窗,一开始我直接把Soft UI的实例弹窗加进去,发现它不弹弹窗,就,什么也没有
后来我又找GPT去了,他告诉我可能是没有引入js,于是我就去cdnjs里面,找了bootstrap5的js引入后解决了问题,但是新的坑又来了
当我做好了以后,我发现一个问题就是,有的皮肤等级/炫彩点击就能弹出框框,有的就弹不出来,然后给我控制台报错
我一开始去问GPT,他说我可能是不存在id为这个东西的元素,我就奇了怪了,我说我命名有这东西,而且在F12控制台里面是能够找到对应的元素的,咋就不行
然后我改成在class
里面写uuid,选择器改成了.uuid
这样的格式,也是跟我说不行,我就非常纳闷
既然GPT给不了我答案,我就开始搜索,搜索着发现有一篇选择器说明的文章(找不到了,要不然我就附上链接了),里面写了选择器的格式规定
1 | 允许的字符: |
我再反过来看,我的这个不合法的选择器正好是以数字开头的,于是我采取了一个办法就是,在武器等级的前面加上weapon-
头,在炫彩的前面加上chorma-
头,这样才能够正常弹出我需要的框框
自大部分功能已经做完后,我就开始考虑多语言的事情了,因为有可能不只是我们在用,老外说不定看到了也想试一试(想Peach了),所以就开始做多语言了
因为json写起来很麻烦,而且不能够写注释,于是我用了yaml文档作为我的翻译索引文件的格式
我先按照我的网站,哪些地方的字是可以写其他语言的,大概构建了一下我的yaml文档格式
1 | global: |
然后就开始在模板里面修改,因为yaml的读取是用这样的代码
1 | import yaml |
我一开始以为这个var
可以是文件,结果发现读出来的lang
的变量类型是str
而不是dict
,才发现应该读入文件
但是,每次加载页面的时候都要读入文件会导致读写吞吐量变大,而且万一前一个进程还没有释放文件,下一个进程又开始读取了就会出bug(特别是访问量很多的情况下),为了避免这个情况我就采用了linux自带的命令cat
来完成这个事情
最后改成了这样子
1 | lang=yaml.load(os.popen(f'cat lang/{str(request.accept_languages.best_match(app.config["BABEL_LANGUAGES"]))}.yml').read(), Loader=yaml.FullLoader) |
虽然读写可能没有什么改善,但是至少不会锁文件,而且也不会爆内存(指读取后不释放变量)
然后写了几个语言的配置文件,分别是英语en
、简中zh-CN
、繁中zh-TW
、日语(机翻)ja-JP
,然后写了对应的yml文件放入lang
文件夹
在上面我们做了皮肤预览的按钮,但是有些皮肤的等级会带有特殊的说明,例如
这种写在武器等级后面的说明型的文字,如果写进按钮里面会非常的长。本来不做多语言的话就可以直接简单粗暴replace这些字符就行了,但是做了多语言就不可以这么做了
还有就是,在valorant-api
返回的数据中,每个等级升级的内容都是用类似metadata
的字符去说明的(下面是没做多语言之前直接写死的转换表)
1 | levelup_info = { |
多语言下,我直接把他们归到了metadata
字典里面去,写在对应语言的yaml文件中(下面为简中,但武器显示仍然为繁中,所以置换表为繁中,而转换表为简中)
1 | metadata: |
然后在模板文件的需要修改语言的对应位置,写好变量,就达成目的啦!
每次部署的时候,因为我们使用的是filesystem
作为session的存储对象,所以在PaaS平台里面,部署会清除之前的数据,导致用户需要重新登陆。因为Flask-Session
是支持Redis
作为存储的,而且我自己也用的比较多,所以我就做了一个可以使用Redis存储的功能
直接让用户把配置写在环境变量里面(README里面有写)
1 | export SESSION_TYPE=filesystem|redis # If you want to use redis u need to set it as redis, and configure the following items |
这样就可以在filesystem
和redis
中进行选择,我用了upstash的免费Redis存储,一个月可以用1W条命令,但是但是,在我测试的过程中我发现,就我们群里的几个人用的情况下,一天都能去到300条命令,多的时候甚至去到了500,这算下来一个月根本不够用啊
于是我投向了Zeabur的Redis存储应用
我在Zeabur里面新建了一个Redis数据库后,就准备把数据库连接改过去了,反正原来的Redis里面没什么数据,尽早更换也不用迁移数据,让群友重新登陆一下就行了,不换还好,一换就出事了,直接timeout了,我以为是Zeabur的服务问题(因为它还在试运营阶段,平常确实有点小问题),就去问老板
我们排除了半个小时也没排出来问题,然后我也不好意思打扰人家,我就说明天再看吧,然后我自己又捣鼓了一会,然后突然想到一个很重要的问题:我让用户设置过SSL,而且我写的是数据库支持再开,否则别开,我就想Zeabur的数据库是不是不支持SSL(Upstash是支持的),然后我就关掉了SSL试了一下,果不其然就是SSL的问题
然后我就跟老板汇报了这个问题,这事也就这么结了
这个还是@Vanilluv跟我提出的(口头上),那既然有要求咱就做嘛
我最开始是用缓存的json文件来做的皮肤库,做了大概两天,反正做的UI跟手机的卡片那样(因为如果还是表格的话会很奇怪)
先注册两个新的路径
1 |
|
这样可以直接用上上面的那个library
函数,避免重复造轮子
就做了大概一个下午就做完了,然后就发现了很多问题
对你没看错,这里面个人喜爱随机选择
和默认
(右下角那个叉叉)都没有被过滤掉,而且最恶心的是这个随机选择每个武器对应一个对象,也就是说有多少个武器就有多少个随机选择,我直接头大~
然后我就随手修了一下,但是只是去掉了随机选择,默认皮肤没去掉(后面会说怎么解决的,这是个坑),我用了过滤器但是就是没去掉,让我很难受
这里的uuid是皮肤的UUID不是武器的UUID,如果你看了上面获取商店那一节的话,你就会知道武器的UUID跟默认皮肤(等级1)的UUID不是一个
结果在我晚上遛狗的时候,我想到了新的解决方法
我是脑袋里面突然蹦出数据库这个东西的,本来我是不怎么用数据库的(因为没怎么碰过数据库语法),但是想到后面还要做搜索功能,还是弄个数据库吧
于是我现在Navicat里面模拟建立数据库,按照如下结构建立
分别解释一下,UUID我设定的是武器的UUID,name是武器的名字,对应四种语言;data是皮肤数据,也是对应四种语言
然后更改了一下缓存更新的机制,改成用数据库进行存储
1 | import sqlite3 |
在这里面,你会发现我多了一节用来清理无用数据(即上面提到的随机最爱和默认)的地方,之前我是用UUID,但是UUID实在是很难弄(你不知道对不对),所以我用武器的英文名作为判断
一开始我没有加入Standard
这个单词在里面的,当时没想到会有这个,结果发现还是没有被去掉,然后看了下后台的数据才发现是有标准这个字段的
然后我才把Standard
给加进去,才可以正常处理这些默认皮肤
说白了就是用sqlite3的搜索功能,这也是我最后选择数据库的原因,如果要手解json的话很麻烦,而且程序运行很耗时间,所以直接用数据库语句就行了
1 | SELECT uuid, name, data FROM skins WHERE name = %?% |
百分号的作用就是通配符,虽然大部分的皮肤名字都是在尾巴,但是也不排除在前面(例如国服翻译的暴徒.exe
,国际服台版写的是.exe 暴徒
)
在html中新建一个搜索框(按钮里面当然少不了瓦的标标)
1 | <section> |
也是用表单的方式,把搜索的内容提交到后端进行处理,后端进行字符串的拼接
1 | query = '%' + request.form.get('query') + '%'# 加入通配符 |
因为武器内容的解析,搜索出来的结果因为语言的问题(简中繁中)所以不能用之前的Weaponlib
类,我就直接把我那边的代码复制过来小改了一下,就丢进去用了
把武器进行解析,然后返回给render_template
进行渲染就行了
附:数据库样本 -> VSC/data.db at dev · GamerNoTitle/VSC · GitHub
这个就是加一大排按钮,然后点一下切换武器种类,不过做这个也挺麻烦的,因为近战武器它没有一个统一的称呼(例如个人近战单位
太极扇
之类的),所以不能通过名称作为索引去做这个近战的分类
然后我发现了一个地方可以判断是否为近战,首先,下面是太极扇
的数据
1 | { |
你会发现在assetPath
里面有很明显的Melee
字样,为了准确,我这里把ShooterGame/Content/Equippables/Melee/
作为判断条件,如果含有这个字段则认为是近战武器,实际证明也是可行的
我们在更新缓存那一节新增一段代码,写入我们的近战武器数据
1 | c.execute('CREATE TABLE melee (uuid TEXT PRIMARY KEY, name TEXT, "name-zh-CN" TEXT, "name-zh-TW" TEXT, "name-ja-JP" TEXT, data TEXT, "data-zh-CN" TEXT, "data-zh-TW" TEXT, "data-ja-JP" TEXT)')# 建表 |
这样,我们把所有的数据存入melee
表中,然后直接获取melee
表中所有的数据就是我们的近战武器了
1 | if request.args.get('query') not in ['近战武器', '近戰武器', 'Melee', '近接武器']: |
做完了分类以后,我逐个去尝试,发现一个问题
没错,捍卫者这一分类下出现了一把R8,然后我去找是什么情况,结果一查才知道这把R8的翻译叫做戍卫者
那没办法了,捍卫者这把枪的索引就只能换成繁中了(因为不冲突),想看看是啥情况的可以自己把query
后面的参数改成戍卫
去试试
做这个功能的原因是我现在游戏内用的英语,然后如果刚进游戏没看到是什么地图,而是在选英雄的时候看地图的时候,就会不知道是什么地图,所以加了这个功能
因为加了地图的对照表,所以干脆就把所有的东西都加进去,用不同的端点区分
现在更新缓存那里把其他的内容也加入数据库
1 | LinkAgentsmap = [ |
说白了就是照葫芦画瓢,因为之前做过了
在主程序里面加入数据库查询的功能就行了
1 |
|
这个还是@Vanilluv提出的,我就加了个lang
参数用来切换语言
如果是网站支持的语言中的一种,就显示指定的语言;如果非支持的语言,默认显示浏览器语言;如果浏览器没有合适的语言(例如用curl
访问)就会显示英语
按照这个逻辑,写了一个判断
1 | if request.args.get('lang'): |
然后使用语言文件的时候就直接调用{lang}.yml
就可以了
这个功能是有人在小黑盒里面问到说“是否支持查看库存”(@Vanilluv发每日商店的时候有人问的),然后本来就想做这个功能,所以就花了三天的时间做了
获取库存很简单,在参考文档里面就有这节内容
获取玩家已拥有的物品 | /store/v1/entitlements/{userId}/{itemType} |
---|
所以获取是很好弄的,获取到的内容我也看了一下,是所有已经购买的武器的等级(需要找skinlevels
表)
1 | { |
ItemID
就是skinlevels表里面的uuid,所以直接跟着UUID找就行了
而炫彩就没那么简单了,炫彩虽然也是uuid,但是我们没有构造炫彩的数据库表(下面是个例子)
1 | { |
然后我是先把有的做了出来,就只要是获取到皮肤的UUID,发现是等级1的,就判断有这把枪,然后把这把枪的数据加入weapon_list
中给网页进行渲染,就达到了查看库存的效果
为什么我上面说花了三天,因为在想怎么给用户提示说这个等级已经用RP购买过了,上面我们不是说到过获取库存的时候是获取的所有皮肤等级嘛,我就把玩家拥有的皮肤等级的UUID给弄到一个列表,然后获取皮肤信息的时候,如果这个等级的UUID在我的列表里面,就给个FLAG叫udpated
,设定为True
,渲染的时候就只需要检查是否存在updated
这个FLAG就可以了
1 | class player: |
1 | {% if level.updated %} <!-- If this level has been updated, set the color of the button to green --> |
这样就可以达到变绿的效果,而原来的紫色按钮就说明没有购买这个等级/炫彩
首先这个价格的来源就很麻烦。我尝试使用拳头自己的Offer列表去解析价格,但是怎么弄价格都是错的(鬼刀4800那种错误),所以没办法。
后来我找到了VALORANT FANDOM WIKI,里面有各种武器的价格
然后就开始弄解析它那个价格表格的代码了
1 | def UpdatePriceCache(): |
因为价格基本不会改,而且只有拳头出皮肤的时候才会有价格的变动,所以我设置为12小时更新一次了
然后把价格/解锁方式给丢入数据库,渲染HTML的时候把数据取出渲染就是了
这个是我去游泳的那天晚上在车上想到的,因为说白了EULA那个东西,是我用生成器弄出来的,其实并不标准,而且我们这个是开源项目,也不是公司什么的那种主体提供的服务,原则上我只需要写个免责声明就行了,但是写个免责声明吧,有感觉好像缺了点什么,最后就决定写个FAQ
所以FAQ在这里啦:https://gamernotitle.notion.site/VALORA-FAQ-86f072f8cebf4a8d9453a795b24cd507
嗯没错,VSC改名为了Valora,这是因为@Vanilluv给我发了张图
也不知道是不是这个人开了还是咋的,反正就是被封了,但是本着开发者的态度,他说用了VSC我就去查查是不是我这个,我就去翻数据库(数据库有玩家的ID,小黑盒是可以查玩家的ID的),然后没发现,就说明咱们是清白的
VSC这个名字确实很多东西用,我之前查到过(如图,这还是其中一个)
所以说咱们为了不跟人冲突就改个名字嘛,我就去问ChatGPT了,改什么名字好
我开发了一个查看瓦罗兰特每日商店的网站,请你帮我给这个网站想个名字,要英文的,越短越好,而且要有缩写版
换一个
Sure, here are a few more suggestions for the name of your website:
For abbreviations, you could use “DV” for “DailyVault,” “VM” for “ValoraMart,” and “VD” for “ValoraDeals.”
它的功能不只有看商店,也可以查看夜市、查看库存、还有完整的皮肤资料库,请你加上这些依据再想想
Thank you for the additional information! Here are some more suggestions for the name of your website, taking into account the expanded functionality:
For abbreviations, you could use “VH” for “ValoraHub,” “VM” for “ValoraMarket,” and “VV” for “ValoraVault.”
缩写请增至三个字母 请你再想想
Sure, here are revised names and abbreviations that are three letters long:
I hope these suggestions are helpful!
嗯它给我的回答……我觉得很不错,然后最后选择了它在两个字母缩写那里给我起的前缀Valora
,简称VLR
本来这一节是叫做Cookie登录的,但是后来发现再怎么弄Cookie都过不了Cloudflare的WAF那一关,所以还不如直接用access token
确定用Access Token了以后就比较简单了,按照重新认证的思路做就是了,不过这样就会发现,跟账号密码登录出来的功能是有区别的:
那没办法了,想要安全那得有付出,至少在我能通过WAF之前,这两个东西都不可能做好了……
我之前是用后端进行限制的,如果没有填写用户名/密码或者不打钩的话就直接弹出提示且不让登陆,不过这样的话说实在的,东西都发出去了,服务器再弹回来,其实就没有发送的必要,然后我就让GPT给我写了对应的函数
1 | function checkInputs() { |
然后把元素的ID一改,完事!
这个项目真的是从我自己立项开始做到现在,做了两周有多,接下来还有其他的更新,但是也是慢更了,就是那种小小的更新,功能性的除了一个皮肤库还没写以外,我就想不到还能做什么功能了,如果你有好的建议可以在下面评论,我看到会去试试的
如果你想给我赞助,除了访问赞助页面以外,也可以给我的账号充VP(缅甸区),DM(私聊)我我看到会给你发ID的,谢谢!
]]>前几天不是把家里的小霸王给改造成了NAS嘛,然后本来就是想架个EMBY然后在家里直接就看番了的,找了一圈发现BT下载是比较好用的,结果下载下来文件名格式又不一样,不符合EMBY的解析要求,于是就有了这篇文章
我推荐用蜜柑计划 - Mikan Project (mikanani.me)
虽然有时候上不去,但是资源是全的,速度也很不错,可以试试
我一开始用的qbitorrent(群晖套件版的),但是那个配置起来超级麻烦,而且发现RSS订阅后不会自动下载(不知道是我的问题还是啥)
然后我记得群晖里有一个自带的Download Station,启动后发现其实它是支持BT下载的
我们找到Download Station,然后打开RSS,在里面添加我们的RSS链接
我这里选的是那种分集用[]
给括起来的字幕组(好正则匹配,后面会说为什么要re匹配),直接加进去就行了
然后在下面下载过滤器新建一个过滤器,根据自己的需要填写过滤规则
设置完后,记得在RSS Feeds里面,把之前已经发出来的剧集先根据自己的需要下载好
因为EMBY需要AnimeName SxxExx
这样的命名格式,但是字幕组发布的资源命名通常都是乱的,所以我们需要配置一个自动重命名
我先写好了一个Python程序,放在/volume1/Storage/AutoRename/AutoRename.py
里面(路径可以自己进SSH去找),内容如下
1 | import os |
这就是为什么选择字幕组的时候我选了分集号用中括号[]
括起来的原因
接着我们打开群晖的控制面板,找到任务计划,新建一个任务
点击新增
-> 用户定义的脚本
根据自己的需要创建即可,一开始在任务名称里面会写Task x
,这个x
就是你的任务号,群晖的任务log会保存在<你指定的目录>/synoscheduler/<ID>
这样的位置,所以这个ID记得记下来然后把脚本里面的ID改掉
保存后群晖就会自动执行重命名任务了,当EMBY进行扫描的时候,扫描到命名正确的文件就会自动加入媒体库了
注:EMBY媒体库的结构举例(也是我这个脚本适合的目录结构)
1 | W:. |
因为最近想看番,然后发现嗶哩嗶哩没有买几部番(如何看嗶哩嗶哩请见这里),就想着能不能直接用qbitorrent那一套自动订阅,但是吧,自己的电脑又不是天天开着,而且用来下番,游戏啥的还打不打了。这不转个头看到家里闲置的ASUS X455LD笔记本,就想着在上面按个黑群晖
这里用到的是Github上的一个项目:fbelavenuto/arpl: Automated Redpill Loader (github.com)
因为我是安装在物理机上面,所以下的是那个带 img
tag的文件,剩下两个VM的是给虚拟机用的
下载后解压,然后掏出我们的老朋友balenaEtcher
来把img文件写入U盘(我这个U盘也是个小霸王,金士顿的经典DT 101 G2)
我们将U盘插入电脑,然后从U盘启动(记得关掉Secure Boot
,我第一次没启动成功然后发现是忘记关Secure Boot了),在这里建议把网线插上,因为这个配置的过程中是不会配置WIFI的
启动的过程中,如果有弹出启动菜单,就直接选择Configure Bootloader
就好了,然后会进入配置向导
获取到了IP以后,可以在其他电脑上输入这个地址进入配置,也可以直接输入menu.sh
开始配置(我这里因为没有网线所以是插了手机用USB网络共享的)
我这里是直接输入menu.sh
进去了,进入menu后我们从上到下依次来
这个程序会自动列出你的电脑可用的群晖型号,我这里给我列出了很多
选适合自己的就行了,我这里选了(后面换成DS3615xs
DS320+
了),这里要记住后面的那个字符串,在下载系统的时候会用到
在Choose a Build Number
里面,我们需要选择一个群晖的版本号,我直接选择了最新的42962
,这个版本号要先记住,后面要用
在这个主要是你要不要洗白的问题,要洗白的话就要用白群晖的序列号,我这里是DS3615xs
,所以用一个DS3615xs
的序列号就可以了,这里我就随机生成一个了
洗白参考:黑群晖洗白介绍:可以让大家使用白群的Quickconnect - 知乎 (zhihu.com)
弄完上面这三个,除非你有更多的自定义,否则直接选择Build the loader
进行编译就可以了,接着电脑就会自动联网进行资源下载,然后编译,这个过程要等
编译好了以后,如果你的光标停在了Switch direct boot: false
上面,按下回车,调成true
(没有就不管),然后选择Boot the loader
,然后手动重启一下电脑(直接输入reboot
就行了,如果无法输入就长按电源键,在这里开始就不推荐使用手机插上去USB网络共享的方法了,因为手机的USB网络共享跟手机的WIFI共享不是一个网域的,会访问不到)
启动好了以后,我们记住屏幕显示的IP地址,进入下一节
首先你要去群晖官网下载一个系统Synology Archive Download Site - Index of /download/Os/DSM
在这里选择你要下载的版本(系统版本号后面带-
的是小更新,我们要选择不带-
的)
在这里搜索在型号选择那一节让你记住的字符串,把系统下载下来
然后链接我们的黑群晖(开个浏览器访问IP就行),进入设置向导,安装系统的时候把你的系统导入进去安装就行了
更新后会自动重启,这个开机可能会有点慢,实测我的开机用了2:25
在群晖里有套件中心,你可以根据需要来安装你所需要的软件,当然你也可以SSH链接进去,不过群晖是没有apt
的,尽管他是Ubuntu衍生
在套件中心,一开始里面的东西会非常少,因为官方没有给我们提供足够的套件,我们可以加入第三方套件源(套件源在下面,安全性不保证,来源于网络)
1 | 1.packages:http://packages.synocommunity.com/?beta=1 |
点开套件中心,点击设置,然后添加自己的套件源就行了
添加完了以后,左边会有一个社群,在社群里面就能找到来自第三方软件源的套件了
黑群晖其实玩玩就好,具体的数据稳定性其实不太确定,因为这个东西毕竟不太稳定(我高一那年弄黑群晖就是数据火葬场),建议用SSH的时候不要乱捣鼓,省的系统崩了
]]>先上张图……
没错,这一轮是强制过期,我的邮件上次还跟我说续费到**7/12/2023 (UTC)**,就……很难受
发现这个问题还是群里面有人说了我才知道的,赶紧用其他的outlook账号开个新的订阅然后把数据转移过去
数据转移我用的是mover.io,微软官方其实也有转移的东西但是我没去研究,mover之前跟微软合作所以就一直在用了,结果跑了一个晚上没跑完
有人说是使用了qyi.io的e5续订服务的原因,这个也不清楚,我现在在telegram上看到的都说是随机的,不过我确实两个订阅都寄了,这个确实没办法
]]>这几天撸了一个Warframe的查询bot(GamerNoTitle/AaTMbot: AaTMbot (Alerts & Tenno’s Market Bot) 是一个与go-cqhttp一起运行的WARFRAME信息查询/推送bot (github.com)),因为自己物理机子用的Python版本是3.10.3
,所以干脆就用上了3.10
更新的match...case...
写法,然鹅就当我写完bot部署到服务器的时候,却发现我的服务器的py还停留在3.8.10
,这不就用不了match...case...
了吗……所以我决定更新一下我的服务器上面的Python
很简单,终端直接wget
就行了,链接自己从官网获得
1 | wget https://www.python.org/ftp/python/3.10.9/Python-3.10.9.tgz |
然后我们要解压一下我们的文件,用tar
命令
1 | tar -zxvf Python-*.tgz |
然后会得到一个文件夹,我们进入这个文件夹里面,准备编译Python
Python源码是要自己编译的,编译成二进制可执行文件才能被我们的系统执行,首先我们要让它自己配置一下
1 | ./configure --enable-optimizations |
等它配置完以后开始编译(没有make
的要先装一下,用sudo apt install make -y
1 | make |
这个过程会非常的漫长(主要我服务器性能太低了),等它编译完
进行安装
1 | sudo make install |
完成后,我们还要把原来的Python替换掉
先删除原来的Python
1 | rm /usr/bin/python |
然后建立连接
1 | sudo ln -s /home/ubuntu/python310/Python-3.10.9/python /usr/bin/python3 |
这样就完成了
]]>TeamPGM/PagerMaid-Pyro: Advanced Multi-Featured Telegram UserBot by pyrogram. (github.com)
Replit使用教程 白嫖Repl.it的服务,让你的服务不间断运行 | GamerNoTitle
先去看Replit的使用教程再来看这个会好一点哦
我们先打开一个Replit实例,创建就好了,类型选到Bash
然后把PagerMaid克隆下来
1 | $ git clone https://github.com/TeamPGM/PagerMaid-Pyro.git |
然后安装轮子(如果不是在replit运行可以不加--target=.
1 | $ pip install -r requirements.txt --target=. |
装好了以后,我们还需要修改配置文件
我们先把原来程序给我们的配置文件复制一份
1 | $ cp config.gen.yml config.yml |
然后打开config.yml
文件,改下里面的配置
我们先去Authorization (telegram.org)登录我们的Telegram账号,注册一个应用,这个登录界面的验证码是发到你的Telegram应用里面的,不是短信!
登录进去以后,点API development tools
,根据提示注册一个应用
注册完了应该会出现像我这样的页面
我们把App api_id
和App api_hash
复制下来,填入配置文件中
1 | api_id: "ID_HERE" |
qrcode_login
强烈建议打开,因为你很有可能会收不到验证码,还不如扫个码,打开就填写True
然后找到web_interface
配置项,把它打开,可以不用,但是要开,要不然不好保活,host
要改成0.0.0.0
,密码记得改一下
1 | web_interface: |
往下的配置根据自己需要修改,一般来说可以不改
接着我们改下main.sh里面的内容,改成下面的内容
1 | python -m pagermaid |
以便我们一键启动
准备好你的手机(要登陆了Telegram)和一个二维码生成器,我用的草料二维码(没收广告费,确实好用)
Telegram在设置 => 设备 => 登录新客户端,进入扫码模式
然后在控制台打上
1 | $ python -m pagermaid |
把我们的PagerMaid打开,然后会弹出二维码或者登录链接,你会发现这个二维码显示不全
所以我们需要把登录链接丢进草料二维码生成器里面,生成一个二维码,拿手机扫一下,这个链接的有效时间是20秒,所以需要快一点
登录后如果配置了二步验证密码的话,还需要输入一下密码,出现像我这样的提示就是成功了
我们随便打开一个聊天窗口(建议找个收藏夹或者私聊,因为你发送的内容和PagerMaid给你返回的内容对方是能看到的),输入,help
(命令前缀是一个逗号)
会弹出PagerMaid的帮助信息,可以在里面找到命令
回归正题,本来用这个东西就是为了用私聊垃圾信息屏蔽的,现在只是装好了后端,还没有安装屏蔽功能
我们在聊天框输入,apt install pmcaptcha
来安装它
然后输入,pmcaptcha show_settings
来查看相关的设置,安装好的同时这个功能就已经打开了
当验证失败的时候就会被封禁(使用的是Telegram的Block功能,我这里选的是Sticker验证方式,使用,pmcaptcha change_type sticker
就可以换过去了,需要对方发一个Sticker才能通过验证)
还有其他的插件,可以自己去探索。这东西有个web控制台的,可以去看看
]]>之前我用过很多的云平台,什么Azure啦,heroku啦,railway啦之类的,问题是这些平台有些太贵(Azure),有些改了免费策略已经不适合我们这些白嫖党使用(Heroku、Railway),我现在还在用的也就是Glitch(开多个账号,反正一个账号1000H/mo,就是配额太小了)
昨天突然想起telegram有个可以屏蔽垃圾私信的项目(具体可以看另一篇文章),然后又想起之前开发TGbot用过的replit,这不又开始了我的白嫖之旅
Repl.it官网:https://repl.it 或者 https://replit.com
BetterUptime官网:https://betteruptime.com/?ref=88fj (后面是AFF码,不想帮我AFF可以删掉)
打开replit,使用你喜欢的方式登录(我用的是Github),然后就会进入主界面
在这里,我们可以点击左边的Create来创建一个实例,里面也有一些模板,可以根据自己的需要创建,我这里就选一个空项目(直接选到bash就行)了
进入到项目的编辑界面,在左边有个Repl Resources
可以看到配额,这个配额确实不能说很多
我们点击左边Files
右边的三个点,然后点击Show hidden files
,把隐藏文件显示打开,肯定会用到的
下面会多出两个东西,一个是.replit
,一个是replit.nix
,其中,.replit
里面存放的是项目的配置,包括启动命令啥的;而replit.nix
里面存放的是nix包的信息,你可以在里面增添你想要的包
因为replit是不能使用sudo
命令的(特殊手段另说),所以说想要安装新的软件只能通过nix包管理器来加
以pip的安装为例,首先我们在shell里面输入pip的时候会提示未安装,让我们选择需要的pip版本,按需要选择就行
然后nix包就会帮我们自动安装,在replit.nix
里面也可以看到加入了一行
1 | { pkgs }: { |
我这里上传一个biliCDN的主页作为演示,需要注意的是,可能是因为replit的nix路径配置问题,直接用pip安装的时候会出现权限不够的问题,所以我们要加入--target=
这一个参数来指定安装的目录,我这里直接安装到了当前目录
虽然右边还是报了错,但是左边的目录里面可以看到轮子已经安装完了
这时候,修改一下main.sh
里面的内容,改成能启动我们的服务(不建议改.replit
里面的内容,容易因为$PATH
里面没有加入环境变量而无法启动)
1 | $ python app.py |
启动完了以后,如果你的是HTTP服务的应用的话,会有一个webview窗口(如图),也会分配一个域名给你,不过可以绑定自定义域名,倒不如说建议绑定自定义域名,分配的repl.co
实在是太慢了
按照replit的规则,应用如果5分钟闲置就会被休眠(所以推荐在这上面部署HTTP服务,如果是TCP啥的容易活不了)
这里我用了网站监控平台BetterUptime,用法其实跟很多监控平台一样,就是加入自己的网站,然后定时监控
主要是监控的间隔时间要选择3分钟,要不然容易断掉
改完然后保存就行了,然后可以在Panel里面看到刚刚加进去的网站,然后放着不管就行了,只要没有报错的话就不会断掉的撒
前段时间AI制图不是很火嘛,说NovelAI的制图效果可以比得上一些画师,然后当时B站就有很多的用AUTOMATIC1111/stable-diffusion-webui加上一堆模型来生成自己的图片
其实我一开始用的是naifu那一套,就是深紫色UI的那一个(图片在下面),而且是跑在colab上面的,这个跟stable-diffusion比的话没有负面Tag这个说法,就是给想要的图片的关键词,然后生成自己想要的图片
后来看到了Stable-diffusion这一套,换模型啥的会比naifu版更加方便,而且功能也更全面,于是果断转向naifu版
之前是跑在Google Colab上面的,但是最近不知道为什么抽风,stable-diffusion跑不起来(开到一半会自动被KeyboardInterupt
),然后我就选择在我电脑上跑了
要是你想在Colab或者Kaggle上面跑的话,我这里也提供下载链接
stable-diffusion-webui 版本:下载链接
naifu-NovelAI 版本:下载链接
这里我们需要从Github上面把源码给弄下来,打开终端输入
1 | $ git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git |
然后进入stable-diffusion-webui文件夹,里面应该有几个bat
或者sh
脚本
Windows用户就逮着bat
脚本用就行了,而Linux用户就用sh
脚本
我们需要关注的是webui-user.bat
和webui-user.sh
文件,在这两个文件里面我们可以设置我们的各项启动参数,以下以Windows为例
1 | @echo off |
初始状态应该跟我一样是什么也没有的,我的电脑用的是NVIDIA Geforce RTX 3060 Laptop 6G
显卡,这个显存虽然看起来很大,但是在机器学习这方面简直是不够用,为了避免爆显存,我们可以在COMMANDLINE_ARGS
里面加上一些参数
如果你的电脑用的显卡跟我的差不多,那么只用加上一个--medvram
就可以了,但如果你的电脑显卡显存小于等于4G,那么我推荐使用--lowvram
作为启动参数
这里附上我的启动参数
1 | @echo off |
这里多的后面会说
设置好启动参数以后,我们还需要下载一个模型,因为没有模型文件是启动不了的(这里模型不一定要是是官方的,官方的模型链接在Dependencies · AUTOMATIC1111/stable-diffusion-webui Wiki (github.com),但你也可以到我的分享站或者社区群体开的站SD - WebUI 资源站去下载)
把你下载好的模型,放到项目文件夹的models/Stable-diffusion
文件夹下(没有的话自己创建一个)
我们双击webui-user.bat
,它会自动进行环境的安装(当然Python是要预先装好的)
整个过程会比较漫长,如果因为网络原因安装不下来的话试试挂个梯子
当看到如图所示的提示的时候,就说明已经开好了,我们可以访问给出的链接进入webui(默认端口是7860
,但我开了一个实例在7860
了,所以它就自动顺延到7861
,实际使用请注意控制台给出的端口号)
访问给出的链接,我们就能到我们的webui控制台了
这个其实上面提到了,就是把ckpt
文件(checkpoint)丢到models/Stable-diffusion
文件夹就行
不过我们下载到的东西不一定是ckpt
文件,还有.vae.pt
和.pt
文件,
简单来说,一般遵循以下原则(当然特殊问题特别看待哈,你别提供给你文件的人说放在指定的位置,你还按照我的这个来)
graph TD;.ckpt/.safetensors-->models/Stable-diffusion;.vae.pt-->models/vae;.pt-->models/hypernetworks;
PT的使用方式:Pt放embeddings文件夹,施法输入对应文件名即可
在webui中能直接选择的其实就是models/Stable-diffusion
里面的模型,在左上角有个选择框,如果你放进去了选择框里没有的话,你可以点一下左边的刷新
在这里选择我们想要的模型以后,我们就可以开始成图了
刚访问自己的webui,里面应该是像我这个这样
左上角显示目前选择的模型,下面有两个大框框,上面输入的是正面tag(就是你想要的图片里面应该是什么样的),下面的是负面tag(就是避免什么样的图)
然后再往下有个Sampling method
是采样方式,就是生成图的时候,要用什么样的方式来对模型进行采样,这里我用得比较多的是Euler a
Euler
和 DDIM
,右边是Sampling steps
采样步数,采样步数越多越接近于你想要的图(不过是类似对数函数那样的,过大反而收益低)
再往下Width
和Height
就是生成图片的宽度和高度,不宜太大,否则会爆显存(CUDA:Out of Memory),我3060用1280*720没问题
右半边有Batch Count
生成图片的数量和Batch size
是损失函数,一般只调整数量,关于这两个推荐阅读 → Batch Size的相关问题及如何选择Batch Size的大小 - 知乎 (zhihu.com)
往下有Seed
,这个玩MC的应该不用说,种子嘛
还有个选项Hires. fix
,这个是高清修复,说白了就是图片放大,同样小心爆显存!!!再往下的可以跳过了
现在,在上面的框框输入以下内容
masterpiece, best quality, official art, extremely detailed CG unity 8k wallpaper
在下面的框框里面输入
lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, bad feet,
然后点击右边的generate,等待大约两分钟,看到右边生成了一张图片(生成的图片取决于模型以及随机生成的种子,所以每次生成基本都是不一样的)
恭喜你!你已经会使用基本的SD功能了!生成的图片可以在outputs/txt2img-images
里面找到!
在上面的教程中你会看到,我的启动项多了很多东西。在这里我把上面的东西搬下来
1 | @echo off |
这里PYTHON
GIT
VENV_DIR
这三个不用动(除非你知道你在做啥),我们主要关注下面两个
COMMANDLINE_ARGS
是Stable-diffusion-webui的启动项,--deepdanbooru
是训练tag的时候用的,可以在图片分割预处理的时候自动推断包含的tag,--medvarm
就是怕炸显存才加的,上面也说过了,--no-half-vae
主要用于解决生成图片时控制台报modules.devices.NansException
的问题(看下面的报错环节)
而PYTORCH_CUDA_ALLOC_CONF
是给CUDA用的启动参数,这里garbage_collection_threshold
决定了缓存的新旧与否(一般用0.5),而max_split_size_mb
是CUDA分割内存的时候的分割快的大小。这个启动参数一般不用设置,除非你要训练模型啥的
SD是可以安装插件的,而安装插件的方式很简单,在上方找到Extensions
选项卡,然后再选择Avaliable
,点击Load from:
按钮(就那个橙色的),加载完后下面会出来个列表,在里面选择自己想要的就可以了
我这里装了一个image browser
用于看图
modules.devices.NansException
在启动参数里面加入--no-half-vae
即可
RuntimeError
1 | changing setting sd_model_checkpoint to animefull-final-pruned.ckpt: RuntimeError |
解决方式:换个模型,该模型可能已经损坏
AttributeError
1 | -----> !!!! The file is most likely corrupted !!!! <----- |
(治标不治本)在启动项添加--disable-safe-unpickle
主页 | SD - WebUI 资源站 (123114514.xyz)
首页 - NovelAI - Share4Nothing (share4nothing.cf)
AI绘画模型博物馆: http://aimodel.subrecovery.top
NovelAI中文频道(u31uiz208r)
魔导师学院(2p6k6vzg5i)
没有频道功能点这个激活频道功能:点击链接加入QQ频道【接驳巴士】:https://pd.qq.com/s/47hvnz3w2
Kaggle: Your Home for Data Science
欢迎使用 Colaboratory - Colaboratory (google.com)(要梯子)
用户注册 | 三分机场 (xn–ehq00hgtfdmt.xyz)
Airports 个人机场/订阅汇总 - Airports (share4nothing.cf)
本人:喵呜初音 - pixiv
]]>这几天一直在弄点其他的东西,昨天弄了个哔哩漫游的服务器(用的vercel),然后一看我的vercel的流量使用,这才多久就已经60G了,一个月的限额可是100G
让我想起上次我的服务被打,一天就区队去掉了150G,vercel直接给我报警,我就在想有没有其他的代替方案
虽然Vercel会判定为DDoS攻击,但是确实很恼人,而且流量没了以后Vercel是会闹脾气的,上次跟群友(就ClientWorker | 一个基于规则驱动的前端路由拦截器的维护者)讨论过这个问题,然后说建议弄个缓存,不过我对Vercel没有研究的多仔细,所以就没弄了
今天突然想到可以用Gcore,它有类似于CloudFlare的CDN服务,而且还挺快的,说干就干!
首先我们在左侧找到CDN,然后新建一个资源
加速类型我们选择第二个(第一个要改的东西太多了而且设置很麻烦还是算了吧)
第二步是设置源站和自定义域名,源站就直接填入cdn.jsdelivr.net
,自定义域名就填自己的域名就好了,HTTPS打开,然后选择第一个Get free Let's Encrypt certificate
这里有个坑:如果你要使用自己的证书,不要用Cloudflare的SSL里面颁发的证书,没有Cloudflare小云朵的庇护的话那个证书是无效的!(这个坑了我至少半小时)
接着我们去DNS那里加一条记录(这里CNAME是跟账户绑定的,我的我自己用*
屏蔽了)
后面直接确认过去就好了,要用CDN的话直接将资源文件的域名改为你的自定义域名
这里有几个要改的设置
这个是修改为源的协议就行了,如果你的源站,支持啥就选啥,因为jsd支持HTTP
和HTTPS
所以我直接选择了第三个
这里可以添加自己的自定义域名,具体不讲,添加CDN资源的时候应该都加完了
这里设置CDN的缓存时间,按照自己的需求设置
这个很重要!!!如果不打开的话,访问的用户遇到重定向会直接重定向到指向的链接,打开的话CDN这边就会获取重定向后的内容然后返回给用户。因为jsd重定向到raw.githubcontent.com
,这个国内会404,所以如果是jsd的反代的话一定要打开,下面的状态码直接全部选上就行了
这个用来控制浏览器端的缓存,根据自己的需要设置
重定向到HTTPS,懂得都懂
这个是启用压缩,如果开了的话经过CDN的内容会压缩,省流
可以添加自定义headers,我这里加的东西如图
显示如下
可以隐藏某些headers项,但是我想不到有啥用
设置下载速度,应该没啥用
这个还处于Beta测试,说白了就是添多一层WAF
在RULES选项卡(左边)可以到规则页面,可以添加自己的规则。我这里是什么都没有加,到时候封仓库的时候再用
这是我第一次用真正意义上的CDN,Gcore还是挺好用的,速度也很快,一个月有1T的流量,应该够用了吧……
]]>上次用fly.io部署了biliroaming-go-server(教程),但是那个有bug,而且要求比较高(要信用卡,而且要服务器),这几天我在Github有找到了一个项目,可以将哔哩漫游服务器部署在Vercel上面
我们直接访问这个项目的地址 -> bili-vd-bak/biliroaming-ts-server-vercel: 为BiliRoaming、哔哩UWP 等提供支持。包括支持基本功能、搜索替换、黑白名单的哔哩漫游服务端。部署在Vercel HK1。 (github.com)
然后fork一下这个项目,就点击顶上的fork
键就好了,默认部署是在香港(hkg1),如果需要修改位置(只有香港和东南亚可选),则直接点开仓库里的vercel.json
然后把里面的regions改掉
1 | { |
改成下面这样
1 | { |
访问Vercel(Develop. Preview. Ship. For the best frontend teams – Vercel),登陆以后,新建一个项目
然后import一下刚刚fork的项目
直接点击Deploy
,然后等待部署完毕,点击Visit
,顶上的链接就是你的服务器地址啦!
在哔哩漫游里面的对应位置填上服务器地址即可!
目前没发现
]]>2022年12月18日下午,我感到十分地不适,在那之前,我们学院里有出现过COVID19(新冠肺炎)病例,所以整个学院都是在疫情管控状态,当我感受到我不适的那一刻我就知道,我很有可能是中招了。我第一次测量体温是37.4(刚刚过发烧线37.3),然后就把我丢到了临时的隔离房间去隔离去,说观察一个晚上再决定是否把我拉去隔离。
2022年12月18日晚,最后一次测量体温是38.1,此时的感觉是喉咙非常地干(话说这个自早上就是这样的了),而且四肢无力,特别是之前动过手术的左腿膝盖那个位置,很酸痛。
我就是带着各种不适的感觉睡了觉,期间起了三次,分别是十一点半、两点和四点
2022年12月19日,早上第一次测量体温,体温飙到了38.3度,这个被拉去隔离没跑了,早上四节课睡了两节课,中午就通知说去统一隔离点隔离,等中午过来以后第一次测了个体温,38.4,感觉头痛、四肢无力、喉咙干、有点流鼻涕、怕冷,来到隔离房间先倒头一睡,下午上课其实也心不在焉。等到了五点钟再测一次体温,好家伙直接给我干到了38.9度,稍微躺了躺感觉好了点,七点钟再测一次,体温下滑到了37.3度,虽然还是发烧,但是没那么严重了,症状轻了一些(当然也有可能是打了一下午COD的结果)
2022年12月20日,本来昨天是37.3的来着今早又到了38.1,说实在,感觉身体很酸痛,而且昨天的症状除了怕冷以外都还在,早上的第一二节课没有直播的那种网课,所以就开始了摸鱼模式,第三四节课概论说白了听了跟没听没区别。。。中午睡了个大觉,醒来已经14:44了(我们14:30下午上课),赶紧打开腾讯会议进去(至少是露个脸嘛),然后又开始摸鱼了(因为是中国近现代史纲要这门课程),下午测体温降到了37.4,然后跟群友玩了会Goose Goose Duck,刚开始玩也不同太懂怎么玩,玩完了等待吃饭
2022年12月21日,今天的体温稳定在37.4(发烧了,但是低烧),早上状态还行,就是喉咙痛,咳嗽,流涕;早上直接打开了FGO用脚本开始刷材料(太无聊了),一个手机开着电工网课,苏菲开着崩崩崩(FydeOS上装了一个),开始玩了起来。下午跟群友开始打CSGO官匹五黑,不能说我水平有多高,至少打得很快乐;晚上跟工作室的小伙伴一起打派派,第一把就成为了捍卫者(“这——是你的捍卫者”),后面就没吃过鸡了,不过体验还行,打下来发现头有点痛,唉不管了睡觉去了
2022年12月22日,早上没测体温,但是第一感觉是:头好痛!小睡了一下,七点二十左右起的床,吃个早餐准备上课,这天没发烧,就是咳嗽很厉害,而且流鼻涕。
2022年12月23日,已经不怎么流鼻涕了,但是还是会咳嗽。晚上打了BF1,应该说其他小队太菜了嘛,我们四人小队拿第一(五人但是最后一个是几乎最后才加入的水友)。开了100个胶囊,发了俩视频,愉快的一天过去了
2022年12月24日,没怎么流鼻涕了,但是咳嗽,难受得很,头不痛。早上听到了一首很好听的V家曲(在下面),等待中午吃饭……
2022年12月25日,除了咳嗽基本没有什么症状了,好烦啊周日还要上课= =,唉没办法,期末考试提前一周了,慢慢来吧
2022年12月26日,上级好烦啊,做个展板要求又多,你又不给我工资,我还要为你累死累活真tm烦,太难了,明天抗原阴性就可以回去楼里隔离了,晚上继续战地1,第一次感到烂橘子比EA Desktop好用???!
2022年12月27日,抗原阴性,会楼里去了,早上玩了会死亡搁浅(键鼠玩的)。至此,我已经阳康啦!
]]>做这个是因为之前 @wuki 问我说能不能用Deploy app servers close to your users · Fly这个平台弄哔哩漫游服务器,然后借了我一个号,结果陆陆续续总共拖了将近半年才弄出来,在这留个记录。
请注意:fly.io平台免费账户需要信用卡验证后才能够部署项目!
这里我们使用的项目是JasonKhew96/biliroaming-go-server (github.com)
根据fly.io官方的文档,有以下地区可选(Regions · Fly Docs)
Region ID | Region Location | Gateway* |
---|---|---|
ams | Amsterdam, Netherlands | ✓ |
cdg | Paris, France | ✓ |
den | Denver, Colorado (US) | ✓ |
dfw | Dallas, Texas (US) | ✓ |
ewr | Secaucus, NJ (US) | |
fra | Frankfurt, Germany | ✓ |
gru | São Paulo | |
hkg | Hong Kong, Hong Kong | ✓ |
iad | Ashburn, Virginia (US) | |
jnb | Johannesburg, South Africa | |
lax | Los Angeles, California (US) | ✓ |
lhr | London, United Kingdom | ✓ |
maa | Chennai (Madras), India | ✓ |
mad | Madrid, Spain | |
mia | Miami, Florida (US) | |
nrt | Tokyo, Japan | ✓ |
ord | Chicago, Illinois (US) | ✓ |
otp | Bucharest, Romania | |
scl | Santiago, Chile | ✓ |
sea | Seattle, Washington (US) | ✓ |
sin | Singapore | ✓ |
sjc | Sunnyvale, California (US) | ✓ |
syd | Sydney, Australia | ✓ |
waw | Warsaw, Poland | |
yul | Montreal, Canada | |
yyz | Toronto, Canada | ✓ |
在这里我们选择的就是香港地区(hkg),在部署中,它的cli是把当前目录下的文件打包为docker镜像上传到它的镜像库中再进行部署的
官网提供的安装方式如下
If you have the Homebrew package manager installed, flyctl can be installed by running:
1 | brew install flyctl |
If not, you can run the install script:
1 | curl -L https://fly.io/install.sh | sh |
Run the install script:
1 | curl -L https://fly.io/install.sh | sh |
Run the Powershell install script:
1 | iwr https://fly.io/install.ps1 -useb | iex |
但是因为我的网络太小霸王了,所以我用了Github的Codespaces来作为中介去干这个
在这个绿绿的Code
按钮里面点到Codespaces,然后创建一个(我这里创建过了所以有一个)
直接打开,可以在网页打开,也可以接入自己的Vscode,进入以后按快捷键Ctrl + L-Shift + `打开一个终端,并把安装flyctl
的命令写进去
这样就是安装完毕了,估计是Codespaces的机制问题,所以需要通过绝对路径去访问它
输入一下命令来登录(这里我就不打绝对路径了,这里假设是用本地电脑且flyctl
已经加入环境变量)
1 | flyctl auth login |
然后终端会显示一个链接,如果你跟我一样用的是Codespaces,那就把这个链接放到自己的浏览器里面去访问登录就行了,如果你是本地运行,应该会自动打开登录页面(没截图,登录应该是小问题)
首先打开.gitignore
文件和.dockerignore
文件(如果有的话),把里面的内容全部删掉,因为部署的时候我们是需要把配置文件给一起上传的,而.gitignore
把这些文件都排除掉了,所以要删掉里面的所有内容
再打开fly.toml
,在最底下加上这些内容
1 | [build.args] |
不这么做的后果↓
1 | 2022-12-19T10:02:56.427 runner[86dbcaaa] hkg [info] Starting instance |
接着我们把Dockerfile
删掉,因为如果有这个文件的话,flyctl
会把这个判定为docker项目,这样的话我们就很难把配置文件丢进去,所以我们要更改它的判定,将判定改为go
项目,所以要删掉这个
然后运行以下命令来初始化,跟着它的提示进行就行,只是最后问我们要不要部署,我们先选择不部署,因为我们接下来要导入数据库(记得把弹出来的数据库连接信息记住,因为它只会展示一次,然后就找不到啦)
接着我们修改一下项目的端口,将config.example.yml
复制一份,为config.yml
找到port
,把后面的数字改为8080
接着我们打开config.yml
修改数据库配置,找到以下内容,注释掉passwordFile
,然后修改配置为我们前面创建数据库时给的内容
1 | # 数据库 |
fly.io的创建的数据库进行连接的时候是使用内部域名进行连接的(格式大概是<app_name>-db.internal
,所以我们不能够通过正常的方式进行连接。所幸,flyctl
里面可以把数据库给映射到本地
使用以下命令进行映射
1 | flyctl proxy 5432 -a <db_name> |
这里我就使用下面这个命令进行连接
1 | flyctl proxy 5432:5432 -a biliroaming-tutorial-db |
显示如下内容的时候就是可以进行连接了
1 | Proxying local port 5432 to remote [biliroaming-tutorial-db.internal]:5432 |
codespaces还可以在PORTS
选项卡里看到绑定的本地端口
这里使用navicat进行连接,在测试之前一定要确保信息填对了
连接以后,我们在左侧可以看到两个数据库,一个是postgres
,一个是<app_name>
用哪个随便,不过如果要用<app_name>
那个,就需要在配置文件里面相应地改掉(在初始化项目那里的数据库连接那个地方)
右键自己需要使用的数据库,选择Execute SQL File
(执行SQL脚本,我这里是英文版),然后逐个将项目的sql文件夹内的脚本执行,构建数据库结构
使用以下命令来部署项目
1 | flyctl deploy |
如果在部署过程中遇到了下面这个问题(用codespaces就出现了,不过这个好像是它服务器的部署器的问题而不是我codespaces的问题)
1 | Error failed to fetch an image or build from source: downloading buildpack: extracting from registry gcr.io/paketo-buildpacks/go: fetching image: error pulling image configuration: error parsing HTTP 403 response body: invalid character '<' looking for beginning of value: "<?xml version='1.0' encoding='UTF-8'?><Error><Code>AccessDenied</Code><Message>Access denied.</Message><Details>We're sorry, but this service is not available in your location</Details></Error>" |
那就要加多个--local-only
参数,变成
1 | flyctl deploy --local-only |
当你的fly.io项目的monitor
里面显示如下就是部署成功了
1 | 2022-12-19T10:35:04.789 runner[fa79ac75] hkg [info] Starting instance |
因为fly.io默认只分配了ipv6地址,然而ipv6还没有普及,我们还是需要ipv4的
使用以下命令来为项目获取ipv4地址
1 | flyctl ips allocate-v4 -a <app_name> |
会显示获取到的IP地址等信息
1 | VERSION IP TYPE REGION CREATED AT |
今年的九月份,我卖掉了我的老联想 Yoga 370,然后购置了一台Surface Pro 5顶配版给我自己用
起初是想当做笔记本用的(因为可以用笔),后来才发现有很多的用途
本文旨在记录我在Surface Pro 5上面的各种骚操作,以及我的个人使用体验,告诉你为什么在2202
年,我还要选择一台仅仅配置是7代i7的微软亲儿子Surface Pro 5
先上两张实物图(背膜是拿图片找某宝做的)
很简单,鱼子上面一搜,就有很多,我找的是个人使用的那种(其实鱼子上面很轻易能看出谁是二道贩子,谁是个人卖家),卖家跟我说电池有点问题,其他没啥问题。我想都17年还是18年的产品了,电池有点问题也是正常的事情,然后就一拍即合,拍下了这台苏菲Pro 5
等我拿到手以后,我发现事情没有那么简单,确实是电池有问题,但是这个电量显示完全不准,有可能我还在办公,电池剩下50%左右的电量就直接给我关机了,等我怎么按下开机键也没用,接上电源后才发现是没电了。
于是我在某宝上一搜,果然有换电池的,价格在280~450不等,我想这个价格也算是合理,毕竟苏菲这东西集成度太高了,拆的也难。于是我找了一家标价是280的,然后把机子寄了过去换电池。
某天晚上自习课刚下课,突然我的OPPO Watch接到一通电话,一听才知道是某宝维修商,他说我的电脑不仅是电池有问题,主板还漏电,对钱比较敏感的我问了一句修这个花多少钱,总之最后价格讲下来就是460
拿到修好的苏菲,我就开始了我的捣鼓之旅。
既然是微软亲儿子,那Windows的体验是少不了的,我这台装的是Windows 11 Professional(专业版)
既然Surface是一个笔记本(真笔记本,不是电脑层面的笔记本),那肯定得走一波手写笔的体验
我用了巨硬自带的OneNote for Windows 10(没错Win11还用的是Win10的),这个东西在我弄数学建模竞赛的时候发挥了非常大的作用
而且Onenote有个好处,如果你在其他机器上登陆同一个Onenote账户,可以直接同步(下面这个是我游戏本上的截图)
当然,因为Surface独有的触屏体验,还可以玩Osu(虽然以前那台LENOVO也可以点着玩)【忘截屏了】
还可以拿来推GALGAME(没下完,就截个Steam意思意思吧),但是拿来打CSGO那就是小霸王了(一帧能玩,两帧流畅,三帧电竞)
这个3:2的屏幕,写代码也是杠杠的(图为弄数模的时候的数据处理)
还可以顺带玩一玩SDVX(民间版本,不外传,因为禁用了键盘所以是拍的)
再加上Win11对触屏本身的BUFF加持,让苏菲变得比某希沃好用多了
因为我用Ubuntu的时候没截屏过,然后输入法配置问题把我搞得心态崩了直接把Ubuntu删了,所以这一届没有图片
总的来说是还可以,但是要经过一番配置才可以,你需要安装一个Kernel才能解锁Surface的全部功能(包括触屏等)
使用的项目是这个https://github.com/linux-surface/linux-surface
安装方法见Installation and Setup · linux-surface/linux-surface Wiki (github.com)
为啥我会选择装ChromeOS?这个要从一个想法说起。本来我就是个音游玩家,一直在用手机玩音游,没怎么用过平板来玩(以前嫖过别人的平板不过那也是别人的),平板玩音游的优势很大,主要还是屏幕大。我一开始选的是Bliss OS For PC,这个里面是个Android x86系统,但我不知道是苏菲特色还是咋地,不管是BlissOS 11、BlissOS 14 还是 BlissOS 15(如果过不了那个logcat
可以F12里面直接找下载链接,这里放一个 -> BlissOS 15 with Gearlock)装在我的Surface上就一直起不来(进不了系统,有的卡在grub,有的卡在kernel load,有的直接重启),所以我就只能另辟蹊径
我想起之前用过的FydeOS,但是用的是以前的那个联想装的,还很不成熟,只能在U盘里面使用,装东西也只能装在那个里面,所以当时就放弃了。时隔一年,我又再次下载下来发现已经跟之前很不一样了,现在可以安装在硬盘里面了(安装过程省略,才不是我没有截图呢),安装的时候如果你要保留Windows,记得让安装程序帮你配置rEFInd,要不然会很麻烦
开机后直接就是一张壁纸,下面是任务栏(启动器)
从下往上滑,打开应用列表,有个非常显眼的东西:安卓设置,点开以后会有个EULA,同意了就可以打开安卓子系统了(其实是Arc - Android Runtime on ChromeOS)
打开Android子系统后,可以在关于里面看到是Android 9(原生的)
用我们的常规手段打开开发者选项后,就可以打开adb调试了,然后可以在ChromeOS的Linux开发者容器里面用adb连接
你还可以在FydeOS的应用商店里面找到配置 OpenGapps
这个应用,打开它,我们就可以安装GAPPS套件了
你可以预先下好Clash啥的软件,方便后续使用
关于VPN服务,真的要点个赞,当你在Android子系统中使用VPN服务时,FydeOS会自动将VPN应用于整个OS里面,也就是说当我打开Clash的时候,不仅仅是Android子系统的软件可以走代理,FydeOS的Chromium也上了代理,不用再在Linux容器里面装多个v2rayL啥的东西了
接着就是装一堆音游啦!既然有了Google Play商店,我就从Play商店里面下载(Cytus2本来在B站下的,因为给B站充钱了,但是在这上面会闪退而Play版就不会,辣鸡龙渊能不能让我转国际区……)
在这个上面玩音游的体验不能算是优秀,只能算是中规中矩,有些音游在上面玩的有点卡(例如阿卡伊,当然不排除我真的不会玩阿卡伊),华为玩音游有的现象在这上面基本都有(指吃音)
不过这个系统的Android和ChromeOS之间几乎没有隔阂,这个体现在分享上面,你可以直接分享到Android的应用中
我还在这上面装了崩崩崩、PCR(多聚酶链式反应)、FGO(非酋系列)、明日方舟这几个游戏,本来装了原的,但是原的体验并不好,跟在我的红米NOTE 11上面打感觉没什么两样,就删掉了
不过这个Android有一个缺点:不能root,我正在寻找root的方式不过这肯定要很久,或许我会找不到。本来我想试试在Windows下用DiskGenius把boot.img直接提取出来修补的,但是FydeOS的目录结构非常奇怪,我是真的没有找到,慢慢来吧……
在开启Linux虚拟机的时候提示安装Linux时出错 - 启动虚拟机时出错,请重试;打开Linux终端提示Error starting penguin container: 5 Launching vmshell failed: Error starting crostini for terminal: 5
可以通过查看/var/log/messages
这个文件来看看问题出在哪,先Ctrl + Shift + T打开Crosh
(ChromeOS的终端入口),然后输入shell
打开终端,接着输入sudo su
进入root用户才能看到
我这里看到的日志如下(节选了报错部分)
1 | 2022-12-20T04:42:38.583489Z INFO vm_concierge[3233]: Preallocating user-chosen-size raw disk image |
这里很明显了是缺少kernel文件,在官方论坛问了一圈,官方回复如下
1 | 请检查 /usr/local/tatl-fydeos/ 目录是否存在,其中应该有 vm_kernel, vm_rootfs.img 等文件。 如果目录不存在或者文件缺失的话,需要在 shell 中以 root 身份执行 /usr/bin/stateful_update_wrapper.sh recover 把 stateful 分区恢复一下,重启后再重试安装 linux 子系统。 |
然后我去检查,果然没有这个目录,根据他给的方法恢复一下,可以用了
这里有个坑就是它恢复的时候会下载资源文件,这个资源文件的下载链接是AWS3的,建议挂个梯子下,要不然慢得很
Surface Pro 5毕竟是一台几年前的本子了,论性能肯定比不上现在的电脑,但是它带给我的使用体验是非常棒的,比我之前那台YOGA要好得多(轻薄、便携),而且3:2的屏幕确实适合工作(这里表扬一下拯救者系列,我的戴尔游侠就是16:9),可能缺点就是在性能上,还有就是Linux的适配上面了。该说不愧是微软亲儿子嘛,微软做工确实牛
]]>WSA确实是个很好用的东西,毕竟能够直接跑上安卓系统,不用忍受模拟器那种广告,很方便
但是同样也带来了一些问题就是:你的C盘会爆满
这主要是因为WSA的数据盘都放在了C:\Users\%username%\AppData\Local\Packages\MicrosoftCorporationII.WindowsSubsystemForAndroid_8wekyb3d8bbwe\LocalCache\
这个目录下,我的数据盘经过我的半年使用已经到了34.3GB
了,然后就导致了我的C盘像上面那张图那样要炸了
我记得Linux里面有ln
命令可以创建文件链接,然后Windows有个叫做mklink
的(仅cmd可用,powershell没有,我踩了这个坑),之前为了让Epic和Steam的GTA5都可用还用过来着,这不用这个方法把数据移到其他硬盘里
我把文件放在了D:\WSA-data
这个文件夹里,连着C:\Users\%username%\AppData\Local\Packages\MicrosoftCorporationII.WindowsSubsystemForAndroid_8wekyb3d8bbwe\LocalCache\
的LocalCache
文件夹整个放进去
然后按Windows + X,选择Windows 终端(管理员)
(选择powershell
或者cmd
都行,但是一定要有管理员权限
然后打入下面这行命令(记得把后面的那个路径改成你自己的)
1 | mklink /J "C:\Users\GamerNoTitle\AppData\Local\Packages\MicrosoftCorporationII.WindowsSubsystemForAndroid_8wekyb3d8bbwe\LocalCache" "D:\WSA-data\LocalCache" |
然后我们的文件链接就创建成功了,打开WSA,一切正常!
]]>