【负载均衡式的在线oj(2.oj_server模块)】

news2024/11/17 6:52:00

🎉实战项目:负载均衡式在线OJ


  • 博主主页:桑榆非晚ᴷ

  • 博主能力有限,如果有出错的地方希望大家不吝赐教

  • 给自己打气:成功没有快车道,幸福没有高速路。所有的成功,都来自不倦地努力和奔跑,所有的幸福都来自平凡的奋斗和坚持🥰🎉✨


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存失败,源站可能有防盗链机制,建议将图片保存下来直接上传上传(imY8zj1iPfVm-1682861111511)(C:\Users\13916\Pictures\Saved Pictures\壁纸\微信图片_20221128141855.jpg)(C:\Users\13916\Pictures\Saved Pictures\壁纸\微信图片_20221128141855.jpg)]


负载均衡式在线OJ

  • 🎉实战项目:负载均衡式在线OJ
  • 二、`oj_server`模块
    • 2.1、`oj_server`子模块
      • 2.1.1 、`oj_server`子模块介绍
      • 2.1.2 、程序编写
      • 2.1.3 、`oj_server`子模块测试
    • 2.2、`oj_model`子模块
      • 2.2.1 `oj_model`子模块介绍
      • 2.2.2 程序编写
      • 2.2.3 `oj_model`子模块测试
    • 2.3、 `oj_view`子模块
      • 2.3.1、 `oj_view`子模块介绍
      • 2.3.2、 程序编写
      • 2.3.3、`oj_view`子模块测试
    • 2.4、 `oj_control`子模块
      • 2.4.1、 `oj_control`子模块介绍
      • 2.4.2、 程序编写
      • 2.4.3、`oj_contral`子模块测试

二、oj_server模块

2.1、oj_server子模块

2.1.1 、oj_server子模块介绍

主要完成对用户所请求资源的路由功能,分别为获取所有所有题目、获取单个指定题目和对指定题目运行结果的判题。

2.1.2 、程序编写

#include <iostream>
#include "../comm/httplib.h"
#include "oj_control.hpp"

using std::string;
using namespace httplib;
using namespace ns_control;

int main()
{
    // 用户请求服务器路由的功能
    Server svr;
    Control ctrl;

    svr.set_base_dir("./wwwroot");
   
    // 1.功能:获取所有的题目列表
    svr.Get("/all_questions", [&ctrl](const Request &req, Response &resp)
    { 
        // 用于测试Get /all_questions资源是否可以成功
        resp.set_content("这是所有题目的列表", "text/plain; charset=utf-8"); 
                
        // 返回一张包含所有题目的html网页
        // string html;
        // ctrl.AllQuestions(&html);
        // resp.set_content(html, "text/html; charset=utf-8"); 
    });
    
      
    // 2.功能:用户根据题目编号,获取题目的内容
    // (\d+)正则表达式:\d表示一个数字,+表式多个数字
    // R"()"保持字符串原貌
    svr.Get(R"(/question/(\d+))", [&ctrl](const Request &req, Response &resp)
    {
        string number = req.matches[1];
        
        // 用于测试Get /question/(\d+)资源是否可以成功 
        resp.set_content("这是指定的一道题:" + number, "text/plain; charset=utf-8"); 

        // 返回用户要获取指定题目的html网页
        // string html;
        // ctrl.OneQuestion(number, &html);
        // resp.set_content(html, "text/html; charset=utf-8");    
    });
    
    
    // 3.功能:用户提交代码,使用测试用例进行判题
    svr.Get(R"(/judge/(\d+))", [](const Request &req, Response &resp)
    {
        string number = req.matches[1];
        // 用于测试Get /judge/(\d+)资源是否可以成功
        resp.set_content("指定题目的判题:" + number, "text/plain; charset=utf-8"); 
    });

    svr.listen("0.0.0.0", 8080);
    return 0;
}

2.1.3 、oj_server子模块测试

测试用例为上面代码,由于相关功能还没有实现,所以简单模拟返回三个路由结果来测试路由功能是否正常。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
观察上面测试结果,满足我们预期想要的结果,所以目前路由功能是没有问题的。

2.2、oj_model子模块

2.2.1 oj_model子模块介绍

oj_model子模块主要用来服务器和浏览器进行数据交互,对外提供访问数据的接口。例如浏览器获取所有的oj题目链表和获取指定oj题目的具体内容。

2.2.2 程序编写

#pragma once
// 文件版本
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <fstream>
#include <cstdlib>
#include <cassert>
#include "../comm/util.hpp"
#include "../comm/log.hpp"

// 根据题目list文件,加载所有的题目信息到内存中
// model: 主要用来和数据进行交互,对外提供访问数据的接口

namespace ns_model
{
    using std::string;
    using std::vector;
    using std::unordered_map;
    using namespace ns_log;
    using namespace ns_util;

    const std::string questins_list = "./questions/questions.list";
    const std::string questins_path = "./questions/";

    struct Question
    {
        string number; // 题目编号,唯一
        string title;  // 题目的标题
        string star;   // 难度: 简单 中等 困难
        int cpu_limit; // 题目的时间要求(S)
        int mem_limit; // 题目的空间要去(KB)
        string desc;   // 题目的描述
        string header; // 题目预设给用户在线编辑器的代码
        string tail;   // 题目的测试用例,需要和header拼接,形成完整代码
    };

    class Model
    {
    public:
        Model()
        {
            assert(LoadQuestionList(questins_list));
        }
        
        // 加载配置文件: questions/questions.list + 题目编号文件
        // 形成题目编号和题目内容的映射关系保存到unordered_map当中
        bool LoadQuestionList(const string &question_list)
        {
            std::ifstream in(question_list);
            if (!in.is_open())
            {
                LOG(FATAL) << " 加载题库失败,请检查是否存在题库文件"
                           << "\n";
                return false;
            }

            string line;
            // 按行读取不保留\n
            while (std::getline(in, line))
            {
                vector<string> tokens;
                
                // 将获取的行数据 {1 判断回文数 简单 1 30000} 按照空格切割,
                // 切割产生的五个字符串切割产生的五个字符串存放在tokens当中
                StringUtil::SplitString(line, &tokens, " ");
                if (tokens.size() != 5)
                {
                    LOG(WARNING) << "加载部分题目失败, 请检查文件格式"
                                 << "\n";
                    continue;
                }

                Question question;
                question.number = tokens[0];
                question.title = tokens[1];
                question.star = tokens[2];
                question.cpu_limit = atoi(tokens[3].c_str());
                question.mem_limit = atoi(tokens[4].c_str());

                string path = questins_path;
                path += question.number;
                path += "/";
                // ./questions/ + question.number + desc.txt or header.cpp or tail.cpp
                FileUtil::ReadFile(path + "desc.txt", &(question.desc));
                FileUtil::ReadFile(path + "header.cpp", &(question.header));
                FileUtil::ReadFile(path + "tail.cpp", &(question.tail));

                // 形成题目编号和题目内容的映射关系保存到unordered_map当中
                _questions.insert({question.number, question});
            }

            LOG(INFO) << "加载题库...成功!" << "\n";
                      
            in.close();
            return true;
        }
        
        // 从编号到题目的映射表unordered_map中获取所有题目
        bool GetAllQuestions(vector<Question> *out)
        {
            if (_questions.size() == 0)
            {
                LOG(ERROR) << "用户获取题库失败"
                           << "\n";
                return false;
            }
            for (const auto &q : _questions)
            {
                out->push_back(q.second); // first: key, second: value
            }

            return true;
        }

        // 从编号到题目的映射表unordered_map中获取指定题目
        bool GetOneQuestion(const std::string &number, Question *q)
        {
            const auto &iter = _questions.find(number);
            if (iter == _questions.end())
            {
                LOG(ERROR) << "用户获取题目失败, 题目编号: " << number << "\n";
                return false;
            }
            (*q) = iter->second;
            return true;
        }
    private:
        // 题号 : 题目细节
        unordered_map<string, Question> _questions;
    };
}

2.2.3 oj_model子模块测试

在当前工作路径下,创建questions目录,在questions目录下创建questions.list文件,并录入一些题目:
一下文题目编号为1题目的相关内容:
在这里插入图片描述
接着在questions目录下以题目编号为目录名创建目录,并在目录下创建desc.txt、header.cpp和tail.cpp
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
以编号为1的题目为例:
当用户要获取1号题目时,服务器会把header.cpp文件中的内容发送给用户浏览器,用户在其中进行编写代码,最后把编写好的代码提交给服务器,服务器把提交上来的代码与tail.cpp拼接,把拼接好的代码负载均衡式的分配给后台负责编译运行的服务器进行处理。

测试代码:

#include "oj_model.hpp"
#include <vector>

using namespace ns_model;
using namespace std;

int main()
{
    Model model;
    vector<Question> all_questions;
    model.GetAllQuestions(&all_questions);
    if (all_questions.size() == 2)
    {
        cout << "*********************************" << endl;
        for (auto &question : all_questions)
        {
            cout << question.number << endl;
            cout << question.title << endl;
            cout << question.star << endl;
            cout << question.cpu_limit << endl;
            cout << question.mem_limit << endl;
            cout << question.mem_limit << endl;
            cout << question.desc << endl;
            cout << question.header << endl;
            cout << question.tail << endl;
        }
        cout << "*********************************" << endl;
    }
    else
    {
        cout << "GetAllQuestion error" << endl;
    }

    Question question;
    if (model.GetOneQuestion("1", &question))
    {
        cout << "*********************************" << endl;
        cout << question.number << endl;
        cout << question.title << endl;
        cout << question.star << endl;
        cout << question.cpu_limit << endl;
        cout << question.mem_limit << endl;
        cout << question.mem_limit << endl;
        cout << question.desc << endl;
        cout << question.header << endl;
        cout << question.tail << endl;
        cout << "*********************************" << endl;
    }
    else
    {
        cout << "GetOneQuestion error" << endl;
    }
    return 0;
}

测试结果:

[lk@VM-8-15-centos oj_server]$ g++ test.cc -std=c++11 
[lk@VM-8-15-centos oj_server]$ ./a.out 
[INFO][oj_model.hpp][94][1682948237]加载题库...成功!
*********************************
2
求最大值
简单
1
30000
30000
求最大值,比如:vector v ={1,2,3,4,5,6,12,3,4,-1};
求最大值, 比如:输出 12
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class Solution
{
public:
    int Max(const vector<int> &v)
    {
        //将你的代码写在下面

        return 0;
    }
};
#ifndef COMPILER_ONLINE
#include "header.cpp"
#endif

void Test1()
{
    vector<int> v = {1, 2, 3, 4, 5, 6};
    int max = Solution().Max(v);
    if (max == 6)
    {
        std::cout << "Test 1 .... OK" << std::endl;
    }
    else
    {
        std::cout << "Test 1 .... Failed" << std::endl;
    }
}

void Test2()
{
    vector<int> v = {-1, -2, -3, -4, -5, -6};
    int max = Solution().Max(v);
    if (max == -1)
    {
        std::cout << "Test 2 .... OK" << std::endl;
    }
    else
    {
        std::cout << "Test 2 .... Failed" << std::endl;
    }
}

int main()
{
    Test1();
    Test2();

    return 0;
}
1
判断回文数
简单
1
30000
30000
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:

输入: 121
输出: true
示例 2:

输入: -121
输出: false
解释: 从左向右读,-121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:

输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:

你能不将整数转为字符串来解决这个问题吗?

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

class Solution{
    public:
        bool isPalindrome(int x)
        {
            //将你的代码写在下面
            
            return true;
        }
};
#ifndef COMPILER_ONLINE
#include "header.cpp"
#endif


void Test1()
{
    // 通过定义临时对象,来完成方法的调用
    bool ret = Solution().isPalindrome(121);
    if(ret){
        std::cout << "通过用例1, 测试121通过 ... OK!" << std::endl;
    }
    else{
        std::cout << "没有通过用例1, 测试的值是: 121"  << std::endl;
    }
}

void Test2()
{
    // 通过定义临时对象,来完成方法的调用
    bool ret = Solution().isPalindrome(-10);
    if(!ret){
        std::cout << "通过用例2, 测试-10通过 ... OK!" << std::endl;
    }
    else{
        std::cout << "没有通过用例2, 测试的值是: -10"  << std::endl;
    }
}

int main()
{
    Test1();
    Test2();

    return 0;
}
*********************************
*********************************
1
判断回文数
简单
1
30000
30000
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:

输入: 121
输出: true
示例 2:

输入: -121
输出: false
解释: 从左向右读,-121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:

输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:

你能不将整数转为字符串来解决这个问题吗?

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

class Solution{
    public:
        bool isPalindrome(int x)
        {
            //将你的代码写在下面
            
            return true;
        }
};
#ifndef COMPILER_ONLINE
#include "header.cpp"
#endif


void Test1()
{
    // 通过定义临时对象,来完成方法的调用
    bool ret = Solution().isPalindrome(121);
    if(ret){
        std::cout << "通过用例1, 测试121通过 ... OK!" << std::endl;
    }
    else{
        std::cout << "没有通过用例1, 测试的值是: 121"  << std::endl;
    }
}

void Test2()
{
    // 通过定义临时对象,来完成方法的调用
    bool ret = Solution().isPalindrome(-10);
    if(!ret){
        std::cout << "通过用例2, 测试-10通过 ... OK!" << std::endl;
    }
    else{
        std::cout << "没有通过用例2, 测试的值是: -10"  << std::endl;
    }
}

int main()
{
    Test1();
    Test2();

    return 0;
}
*********************************

阅读测试结果,与预期想得到的结果一致,所以目前model子模块没有问题。

2.3、 oj_view子模块

2.3.1、 oj_view子模块介绍

oj_view子模块的功能是对数据进行渲染形成html文件。

2.3.2、 程序编写

#pragma once

#include <iostream>
#include <string>
#include <ctemplate/template.h>

#include "oj_model.hpp"
// #include "oj_model2.hpp"

namespace ns_view
{
    using namespace ns_model;

    const std::string template_path = "./template_html/";

    class View
    {
    public:
        void AllExpandHtml(const vector<Question> &questions, std::string *html)
        {
            // 题目的编号 题目的标题 题目的难度
            // 推荐使用表格显示
            // 1. 形成路径
            std::string src_html = template_path + "all_questions.html";
            // 2. 形成数字典
            ctemplate::TemplateDictionary root("all_questions");
            for (const auto &q : questions)
            {
                ctemplate::TemplateDictionary *sub = root.AddSectionDictionary("question_list");
                sub->SetValue("number", q.number);
                sub->SetValue("title", q.title);
                sub->SetValue("star", q.star);
            }

            // 3. 获取被渲染的html
            ctemplate::Template *tpl = ctemplate::Template::GetTemplate(src_html, ctemplate::DO_NOT_STRIP);

            // 4. 开始完成渲染功能
            tpl->Expand(html, &root);
        }


        void OneExpandHtml(const struct Question &q, std::string *html)
        {
            // 1. 形成路径
            std::string src_html = template_path + "one_question.html";

            // 2. 形成数字典
            ctemplate::TemplateDictionary root("one_question");
            root.SetValue("number", q.number);
            root.SetValue("title", q.title);
            root.SetValue("star", q.star);
            root.SetValue("desc", q.desc);
            root.SetValue("header", q.header);

            // 3. 获取被渲染的html
            // ctemplate::DO_NOT_STRIP 保持代码原样
            ctemplate::Template *tpl = ctemplate::Template::GetTemplate(src_html, ctemplate::DO_NOT_STRIP);

            // 4. 开始完成渲染功能
            tpl->Expand(html, &root);
        }
    };
}

2.3.3、oj_view子模块测试

这里先不做测试,稍后与oj_control联合测试。

2.4、 oj_control子模块

2.4.1、 oj_control子模块介绍

2.4.2、 程序编写

#pragma once
#include <iostream>
#include <string>
#include <vector>
#include "oj_model.hpp"
#include "oj_view.hpp"
#include "../comm/log.hpp"
#include "../comm/util.hpp"

namespace ns_control
{
    using std::cout;
    using std::string;
    using std::vector;
    using namespace ns_log;
    using namespace ns_util;
    using namespace ns_model;
    using namespace ns_view;

    class Control
    {
    public:
        bool AllQuestions(string *html)
        {
            vector<Question> all_questions;
            if (_model.GetAllQuestions(&all_questions))
            {
                LOG(INFO) << "获取所有题目成功" << "\n";
                // 构建网页返回
                _view.AllExpandHtml(all_questions, html);
                return true;
            }
            else
            {
                LOG(ERROE) << "获取所有题目失败" << "\n";
                *html = "获取题目失败, 形成题目列表失败";
                return false;
            }
        }

        bool OneQuestion(const string &number, string *html)
        {
            Question question;
            if (_model.GetOneQuestion(number, &question))
            {
                LOG(INFO) << "获取单个题目成功" << "\n";
                // 构建网页返回
                _view.OneExpandHtml(question, html);
                return true;
            }
            else
            {
                LOG(ERROE) << "获取单个题目失败" << "\n";
                *html = "指定题目: " + number + " 不存在!";
                return false;
            }
        }

    private:
        Model _model;
        View _view;
    };
}

2.4.3、oj_contral子模块测试

这里对oj_contral子模块测试采用前后端测试,即oj_server子模块联动测试

#include <iostream>
#include "../comm/httplib.h"
#include "oj_control.hpp"

using std::string;
using namespace httplib;
using namespace ns_control;

int main()
{
    // 用户请求服务器路由的功能
    Server svr;
    Control ctrl;

    svr.set_base_dir("./wwwroot");
   
    // 1.功能:获取所有的题目列表
    svr.Get("/all_questions", [&ctrl](const Request &req, Response &resp)
    {         
        // 返回一张包含所有题目的html网页
        string html;
        ctrl.AllQuestions(&html);
        resp.set_content(html, "text/html; charset=utf-8"); 
    });
    
      
    // 2.功能:用户根据题目编号,获取题目的内容
    // (\d+)正则表达式:\d表示一个数字,+表式多个数字
    // R"()"保持字符串原貌
    svr.Get(R"(/question/(\d+))", [&ctrl](const Request &req, Response &resp)
    {
        string number = req.matches[1];        
        // 返回用户要获取指定题目的html网页
        string html;
        ctrl.OneQuestion(number, &html);
        resp.set_content(html, "text/html; charset=utf-8");    
    });
    
    
    // 3.功能:用户提交代码,使用测试用例进行判题
    svr.Get(R"(/judge/(\d+))", [](const Request &req, Response &resp)
    {
        string number = req.matches[1];
        // 用于测试Get /judge/(\d+)资源是否可以成功
        resp.set_content("指定题目的判题:" + number, "text/plain; charset=utf-8"); 
    });

    svr.listen("0.0.0.0", 8080);
    return 0;
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在第二幅图中我们发现题目没有按照升序进行排列,其他结果都是预期的,所以我们只需要解决这个bug就好。我们只需要在获取到所有题目后对题目进行排序就好。

在这里插入图片描述
在这里插入图片描述
经过这样的测试,我们可以确定写到目前为止,项目还没有出现问题,接下来就是对oj_view子模块的完善了,优化一下前端页面。前端页面的优化就不进行讲解了,这个项目的主要任务是后端的内容。
最终前端显示的内容:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/504579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rtl仿真器-verilator安装和测试

安装 查看官网安装说明页 https://verilator.org/guide/latest/install.html 1.ubuntu 源已经加好了&#xff0c;直接用命令安装 2. 编译源码安装&#xff1a; sudo apt-get install git perl python3 make autoconf g flex bison ccache sudo apt-get install libgoogle-perf…

FPN和PAN的内容及区别

FPN和PAN都是用于解决在目标检测中特征金字塔网络(FPN)在多尺度检测任务上的不足的方法。下面分别详细介绍一下它们的原理和区别。 FPN FPN全称Feature Pyramid Network&#xff0c;是由FAIR在2017年提出的一种处理多尺度问题的方法。FPN的主要思路是通过构建金字塔式的特征图…

Hadoop入门篇02---HDFS学习与简单使用

Hadoop入门篇02---HDFS学习与简单使用 存储系统概念认识硬盘,RAID小结 存储架构DAS&#xff0c;NAS&#xff0c;SAN对比 文件系统 大数据存储大数据存储面临的问题如何解决小结 HDFSHDFS的起源和发展HDFS的设计目标HDFS的应用场景HDFS的特性命令行实践常用命令 Java客户端API使…

双向带头循环链表

双向带头循环链表 1.前言2.带头双向循环链表的初始化3.创建一个哨兵位头节点4.链表的打印5.malloc函数创建节点5.链表的尾插6.链表的尾删7.链表的头插8.链表的头删9.链表的查找10.链表任意位置插入&#xff08;在给点定位置的前面插入&#xff09;11.链表任意位置删除12.空间释…

IPWorks Bluetooth ! IPWorks BLE 2022 C++ Edition Crack

蓝牙库-IPWorks Bluetooth ! IPWorks BLE 2022 C Edition 一个蓝牙低功耗组件库&#xff0c;提供对 BLE 操作的直接访问。IPWorks BLE 组件提供简单的服务发现和对支持 BLE 的设备的访问。 最新的 IPWorks BLE 现已推出&#xff01;最新版本的 IPWorks BLE 具有现代化和简化的…

【MySQL】MySQL 知识点总结

文章目录 前言关系型数据库和非关系型数据库关系型数据库非关系型数据库关系型数据库与非关系型数据库之间的区别 MySQL整体架构SQL 的执行步骤MySQL 的架构图示连接器分析优化和执行查询缓存分析器优化器&执行器 存储引擎MyISAM和InnoDB的区别 事务事务的四大特性隔离级别…

【电动车】基于双层凸优化的燃料电池混合动力汽车研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

聚观早报 | 巴菲特后悔减持苹果;羊了个羊侵害用户权利被通报;

今日要闻&#xff1a;巴菲特两年前减持苹果是个愚蠢的决定&#xff1b;羊了个羊侵害用户权利被通报&#xff1b;英特尔预计二季度营收同比下滑&#xff1b;陆奇最称中国要先赶上GPT-3.5&#xff1b;任天堂对GitHub展开大规模DMCA行动 巴菲特两年前减持苹果是个愚蠢的决定 在伯…

【Linux】Redis数据库、实例项目搭建redis服务器环境下mysql实现la/nmp架构缓存

一、Redis简介 Redis 是当前互联网世界最为流行的 NoSQL&#xff08;Not Only SQL&#xff09;数据库。NoSQL 在互联网系统中的作用很大&#xff0c;因为 它可以在很大程度上提高互联网系统的性能。 Redis 具备一定持久层的功能&#xff0c;也可以作为一种缓存工具。对于 NoSQL…

【论文复现】基于区块链的分布式光伏就地消纳交易模式研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

盖雅案例入选「首届人力资源服务国际贸易交流合作大会20项创新经验」

近日&#xff0c;首届人力资源服务国际贸易交流合作大会顺利召开。为激励企业在人力资源服务贸易领域不断创新&#xff0c;加快培育对外贸易新业态、新模式&#xff0c;形成人力资源服务领域国际竞争新优势&#xff0c;大会评选出了「首届人力资源服务国际贸易交流合作大会20项…

第2天学习——Docker安装

一、前言 Docker 是一个用于开发、传送和运行应用程序的开放平台。Docker 使您能够将应用程序与基础设施分开&#xff0c;以便您可以快速交付软件。使用 Docker&#xff0c;您可以像管理应用程序一样管理基础设施。通过利用 Docker 的快速交付、测试和部署代码的方法&#xff0…

sqli-labs通关(十四)(十五)(十六)

第十四关 输入1",出现如下报错信息&#xff0c;告诉我们要双引号闭合 所以我们输入 1" or 11# 没有任何返回信息&#xff0c;这一关和十三关一样&#xff0c;利用报错信息爆出数据 1" and extractvalue(1,concat(0x7e,(select database())))# 第十五关 输入1是这…

【软件测试】第二章 黑盒测试

系列文章目录 文章目录 系列文章目录前言第二章 黑盒测试2.1 等价类划分2.2 边界值分析2.3 因果图法2.4 判定表驱动2.5 正交试验法2.6 其他黑盒测试方法2.7 功能性测试总结 总结 前言 第二章 黑盒测试 黑盒测试&#xff1a;功能测试或数据驱动测试测试对象&#xff1a;需求规格…

发布会实录|悠易科技CTO李旸:洞察新引擎 品牌新增长

4月26日&#xff0c;悠易科技LinkFlow对其核心的 “洞察”产品能力进行了升级。作为开场嘉宾&#xff0c;悠易科技CTO李旸做了题为《洞察新引擎 品牌新增长》的精彩分享&#xff0c;为我们阐释了本次发布升级的背景和出发点&#xff0c;帮助我们更好地理解LinkFlow CDP如何借助…

【postgresql】一些函数记录

1、coalesce函数&#xff1a;合并&#xff0c;coalesce(值1&#xff0c;值2&#xff0c;值3……)&#xff0c;返回第一个不为null的值&#xff1b; 2、coalesce和ifnull的区别&#xff0c;ifnull只有两个参数&#xff0c;返回第一个不为null的参数 3、if和casewhen的区别&…

信息安全评估

安全评估基础 概念、作用、安全评估标准 安全评估基本概念 什么是安全评估 针对潜在影响资产正常执行其职能的行为产生干扰或者破坏的因素进行识别、评价的过程 对安全评估的理解 狭义指对一个具有特定功能的工作系统中固有的或潜在的危险及其严重程度所进行的分析与评估&a…

通用路由封装协议GRE

通用路由封装协议原理 通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX、ATM、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IPv4)中传输。 GRE提供了将一种协议的报文封装在另一种协议报文中…

国产AI大模型酣战,科大讯飞打响“智慧涌现”第一枪

配图来自Canva可画 ChatGPT问世半年之久&#xff0c;人与AI“你问我答”的游戏热度不降反升&#xff0c;AI大模型技术需求也随之水涨船高&#xff0c;成为科技企业重点关注的方向。 在海外&#xff0c;OpenAI、谷歌、微软的AI大模型战争正打得火热&#xff1b;在国内&#xf…

PowerShell系列(二):PowerShell和Python之间的差异介绍

目录 1、Python定义 2、Python用途 4、PowerShell用途 5、PowerShell和Python对比 5.1 共同点 5.2 不同点 6、总结 今天给大家聊聊PowerShell和Python之间有哪些共同之处&#xff0c;各自有哪些优势&#xff0c;希望对运维的朋友了解两种语言能提供一些有用的信息。 1、Python定…