🔬这里是怪物实验室,小心怪物出没!

Qt5操作OpenGL(核心模式)
G

main.cpp

#include <QApplication> #include <QDebug> #include "canvas.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); QSurfaceFormat glFormat; glFormat.setVersion(3, 3); // 设置OpenGL版本 glFormat.setProfile(QSurfaceFormat::CoreProfile); // 设置使用核心模式 QSurfaceFormat::setDefaultFormat(glFormat); Canvas *c = new Canvas(); c->show(); return a.exec(); }

Canvas.h

#ifndef CANVAS_H #define CANVAS_H #include <QWidget> #include <QOpenGLWidget> #include <QOpenGLExtraFunctions> class Canvas : public QOpenGLWidget,protected QOpenGLExtraFunctions { Q_OBJECT public: explicit Canvas(); signals: public slots: private: protected: virtual void initializeGL(); virtual void resizeGL(int w, int h); virtual void paintGL(); private: GLuint shaderProgram; }; #endif

Canvas.cpp

#include "canvas.h" #include <QtDebug> #include <QtOpenGL> // 以下为测试代码,不推荐这么写 // ================================= GLuint VBO, VAO; const char *vertexShaderSource = "#version 330 core\n" "layout(location = 0) in vec3 aPos;\n" "void main(){\n" " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" "}\n\0"; const char *fragmentShaderSource = "#version 330 core\n" "out vec4 FragColor;\n" "void main(){\n" " FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" "}\n\0"; // ================================= Canvas::Canvas() { } void Canvas::initializeGL() { //着色器部分 this->initializeOpenGLFunctions(); int vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glCompileShader(vertexShader); int success; char infoLog[512]; glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); qDebug() << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << endl; } int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); glCompileShader(fragmentShader); glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); qDebug() << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << endl; } shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); if (!success) { glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); qDebug() << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << endl; } glDeleteShader(vertexShader); glDeleteShader(fragmentShader); GLfloat vertices[] = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f }; glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (void*)0); glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); } void Canvas::resizeGL(int width, int height) { glViewport(0, 0, width, height); } void Canvas::paintGL() { glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(shaderProgram); glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLES, 0, 3); glUseProgram(0); }

read more

⚠️服务器重地,闲人免入!

局域网部署Gitlab
G

使用Gitlab内置的Nginx服务

1、去官网下载最新版的Gitlab软件,根据操作系统选择:(我的是CentOS7,选择rpm x64安装包)
https://packages.gitlab.com/gitlab/gitlab-ce

wget https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-11.7.5-ce.0.el7.x86_64.rpm

2、安装依赖包和相关配置

sudo yum install -y curl policycoreutils-python openssh-server sudo yum install postfix sudo systemctl enable postfix sudo systemctl start postfix sudo systemctl enable sshd sudo systemctl start sshd sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent sudo firewall-cmd --zone=public --add-port=8081/tcp --permanent sudo firewall-cmd --reload

3、安装Gitlab

rpm -i gitlab-ce-11.7.5-ce.0.el7.x86_64.rpm

4、配置Gitlab,监听8080端口

vi /etc/gitlab/gitlab.rb #======================= # 修改external_url,修改成你服务器的ip地址,如:external_url 'http://192.168.1.xxx' # 查找所有8080端口,共3个,全部改成8081 # 查找nginx['listen_port'],将Nginx监听端口修改成8080

5、重启Gitlab服务器

sudo gitlab-ctl reconfigure sudo gitlab-ctl restart

6、用浏览器访问:
http://192.168.1.xxx:8080

可能出现问题的解决方案:

安装过程中卡死不动,强制终止后运行下面指令

sudo systemctl restart gitlab-runsvdir sudo gitlab-ctl reconfigure sudo gitlab-ctl restart

网络错误日志调试

gitlab-ctl tail

read more

👾这是谁家的怪物?

GuaikNet怪客网络库
G
GuaikNet-怪客网络

可配置微服务的HTTP网络服务端程序

https://github.com/guaik/GuaikNet ️安装说明:(CentOS7) yum -y install epel-release yum -y install git yum -y install python-tools yum -y install python-pip pip install --upgrade pip pip install tornado pip install gevent pip install pika git clone https://github.com/guaik/GuaikNet.git cd ./GuaikNet chmod +x ./start.sh ./start.sh # 如果显示如下信息,证明已经成功安装并运行 # ********************************** # @ Welcome to use <GuaikNet> system # @ website: https://bbs.guaik.org # @ email : luting.gu@gmail.com # ********************************** 系统测试:

安装requests库

pip install requests

将项目根目录下的client.py文件复制到测试电脑,修改client.py中的http://localhost:8080,将其中的localhost改成你部署GuaikNet项目所在的服务器
地址。

然后运行:python ./client.py

如果返回Welcome to use GuaikNet system则说明系统运行正常。

使用说明

GuaikNet的工作目录有两个,分别是http请求的处理目录./works和rpc的工作目录./rpc。

HTTP请求协议:

示例:{"protocol":"json","version":"v1.01","action":"guaik.welcome","content":{}}

protocol: 请求协议 选项:[json, aes, rsa] (当前只使用json,aes加密和rsa加密方式还未加入)。

version : 版本号,如果客户端发起请求所使用的版本号与服务器当前版本号不同,服务端将不处理请求。

action : 需要调用的服务,命名规则是以works目录为根目录: 子目录.文件名。以上面的请求"action":"guaik.welcome"为例,
将会调用guaik目录下模块名为welcome的处理函数。

content : 该字段为自定义字段,按照服务端的开发文档填写。

HTTP处理例程:(./works/guaik/welcome.py) def handler(data,ctx): ctx.write("Welcome to use GuaiKNet system")

处理例程函数定义统一写成:def handler(data,ctx): pass,否则无法被系统解析。

参数:data 对应着客户端请求content字段

参数:ctx http请求的上下文,通过该对象的write方法可以向客户端返回处理结果。

RPC调用说明: 需要安装RabbitMQ消息队列,一键安装脚本:

curl -s -o rabbitmq.py https://raw.githubusercontent.com/guaik/GuaikInstaller/master/rabbitmq.py && python rabbitmq.py install

RPC功能默认是关闭的,需要在./bootstrap.py文件中开启该功能:

server.active_rpc("rpc_host", 5672, "/", "username", "passwd")

找到该行,取消注释,填上消息队列的:(主机IP, 主机端口, 虚拟主机(vhost), 用户名, 密码)

RPC处理例程的默认目录为:./rpc

RPC处理例程调用规则:(以下是发送短信验证码的DEMO) from server.application import gm rpc = gm.get("rpc") rpc.call("sms.send_verify_code", "+8618888888888")

从全局对象管理器(gm)中取出rpc对象,使用rpc对象的call方法,第一个参数是rpc的方法名,之后所有的参数是rpc方法对应的参数列表。原型为:
def call(self,key,*args): ...

方法名的规则是:模块名.函数名

RPC方法定义规则:(以./rpc/sms.send_verify_code为例)

import logging import requests import json from server.application import gm rpc = gm.get("rpc") api_key = "your_api_key" api_secret = "your_secret" brand = "Guaik" @rpc.route() def send_verify_code(number): request_id = None try: data = {"api_key":api_key,"api_secret":api_secret,"number":number,"brand":brand} headers = {'Content-Type': 'application/json'} r = requests.post("https://api.nexmo.com/verify/json",headers = headers, data = json.dumps(data)) data = json.loads(r.text) if data["status"] == "0": request_id = data["request_id"] except Exception as e: logging.error(e) return request_id

先从全局对象管理器gm中取出rpc对象,然后在send_verify_code的上方加上@rpc.route()注解,这时候send_verify_code将被注册到RpcManager中,
成为RPC处理例程。

🧙其他说明: ./bootstrap.py:

LEVEL :当前服务器日志级别,作为Server的初始化参数传入。

CUR_VERSION :当前解析器的版本号,作为Analysis的参数传入,用于判断客户端发送的请求版本是否正确。

server.gen_http_process(8080,1,Analysis(CUR_VERSION)):
以上代码生成http服务进程,默认监听8080端口。1代表启动一个进程,如果该参数为4,则启动4进程依次监听8080,8081,8082,8083端口。
第三个参数传入解析器对象,该对象用于解析客户端请求并调用对应的处理例程,在该例程中存放着请求与处理例程的映射关系。也可以自定义解析器对象,
基类在./base/analysis.py中。

server.start(False):
这边的False表示不以守护进程运行,如果需要以守护进程运行,则修改成True即可,守护进程默认只在Linux系统中生效。

在./config目录下存放着可能会用到的配置文件,proxy.conf为Nginx反向代理的配置文件,可以修改它并将它放到/etc/nginx/conf.d下,
然后重启Nginx服务使其生效。可以通过监听多个服务端口,配合Nginx实现服务端的多进程处理。

upstream servers { server localhost:8001; server localhost:8002; server localhost:8003; server localhost:8004; } server { listen 8080; location / { proxy_pass http://servers; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_redirect off; # Socket.IO Support proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } PS:打了这么多字应该会有错别字,欢迎纠正:luting.gu@gmail.com

read more

🌋制造怪物的神秘区域

GuaiK Amazing
J

read more

☠️AI病毒来袭,开启怪物HIPS系统……完成

VSCode+CMake开发NT式驱动程序
G

@pipi vscode还是比较好用的,我现在都很少用IDE了,除了开发Qt程序会用QtCreator

read more

📢GuaiK战区,请时刻关注战报!

关于《GuaiK实验室》随时关闭备份的通知
G

为了确保《GuaiK实验室》的数据安全,以及国外主机的各种不稳定因素。本站会不定期的关闭并备份所有数据库及文件资料。

read more

资源共享,创造怪物,这是怪咖世界

BBS状态

0
Online

30
Users

91
Topics

114
Posts

活跃用户