阿里 OSS 访问图片 403
如下图, 原因是域名开启了 Referer 防盗链,如下, 添加允许访问的域名即可。
如下图, 原因是域名开启了 Referer 防盗链,如下, 添加允许访问的域名即可。
wget -O - https://get.acme.sh | sh . .bashrc # 自动更新 acme.sh --upgrade --auto-upgrade # 测试是否能成功获取 acme.sh --issue --test -d joking.vksir.zone -w /var/www/html --keylength ec-256 # 正式获取 acme.sh --issue -d joking.vksir.zone -w /var/www/html --keylength ec-256 --force # 为 Xray 安装证书 acme.sh --install-cert -d joking.vksir.zone --ecc \ --fullchain-file /usr/local/etc/xray/xray.crt \ --key-file /usr/local/etc/xray/xray.key chmod +r /usr/local/etc/xray/xray.key
我是于菲,容貌俏丽的假小子,时常戴着一顶棒球帽,身穿夹克衫。 姐姐两年前死了,死在了林家大院。她是为了去寻找我们刘家的宝藏——没错,祖父去世时告诉我们,他姓刘,为了逃离文革制裁才隐姓埋名改成了“刘”;林家曾也是名门望族,家境殷实,他们刘家三兄弟分开隐居逃难前,将家里的资产埋藏在了刘家大院,后来刘家大院被林家买走,变成了林家大院,而资产,可能还在那里。 现在,公司举办一场《虚拟游戏》:七个人,两名凶手杀人,五位侦探找出凶手,胜者获得五万奖金。而这场杀人游戏将在虚拟世界进行,这个世界即是两年前的林家大院,公司号称虚拟世界的场景由历史现实 1:1 还原而来。虽然我不知道公司是怎么做到的,但这和我无关,我需要回到两年前,查询姐姐的死因,同时寻找祖父家的宝藏。 姐姐生前待我极好,曾经我并不是一个假小子,我也喜欢穿漂亮裙子,打扮得可可爱爱出门。但是姐姐走了,家里只剩下我一个,为了不让父母担心,我必须坚强起来,打扮阳刚一点,努力假装坚强。 虚拟游戏开始了,我并不是凶手。 但是,游戏开始前,王总告诉我,游戏开始的第一天晚需要我登出游戏,然后他来进游戏进行一些操作。 是的,我是公司的原因,公司举办了这场《虚拟游戏》,而王总是总负责人,他有权来命令我做一些事情,我无法拒绝。虚拟游戏是在虚拟世界进行,而我们玩家需要躺入游戏仓中进入游戏,这时我们对外界是没有任何感觉的。进入游戏仓后无法自主登出,必须受外界影响——比如闹钟,才能登出。而游戏角色是由公司提供的,创建角色的权限在王总那儿。虽然游戏角色外表和我本人一致,但其它人也能操控,所以王总使用我的游戏仓就能使用我的游戏角色做一些事情,假装成我。 我不知道他要做什么,但我没得选。 未待完续
Manjaro 还是好啊(或者说,Arch linux 还是好)。 系统环境全部准备的好好的,想编译安装什么的,直接 make && make install 就行。换了 CentOS 7,那就是各种报错,缺这缺那,麻烦的很。 强大的包管理系统。又说 CentOS,想装个麻烦的很,参照 PHP,想装个软件还得去找 源,或者你想编译安装?行,一大堆报错等着你呢!而 Manjaro,直接 yay -S php,真的不要太简单。 就这……这不就够了吗?要不是服务器不好装 Manjaro,我都不想在服务器上用 CentOS 了,装个软件着实麻烦(强迫症……不想用 docker)。 还是在 PC 上用用吧。 环境:? 制作启动盘 使用官方推荐的刻录工具 Rufus 进行刻录。 据说是要使用 dd 模式进行刻录,但是目前的 Rufus v3.9 并没有 dd 模式,或许要使用低版本的 Rufus,或许不需要(距离上次安装有点久,有点忘了,下次安装系统再修改)。 安装 从 U 盘启动 如我的电脑——Acer Swift 5,其 bios 系统中存在 UEFI 安全模式,将其关掉。 安装 1. lang=zh_CN driver=nonfree 然后 Boot 即可。 配置 安装源 自动寻找最快源 sudo pacman-mirrors -i -c China -m rank 添加 archlinuxcn 清华源 ...
闲话 2020WUHAN,闲在家没事做,之前也用C语言写了一个小的游戏脚本,只有黑框框,趁这个时间就想给它弄个界面出来。 笔者其实只有非常粗略的编程技术,仅仅略懂C语言和Java。游戏脚本需要非常精准的时间控制函数,而且需要模拟键盘输出,响应键盘输入,运行在windows上,考虑到java的效率问题,选择了C++进行开发。 听说QT和MFC都不错,其实也考虑过imgui,但是那个教程资源很少,有也基本都是英文的,看起来着实费劲。 QT 感觉qt很适合新手,折腾了一番,没一天的时间就把界面折腾出来了,也基本完善了所有功能。但是,qt很不靠谱!做好了程序没法导出exe。用windeployqt工具导出错,查了一下,貌似是现在的版本5.14.0,有这个bug,没法导出。 卸了,装上5.13.3,可以成功导出。但是!我是高分屏,5.13.3界面会自动启用win10缩放,而且禁用缩放也没用。这导致编辑gui的界面被放得过大,不仅操作不方便,而且生成的程序窗口大小和那个不一致,放大ui也不放大字体。5.13.3也不能用。 各种难受。(刚看了眼,5.14.1发布了,想来是可以导出程序了,但怎么说,这种开源项目,出这种莫名其妙的bug,其实很难受。弃了) MFC 听说mfc并不适合新手,确实,但是,visual studio 2019 为mfc 开发提供了很多便捷操作,查查资料,其实并没有那么难(笔者可是0基础,C++都是现学的) vs2019 提供了哪些便捷操作呢?拖放编辑UI(这个和qt一样),类向导可以直接添加消息函数、重载函数,全图形交互式操作(这就不叫敲代码了吧……一键添加代码?) 当然,比起来MFC还是更难,但是mfc发展至今,资料也非常多,常见问题都能找得到,且微软不会像qt这样出一些莫名其妙的bug,mfc发展非常完善。vs2019也比qt creator好用得多(开发qt时我用的vscode写代码),调式功能非常不错,不像qt,出个错误又没有提示信息,有时候摸不着头脑。 学习c++ 菜鸟驿站 非常棒的网站,快速学习主要知识,直接上手,不懂的地方再找资料细看。 学习mfc开发 VC驿站 里面有很多C++相关的教程,笔者专注于看MFC开发那一块。 实用VC++编程之玩转控件 站长在b站上发的mfc教程视频,非常详细,讲解也很清楚。 mfc小程序需要学哪些 仅对于笔者需要的功能来说啊: 创建对话框 使用按钮、文本框、Spin、ComboBox等基础控件 控件设置 添加控件响应 添加菜单 禁止对话框窗口缩放 重载函数使得F1,Esc,Enter键失效 弹出第二个窗口 注册全局热键 读写文件 一一说来。 创建对话框程序 使用vs2019模板创建即可,运行,弹出一个窗口。 基于对话框 + 无增强的MFC控件 + 在静态库中使用MFC 没有mfc模板可能是没有装这个组件,百度即可。具体创建跟着vc驿站的教程视频来。 添加控件 图形交互式操作 设置控件变量名:右键控件——添加变量——设置名称 (变量名更易于自己识别,编写控件事件更方便) 添加响应 - 右键控件——添加事件处理程序——选择类列表:CXXXDlg——更改函数名——选择事件类型 下面有事件说明,大多数时候默认事件是最合适的 添加完成后,会直接跳转到cpp文件中,函数声明、创建,vs2019全部为你做好了,直接在里面添事件代码就行。 控件设置 Spin Control //设置DamageA和DamageB的Spin UDACCEL aclA, aclB; aclA.nInc = 2; aclB.nInc = 10; m_Spin_DamageA.SetRange(0, 9999); m_Spin_DamageA.SetAccel(2, &aclA); m_Spin_DamageA.SetBuddy(GetDlgItem(IDC_EDIT1)); m_Spin_DamageB.SetRange(0, 9999); m_Spin_DamageB.SetAccel(2, &aclB); m_Spin_DamageB.SetBuddy(GetDlgItem(IDC_EDIT2)); 说明: ...
粗略实现了一下 requests 库。但后来想想,也必要自己造轮子,还是 resty 香! package requests import ( "encoding/json" "errors" "fmt" "io" "log" "net/http" "net/url" "reflect" "strings" ) type Client struct { Url string Headers map[string][]string Params map[string][]string Content string Data interface{} Json interface{} } type Response struct { Status string StatusCode int Body string } func (c Client) newRequest(method string) (req *http.Request, err error) { // url if reflect.ValueOf(c.Url).IsZero() { err = errors.New(fmt.Sprintf("url is needed: client=%+v", c)) return } u, err := url.ParseRequestURI(c.Url) if err != nil { return } // params if !reflect.ValueOf(c.Params).IsNil() { var params url.Values = c.Params u.RawQuery = params.Encode() } // body, headers body := "" if reflect.ValueOf(c.Headers).IsNil() { c.Headers = make(map[string][]string) } if !reflect.ValueOf(c.Content).IsZero() { body = c.Content } else if !reflect.ValueOf(c.Data).IsValid() { c.Headers["Content-Type"] = []string{"application/x-www-form-urlencoded"} var bodyBytes []byte bodyBytes, err = json.Marshal(c.Json) if err != nil { return } body = string(bodyBytes) } else if !reflect.ValueOf(c.Json).IsValid() { c.Headers["Content-Type"] = []string{"application/json"} var bodyBytes []byte bodyBytes, err = json.Marshal(c.Json) if err != nil { return } body = string(bodyBytes) } req, err = http.NewRequest(method, u.String(), strings.NewReader(body)) if err != nil { return } req.Header = c.Headers return } func (c Client) parseResponse(resp *http.Response) (response *Response, err error) { defer func(Body io.ReadCloser) { err := Body.Close() if err != nil { log.Printf("close response body failed: err=%s", err) } }(resp.Body) body, err := io.ReadAll(resp.Body) if err != nil { return } return &Response{ resp.Status, resp.StatusCode, string(body), }, nil } func (c Client) Request(method string) (response *Response, err error) { req, err := c.newRequest(method) if err != nil { return } client := http.Client{} resp, err := client.Do(req) if err != nil { return } return c.parseResponse(resp) } func (c Client) Get() (response *Response, err error) { return c.Request("GET") } func (c Client) Post() (response *Response, err error) { return c.Request("POST") }
最近为饥荒群安排了 QQ 机器人 Stella ,并为其搭载了饥荒服务器管理模块,只要 @Stella 发送指令就可以快捷地对服务器进行操作。旨在使饥荒服务器更易于管理,降低操作门槛,让每个人都能参与使用,同时减轻服务器管理者的负担。 以下,是服务器管理命令的简明文档。 须知 Stella 是 Q 群机器人,发送指令必须先 @Stella,然后输入指令。 输入指令必须以 # 开头。 服务器名见公告,当前只有 极光 和 矮星 两台服务器搭载了此功能。 如: 通用 API #服务器名 player-list 显示当前在线玩家 #服务器名 mod-list 显示服务器安装的 Mod 管理员 API 基本管理 #服务器名 start 启动服务器 #服务器名 stop 关闭服务器 #服务器名 restart 重启服务器(并更新 Mod) #服务器名 update 更新服务器(指更新服务器版本) Mod 管理 添加 Mod #服务器名 mod-add 参数 有两种参数,一种是 ModID,一种是 modoverrides.lua 文件内容。 ModID 一个或多个 ModID,中间以空格隔开,如下: ModID 怎么看? 以全球定位为例,如下图红框中内容。 modoverrides.lua 文件内容 modoverrides.lua 文件位于 Cluster_1/Master/modoverrides.lua,每个存档都有各自的 Mod 文件。 ...
眼睛有点疼,但看完了还是要写一写,明天周一就更没时间写了吧? 86 战区——也是唯一一个战区。 白种人把持共和国,居住在 1-85 区,歌舞升平;其它色人种被赶到 86 区,被迫同入侵者展开战斗。 白种人对内称无人阵亡,边境战线连日大捷,蛊惑群众——其实他们这么说也没错,因为 86 在他们看来,不是人,只是「猪」。86 被迫保卫「祖国」,他们是可以放弃的,只是没有。 战争已经持续了很多年,86 也死得差不多了,现在在战场上的基本都是少年(少年包括男女),估计要不了多久,86 就要灭绝了。 故事中有很多不合理的地方,不能用常理来看。整个故事极具嘲讽意味,但并不想仔细分析,没必要。 86 为什么还要战斗? 因为要活。他们可以死,也可以复仇,复仇不过是将边境拱手相让,让敌军代替他们复仇。人终有一死,但在死之前,他们想肩负他们 86 的荣耀,只是这个过程中,不小心保卫了白种人而已。 这么想其实没错,前提是不直接起义,面对敌军,只有束手就擒和奋勇杀敌,可以选择杀一杀。 少校? 前面看得非常的尬,身为白种人,身处 1 区,却一直想靠近 86 区的 86。一个是压迫者中的一员,一个是被压迫者,这么做当然会引起被压迫者的反感,不管是不是真心,别人又不知道。天天找 86 聊天,企图通过交谈去接近他们,还说一些 1 区的事情,什么「灯火不灭,看不见星星好可惜」之类的,老凡尔赛了。真的不会惹人厌么? 当然这都是建立在前期少校没什么作为的前提下,后面少校为了 86,多次同上级提出增员请求、炮击请求,最后甚至直接黑入系统,擅自使用迎击炮帮助 86 杀敌,在冒着失明风险下进行视觉同步,精确制导。少校为 86 做了很多,并非假仁假义,她是个高尚的人。 辛? 没什么吧,普普通通高冷男主,帅的。 就这些了,其实是个非常浅的番,但是因为是末世,给人一种史诗感,寂寥,萧瑟,个人比较喜欢,所以还是不错的。番本身并没有什么亮点。不值得一看。 ——记于 2020/8/16
如果有一天,有人告诉你三个 0.1 加起来不等于 0.3 你会不会觉得很惊讶?但事实如此: >>> 0.1 + 0.1 + 0.1 == 0.3 False 这是为什么呢?这就涉及到了浮点运算的精度问题。 Why 计算机一般以二进制存储数据。在十进制里,0.1 是个精确值,但在二进制里,0.1 是一个无限循环小数: a = 0.1 print('0.', end='') for _ in range(50): a *= 2 print(int(a // 1), end='') a -= a // 1 0.00011001100110011001100110011001100110011001100110 所以从存入的那一刻,其数值就已经从精确值变为了不定值。 在某些需要精确计算的场合,这非常致命。 How 如何解决? 其一是使用 decimal 模块,这里也仅介绍 decimal 模块,在我看来,它几乎满足所有要求。 decimal Decimal is based on a floating-point model which was designed with people in mind. 它模仿人类十进制计算方法进行计算: 绝对精确:0.1 + 0.1 + 0.1 = 0.3 有效位保留:0.30 * 0.200 = 0.06000 四舍五入 Decimal class decimal.Decimal(value="0", context=None) value 可以是整数、字符串、浮点数等。 >>> Decimal(1) # 一般用于表示大数字 Decimal(1) >>> Decimal('0.1') # 用于精确表示浮点数 Decimal('0.1') >>> Decimal(0.1) # 一般无用 Decimal('0.1000000000000000055511151231257827021181583404541015625') >>> Decimal('inf') >>> Decimal('-inf') context ...
非常强大的子进程管理模块,你想要的它都有。 环境:Windows 10 上一篇文章讲的 Pexpect,功能是不错,但它有的 Subprocess 都能做到,且更加完美。 一个好的子进程管理需要满足什么功能需求? 无阻塞 / 阻塞 标准输入 / 输出 信号发送 / kill 其实也不多。 开始 import subprocess proc = subprocess.Popen('ping 127.0.0.1', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE) print(proc.stdout.read().decode('gbk')) # 因为是 windows 系统,默认编码是 ‘gbk’ 正在 Ping 127.0.0.1 具有 32 字节的数据: 来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128 来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128 来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128 来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128 127.0.0.1 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失), 往返行程的估计时间(以毫秒为单位): 最短 = 0ms,最长 = 0ms,平均 = 0ms subprocess 主要有两个运行命令的方法: ...