阅读视图

发现新文章,点击刷新页面。

聊聊键盘!(一)配列

爷爷,你友链里的博主更新了! 提前多图预警,但图片大小应该都不大

前情提要:双十一看上的键盘套件便宜了几十块钱,又看到闲鱼有卖很便宜的未通电轴体,直接下单,遂得一把新键盘XD

前前情提要:家里已经有3把键盘了()要不是我把我最开始的那把卖掉我爸绝对会杀了我的(虽然他现在应该还不知道我买新键盘这件事就是了)

那这篇文章就借着我的新键盘来跟大家聊聊机械键盘这个东西,以及什么是客制化(键盘)这个圈子。

首先

大图镇楼!

键盘美图

本来旧键盘是用的这个侧刻键帽的,但发现白色键帽还是得配白色套件啊。

我们先来看看键盘的配列

配列

市面上常见的配列为60%、65%、75%、80%、95%、100%,每种配列又会细分为具体的键数,我们从大到小来看

100%

100%配列就是我们最常见的键盘,分为功能键区、主键区、编辑键区、数字键区,一般为104键或108键,108键比104键多四个特殊按键,位于数字键区上方

100配列.png

95%

一般为98键左右,相对于100%配列来说删去了编辑键区,并将一些使用频率比较高的分散到别的位置,使键盘在减小一定宽度的同时并没有丧失多少方便性,只不过因为布局会更加紧凑,所以更容易误触。目前博主还没用过所以不多做评价(

95配列.webp

80%

一般为87键左右,相对于100%配列来说砍掉了数字区,非常适合不经常输数字但编辑键使用较多的人群,与100%配列除了没有数字键区之外相同,相对来说比较百搭。一般只要不是离了小键盘活不了的话买80%配列没错

80配列.png

75%

一般为84键左右,相对于80%配列来说将编辑键区删减并排布的更紧凑,适合想要更加缩减键盘体积的人群,到这个大小基本就要用组合键实现一些功能了。

75配列.webp

65%

一般为68键左右,相对于75%配列来说砍掉了功能键区,适合经常要带键盘出差以及喜欢小键盘的人,真的非常小一个。不过因为比100%配列小了将近一半,在使用时对组合键的依赖性很强,不适合懒得记键位的人

65配列.webp

60%

一般为61键左右,到这一步键盘只剩下主键区了,不用组合键几乎寸步难行。但是你不能否认小小的真的很可爱它真的非常便携,我有一段时间因为经常出去集训,习惯带自己的键盘,这时候小键盘的好处体现的淋漓尽致,几乎不会占据太大体积,不像我同学的75%占据一大块书包(

60配列.webp

一些很小众的配列

之前比较火的一个梗叫做“未成年键盘”,当你看完上面的配列介绍后有可能以为它是形容60%配列的,但丧心病狂的人类觉得组合键还能再开发潜力,于是将主键区的数字一行砍掉,做出了40%甚至30%配列的键盘,这种键盘属于客制化圈内的抽象产物,目前(应该还有不短的未来)还没有大厂生产,我觉得应该是好用的,但无奈囊中羞涩,没法搞一把玩玩。

40配列.webp

还有一个从95%抽象而来的90%配列,紧凑到键位几乎是正方格排布,不留空隙,网上说优点是展示键帽非常好看,但博主显然是不会买的(才不是因为没钱)

90配列.webp


分篇写吧,没想到会写这么多出来qwq

我的博客也有一天会被反代?

前言

这是一个暑假的下午,我看到klcdm给我发来的统计数据,心头一动,点开了我的shynet(数据统计)。这时突然发现,嗯?怎么7.30的访问量高达300多,这可不是我这10ip小博客能到达的数量(当时好像还是1ip)。点进去一看,访问网址出现了一堆不是我的域名,这很明显有问题,再加上前两天刚刷到论坛有人说被反代了的消息,点进去一看,我这小博客居然也有资格被别人反代了。不光改成了全繁体,还把我的bio改掉了,下面是反代站点截图:

反代站点

解决

虽然很开心我的博客也有资格被反代了,但是这种侵占别人劳动成果的事情该解决还是要解决的,翻了一下之前论坛上刷到的帖子,选择了这个博主的方法,加一个js检测host,如果不是我自己的域名就自动跳转,别忘记混淆加密一下js,要不然它改链接的时候就一块改掉了。

原博主只提供了最基础的js,直接加进去的话不会自动执行,这里给出修改后带<script>标签的代码:

<script>
$(function(){
const host = window.location.host
if (host !== 'zhul.in' && ! host.startsWith('localhost') && ! host.startsWith('127.0.0.1')) {
    document.body.innerHTML = [
        '<div style="margin: auto;">',
        '<h1>当前页面并非本文作者的主页,将在五秒后跳转。</h1>',
        '<br />',
        '<h1>请此站点持有者联系我: zhullyb@outlook.com</h1>',
        '</div>',
    ].join('')
    document.body.style = [
        'background-color: white;',
        'color: black;',
        'text-align: center;',
        'font-size: 50px;',
        'width: 100vw;',
        'height: 100vh;',
        'display: flex;',
    ].join('')
    setTimeout(() => {
        window.location.href = 'https://zhul.in'
    }, 5000)
}
});
</script>

效果:

最终效果

一些事情

怎么确定自己的博客是被反代还是被扒了呢,我通过给页脚加了点东西,一刷新那个网址发现很快新加的东西就出来了,很明显就是直接反代的我的站点了,毕竟一开始数据统计用的都是我的,要不然我也发现不了这么及时(有可能永远都发现不了)。看下图就知道为什么我会注意到过于多的访问量了qwq

7.30

aio折腾记录(三):安装omv及配置

鸽了好久啊(

这篇文章主要讲一下aio的nas部分,其实用omv之前用过一段时间的truenas scale但是太懒没写文,觉得truenas占用有点太大了就决定换个系统,在群晖和omv之间对比了一下决定用omv,毕竟我服务全是docker在跑。

安装

比openwrt简单,直接上传镜像然后创建虚拟机就可以,操作系统选择刚刚上传的镜像,硬盘自己看着办,系统盘可以不加太多,反正之后肯定是要通机械硬盘的。内存看你自己,空载大概0.3G,占用挺小的。网卡选VirtIO半虚拟化。网络设备加一个网口就好,怎么创建虚拟网口这里不讲了。然后就是启动,在控制台安装系统,这个之后再补吧,装的时候没截图导致的。

直通硬盘

这一步可选,不想直通的话直接添加硬盘就可以。这里直接摘网上直通硬盘教程

  1. 进入pve的管理shell
  2. 输入 ls /dev/disk/by-id 查看存储设备的id

    这时会输出几行文字,像这样

    硬盘id

    红框框出来的就是我的机械硬盘,sata一般是ata前缀,找这个就行了,有的后面带-part几的不用管,下一步硬盘id添加不带-part的

  3. 在shell里输入以下命令:

    qm set 虚拟机id -硬盘名 /dev/disk/by-id/硬盘id

    就比如我omv的虚拟机id是103,硬盘名一般按sata+编号方式命名,尽量不要打中文,然后再加上我的硬盘id,那我的指令就是下面这样:

    qm set 103 -sata1 /dev/disk/by-id/ata-WDC_WD30EFRX-68EUZNOW0_-WX34E7V9Z7RI

    如果指令返回以下信息,那么就说明成功了:

    update VM 103: -sata1 /dev/disk/by-id/ata-WDC_WD30EFRX-68EUZN0_WD-WX34E7V9Z7RI
  4. 在虚拟机的硬件选项卡里看一下,出现对应硬盘名的硬盘就说明成功了

omv配置

主要就是添加硬盘、更换omv下载源以及下载omv-extras

添加硬盘在文件系统里,根据需要选择挂载现有文件系统还是创建并挂载,这个具体在网上搜一下吧因为我忘干净了qwq

对于omv下载源我选择更换清华镜像,这里直接贴清华官方教程 链接

安装omv-extras可以从清华镜像下载对应版本的安装包 链接,下载完后安装依赖 sudo apt --yes --no-install-recommends install dirmngr gnupg 然后安装安装包 sudo dpkg -i 根据版本下载下来的安装包名称,最后登录omv的后台,在后台侧栏中的系统选项卡里看到omv-extras就算成功(可能需要重启omv)

docker compose

因为我大部分服务都是docker跑的,所以接下来安装docker compose扩展,具体步骤看图

安装docker扩展

安装完成后在侧栏的服务里就能看到compose了,点进去之后要设置一个共享文件夹用来存储docker容器及一些数据,这里在存储器中的共享文件夹添加即可。这里说一下共享文件夹这个东西,共享文件夹是omv中各服务的文件存储地点,大部分服务都需要一个共享文件夹作为存储数据的地方,感觉统一管理还是比较舒服的。

compose的设置里最底下有docker的控制按钮,第一次有可能需要点重新安装docker来安装docker,或者点重启docker来启动docker,记得要在设置完数据文件夹之后操作,这个我忘了omv有没有预安装docker了。

omv的compose扩展还是比较好用的,提供了compose文件部署、网络架构等一系列有gui的设置,也提供了一部分compose文件模板,和自己的数据文件夹联动,可以实现一键部署连路径都不用费心思设置,这点比truenas scale方便很多,毕竟我到现在都不知道怎么查看truenas里的docker volume内数据。

最后

目前我摸索到的就这些了,有啥好玩的发现了再分享。写的挺乱的,欢迎评论区批评qwq,有问题也可以在评论区里问或者首页有我联系方式。

域名+2

是的我又买域名了

这次是在论坛上刷到有人出米(域名),好奇点进去看了一眼,发现一个wrnm.de,这一下子就看对眼了,大脑没有经过任何思考就点进了他的私信然后问他怎么出的,最后20块钱拿下,续费29倒也不贵,纯纯搞抽象的

怎么最近更新只剩下买域名了啊()

请假回家有感

周知所众,博主是个苦逼的住校高中生,由此,请假回家在我们同学群体里就成为了一件奢侈的会让人羡慕的事情。而请假回家的人经常会受人所托带一大堆零食和喝的回校


关于住校这件事,一些幸运儿们可能到了大学才会体验住校的感觉,但那时候真的就很自由了,啥都可以干也有电脑手机什么的。而博主就属于比较不幸的一批,从初中开始住校一直到现在开学高二,不能说内心毫无波澜吧只能说是一潭死水。

高中学习本来就紧张,又是住校没什么可干的,一天天教室食堂宿舍三点一线,放松也仅限于吃完饭去操场逛逛看看小情侣谈恋爱,所以请假回家是对心灵的一大慰藉(尤其是像我这种离家太远请假回家可以合情合理去我叔叔家的)。但是吧,很多家长觉得你一个学生上学时间就在学校里好好待着就行了,没事闲的回什么家啊多耽误上课。其实真不大耽误,先不考虑故意逃课请假的,至少我们班绝大部分请假都是挑自习时间以及一些无关紧要的课才会请,进度一点都不带落下的,而且回家调整下心情放松下压力,之后回学校上课往往都是效率更高的。

不知道怎么往下写了,请假回家真爽吧()

域名+1

是的我又乱花钱了

总之就是前两天在spaceship上买了个 5544332.xyz 的域名,寓意是小星星里的挂在天空放光明的简谱,前两句都被注册了。目前打算放点奇怪东西()不保证其对中国大陆的可用性

$0.67/年,续费同价,不得不说真便宜啊。不过这种域名做域名邮箱会增大被认为是垃圾邮件的可能性,但是维护好了至少不会进QQ邮箱的垃圾桶XD

2023 NOIP 游?

现在才想起来开个游记,不知道会怎么样

Day $-\infty \sim -1$

疯狂模拟赛,被薄纱力!

Day 0

疯狂摆大烂,教练请了杜瑜皓和施韩原大佬来给我们加油鼓劲,下午校长还要来,%%%了属于是

谁家好人线段树2因为没调用build调3hr啊

Day 1

退役啦哈哈,再也不想碰oi了

一个文段

水个更新,在网上看到的写的比较好的

要我说女孩子呀,各有各的漂亮法。

有的眉目清泠,像是一整季的雪水都融在了她的眼睛里。

有的酒窝甜蜜,她笑一笑漫山遍野的风声都要消息。

有的天生绵软,你朝她挨过去,像碰着了一团云。

有的发汗时竟能生出浅浅的香气,散在天地间顿觉云销雨霁。如何不漂亮呢?

她若是瘦,你便看她伸懒腰时优雅得像天鹅抻颈。

她若丰盈,你便看她日光底下肌肤亮起时有多绮丽。

她若生斑,你便赞她漂亮得发光上帝这才在她的眼角鼻翼投下了淡淡的影。

她若佝偻,你便赞她小小只多秀气刚刚好搂在怀里。

你瞧,女孩子生来就漂亮得不讲理。

————林鹤连

aio折腾记录(二):安装openwrt及网路配置

装完了pve这个虚拟机框架,接下来要装的是openwrt作为网络框架,大鹏蟹只装了爱快,那这部分我不偷懒了我多写点XD

参考了这个大佬的教程,不过我没装爱快,直接用openwrt做的主路由,有些区别但不多。

先说一下我的网络拓扑,光猫负责转化光信号以及拨号,其他都交给软路由,软路由一个lan口通到硬路由wan口上,硬路由只负责广播wifi以及起到一个交换机的作用

安装

首先下载镜像,推荐镜像 Bleachwrt,建议下载高大全版本因为他的自用精简版只有一个穿越长城(目的明确了属于是)。

还有其他镜像例如 eSir GDQ 高大全 (不建议下载,硬盘空间不足需要后续扩容,没有SmartDNS插件,个人感觉可用性不强)、immortalwrt

建议下载后改个短点的名方便后期上传添加硬盘

  1. local - 内容 - 上传:OpenWrt 的镜像。记下日志中的上传路径待会用,一般是/var/lib/vz/template/iso/文件名(图片里是我随便传的一个) 上传镜像.png 上传路径.png
  2. 创建虚拟机,命名编号无所谓,编号不要重复,把编号记好就行,开机自启动建议打开
  3. 操作系统设置为不使用任何介质
  4. 硬盘直接删掉就行,待会再添加,cpu可以跟宿主机cpu核数保持一样就行,插槽数保持为1,内存建议1G以上,实在小的512M也行,网卡模型选择 VirtIO(半虚拟化)。
  5. 网络设备可以先选择无网络设备,或者随便选个网桥(最好是非管理网口)
  6. 最后确认不要选择创建后启动
  7. 导入openwrt镜像到硬盘里:qm disk import 虚拟机编号 镜像路径 local-lvm,比如我的就是qm disk import 100 /var/lib/vz/template/iso/openwrt.img local-lvm (pve8的指令与pve7指令不同,pve7请使用qm importdisk 编号 路径 local-lvm
  8. 添加硬盘给openwrt:pve中openwrt->硬件->双击未使用的硬盘->添加 可以选中硬盘,点击硬盘操作扩容硬盘大小,我扩到10G因为之后有docker需求。添加硬盘.png
  9. 添加网络设备,我用主路由而且网卡比较多,就给openwrt直通了两个网口,一个wan一个lan,网卡不够的话用网桥也是可以的,在添加里选择网络设备即可,记得把防火墙关掉,用openwrt的。注意第一次添加网卡最好不要超过两个,否则无法自动区分出wan口和lan口,需要手动配置。直通网卡:硬件->添加->PCI设备->勾选原始设备,在设备里找到你要直通的网卡,然后把下面的所有功能勾选上。PCI设备.png 设备选择.png
  10. 调整启动顺序,选项里的引导顺序,关闭网络引导只留一个硬盘 引导顺序.png 引导顺序1.png
  11. 启动虚拟机,进入控制台,执行 vim /etc/config/network,将config interface 'lan'下的option ipaddr后的ip改为pve之前设置的网关ip,因为我要用openwrt接管整个家庭网络。更改完后按esc,输入:wq退出,然后执行reboot重启openwrt。
  12. 访问管理地址并登录:https://刚刚设置的ip。默认用户:root。默认密码:password。

配置

基本跟上面提到的参考里面写的一样,不同点我再说一下。注:wrt ip = openwrt自己的ip

没开定时重启,因为家里人要用网,怕我不在家的时候aio炸了出问题

接口 > lan

  • IPv4网关写的wrt ip
  • 自定义dns服务器之后弄好了记得改就行,虽然我这个铁头娃一开始就直接填的wrt ip
  • DHCP如果用的是Bleachwrt的话不用动,别的固件不清楚默认设置
  • ipv6我没关,如果你openwrt拨号光猫只负责桥接的话那更建议不关了,获得公网ipv6

SmartDNS

我用的DNS上游服务器来自:https://www.zctou.com/2154.html,分组需要点修改,在里面设置

Adguard Home

我用的过滤规则:https://www.xcbtmw.com/29480.html

dns监听端口没找到在哪改我直接在手动设置里改的,dns下的port

硬盘扩容(可选)

没按照文章里的方法来,直接扩容的根目录,建议先做个快照再进行扩容,大体流程:

  1. 系统->磁盘管理->找到你想添加/扩容的硬盘点击修改->在空闲空间创建分区并格式化
  2. 系统->挂载点->挂载点->添加->启用此挂载点,uuid找跟你刚才格式化的分区大小一样的,挂载点选择作为根文件系统使用
  3. 注意:根目录准备的命令需要更改一条,将mount /dev/sda1 /tmp/extroot中的/dev/sda1改为你自己的分区名称,可以在uuid后面大小的前面找到,更改完后执行完命令重启,即可扩容。

增加网口

因为前面为了省事不配置lan口wan口只添加了两个网口,接下来我要添加一个给虚拟机的网口并让openwrt接管pve的管理网口,跟安装中的第九步操作一样,不过我这里不直通,只添加网络设备。这里有个坑点,添加完重启后我发现openwrt的wan口连不上网了,排查了一下发现是添加了新的网口之后openwrt内的网卡名称与其对应的网络设备发生了变化,原先的eth1所对应的接口现在变成eth3了,怎么找出来的呢,我在shell内执行ifconfig,发现有两个口的一个编号跟pve中的网络设备的编号是一样的(见图),查了一下发现是以太网设备的硬件地址,就根据这个找到了正确的网口,并在openwrt里的接口配置里把wan口绑定的和lan口绑定的改过来了,并把多加的两个网口和lan口桥接上了,然后就可以顺利上网了!网卡

应该就这些了,想到在更新吧

aio折腾记录(一):前言及安装pve

前言

Hello!好久没正儿八经更过一篇文章了,先来前情提要一下:

我很久之前就想在家里放个服务器,迫于资金问题一直没搞,直到今年年初收了压岁钱才有钱搞,在闲鱼上收了一个小主机,铠晶t201p,cpu J4125,内存8G+8G,固态64G(后来换成了256G),四块1T的机械硬盘,这些一套下来1000元整,后来我又自己换了固态,卖了两个1T的买了两个3T的,总花费大概在1300这一块。放个图

qq_pic_merged_1711164786124.jpg
IMG_20240323_113346.jpg
IMG_20240310_130510.jpg

然后就寻思做个all in one,主要需求是一个软路由,一个win挂一些软件,还有一个nas存东西。虚拟机框架选择了pve,下面来看安装过程。

安装

参考了张大妈上大鹏蟹佬的教程,除了第一次装的时候因为硬盘之前的分区问题导致没装上pve8.1之外其他的没啥问题。

1. 制作启动盘

这里推荐使用ultraISO,rufus感觉功能太多太细反正我做的时候用rufus没搞好,用ultraISO一键弄好了还是蛮方便的,具体操作跟上面说的教程一样这里就不贴了

2. 安装pve

启动盘插到主机上,进入bios->Boot->Boot Option #1设置为启动盘,然后在Advanced->CPU configuration或其他cpu相关->开启Intel Virtuallzation Technology和VT-D,保存退出即可。

开机后会弹出来一个pve的UI界面,选择第一个选项Install Proxmox VE,然后会蹦出十几秒的shell界面,等它重新变为UI界面就可以开始安装了。

  1. 首先出现一个相关协议界面,点击右下角同意继续。
  2. 第二步选择安装磁盘,建议多磁盘的新手朋友们先把其他磁盘拆掉避免安装到错误硬盘上,点击旁边的optionshdsize设置为64,如果磁盘空间小于64G的话可以不设置,这样是为了先采用64G的空间进行安装,后期再进行扩容。因为pve上扩容空间是比减小空间更方便的。
  3. 第三步设置登录密码,输入邮箱地址(没有实际用处但是不写不通过)
  4. 第四步选择使用地区国家,选择你的所在地区即可,时区保持默认的Shanghai就可以,输入法默认英文键盘
  5. 第五步是最重要的填写主机信息,这里直接摘大鹏蟹的过来了,防止出错

    1. 选择网卡, 这里选择的网卡,是以后你进行PVE系统的管理口,意思是你选择了哪个网卡,以后只能通过这个网口进行对PVE系统的管理,如果主机网口比较少,那随便选都可以,如果网口很多的,请记住你选择的网卡,免得后期不方便管理,如果你的主机是有wifi 网卡,那么这里也会出现这个wifi网卡,但是千万不能选择wifi网卡,是无法链接的,一定要选择有线网卡;
    2. 主机名称,其实是让输入你自己的网站名称,格式一定是 XXX.XXX, 不然无法通过,可以随便填,不过填写后,会作为你PVE主机的名称,请输入自己喜欢的名称即可;(多写几个.例如abc.bca.cba也是没问题的)
    3. 管理 地址,后期通过这个IP地址进行管理,这里需要设计好,比如你计划以后的局域网网关地址是192.168.0.1,那么你就应该输入192.168.0.2, 与网关地址不要冲突,自己能记住即可,这里建议设置成你现有路由器一样的网关地址,这样后续进行联网调试会更加方便,适合新手;
    4. 网关地址,同管理地址的意思,我设置成192.168.0.1, 这个地址我以后也会作为软路由的网关路由地址,虽然后期都可以改,不过一开始还是计划好吧;
    5. DNS地址,这个虽然不改保持默认能继续安装,但是新手一定一定要修改这个为114.114.114.114,切记切记,因为如果你保持默认或者随便填写一个不可用的DNS,那么后期你的PVE 是无法联网安装插件的,我就吃过亏,研究了很久;
  6. 最后会把信息给你汇总让你确定,确定无误后开始安装即可。

上次分区原因导致安装失败最后报错大概是pve unable to install the EFI boot,网上搜到的解决方法是用U盘进入pe系统,将安装硬盘的分区清除并格式化,然后再次安装。我没试过,直接换了个新的硬盘装的,但我觉得应该就是分区的问题。

安装完后会自动重启,记得把U盘拔掉防止再次进入安装界面,注意管理网口如果是非主板网口的话不要拔插,否则有可能进不去管理界面。

设置pve

通过网线连接pve的管理网口与电脑,当然我实测下来将管理网口连接到路由器应该也是可以的,然后你需要将你电脑的网段改为和pve一样的网段,让它俩处于同一个局域网中才可以互相访问

  1. 打开【你的电脑】-【控制面板】-【网络和共享中心】;
  2. 找到有线网口的网卡,点击进入选项;
  3. 进入【属性】设置,找到【internert协议版本4(TCP/IPv4)】并双击;
  4. 选择【使用下面的IP地址】;
  5. 将第一个【IP地址】改为192.168.0.5(除了最后一个.后面的数字和pve的不同其余全部相同),只要是同个网段,和PVE不一样即可;
  6. 第二个【子掩码】会自动填入255.255.255.0,默认即可;
  7. 【默认网关】改为192.168.0.1(和pve的网关相同即可);
  8. 完成,点击确定;

上面的ip记得根据你的实际情况更改,注意事项(摘自上提教程):

  • 上面的192.168.0.1是你安装PVE系统时,设置PVE的IP对于的网关,前三段你设置多少,这个网关最后一位就是1;
  • 同理,192.168.0.5,是你的电脑即将使用的IP ,这里的前三段要和网关一样,最后一位不能和PVE主机相同即可;
  • 如果你在安装PVE的时候就听从我上面的建议,将网关设置成现有路由器相同,则可以免去这一步骤;

管理pve可以通过web、ssh等形式管理,本文暂时只提web管理方式

pve开机后上方会有一个链接,那个链接就是pve的管理网址,大概是https://pve的ip:8006/,注意不要忽略http后的s和ip后的:8006这个端口,访问时会提示不是专用链接,不用管直接点击高级选项然后访问即可,通过安装时设置的密码登录,记得在登录那个地方更改语言,登陆后有个弹窗提示你订阅不可用直接关闭即可。

现在你就可以探索pve了!

写不动了剩下的看大鹏蟹写的吧,这个佬写的是真细

博客近期计划(如果算的话

计划就是没有计划

今年应该不会太鸽了,感觉在学校会有时间去记录自己的瞎想,然后两周放假回来就放上来。博客功能我感觉我会自己鼓捣一些东西,但时间就不好说了,毕竟两周才回家一次。

至于内容方面,因为退竞了,OI相关的更新基本就没了,估计会更一些生活方面的以及瞎折腾的,比如最近买了一个二手的all in one,下次回来应该会把折腾记录放上来,现在网络这块还没搞明白,好麻烦啊真是。

总之不论会写些什么吧,我都会尽量保持每两三周一更的频率,也是尽量把文章幅度拉长一点吧,也算锻炼一下自己的写作能力了。有很多想做的事呢感觉时间好少。就酱吧,下方是奇丑无比的手写原稿,一些内容在打出来的里面删掉了,感觉写的有点碎qwq。

P.S. 博客前两周炸掉是cdn回源协议弄错了,改了一下之后好了,但是发现还是不行所以现在干脆把cdn撤掉了,就酱。

手写原稿.jpg

chatgpt是真好用……吗?

事情的起源呢,来自于最近几天我的语文作业都是chatgpt做的,结果发现自己现在一点都不会做了,写作能力几乎为0,正好之前在网上看到过关于chatgpt对个人思维能力的影响的文章,寻思随便写写。

chatgpt作为一个AI,对人的帮助无疑是非常大的,但是在我使用gpt的过程中,我发现一个很严重的问题:我的思维能力是逐渐在倒退的。都说脑子不用会变傻,这句话放在这件事上面再合适不过了。对于一个问题,你自己想可能需要想几个小时才能想出一个粗略的答案,而gpt在一分钟内就能给你列出一份详细的答案、解释,而且gpt列出来的你都可以转化为自己想出来的东西,反正也没人认得出来不是吗。就在这个过程中,我的思维能力逐渐下降,大脑逐渐放空,相对于之前捉住一个问题反复思考直至想出来为止,现在我大脑的工作方式反而变成了如何把这个问题转化为gpt能理解的语言,如何让gpt准确的给出我想要的答案。后者用脑量明显是大大减少的。

新服务器开荒指南!

新服务器开荒指南!

又剁手了qwq,买了cloudcone的圣诞节特惠机子,配置如下:

服务器配置

打算把自己想乱搞的东西部署在上面,延迟还可以

系统用的是Ubuntu 20.04 LTS

那么就让我们开始吧!(第一次写这种东西,如果有问题还请大佬在评论区狠狠输出!)

准备工作

记好你的服务器ip,和你的root密码

安装screen

screen是一个软件,可以让一些东西在后台运行,妈妈再也不怕我装东西的时候ssh断掉了!

首先更新下安装源:

apt update

然后直接安装!

apt install screen

用法:screen -R 名称 新建一个名为名称的后台;screen -x 名称 进入名为名称的后台

添加一个用户

这里是为了防止待会禁止root用户使用ssh登录后一不小心断连连不回去了,而且日常不用root用户是好文明,防止 rm -rf /(千万别尝试!)。

在root用户下执行 adduser 用户名 指令,然后他会让你执行一系列操作,跟着指示执行即可。

1703599710535.png

然后要给这个用户添加 sudo 权限,在root用户下执行 visudo 指令,然后在 root ALL=(ALL:ALL) ALL 这行之后添加一行,格式如下图:

1703600525351.png

然后按 Ctrl+O 后按回车即可。

1. 安全措施

更改默认ssh端口

防止被爆破,要不然每次登录看见几万个失败尝试会很难受的

执行 sudo vim /etc/ssh/sshd_config (或者 nano 之类的你喜欢的编辑器),找到 Port 22 这一行,改成一个你喜欢的数字,建议>100。1703599312540.png

禁止root用户登录

还是刚才编辑的文件,找到 PermitRootLogin 并把后面的 yes 改为 no

最后在做完以上两步后执行 sudo systemctl restart sshd 重启ssh

安装fail2ban

这个软件可以将扫描ip尝试爆破的ip进行封禁,减少被爆破概率。

国内vps请自行搜索apt换源

执行 sudo apt update 以及 sudo apt upgrade 进行软件更新(可选),然后执行 sudo apt install fail2ban 安装fail2ban。具体教程看大佬写的吧 这里 毕竟我也是照着这个来的。

暂时想到的就这些了

2. 配置环境

这里我打算配置 NSP(Nginx+Sqlite+PHP)环境,因为我自己要用的就这些,再加上一个docker。

安装Nginx

如果不想要最新版的Nginx,直接执行 apt install nginx 即可,如果想要最新版的可看以下命令

# Open Terminal (or connect via SSH)
# Ensure you have all of the prerequisites installed:
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
# Import the nginx signing key for apt:
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
     | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
# Create a sources .list file for apt:
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
     http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
     | sudo tee /etc/apt/sources.list.d/nginx.list
# Pin the repository to ensure the nginx packages are installed instead of the Ubuntu-provided packages:
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
     | sudo tee /etc/apt/preferences.d/99-nginx
# Update apt:
sudo apt update
# Install nginx:
sudo apt install nginx

然后启动nginx:

sudo systemctl start nginx

如果有如下报错的话:

Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xe" for details.

多半是内置的Apache抢占了nginx的端口,执行以下命令:

sudo systemctl stop apache2.service
sudo systemctl restart nginx

然后在浏览器里输入你的服务器ip看看会不会出现以下图片,如果出现了那么恭喜你,没出现的话去看一下防火墙关了吗。

1703603292830.png

安装PHP

我常用的版本是7.4,这里就以这个版本举例。

首先安装这个软件包:

sudo apt install software-properties-common

然后添加存储库:

sudo add-apt-repository ppa:ondrej/php

最后更新安装包:

sudo apt update

然后你就可以直接安装php7.4了!

sudo apt install php7.4

安装sqlite

不用特别安装,装个php的驱动就好

sudo apt install php7.4-sqlite3

安装docker

确保有以下软件包:

sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release

添加docker官方密钥:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

国内用户可以添加阿里云的:

curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

添加docker官方库:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

国内用户:

sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

更新软件源:

sudo apt update

安装docker ce:

sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

建议配置用户组使得不需要sudo就可以使用docker:

sudo usermod -aG docker $USER

增加swap(虚拟内存)

生成swap文件:

sudo dd if=/dev/zero of=/swapfile count=2048 bs=1024k
                   swap文件路径     数量      大小

最终swap文件大小就是数量×大小

赋予swap文件权限:

sudo chmod 0600 /swapfile

设置文件为swap:

sudo mkswap /swapfile

开启该文件的swap:

sudo swapon /swapfile

先写到这,之后再更新!

1826. 平衡子段

1826. 平衡子段

题目链接

题目描述

一个序列含有 N 个整数 $A_i$。现在给出两个整数 M、C,让你从原序列中寻找长度为 M,波动幅度不超过 C 的平衡子段。

所谓“长度为 M,波动幅度不超过 C 的平衡子段 ”,是指:

  1. 在原序列中是连续的M个数
  2. 记这M个数中的最大值为 Max,最小值为 Min,则 $Max-Min\leq C$

思路

固定长度的区间,让你找区间中的最大最小值,一眼RMQ问题,看看数据范围,可以 $O(N\log N)$,直接莽一发ST表

代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
int read(){
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<3)+(x<<1)+(c^48);
        c=getchar();
    }
    return x*f;
}
const int N=1000006,M=22;
int n,m,c;
int fd[N][M],fx[N][M];
//ST表查询
inline int da(int l,int r){
    int x=(int)log2(r-l+1);
    return max(fd[l][x],fd[r-(1<<x)+1][x]);
}
inline int xiao(int l,int r){
    int x=(int)log2(r-l+1);
    return min(fx[l][x],fx[r-(1<<x)+1][x]);
}
int main()
{
    n=read();
    m=read();
    c=read();
    for(int i=1;i<=n;++i){
        fd[i][0]=read();
        fx[i][0]=fd[i][0];
    }
    //预处理ST表
    for(int j=1;j<M;++j)
        for(int i=1;i+(1<<j)-1<=n;i++){
            fx[i][j]=min(fx[i][j-1],fx[i+(1<<(j-1))][j-1]);
            fd[i][j]=max(fd[i][j-1],fd[i+(1<<(j-1))][j-1]);
        }
    vector<int> a;
    //枚举起点判断合法性
    for(int i=1;i+m-1<=n;++i){
        if(da(i,i+m-1)-xiao(i,i+m-1)<=c) a.push_back(i);
    }
    if(a.empty()) printf("NONE\n");
    else{
        for(int i:a) printf("%d\n",i);
    }
    return 0;
}

据说可以 $O(N)$,既然是一个个区间从1到n枚举过去,考虑用单调队列维护区间最大最小值。以最大值举例,每次加一个数x的时候从队尾弹出比x小的,然后从队头弹出距离大于m的,最后取出最大最小值判断即可。

代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
int read(){
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<3)+(x<<1)+(c^48);
        c=getchar();
    }
    return x*f;
}
const int N=10000007;
int n,m,c,h,t,hh,tt;
int a[N];
typedef pair<int,int> pii;
pii da[N],xiao[N];
vector<int> ans;
int main()
{
    n=read();
    m=read();
    c=read();
    for(int i=1;i<=n;++i) a[i]=read();
    for(int i=1;i<=n;++i){
        //最大值单调队列
        //先弹小的
        while(h<t&&da[t].second<a[i]) --t;
        //再弹远的
        while(h<t&&da[h+1].first+m-1<i) ++h;
        //最小值
        while(hh<tt&&xiao[tt].second>a[i]) --tt;
        while(hh<tt&&xiao[hh+1].first+m-1<i) ++hh;
        //别忘记入队
        da[++t]={i,a[i]}; xiao[++tt]={i,a[i]};
        if(i>=m){
            if(da[h+1].second-xiao[hh+1].second<=c) ans.push_back(i-m+1);
        }
    }
    if(ans.empty()) printf("NONE\n");
    else for(int i:ans) printf("%d\n",i);
    return 0;
}

Tailchat 使用体验

省流:强推Tailchat!

前情提要

机房里用QQ不是很方便,又正好看到一个标着聊天室的链接,点进去发现是tailchat的预览版服务器,看了下文档觉得还不错,正好自己手里闲着一个服,干脆自部署使用

部署步骤

官方文档

使用官方的docker-compose部署

首先安装docker环境

拉取最新镜像并改名

docker pull moonrailgun/tailchat # 从公共镜像库拉取 tailchat镜像
docker tag moonrailgun/tailchat tailchat # 将下载的镜像改名为tailchat(和源码编译保持一致,如果不改的话会走源码编译流程)

下载docker-compose配置文件以及环境变量

mkdir tailchat && cd tailchat
wget https://raw.githubusercontent.com/msgbyte/tailchat/master/docker-compose.yml
wget https://raw.githubusercontent.com/msgbyte/tailchat/master/docker-compose.env

建议更改的环境变量(docker-compose.env):

  • API_URL 对外的url地址,用于文件及api访问,如果图片访问有问题就是这的问题
  • SECRET 服务端加密秘钥,用于生成Token。默认 tailchat

改完后一键启动:

# 确保配置文件(docker-compose.yml和docker-compose.env)在当前目录下
# 执行以下命令一键启动
docker compose up -d

官方文档很详细了,开发者回复也很积极,这里就不多写了。

使用体验

可以说是比较新奇,第一次见到需要安装插件才能解锁完全形态的聊天平台,插件生态目前比较丰富,开发者也提供了文档供个人开发,如果想默认安装xxx插件的话需要自己编译,不过至少是提供了选项,扩展性真的很强。

重点说一下它的性能占用,所有docker容器大概存储占用3G左右,性能这块我实测下来十多人同时在线发言的话一个1核1g的小服务器是完全撑得住而且非常流畅的,下图为9人在线但没有发言时的占用:

9人在线占用.png

这是我服务器的cpu:

cpuinfo.png

具体可见官方文档中的压测部分。

还有就是后台界面,在部署时是可选的,功能不是很多但必需的东西都在,其他一些比较杂的需要在环境变量里配置。

总的来说是非常爽的,这十几天用下来同学们反响也都很好,我的评价是比discord强!

最后看一眼可怕的水群速度

水群速度.png

线段树的前世今生

标题党.jpg

这篇文章就是想写一写关于线段树的一些比较高级且较常用的东西(太高级的我不会所以不要在本文章中期待看到线段树合并/分裂、猫树等东西,等我啥时候会了再说)

[...]

❌