ddOtube.20.05.05

我打算搞个视频网站了,因为我发现那个叫做BackBlaze的云存储服务商,它和cloudfare之间居然免流量!这样的话,哪怕存储1TB的视频我也只需要5美元的费用,而观众看视频导致的流量既不会从vultr或者别的什么vps厂商那里扣也不会从BackBlaze那里扣,而且我也不会觉得它能达到1TB

毕竟untergangers被屑tube天天copyrekt,我觉得我可以做点事情解救他们,或者在我看来,搞不好可以在我自己的视频网站上上传100Mbps的4k视频,这是屑cord做不到的(迫真

现在就差技术路线了,我到底用什么做视频网站?要不要重新买个vps?而且最重要的是,如何实现上传功能?我还想做点别的功能,比如供管理员命令行批量重新上传untergangers的视频?从其他网盘那里获取视频上传链接(比如untergangers喜欢用的mediafire或者我最喜欢用的discord drive)?

其实这些都好办,因为只有我是管理员,我可以直接用脚本上传任何视频并设置好参数,但别人怎么办?我还得看看BackBlaze的参考文档,还有和我选择的开源视频网站程序集成

另外这个视频网站也允许我做出那件我一直想做但做不到的事情:unterganger archive

因为unterganger圈子流行退圈删视频,比如fish chan的视频就被删过,我之前想过用discord drive做这件事情,但现在我有更好的办法了:BackBlaze + cloudflare

或者我也可以archive别的视频,比如某俄罗斯猫片up的喵酱视频

总之拥有自己的视频网站将是件非常有意思的事情,而且由于是cloudflare的cdn,搞不好我甚至都不用翻墙

至于费用,哪怕里面堆满我自己拖的视频也只需要5美元/TB,我觉得还能接受

至于视频网站程序,它至少得能实现下述功能:

  • 重定向上传到BackBlaze
  • 像屑tube那样设置播放列表,或者视频分类
  • 对视频分类设置权限,比如unterganger archive只对部分unterganger开放

剩下的东西我觉得可以直接命令行了

ps. 域名已经买了,ddotube.com,这次我用的是namesilo,接下来如果没啥问题的话我打算把godaddy上的域名全部转出

UPDATE:在我等那个虚拟信用卡卖家发货的时候,我™居然注册了10个BackBlaze账号可还行,它的电话验证比屑cord松多了,随便过,所以我顿时有了100GB白嫖空间;现在信用卡发了,而且也通过了验证,所以我的大号应该可以正常用了,然而我仍然没有确定用哪个开源视频网站🤔

我那个eDP转DP直驱也翻车了,只会不停RGBW四色显示,插台式机上还能显示出分辨率等参数,甚至设备管理器里都有型号,就是不显示;笔记本上压根连型号都识别不出,看来这10系N卡简直和diy有仇🙃

所以我只能去买驱动板了,™驱动板什么都带,甚至还内置背光驱动🤔也就是加130块钱的样子🤔另外我又买了个便宜域名,准备设置上cloudflare,结果它一直卡在nameserver那里,我记得明明在whois里面都改了啊,这可真🐔儿见鬼了

UPDATE2:在我折腾了将近一个小时后,第二套域名系统也折腾成功了,反正只要节点还是f002(我注册了十个也是如此),一个域名就可以对付一堆账号,只要把链接中间的bucket name改掉即可,所以嘛,我已经打算把那个0.⑨⑨美元的xyz域名当公共肉便器用了🤔基本上见人就推荐白嫖backblaze,直到某个傻逼准备橄榄我,whois出道然后出了李志强为止(我现在注册的所有域名都填的李志强的迫真信息🤔保险起见剩下的DNS记录全部改成了4chan的ip地址(八成也是cloudflare

我测试了下墙内的连接性,发现了一个非常诡异的现象,移动墙中墙的宽带连接起来速度极慢,但移动4G却能满速看视频,包括brcc系列,可能和成都移动恰好相反吧🙃

我看啥时候出个迫真白嫖教程,对了,出于橄榄李志强的原因(迫真),我鼓励所有人直接用https://kawaii.toiletchan.xyz取代自己注册个域名搞cloudflare🙃对,我并没有按照backblaze官方教程那样设置page rules,我搞的就是一个域名访问所有的backblaze public buckets,不服来肛李志强去啊🤔

borderlands3.20.04.22

这几天连着玩了好几天borderlands3,和我玩的其他游戏一样,这游戏也玩到了玩游戏时间没迫真改游戏时间多的程度

目前bl3由于存档修改器没出,所以只能对武器进行内存修改,据说武器数据其实是在资源文件里的,随机只是在随机buff(那么buff肯定是在存档里面的,为什么我没法修改?),所以现在用CE修改的结果再次打开游戏会失效

但bl3迫真修改的另外一个领域挺有意思的,这游戏其实无论开箱子还是用那个“gun gun”直接刷武器,甚至任务结束领奖励都是在对一个叫做itempool的对象进行随机化操作,如果能找到比如gun gun的指针(CE脚本已经有了),修改其itempool参数,就能想刷什么就刷什么,比如将弹药的itempool放进去,gun gun就变成了ammo gun🤔或者刷10个橙色装备也行,我反正已经集齐了infinity枪🤔

问题是itempool的指针每次运行游戏后都会变,所以需要注入一个borderlands3.dll进去,它据说能实现console但我从来没调用成功过,但它至少能dump出各种对象的指针出来,然后grep一下就能获得itempool指针了🤔我看了下里面有意思的东西多得是,比如有些任务奖励的枪,甚至连gun gun本身都能刷出来(我猜测这个itempool的存在是为了主线后期的某个任务奖励,倒数第二个vault的神器就是这个,但和另外三个不一样,这个是个武器),而且由于gun gun刷出来的枪总是匹配当前等级,如果乐意的话可以一直使用某些装备,免得接着玩下去那些装备变得太弱🤔

另外我还发现了一些有意思的东西,比如dwClipToSpend和BulletsToFire这两个参数,前者如果设为0的话任何武器都能变成infinity(至少infinity是这么设置的),后者如果为0的话表示连发,如果为1或者其他数的话表示点一次鼠标发射的弹药数;gun gun和maliwan的武器一样需要蓄力,但坑爹的是蓄力之后只能发一次(10个武器),这样刷infinity的时候就极其蛋疼,所以我把这两个变量都改成0,fire rate改成2,然后我就可以刷一堆小手枪,然后做infinity hunter了(迫真

Lilith:这就是你迟迟不去寻宝的理由?(手动滑稽

UPDATE:最近bl3来了一波更新,那个临时改武器参数的脚本废了,但改itempool和找出武器指针的脚本还能用

新的event地图里面有新武器,其实只要开event就能在除了飞船外的任何地图刷新武器(因为有哪些可用的itempool其实和地图相关,但很神奇的是地图专属itempool其实还是比较少的),除了一把atlas的武器需要在那个地图的boss itempool里刷;那真的是bl3最神的神器,只需要一颗子弹就能召唤出一把悬空的自动炮塔,能一直射到时间限制结束为止,不像tediore的神器需要浪费一个弹夹而且还有子弹的限制,配合no reload可以刷出几十把炮塔,将任何视线内的敌人扫成筛子🤔像极了rage2里的无限无人机流🤔果然bl3有隐藏class,那就是:飞过来!飞过来!!飞过来!!!(wiebitte

接下来我研究了下更进阶的antics,直接改武器;分析武器指针可以发现武器的永久存储数据只有等级、blueprint和武器附件参数,别的数字形式数据都是由前者算出来的🤔理论上将一把武器的参数全部替换成另外一把武器的参数就能将它直接变成后者,比如我就这样lv1就拿到了gun gun🤔

但问题是lv1是没有什么机会得到eridium的,而这个游戏诡异的地方是如果eridium为0的话是怎么也修改不了的,所以真正可以使用gun gun的时候可能是lv4,第一个地图西北方向(也就是claptrap任务拆COV广播塔的地方再往前)有个隐藏boss,打它就有eridium🤔我记得我那次玩时拿到了eridium准备闪人,然后它一直跟着我到了COV的营地,然后和COV打起来了,接下来居然判断我TM赢了,草(中日双语

既然gun gun没法用,我就打算按照atlas武器的参数改一把那个神器,结果游戏崩了🙃但改另外一款atlas武器时却意外成功🙃我去bl3 moddin' discord上查东西,结果发现就这几天突然出了存档修改器,而且还是web端,爽的1b,直接从另外一个存档搞到了武器数据编码粘贴了过去,这样我终于可以拿神器在lv1时就biubiubiu过去了(手动滑稽🤔

话说回来现在既然已经可以直接粘贴武器进去了,甚至造出游戏中不存在的武器(比如在辐射枪里加上the leech的改良版taser造出辐射伤害的taser枪),我觉得gun gun好像没啥必要了,用claptrap的名言来说,就是“screw you borderlands 3, you can't hurt us anymore”(wiebitte🤔

b r u h s e t t e.20.04.16

我今天下午傻逼了,改频道备份脚本的时候把调试用的message id硬编码到了脚本里面而忘了打注释,导致后面拖的ucc绝大多数频道都没有拖完,更™哭笑不得的是我到拖那个没多少消息的science频道发现第一次返回的就是个空数组才发现这个问题,然后我发现我™把那串玩意还写到github里去了,吓得我赶紧先改了git,然后再接着搞

所谓改git就是先git clone到本地,然后git reset --hard [确认没有出错的commit],然后git push -f,输入github账号和密码,搞定,github那边再也看不到出错的代码了

本来今天晚上我就可以列举出实验数据的,但目前这样我只能先列举出(但愿)没出错部分的数据了

I what data

当然是ucc的数据了(手动滑稽

我用一台vultr最烂的机子(512MB内存,10GB固态,NY/NJ)搞这次实验,而且我利用起来了上次创建到一半就被橄榄的账号,所以只有⑨个webhook线程+1个nitro线程

下面是实验结果:

我们先写一个循环:

for bruh in `ls -tr | grep -Eo "ucc.[a-z\-]*" | uniq`
do
N=(cat "bruh.20.04.16.json" | wc -l)
[ (wc -c < "bruh.20.04.16.sedresults") -eq 0 ] && M=0 || M=(((cat "bruh.20.04.16.sedresults" | wc -l )/2))
echo "bruh(N=N,M=M)"
echo "\`\`\`"
cat "$bruh.20.04.16.timestat"
echo "\`\`\`"
echo
done

然后我们就可以列举结果了(其中N为消息条数,M为附件的数量):

ucc.rules(N=3,M=0)

>>>> time for stage 1:
real    0m0.598s
user    0m0.212s
sys 0m0.163s
>>>> time for stage 2 reupload phase:
real    0m0.069s
user    0m0.030s
sys 0m0.038s
>>>> time for stage 2 sedreplace phase:
real    0m0.008s
user    0m0.001s
sys 0m0.007s
>>>> time for stage 2:
real    0m0.259s
user    0m0.126s
sys 0m0.132s

ucc.general(N=178154,M=8917)

>>>> time for stage 1:
real    40m0.036s
user    15m3.618s
sys 15m59.694s
>>>> time for stage 2 analysis phase:
real    54m40.750s
user    15m8.014s
sys 38m53.228s
>>>> time for stage 2 reupload phase:
real    78m32.942s
user    35m29.197s
sys 24m38.265s
>>>> time for stage 2 sedreplace phase:
real    34m10.949s
user    16m32.306s
sys 16m57.830s
>>>> time for stage 2:
real    167m26.441s
user    67m10.152s
sys 80m30.151s

ucc.parodies(N=3836,M=83)

>>>> time for stage 1:
real    0m58.126s
user    0m24.488s
sys 0m20.151s
>>>> time for stage 2 analysis phase:
real    0m47.037s
user    0m17.923s
sys 0m28.172s
>>>> time for stage 2 reupload phase:
real    0m47.024s
user    0m20.175s
sys 0m11.811s
>>>> time for stage 2 sedreplace phase:
real    0m2.095s
user    0m0.862s
sys 0m1.194s
>>>> time for stage 2:
real    1m36.432s
user    0m39.057s
sys 0m41.348s

ucc.pictures(N=21194,M=3570)

>>>> time for stage 1:
real    4m53.799s
user    1m52.285s
sys 1m55.062s
>>>> time for stage 2 analysis phase:
real    6m52.144s
user    2m17.382s
sys 4m27.690s
>>>> time for stage 2 reupload phase:
real    34m38.977s
user    15m16.545s
sys 10m23.845s
>>>> time for stage 2 sedreplace phase:
real    2m44.607s
user    1m14.663s
sys 1m27.114s
>>>> time for stage 2:
real    44m16.138s
user    18m48.753s
sys 16m18.879s

ucc.games(N=4168,M=474)

>>>> time for stage 1:
real    1m3.273s
user    0m25.020s
sys 0m26.014s
>>>> time for stage 2 analysis phase:
real    1m3.392s
user    0m23.598s
sys 0m38.562s
>>>> time for stage 2 reupload phase:
real    5m11.379s
user    2m7.728s
sys 1m25.108s
>>>> time for stage 2 sedreplace phase:
real    0m11.912s
user    0m4.785s
sys 0m6.849s
>>>> time for stage 2:
real    6m26.957s
user    2m36.216s
sys 2m10.685s

ucc.music(N=3296,M=168)

>>>> time for stage 1:
real    0m57.296s
user    0m25.796s
sys 0m21.075s
>>>> time for stage 2 analysis phase:
real    0m43.922s
user    0m16.960s
sys 0m26.012s
>>>> time for stage 2 reupload phase:
real    10m18.591s
user    1m28.233s
sys 0m59.993s
>>>> time for stage 2 sedreplace phase:
real    0m8.526s
user    0m3.965s
sys 0m4.357s
>>>> time for stage 2:
real    11m11.394s
user    1m49.281s
sys 1m30.579s

ucc.youtube(N=3269,M=63)

>>>> time for stage 1:
real    0m54.414s
user    0m23.364s
sys 0m20.059s
>>>> time for stage 2 analysis phase:
real    0m40.292s
user    0m15.551s
sys 0m23.910s
>>>> time for stage 2 reupload phase:
real    0m46.225s
user    0m15.342s
sys 0m10.395s
>>>> time for stage 2 sedreplace phase:
real    0m1.605s
user    0m0.648s
sys 0m0.894s
>>>> time for stage 2:
real    1m28.441s
user    0m31.681s
sys 0m35.376s

ucc.bots(N=178784,M=15950)

>>>> time for stage 1:
real    43m44.499s
user    18m2.452s
sys 17m22.506s
>>>> time for stage 2 analysis phase:
real    73m5.382s
user    19m30.763s
sys 52m51.512s
>>>> time for stage 2 reupload phase:
real    155m11.269s
user    67m43.191s
sys 46m36.591s
>>>> time for stage 2 sedreplace phase:
real    65m31.364s
user    32m56.373s
sys 31m18.920s
>>>> time for stage 2:
real    293m50.687s
user    120m11.196s
sys 130m48.238s

ucc.spam(N=22191,M=1554)

>>>> time for stage 1:
real    5m8.796s
user    2m9.658s
sys 1m55.477s
>>>> time for stage 2 analysis phase:
real    4m42.811s
user    1m50.327s
sys 2m49.128s
>>>> time for stage 2 reupload phase:
real    35m51.530s
user    9m23.487s
sys 5m36.858s
>>>> time for stage 2 sedreplace phase:
real    2m54.117s
user    1m27.707s
sys 1m23.897s
>>>> time for stage 2:
real    43m29.036s
user    12m41.749s
sys 9m50.207s

ucc.announcements(N=1128,M=56)

>>>> time for stage 1:
real    0m21.185s
user    0m6.881s
sys 0m6.430s
>>>> time for stage 2 analysis phase:
real    0m11.996s
user    0m5.183s
sys 0m6.553s
>>>> time for stage 2 reupload phase:
real    0m46.831s
user    0m14.504s
sys 0m7.984s
>>>> time for stage 2 sedreplace phase:
real    0m1.020s
user    0m0.407s
sys 0m0.594s
>>>> time for stage 2:
real    1m0.074s
user    0m20.181s
sys 0m15.265s

ucc.roleplaying(N=13394,M=202)

>>>> time for stage 1:
real    3m8.108s
user    1m15.497s
sys 1m9.103s
>>>> time for stage 2 analysis phase:
real    2m30.225s
user    0m57.706s
sys 1m29.795s
>>>> time for stage 2 reupload phase:
real    2m19.907s
user    0m54.710s
sys 0m29.106s
>>>> time for stage 2 sedreplace phase:
real    0m6.245s
user    0m2.795s
sys 0m3.315s
>>>> time for stage 2:
real    4m56.968s
user    1m55.423s
sys 2m2.564s

ucc.nsfw(N=67477,M=6063)

>>>> time for stage 1:
real    15m55.261s
user    6m25.597s
sys 6m19.178s
>>>> time for stage 2 analysis phase:
real    17m38.283s
user    5m46.530s
sys 11m41.315s
>>>> time for stage 2 reupload phase:
real    53m7.474s
user    25m51.804s
sys 15m48.258s
>>>> time for stage 2 sedreplace phase:
real    11m18.488s
user    5m36.071s
sys 5m32.812s
>>>> time for stage 2:
real    82m5.272s
user    37m14.776s
sys 33m2.907s

ucc.parody-of-the-month(N=230,M=1)

>>>> time for stage 1:
real    0m4.866s
user    0m1.773s
sys 0m1.734s
>>>> time for stage 2 analysis phase:
real    0m2.490s
user    0m1.095s
sys 0m1.379s
>>>> time for stage 2 reupload phase:
real    0m2.902s
user    0m0.272s
sys 0m0.212s
>>>> time for stage 2 sedreplace phase:
real    0m0.113s
user    0m0.032s
sys 0m0.080s
>>>> time for stage 2:
real    0m5.878s
user    0m1.532s
sys 0m1.907s

ucc.unterganger-of-the-month(N=356,M=4)

>>>> time for stage 1:
real    0m5.512s
user    0m2.075s
sys 0m1.818s
>>>> time for stage 2 analysis phase:
real    0m3.346s
user    0m1.517s
sys 0m1.805s
>>>> time for stage 2 reupload phase:
real    0m3.691s
user    0m0.976s
sys 0m0.576s
>>>> time for stage 2 sedreplace phase:
real    0m0.263s
user    0m0.081s
sys 0m0.180s
>>>> time for stage 2:
real    0m7.569s
user    0m2.674s
sys 0m2.730s

ucc.politics-issues-news(N=39138,M=902)

>>>> time for stage 1:
real    9m52.465s
user    4m1.586s
sys 3m49.775s
>>>> time for stage 2 analysis phase:
real    11m59.082s
user    2m56.054s
sys 5m24.818s
>>>> time for stage 2 reupload phase:
real    7m53.525s
user    3m55.623s
sys 2m11.564s
>>>> time for stage 2 sedreplace phase:
real    1m11.090s
user    0m32.826s
sys 0m37.067s
>>>> time for stage 2:
real    21m4.250s
user    7m24.727s
sys 8m13.773s

ucc.personal-venting(N=63703,M=1814)

>>>> time for stage 1:
real    15m24.444s
user    5m45.986s
sys 6m9.725s
>>>> time for stage 2 analysis phase:
real    17m28.200s
user    5m28.831s
sys 11m35.278s
>>>> time for stage 2 reupload phase:
real    19m5.728s
user    7m44.789s
sys 4m42.570s
>>>> time for stage 2 sedreplace phase:
real    2m53.872s
user    1m22.623s
sys 1m28.695s
>>>> time for stage 2:
real    39m28.740s
user    14m36.596s
sys 17m47.007s

ucc.welcome-goodbye(N=12510,M=154)

>>>> time for stage 1:
real    2m57.746s
user    1m8.830s
sys 1m7.993s
>>>> time for stage 2 analysis phase:
real    2m48.142s
user    1m1.245s
sys 1m42.571s
>>>> time for stage 2 reupload phase:
real    1m30.062s
user    0m38.672s
sys 0m22.933s
>>>> time for stage 2 sedreplace phase:
real    0m5.497s
user    0m2.299s
sys 0m3.066s
>>>> time for stage 2:
real    4m24.047s
user    1m42.358s
sys 2m8.766s

ucc.feedback-support(N=4354,M=74)

>>>> time for stage 1:
real    1m3.929s
user    0m24.427s
sys 0m24.672s
>>>> time for stage 2 analysis phase:
real    0m54.821s
user    0m21.481s
sys 0m31.699s
>>>> time for stage 2 reupload phase:
real    1m0.924s
user    0m19.385s
sys 0m12.476s
>>>> time for stage 2 sedreplace phase:
real    0m1.948s
user    0m0.762s
sys 0m1.088s
>>>> time for stage 2:
real    1m57.993s
user    0m41.722s
sys 0m45.465s

ucc.pokemon-bots(N=69043,M=83)

>>>> time for stage 1:
real    17m31.568s
user    6m41.507s
sys 6m54.745s
>>>> time for stage 2 analysis phase:
real    18m10.107s
user    5m35.012s
sys 12m10.210s
>>>> time for stage 2 reupload phase:
real    1m28.991s
user    0m22.092s
sys 0m13.200s
>>>> time for stage 2 sedreplace phase:
real    0m10.733s
user    0m5.372s
sys 0m5.145s
>>>> time for stage 2:
real    19m50.917s
user    6m2.850s
sys 12m29.112s

ucc.rules-dca(N=1,M=0)

>>>> time for stage 1:
real    0m0.557s
user    0m0.190s
sys 0m0.133s
>>>> time for stage 2 reupload phase:
real    0m0.084s
user    0m0.026s
sys 0m0.058s
>>>> time for stage 2 sedreplace phase:
real    0m0.011s
user    0m0.002s
sys 0m0.006s
>>>> time for stage 2:
real    0m0.337s
user    0m0.123s
sys 0m0.208s

ucc.best-audio-based(N=163,M=1)

>>>> time for stage 1:
real    0m3.159s
user    0m1.041s
sys 0m1.114s
>>>> time for stage 2 analysis phase:
real    0m1.884s
user    0m0.770s
sys 0m1.057s
>>>> time for stage 2 reupload phase:
real    0m2.829s
user    0m0.264s
sys 0m0.222s
>>>> time for stage 2 sedreplace phase:
real    0m0.103s
user    0m0.040s
sys 0m0.061s
>>>> time for stage 2:
real    0m5.074s
user    0m1.158s
sys 0m1.512s

ucc.best-current-events(N=363,M=3)

>>>> time for stage 1:
real    0m6.164s
user    0m2.346s
sys 0m2.096s
>>>> time for stage 2 analysis phase:
real    0m4.232s
user    0m1.737s
sys 0m2.326s
>>>> time for stage 2 reupload phase:
real    0m6.055s
user    0m0.773s
sys 0m0.582s
>>>> time for stage 2 sedreplace phase:
real    0m0.261s
user    0m0.083s
sys 0m0.174s
>>>> time for stage 2:
real    0m10.846s
user    0m2.692s
sys 0m3.281s

ucc.best-dpmv(N=309,M=4)

>>>> time for stage 1:
real    0m5.095s
user    0m1.803s
sys 0m1.815s
>>>> time for stage 2 analysis phase:
real    0m3.480s
user    0m1.484s
sys 0m1.923s
>>>> time for stage 2 reupload phase:
real    0m3.917s
user    0m1.032s
sys 0m0.654s
>>>> time for stage 2 sedreplace phase:
real    0m0.155s
user    0m0.070s
sys 0m0.083s
>>>> time for stage 2:
real    0m7.845s
user    0m2.697s
sys 0m2.840s

ucc.best-fx(N=188,M=1)

>>>> time for stage 1:
real    0m3.332s
user    0m1.147s
sys 0m1.165s
>>>> time for stage 2 analysis phase:
real    0m2.353s
user    0m0.907s
sys 0m1.393s
>>>> time for stage 2 reupload phase:
real    0m2.776s
user    0m0.270s
sys 0m0.224s
>>>> time for stage 2 sedreplace phase:
real    0m0.122s
user    0m0.047s
sys 0m0.064s
>>>> time for stage 2:
real    0m5.521s
user    0m1.310s
sys 0m1.864s

ucc.best-parody-by-a-newcomer(N=216,M=3)

>>>> time for stage 1:
real    0m3.999s
user    0m1.389s
sys 0m1.331s
>>>> time for stage 2 analysis phase:
real    0m2.521s
user    0m1.012s
sys 0m1.441s
>>>> time for stage 2 reupload phase:
real    0m3.483s
user    0m0.758s
sys 0m0.503s
>>>> time for stage 2 sedreplace phase:
real    0m0.140s
user    0m0.057s
sys 0m0.081s
>>>> time for stage 2:
real    0m6.394s
user    0m1.929s
sys 0m2.172s

ucc.best-series(N=128,M=2)

>>>> time for stage 1:
real    0m2.613s
user    0m0.861s
sys 0m0.850s
>>>> time for stage 2 analysis phase:
real    0m1.715s
user    0m0.664s
sys 0m0.970s
>>>> time for stage 2 reupload phase:
real    0m3.172s
user    0m0.541s
sys 0m0.386s
>>>> time for stage 2 sedreplace phase:
real    0m0.134s
user    0m0.052s
sys 0m0.076s
>>>> time for stage 2:
real    0m5.286s
user    0m1.355s
sys 0m1.598s

ucc.best-story-based(N=172,M=1)

>>>> time for stage 1:
real    0m3.167s
user    0m1.073s
sys 0m1.060s
>>>> time for stage 2 analysis phase:
real    0m2.035s
user    0m0.823s
sys 0m1.147s
>>>> time for stage 2 reupload phase:
real    0m2.768s
user    0m0.270s
sys 0m0.222s
>>>> time for stage 2 sedreplace phase:
real    0m0.101s
user    0m0.037s
sys 0m0.063s
>>>> time for stage 2:
real    0m5.181s
user    0m1.240s
sys 0m1.593s

ucc.best-video-game-based(N=235,M=1)

>>>> time for stage 1:
real    0m4.384s
user    0m1.519s
sys 0m1.389s
>>>> time for stage 2 analysis phase:
real    0m2.803s
user    0m1.136s
sys 0m1.567s
>>>> time for stage 2 reupload phase:
real    0m2.997s
user    0m0.278s
sys 0m0.221s
>>>> time for stage 2 sedreplace phase:
real    0m0.101s
user    0m0.036s
sys 0m0.061s
>>>> time for stage 2:
real    0m6.175s
user    0m1.567s
sys 0m2.003s

ucc.most-humorous(N=367,M=3)

>>>> time for stage 1:
real    0m6.181s
user    0m2.235s
sys 0m2.249s
>>>> time for stage 2 analysis phase:
real    0m4.521s
user    0m1.864s
sys 0m2.551s
>>>> time for stage 2 reupload phase:
real    0m5.886s
user    0m0.728s
sys 0m0.563s
>>>> time for stage 2 sedreplace phase:
real    0m0.147s
user    0m0.042s
sys 0m0.103s
>>>> time for stage 2:
real    0m10.803s
user    0m2.733s
sys 0m3.365s

ucc.most-innovative(N=226,M=2)

>>>> time for stage 1:
real    0m3.829s
user    0m1.382s
sys 0m1.431s
>>>> time for stage 2 analysis phase:
real    0m2.671s
user    0m1.087s
sys 0m1.521s
>>>> time for stage 2 reupload phase:
real    0m3.847s
user    0m0.485s
sys 0m0.372s
>>>> time for stage 2 sedreplace phase:
real    0m0.116s
user    0m0.047s
sys 0m0.068s
>>>> time for stage 2:
real    0m6.876s
user    0m1.696s
sys 0m2.123s

ucc.transportation(N=8875,M=907)

>>>> time for stage 1:
real    2m17.521s
user    0m52.525s
sys 0m52.450s
>>>> time for stage 2 analysis phase:
real    2m27.892s
user    0m54.824s
sys 1m29.327s
>>>> time for stage 2 reupload phase:
real    13m57.523s
user    4m3.844s
sys 2m44.045s
>>>> time for stage 2 sedreplace phase:
real    0m28.523s
user    0m12.060s
sys 0m15.827s
>>>> time for stage 2:
real    16m54.303s
user    5m10.847s
sys 4m29.437s

ucc.pokemon(N=1571,M=207)

>>>> time for stage 1:
real    0m25.140s
user    0m9.312s
sys 0m9.405s
>>>> time for stage 2 analysis phase:
real    0m24.955s
user    0m9.937s
sys 0m14.716s
>>>> time for stage 2 reupload phase:
real    2m21.297s
user    0m56.130s
sys 0m36.807s
>>>> time for stage 2 sedreplace phase:
real    0m4.689s
user    0m1.801s
sys 0m2.762s
>>>> time for stage 2:
real    2m51.213s
user    1m7.955s
sys 0m54.467s

ucc.technology(N=1473,M=72)

>>>> time for stage 1:
real    0m22.791s
user    0m8.519s
sys 0m8.911s
>>>> time for stage 2 analysis phase:
real    0m19.449s
user    0m8.012s
sys 0m11.196s
>>>> time for stage 2 reupload phase:
real    0m55.958s
user    0m18.453s
sys 0m12.080s
>>>> time for stage 2 sedreplace phase:
real    0m1.580s
user    0m0.642s
sys 0m0.901s
>>>> time for stage 2:
real    1m17.286s
user    0m27.224s
sys 0m24.354s

ucc.film-tv(N=2543,M=105)

>>>> time for stage 1:
real    0m37.866s
user    0m14.915s
sys 0m14.765s
>>>> time for stage 2 analysis phase:
real    0m32.578s
user    0m13.279s
sys 0m18.702s
>>>> time for stage 2 reupload phase:
real    0m57.283s
user    0m26.494s
sys 0m17.257s
>>>> time for stage 2 sedreplace phase:
real    0m2.512s
user    0m1.010s
sys 0m1.461s
>>>> time for stage 2:
real    1m32.695s
user    0m40.901s
sys 0m37.623s

ucc.sports(N=1192,M=81)

>>>> time for stage 1:
real    0m18.639s
user    0m7.179s
sys 0m7.196s
>>>> time for stage 2 analysis phase:
real    0m15.726s
user    0m6.550s
sys 0m9.009s
>>>> time for stage 2 reupload phase:
real    1m10.613s
user    0m20.647s
sys 0m14.061s
>>>> time for stage 2 sedreplace phase:
real    0m1.777s
user    0m0.727s
sys 0m1.034s
>>>> time for stage 2:
real    1m28.410s
user    0m28.021s
sys 0m24.299s

ucc.ums-general(N=3190,M=95)

>>>> time for stage 1:
real    0m46.793s
user    0m18.700s
sys 0m18.251s
>>>> time for stage 2 analysis phase:
real    0m40.276s
user    0m16.657s
sys 0m22.902s
>>>> time for stage 2 reupload phase:
real    1m8.613s
user    0m24.517s
sys 0m16.028s
>>>> time for stage 2 sedreplace phase:
real    0m2.369s
user    0m0.947s
sys 0m1.326s
>>>> time for stage 2:
real    1m51.528s
user    0m42.216s
sys 0m40.431s

ucc.ums-pictures(N=1066,M=266)

>>>> time for stage 1:
real    0m15.732s
user    0m6.127s
sys 0m6.069s
>>>> time for stage 2 analysis phase:
real    0m21.324s
user    0m8.216s
sys 0m12.682s
>>>> time for stage 2 reupload phase:
real    2m38.321s
user    1m7.286s
sys 0m45.061s
>>>> time for stage 2 sedreplace phase:
real    0m5.464s
user    0m2.027s
sys 0m3.331s
>>>> time for stage 2:
real    3m5.341s
user    1m17.608s
sys 1m1.226s

ucc.untercast(N=6845,M=530)

>>>> time for stage 1:
real    1m48.483s
user    0m40.838s
sys 0m40.556s
>>>> time for stage 2 analysis phase:
real    1m48.122s
user    0m41.829s
sys 1m4.776s
>>>> time for stage 2 reupload phase:
real    7m49.343s
user    2m16.626s
sys 1m35.477s
>>>> time for stage 2 sedreplace phase:
real    0m15.732s
user    0m6.441s
sys 0m8.818s
>>>> time for stage 2:
real    9m53.504s
user    3m5.025s
sys 2m49.246s

ucc.server-invite-link(N=2,M=0)

>>>> time for stage 1:
real    0m0.641s
user    0m0.182s
sys 0m0.208s
>>>> time for stage 2 reupload phase:
real    0m0.106s
user    0m0.028s
sys 0m0.056s
>>>> time for stage 2 sedreplace phase:
real    0m0.012s
user    0m0.004s
sys 0m0.006s
>>>> time for stage 2:
real    0m0.324s
user    0m0.106s
sys 0m0.192s

ucc.anime-manga(N=15302,M=2867)

>>>> time for stage 1:
real    3m53.946s
user    1m30.287s
sys 1m31.074s
>>>> time for stage 2 analysis phase:
real    5m38.263s
user    1m56.936s
sys 3m35.981s
>>>> time for stage 2 reupload phase:
real    24m42.708s
user    12m0.428s
sys 7m48.289s
>>>> time for stage 2 sedreplace phase:
real    2m0.582s
user    0m52.916s
sys 1m6.151s
>>>> time for stage 2:
real    32m22.060s
user    14m50.442s
sys 12m30.715s

ucc.memes(N=5054,M=1186)

>>>> time for stage 1:
real    1m16.949s
user    0m29.395s
sys 0m31.031s
>>>> time for stage 2 analysis phase:
real    1m44.958s
user    0m39.258s
sys 1m4.518s
>>>> time for stage 2 reupload phase:
real    50m14.584s
user    4m41.889s
sys 3m12.321s
>>>> time for stage 2 sedreplace phase:
real    0m30.521s
user    0m12.461s
sys 0m17.750s
>>>> time for stage 2:
real    52m30.390s
user    5m33.754s
sys 4m34.770s

ucc.food(N=4161,M=433)

>>>> time for stage 1:
real    1m6.912s
user    0m25.735s
sys 0m25.955s
>>>> time for stage 2 analysis phase:
real    1m7.046s
user    0m25.823s
sys 0m40.645s
>>>> time for stage 2 reupload phase:
real    3m58.520s
user    1m54.117s
sys 1m18.193s
>>>> time for stage 2 sedreplace phase:
real    0m11.407s
user    0m4.454s
sys 0m6.843s
>>>> time for stage 2:
real    5m17.242s
user    2m24.494s
sys 2m5.848s

ucc.duckhunt(N=118065,M=70)

>>>> time for stage 1:
real    30m25.377s
user    12m42.342s
sys 12m4.405s
>>>> time for stage 2 analysis phase:
real    33m8.739s
user    10m41.799s
sys 22m4.306s
>>>> time for stage 2 reupload phase:
real    1m14.276s
user    0m20.465s
sys 0m11.595s
>>>> time for stage 2 sedreplace phase:
real    0m11.667s
user    0m5.498s
sys 0m5.977s
>>>> time for stage 2:
real    34m35.979s
user    11m8.231s
sys 22m22.559s

ucc.lego(N=334,M=48)

>>>> time for stage 1:
real    0m5.580s
user    0m2.334s
sys 0m1.999s
>>>> time for stage 2 analysis phase:
real    0m5.424s
user    0m2.339s
sys 0m3.005s
>>>> time for stage 2 reupload phase:
real    0m32.945s
user    0m12.547s
sys 0m7.392s
>>>> time for stage 2 sedreplace phase:
real    0m0.933s
user    0m0.386s
sys 0m0.538s
>>>> time for stage 2:
real    0m39.560s
user    0m15.371s
sys 0m11.090s

ucc.my-little-pony(N=1524,M=379)

>>>> time for stage 1:
real    0m22.741s
user    0m9.399s
sys 0m8.386s
>>>> time for stage 2 analysis phase:
real    0m29.876s
user    0m12.084s
sys 0m17.392s
>>>> time for stage 2 reupload phase:
real    4m12.570s
user    1m36.639s
sys 0m59.956s
>>>> time for stage 2 sedreplace phase:
real    0m7.781s
user    0m3.143s
sys 0m4.565s
>>>> time for stage 2:
real    4m50.525s
user    1m51.987s
sys 1m22.078s

ucc.boxbot(N=3755,M=291)

>>>> time for stage 1:
real    0m59.068s
user    0m24.940s
sys 0m22.502s
>>>> time for stage 2 analysis phase:
real    0m55.921s
user    0m23.047s
sys 0m32.131s
>>>> time for stage 2 reupload phase:
real    3m29.539s
user    1m13.747s
sys 0m47.713s
>>>> time for stage 2 sedreplace phase:
real    0m7.230s
user    0m2.781s
sys 0m4.310s
>>>> time for stage 2:
real    4m33.102s
user    1m39.705s
sys 1m24.432s

ucc.ucc-news(N=907,M=40)

>>>> time for stage 1:
real    0m14.899s
user    0m5.605s
sys 0m5.452s
>>>> time for stage 2 analysis phase:
real    0m11.960s
user    0m5.109s
sys 0m6.550s
>>>> time for stage 2 reupload phase:
real    0m28.593s
user    0m10.179s
sys 0m6.545s
>>>> time for stage 2 sedreplace phase:
real    0m1.175s
user    0m0.410s
sys 0m0.728s
>>>> time for stage 2:
real    0m42.098s
user    0m15.825s
sys 0m14.060s

ucc.science(N=249,M=2)

>>>> time for stage 1:
real    0m4.172s
user    0m1.664s
sys 0m1.641s
>>>> time for stage 2 analysis phase:
real    0m3.094s
user    0m1.279s
sys 0m1.789s
>>>> time for stage 2 reupload phase:
real    0m3.610s
user    0m0.527s
sys 0m0.422s
>>>> time for stage 2 sedreplace phase:
real    0m0.140s
user    0m0.042s
sys 0m0.097s
>>>> time for stage 2:
real    0m7.111s
user    0m1.939s
sys 0m2.483s

ucc.newcomer-of-the-year(N=24,M=0)

>>>> time for stage 1:
real    0m0.900s
user    0m0.355s
sys 0m0.298s
>>>> time for stage 2 reupload phase:
real    0m0.079s
user    0m0.022s
sys 0m0.055s
>>>> time for stage 2 sedreplace phase:
real    0m0.011s
user    0m0.003s
sys 0m0.006s
>>>> time for stage 2:
real    0m0.305s
user    0m0.104s
sys 0m0.196s

可以去迫真拟合一下sedreplace的时间复杂度是不是O(NM),至于其他阶段,第一阶段只有O(N),第二阶段分析时也只有O(N),上传时只有O(M),由于线程数是常量无论除以线程数还是除以线程数的平方还是除以别的什么都无关紧要

II what next

等我在ucc上测试成功后,我打算拿它去测试church of pancakechi,然后看下有没有心情开示它的整个消息记录;好了,我现在可以去写hakushinsona或者打完borderlands3了

bruhbitte.20.04.16

草,我这几天突然写不动fanfic了🤔所以我在搞些别的玩意,比如完成了从discord的guild元数据中找到能拖的频道(检查一下是不是missing access即可)并生成备份频道脚本可以接受的参数sh文件的脚本(这名字真™长🤔

然后在频道备份脚本里加了个迫真profiler,可以迫真统计每个阶段所花的时间🤔这样我就可以去尝试一次性备份整个ucc了,尽管看起来并没有什么卵用🤔由于肯定需要向discord发送十万甚至九万个请求,我搞了台vultr的🐣跑🤔

话说回来我觉得kamoganger chat central已经是个巨型乐子了,但接下来我肯定要拿这个脚本dump下church of akechi,搞不好还可以找个地方开示dump,那才是最大的乐子🤔

next beeg project.20.04.04

最近discord又推出了一个新功能,拥有全局管理员权限的用户可以将其guild导出成server templates,这样别人拿到这个templates链接(顺便一提的是,discord官方居然做了些这种templates)就能一键生成和那个guild几乎完全一样的guild了,准确点来说频道、roles和权限设置(包括每个频道的特殊权限设置)都能继承,emoji好像不能

当然这个功能得全局管理员那么大的权限才能使用,不过。。。

I discord guild datastructure

我前段时间在写频道备份脚本,我在想discord肯定有api可以获取一个guild里所有channels的数据,然后就可以一个for循环搞定

然后我就看了下注诸如https://discordapp.com/api/v6/guilds/[guild id]https://discordapp.com/api/v6/guilds/[guild id]/channels返回的结果,然后我发现了一件非常生草的事情:

无论用户有什么roles,哪怕没有roles,都能获得里面所有频道的信息、所有roles的信息,甚至所有和权限有关的信息

从某种程度上来说,获取的信息和templates功能返回的信息几乎一样多,甚至更多,毕竟还有emoji的信息,还有每个玩意的id(在templates返回的信息里面id只是个位数,而不是和时间相关的参数,不过这个不太重要)

所以我在想,有没有办法利用抓取的这部分metadata手动构造一个和原版一毛一样的guild?

II bruh

我仍然懒得看discord官方文档,所以我打算抓包解决

尽管我肯定希望discord有那么一个api,能让我把抓包得到的metadata全部扔进去它就能让一个guild变成一个和那些metadata一毛一样的guild,然而很不幸的是它并没有这种api;所以我们只能手动来了:

  1. 建立一个guild,并按照metadata修改其基本属性
  2. 按照metadata的内容建立一系列channels,别忘了channel有三种,文字channel,语音channel,还有category也是channel的一种,三种都需要抓包
  3. 对每一个channel以其metadata进行修改属性操作
  4. 按照metadata的内容建立一系列roles,并设置其permissions(但愿其设置permissions的api也是直接一个数字过去)
  5. 对每个channel设置permission override
  6. 如果可能的话,emoji也重新上传一遍,这个好办,上传动画emoji好像不需要nitro我也不清楚
  7. 调用discord的template功能:wiebitte:

现在已知的api操作:

  • 貌似频道的position这个参数只在其parent id里面,而category它也有自己的position
  • 一次请求就可以搞定所有频道的排序,所以理论上来说可以在一次请求中加入所有原来的parent id和position,理论上来说就能搞定排序问题
  • roles也能一次性搞定排序;另外和channels一样,排序的api和每个元素属性的api是两个不同的api
  • 奇怪的是channel的permission override用了put请求,而且貌似每个channel的每个role都需要请求一遍;只不过好像没有新建override和更改的区别
  • 其实permission override可以建立频道channel的时候就加进去,不然的话它就和category同步;我觉得category会有permission override这么一个选项可能就和这个有关吧

UPDATE:终于写完了,建立频道的时候我建立了两遍,第一遍先建立categories,然后对它们排序,然后在metadata里面替换一遍id,就像建立roles时做的那样(其实roles应该先建立,然后在metadata里替换掉id,这样才能正确地设置permission override);第二遍再建立其他channels;我发现在建立channel时就可以设置好除了position之外的所有参数,甚至包括parent id(但就是position需要从所有参数里移除,之后再设置,不然会导致部分channels创建失败)

接下来当然就可以用discord的那个templates功能创建个template了,然后就可以用来troll人了;比如:

The HRP Community(迫真

Unterganger Chat Central(迫真

某个shuann(p5的joker和ann chan)聊天室

Persona & SMT(迫真

是时候迫害一波perusonafags了(手动滑稽

multithreading discordbackups.20.03.30

没想到在缝合了包括discord drive脚本等一大堆脚本之后,我真的把多线程重新上传附件给做出来了,而且效果相对原版可以说是立竿见影,只需10个线程,拖ucc的冻鳗频道只花了28分钟42秒,拖ucc的mlp频道只花了两分钟48秒,现在还在测试nsfw频道,估计不会超过两小时🤔

总体来说对discord附件的处理,有两种方式,一种是在遇见附件的时候处理它并即时替换消息然后再写入dump文件;另外一种方式是先dump一遍消息,在此过程将需要重新上传的文件全部列出来(当然生成aria2链接的时候理论上来说就包含了所有信息,但那不够,我需要再生成一个metadata文件),然后在另外一个函数中将这些文件全部处理一遍,获取原链接和重新上传后新链接的对应关系,然后用sed命令实现替换,由于discord链接只有一个斜杠(可能还有双引号)是sed的元字符,把它转义掉即可

当然如果是py等高级脚本语言的话,理论上可以在dump消息的时候就将附件推到每个重新上传线程的待处理队列里面,这两步都可以并行,但bash并不是这种高级脚本语言,所以只能分两步走了

和discord drive相比,我还需要实现将大于8MB的文件交给nitro线程上传这个功能,考虑到实际情况,我强制规定数组0为nitro线程(即只有一个nitro线程),别的线程从1开始;接下来分配线程的时候只需要一个for循环就可以像以前一样干了

由于metadata文件里包括了附件的文件大小,遇到大于8MB的文件直接推给nitro线程,剩下的写个求余按顺序推给剩下的线程

另外我发现将for列举线程内文件的循环写在线程函数之外和之内都能正常工作,所以我还是写在线程函数之内比较好看;看来唯一需要注意的点几乎只剩下了将里面所有变量前面都加上local🤔

这么搞的话尽管从discord上下东西的速度是快了不少,但之后sed时就蛋疼了,毕竟现在它需要在一大坨消息dump里找到并替换附件url,时间复杂度瞬间从O(n+2m)变成了至少O(2nm),其中n是消息条数,m是附件数量,乘2是因为需要替换的地方有两处

比如搞ucc的nsfw频道时前两个步骤只花了可能一个小时,但sed替换时一秒钟才能替换1到1.5次,而需要替换的消息有一万多条🤔

这还真TM操蛋,不过除了移到本地linux外还有什么加速的方法?🤔可能需要重写一遍scheduler算法,直接将dump文件拆成线程个数份,然后除了需要扔给nitro线程的文件外,其他线程生成的新链接只需要替换它对应的dump片段,最后再将替换完成后的片段合并,这样时间复杂度就变成了O(t(n/t)(2m/t)),取决于sed可不可以多线程,前面的那个t也许可以去掉🤔

UPDATE:草,终于写完了多线程,无论(重新)分析、上传和sed替换都做了多线程,发现尽管sed时间缩短了十万甚至九万倍,但别的开销大了起来:

  • 由于不知道消息的具体数量,没法在一开始dump的时候分析,只能等dump完后分析,由于要保证前向兼容(获取原始aria2列表),需要重新分析(但这个也可以写成在分析阶段做,倒是没什么)

  • 最主要的是附件的分布并非均匀,所以有的dump片段就会比别的片段多些附件,甚至多出几十到几百件,这样别的线程需要等待这个线程

实测优化后的方法拖ucc的mlp频道居然比优化前多整整一分钟,就是在等那个多出来的线程;冻鳗频道花了26分钟32秒,快了两分钟多一点;我估计nsfw频道会是这种优化方法的最大受益者,毕竟之前光sed替换就花了67分钟49秒,而在优化后相同的过程(我光注释了上传的代码,然后生成了假的sed替换文件,如果不考虑附件不均匀导致的开销,可以认为是优化后的表现)只花了15分钟46秒🤔

由于我不小心ctrl+c掉了nsfw频道的dump过程,它sed到一半好像花了86分钟,我估计和discord交互的时间是52分钟左右🤔

对了,在比如死🐴管理一个小时后就要删聊天室的极端情形下,优化后的方法由于有重新分析和线程间不均匀等额外开销,搞不好会导致来不及备份完很多附件就消失了的额外风险,而之前的方法没有这个风险,而且由于给线程分配任务是按照余数的方式分配,它会尽可能均匀,最多只多出一个任务🤔

我的测试表明基本上在一万条消息以上,优化后的方法在时间上才有优势,而且会因为时间复杂度的二次方性优势更大

比如拖十万条消息和附件时,原来的方法可能要花以天计的时间来完成sed,当然此时已经和discord上面被删了的频道没有半毛钱关系了🤔

future

接下来我打算实现个迫真profiler,来标记出每个阶段需要花的时间,反正time命令的结果貌似只能输出到stdout或者stderr,如果设置重定向的话恐怕所有东西都从屏幕上消失了;我要么查下吧

然后就是想办法实现备份整个guild的脚本了,只需要列出所有channels,然后设置好每个channel对应的参数,然后就可以调用这个脚本了;主要是需要备份整个guild的时候情形都非常极端(比如旧/r/megatan即将被删前几个小时),时间真的很珍贵,估计所有频道都得设置成仅文字或者旧多线程方法

另外我需要想办法测试下一个频道被删之后里面的附件能保存多少时间,我看哪天想办法设计个实验,但现在还是算了吧

附录

用优化前方法拖mlp频道时间:

real 2m48.221s
user 1m38.277s
sys 1m26.461s

用优化后方法拖mlp频道时间:

real 3m19.677s
user 1m35.828s
sys 1m31.185s

用优化前方法拖冻鳗频道时间:

real 28m41.908s
user 16m8.481s
sys 14m10.055s

用优化后方法拖冻鳗频道时间:

real 26m32.508s
user 13m26.061s
sys 13m55.378s

优化前nsfw频道执行sed替换所用时间:

real 67m49.196s
user 33m38.716s
sys 31m18.762s

优化后nsfw频道重新分析、执行sed替换等所用时间:

real 15m45.703s
user 10m1.709s
sys 17m54.682s

优化后拖nsfw频道所用时间:

real 67m12.181s
user 35m12.408s
sys 40m22.244s

至于优化前的时间,反正我懒得测,当然也不一定(bruh

UPDATE.20.04.12:在vultr 512MB内存vps上拖ucc的迫真赛博监狱频道所用时间(由于司马cord不支持ipv6,我只能多花点钱上个ipv4实例):

real    12m16.441s
user    3m50.691s
sys     3m23.343s

futabruh.20.03.20

这几天在玩四海兄弟3,这破游戏经常闪退,有时甚至还会蓝屏或者直接重启,我以为是某个元件过热所致,但我检查过所有传感器,温度都是正常范围;但今天它闪退的次数实在是过多,我玩个偷车的支线甚至车快到据点了,电脑直接重启,感觉那些关卡我好像试了不下十次甚至九次🤔

我感觉是内存问题,插上另外四条内存,这下好了,它直接开不了机了;如同我折腾R4E那样,我随便换了下内存,最终无论怎么折腾它都只能识别出三条,而且闪退问题仍然没有解决;甚至某些时候登录到系统之后就开始蓝屏🙃

我猜测上次主板直接翻转180度摔到地上也许对其部分内部电路造成了难以估计的损害,此时恐怕只能插ecc内存了🤔

还好我之前搞x86玩具的那四条工业垃圾一般的4GB内存(加起来也只有100块钱)被我带上了(而我却忘了带主机上的16GB内存,但我怎么想到在家里还能玩寨板?),赶紧插上看能不能用;那四条内存好像没法随便插,那个带马甲的海力士内存必须插4号槽(还是1号槽来着,这主板连个sepc都没有),不然开不了机;但如果能开机的话,那它是相当稳定的,比如我玩了可能是两个小时的游戏,一次闪退都没有发生,我感觉好像又回到了使用hp工作站主板的时候

但这16GB内存也太たま少了吧,一个四海兄弟3就能占掉4GB,再开几个firefox开个虚拟机,我估计内存就要爆炸了;现在32GB的ecc好像降到了356还是365来着,赶紧买上四条再说,最多我问下卖家4Rx4的14900L能不能用在山寨x99上

ps. 将低频率的ecc内存插入设置为高内存频率的系统后,会发生的事情之一便是直接卡得没法用;哪怕可以用,aida64的内存速度测试也没法完成,会无限卡🙃

UPDATE:悲报,那个32GB的4R*4 14900L内存条果然没法用,怎么改设置都不行,放弃折腾了,退货,然后买四条16GB的2R*4 14900R🙃

当然如果我哪天钱多得没处花了,我可以考虑买8条2666的DDR4,这样我也就可以使用个正经主板了,比如hp的z440主板就挺不错,还比华南的寨板便宜(?

然后插上8条DDR4的32GB内存,直接256GB内存,爽死了,整个系统都可以RamDisk化🤔而且关机前都可以保存回固态,其实完全可以像VMware处理虚拟机的内存那样,随时都保存快照,这样就可以在关机前尽可能快地保存东西,尽可能同时享受RamDisk的速度和固态的非易失性🤔我记得很多RamDisk软件有这种设置,但整个系统都RamDisk化我还没有尝试过🙃

b r u h c o r d.20.03.13

现在discord搞几个小号可真たま难,有时候刚注册完就强制电话验证了,有时候注册几个小时后才需要强制电话验证,反正以这个概率我们可以认为discord完全就是需要电话才能用了(老账号除外

然后discord还要摆出一副像17年那样的欢迎各路人士随便注册(甚至现在都可以直接在邀请链接里面填用户名然后直接创建账号)的迫真白左模样,实在是让人哭笑不得

所以我来做几个实验透透discord的🍺

实验一

我先使用我上次买的一个qq号的邮箱注册个小号

然后搞到auth或者token,对于什么都没有的新账号来说直接在firefox开发者选项的存储、本地存储里面就能找到token,不用抓包

然后上bash大法:

function altantics() { # 1 = auth,2 = alt number
    curl 'https://discordapp.com/api/v6/users/@me/settings' -X PATCH -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0' -H 'Accept: */*' -H 'Accept-Language: en-US' --compressed -H 'Content-Type: application/json' -H "Authorization: 1" -H 'Origin: https://discordapp.com' -H 'Connection: keep-alive' -H 'Cookie: __cfduid=d34b57750a8621dabd797ce74bfc579ef1584047884; locale=en-US; __cfruid=2b1a676e24e573415b1d55769aa6d0f4b68cea0a-1584047889' -H 'TE: Trailers' --data '{"locale":"en-US"}'
    ./discordfilehosting.v7.sh --antics "1" futabruh futabruh futabruh alt2.conf 32
    curl 'https://discordapp.com/api/v6/users/@me' -X PATCH -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0' -H 'Accept: */*' -H 'Accept-Language: en-US' --compressed -H 'Content-Type: application/json' -H "Authorization:1" -H 'Origin: https://discordapp.com' -H 'Connection: keep-alive' -H 'Cookie: __cfduid=d23c3aae32eb5dbb13cbfdf9dadc976661584047531; locale=en-US; __cfruid=955decf5551e3d1a15f9b51d952ac1a623c88963-1584047534' -H 'TE: Trailers' --data '{"username":"leachan'"2"'","email":"leachan'"2"'@saggyboobs.com","password":"[insert password here]","avatar":null,"discriminator":null,"new_password":null}'  
}

这样,我们就可以批量搞小号并改名成完全不存在的邮箱了,而生草的是那个qq邮箱居然能重复用(因为在验证邮箱之前可以随便改邮箱),实测我注册到第⑨个小号的时候才出现了我的脚本跑到一半就被风控的结果

实验二

在此过程中它生成了32的不知道多少倍个webhooks,我们来测试下当创建guild和webhooks的小号被风控(注意,不是橄榄)之后,这些webhooks能不能用

从只有一半的第⑨个webhook conf里面提取最后一条链接:

https://discordapp.com/api/webhooks/687774052252909569/on5bdVDOJJCOIbyV2_U8lLIaeIe2daM0wwwqVH3xeCq6KBDkWorQSrP6ybCUp1UhzkUo

然后随便找个discord image hostin'客户端上传个东西:

[上传过程略]

实测它完全能上传并返回预期的discord外链

结论(迫真

discord网盘的稳定性,至少基于webhooks的版本,得到了进一步的验证,只要确保guild owner的小号不被橄榄(一般来说discord账号很难被橄榄,尤其是这个小号加入了ao多聊天室而一句批话都没说过时),哪怕它被司马cord给风控了,它创建的所有webhooks都能正常使用,而我的discord网盘脚本是以discord webhook上传后的返回值来获取文件链接的,字面意义上的和discord账号没有一毛钱关系,完全不影响discord网盘所有功能的运作

phones

现在还有没有接码平台啊,我还是需要搞一堆discord小号的,用来toiletgang或者迫害perusonafags或者别的事情

wowwtf.20.03.11

卧槽,我发现x99系统居然支持睡眠啊,不像渣渣x79

但这个主板还是有点毛病的,比如睡眠之后居然没法像笔记本那样就用键盘或者鼠标唤醒,而是需要按下电源键;但更蛋疼的问题是唤醒之后风扇会狂转,直到下次重启之后才能恢复设定的低转速,这就非常蛋疼了,搞不好我只能尝试去买个物理调风扇转速的玩意,有吗?

data recovery.20.03.02

我去,那个司马易驱线在搞乱了我固态的分区表后,居然连那个5mm硬盘都不放过,但这次我发现用dg居然能恢复出来,它的智能读取分区功能不仅可以读出来原样数据,连目录结构都能保留,实在是太强了

然而我的那个版本dg没有破解完全,所以没法恢复,所以我只好再找个dg版本

其实dg是有加密狗的,难怪破解版dg都有这样那样的问题,比如数据检测出来了恢复的选项却点不了,估计是下了若干个反破解断点

但在我寻找dg破解版的过程中,我发现了dg居然还有海外版,而且海外版居然没使用加密狗,这样这玩意就没啥难度了,由于dg没有在线激活,只要带了注册信息就是完全的专业版,比adobe全家桶还要巴适

这样,我就用着英文版的dg将那块硬盘里的所有数据导出来了,文件的时间戳至少是完整的,但文件夹就不是了,本来能保住文件夹时间戳的软件也只有winrar和部分全盘备份软件了,而dg不是其中之一

好了,这次事件的教训无非就是哪怕这种盘也得接阵列卡上,至于那块接阵列卡上的固态,里面只有点音乐了,可以转移到5mm硬盘上;其实我买这破玩意就是为了放些固态放不下的东西,而那些服务器机械硬盘由于没有散热系统,我必须用的时候才会插上