0%

闲话

2020WUHAN,闲在家没事做,之前也用C语言写了一个小的游戏脚本,只有黑框框,趁这个时间就想给它弄个界面出来。

笔者其实只有非常粗略的编程技术,仅仅略懂C语言和Java。游戏脚本需要非常精准的时间控制函数,而且需要模拟键盘输出,响应键盘输入,运行在windows上,考虑到java的效率问题,选择了C++进行开发。

听说QT和MFC都不错,其实也考虑过imgui,但是那个教程资源很少,有也基本都是英文的,看起来着实费劲。

QT

感觉qt很适合新手,折腾了一番,没一天的时间就把界面折腾出来了,也基本完善了所有功能。但是,qt很不靠谱!做好了程序没法导出exe。用windeployqt工具导出错,查了一下,貌似是现在的版本5.14.0,有这个bug,没法导出。

阅读全文 »

粗略实现了一下 requests 库。但后来想想,也必要自己造轮子,还是 resty 香!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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,然后输入指令。
  • 输入指令必须以 # 开头。
  • 服务器名见公告,当前只有 极光矮星 两台服务器搭载了此功能。
阅读全文 »

眼睛有点疼,但看完了还是要写一写,明天周一就更没时间写了吧?

86 战区——也是唯一一个战区。

白种人把持共和国,居住在 1-85 区,歌舞升平;其它色人种被赶到 86 区,被迫同入侵者展开战斗。

白种人对内称无人阵亡,边境战线连日大捷,蛊惑群众——其实他们这么说也没错,因为 86 在他们看来,不是人,只是「猪」。86 被迫保卫「祖国」,他们是可以放弃的,只是没有。

战争已经持续了很多年,86 也死得差不多了,现在在战场上的基本都是少年(少年包括男女),估计要不了多久,86 就要灭绝了。

阅读全文 »

如果有一天,有人告诉你三个 0.1 加起来不等于 0.3 你会不会觉得很惊讶?但事实如此:

1
2
>>> 0.1 + 0.1 + 0.1 == 0.3
False

这是为什么呢?这就涉及到了浮点运算的精度问题

阅读全文 »

非常强大的子进程管理模块,你想要的它都有。

环境:Windows 10

上一篇文章讲的 Pexpect,功能是不错,但它有的 Subprocess 都能做到,且更加完美。

一个好的子进程管理需要满足什么功能需求?

  • 无阻塞 / 阻塞
  • 标准输入 / 输出
  • 信号发送 / kill
阅读全文 »

相对有名的可用于自动化应用程序交互的模块,可用于 ssh、ftp 等程序。

环境:Ubuntu 20.04 LTS

最近想做一个游戏服务器管理器,以 Python 为主语言,对 Linux 上的常驻程序进行管理。需要满足:

  • 无阻塞启动程序
  • 实时读取程序输出
  • 实时进行程序输入
  • 定时进行程序重启
阅读全文 »

环境:CentOS 7,无界面

安装 Chrome

1
2
3
4
5
# 直接从网络安装 rpm 包
yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm

# 查看版本
google-chrome -version
阅读全文 »

常用命令

1
2
3
4
5
6
7
8
9
10
# 登录
ssh <USER>:<PASSWORD>@<IP>

# 创建密钥
ssh-keygen
# 上传公钥
ssh-copy-id <UESR>@<IP>

# 端口映射
ssh -L <LOCAL_IP>:<LOCAL_PORT>:<REMOTE_IP>:<REMOTE_> <UESR>@<IP>
阅读全文 »

​ 正在守夜。

​ 香是在燃着的,缕缕白烟,不能断。

​ 其实我有一点困,诸如平时,熬夜到两三点对于我来说是家常便饭的——现在 2:45。但是我现在有一点困,因为我不想守了。

​ 不是很想守。

​ 昨天守夜是不错的,我还挺乐意的。也不是说乐意,我是觉得我应该这么做——是嘛,身为孙子,这是应该做的。而且,我不守的话,我爸就得守,我爸不能守,那就只有我妈守了。

阅读全文 »