在线代码测试小项目

2023-10-27

[小项目]代码在线测试

http是我们生活中最常使用的协议,现如今网络浏览器越来越贴近人们的生活,使得做什么事都很方便,但是想要运行一段代码还得需要在电脑指定的环境下来运行,这在有些情况下让人很抓狂,我在网上也看到过很多代码在线测试的网页,感觉还不错,但是还是不知道这背后具体是怎麽实现的,有幸在网上看到过tinyhttp的源码,便想着自己参照着实现一个小型的http服务器来做一个代码测试服务器。

在做服务器之前先要了解http的相关知识,http是一个大量使用的应用层协议,本身的格式分为首行,请求头,空行和正文。

  • 首行中又可以具体分为请求方法,请求uri,http协议及版本号。请求方法多种多样,但是最常用的还是GET和POST,这两种请求方法都是对服务器进行资源请求,并且都可以给服务器传递参数,不过GET方法是直接在URL之后直接追加参数,POST是将参数写在正文之中,相比之下,POST方法更为安全。请求uri主要是标识了具体想请求的资源,常见的就是一个服务器的主页/index,协议及版本号具体标识了所使用http的版本。
  • 请求头则是一个又一个的键值对,用来说明本次http请求的必要信息,比如请求格式,字符编码,用户信息,标识正文大小的Content-Length等,每一个键值对以\r\n结尾
  • 空行没有任何信息,只是用来分割请求头与正文的一个标识,也是一个\r\n
  • 正文是本次http请求的具体内容,可以存放POST所要提交的数据以及其他内容

既然是服务器,就需要对客户端做出响应,http的响应报文也是有四个部分,状态行,消息头,空行,响应正文。具体内容与请求报文区别不大,这里不再多说

在知道了http结构之后,我们就需要分析如何对http请求做出响应,从浏览器得到的信息是整个http报文,需要从其中提取有效信息构造响应报文,我们的目的是让服务器对所提交的代码在后台运行并返回结果,一个进程肯定满足不了我们的需求,所以http服务器可以使用多进程或者多线程,既然服务器要将代码的结果返回必须要在服务器中运行,这就需要使用CGI技术

  • CGI(Common Gateway Interface)是www最终要的技术之一,是CGI程序和服务器之间传递信息的过程,浏览器可以从服务器上下载资源,并且也可以向服务器提交资源(比如代码),这样http服务器与浏览器之间可以通过CGI来进行交互,GET方式如果没有传入参数就可以按照一般的方式进行返回资源,但是如果有参数传入,http就需要按照CGI方式处理参数,并将执行结果返回给浏览器,POST方法一般都需要使用CGI来处理。

常规模式http响应流程
在这里插入图片描述
CGI模式http响应流程:
在这里插入图片描述
清楚了大概流程也就可以动手写代码了

///
void usage(const char* );
int startup(int );
int getLine(int, char*, int);
void clearHeaer(int );
void show_400(int );
void show_404(int );
void show_500(int );
void echoErrMsg(int , int );
int exec_cgi(int , char*, char*, char* );
int echo_www(int , char*, int );
int handlerRequest(int );
///

void usage(const char *proc)
{
	printf("Usage %s [port]\n", proc);
}

int startup(int port)
{
	int sock = socket(AF_INET, SOCK_STREAM, 0);
	if(sock < 0){
		perror("socket");
		exit(2);
	}

	int opt = 1;
	setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

	struct sockaddr_in local;
	local.sin_family = AF_INET;
	local.sin_port = htons(port);
	local.sin_addr.s_addr = htonl(INADDR_ANY);

	if(bind(sock, (struct sockaddr*)&local, sizeof(local)) < 0){
		perror("bind");
		exit(3);
	}

	if(listen(sock, 5) < 0){
		perror("listen");
		exit(4);
	}

	return sock;
}

int getLine(int sock, char line[], int len)
{
	char c = '\0';
	int i = 0;
	while(c != '\n' && i < len-1){
		recv(sock, &c, 1, 0);
		if(c == '\r'){
			recv(sock, &c, 1, MSG_PEEK); //窥探功能
			if(c == '\n'){
				recv(sock, &c, 1, 0); //覆盖 \r 为 \n
			}else{
				c = '\n';
			}
		}
		//\r\n \r->\n
		line[i++] = c;
	}
	line[i] = '\0';

	return i;
}

void clearHeaer(int sock) //清理头部
{
	char line[MAX];
	do{
		getLine(sock, line, sizeof(line));
	}while(strcmp("\n", line));
}

void show_400(int sock) 
{
	char line[MAX];
	struct stat st;
	sprintf(line, "HTTP/1.0 400 Bad Request\r\n");
	send(sock, line, strlen(line), 0);
	sprintf(line, "Content-Type: text/html;charset=utf-8\r\n");
	send(sock, line, strlen(line), 0);
	sprintf(line, "\r\n");
	send(sock, line, strlen(line), 0);

	int fd = open(PAGE_400, O_RDONLY);

	stat(PAGE_400, &st);
	sendfile(sock, fd, NULL, st.st_size);
	close(fd);
}

void show_404(int sock)
{
	char line[MAX];
	struct stat st;
	sprintf(line, "HTTP/1.0 404 Not Found\r\n");
	send(sock, line, strlen(line), 0);
	sprintf(line, "Content-Type: text/html;charset=uft-8\r\n");
	send(sock, line, strlen(line), 0);
	sprintf(line, "\r\n");
	send(sock, line, strlen(line), 0);

	int fd = open(PAGE_404, O_RDONLY);

	stat(PAGE_404, &st);
	sendfile(sock, fd, NULL, st.st_size);
	close(fd);
}

void show_500(int sock) 
{
	char line[MAX];
	struct stat st;
	sprintf(line, "HTTP/1.0 500 Internal Server Error\r\n");
	send(sock, line, strlen(line), 0);
	sprintf(line, "Content-Type: text/html;charset=utf-8\r\n");
	send(sock, line, strlen(line), 0);
	sprintf(line, "\r\n");
	send(sock, line, strlen(line), 0);

	int fd = open(PAGE_500, O_RDONLY);

	stat(PAGE_500, &st);
	sendfile(sock, fd, NULL, st.st_size);
	close(fd);
}

void echoErrMsg(int sock, int status_code)
{
	switch(status_code){
		case 400:
			show_400(sock);
			break;
		case 404:
			show_404(sock);
			break;
		case 500:
			show_500(sock);
			break;
		default:
			break;
	}
}

int exec_cgi(int sock, char *method, char *path, char *query_string)
{
	char line[MAX];
	int content_length = -1;
	char method_env[MAX/32];
	char query_string_env[MAX];
	char content_length_env[MAX/8];

	if(strcasecmp(method, "GET") == 0){
		clearHeaer(sock); //清理头部
	}
	else{ //POST
		do{
			getLine(sock, line, sizeof(line));
			//Content-Length: xxx
			if(strncasecmp(line, "Content-Length: ", 16) == 0){
				content_length = atoi(line + 16);
			}
		}while(strcmp("\n", line));
		if(content_length == -1){
			return 400;
		}
	}

	int input[2];
	int output[2];

	//管道站在子进程角度
	pipe(input);
	pipe(output);

	pid_t id = fork();
	if(id < 0){
		LOG(ERROR, "fork error");
		return 500;
	}
	else if(id == 0){
		close(input[1]);
		close(output[0]);

		dup2(input[0], 0);
		dup2(output[1], 1);
		dup2(output[1], 2);

		sprintf(method_env, "METHOD=%s", method);
		putenv(method_env);
		if(strcasecmp(method, "GET") == 0){
			sprintf(query_string_env, "QUERY_STRING=%s", query_string);
			putenv(query_string_env);
		}
		else{
			sprintf(content_length_env, "CONTENT_LENGTH=%d", content_length);
			putenv(content_length_env);
		}

		execl(path, path, NULL);
		exit(1);
	}
	else{
		close(input[0]);
		close(output[1]);

		sprintf(line, "HTTP/1.0 200 OK\r\n");
		send(sock, line, strlen(line), 0);
		sprintf(line, "Content-type: text/html;charset=utf-8\r\n");
		send(sock, line, strlen(line), 0);
		sprintf(line, "\r\n");
		send(sock, line, strlen(line), 0);

		int i = 0;
		char c;
		if(strcasecmp(method, "POST") == 0){
			for(; i < content_length; i++){
				recv(sock, &c, 1, 0);
				write(input[1], &c, 1);
			}
		}

		while(read(output[0], &c, 1) > 0){
			send(sock, &c, 1, 0);
		}

		waitpid(id, NULL, 0);
		close(input[1]);
		close(output[0]);
	}

	return 200;
}

int echo_www(int sock, char *path, int size)
{
	char line[MAX];
	clearHeaer(sock);

	int fd = open(path, O_RDONLY);
	if(fd < 0){
		return 404;
	}

	sprintf(line, "HTTP/1.0 200 OK\r\n");
	send(sock, line, strlen(line), 0);
	
	if(strcasecmp("html", path+strlen(path)-4) == 0){
	    sprintf(line, "Content-type: text/html;charset=utf-8\r\n");
    } else if (strcasecmp("js", path+strlen(path)-2) == 0){
	    sprintf(line, "Content-type: application/x-javascript;charset=utf-8\r\n");
	} else if (strcasecmp("css", path+strlen(path)-3) == 0){
	    sprintf(line, "Content-type: text/css;charset=utf-8\r\n");
	}
	send(sock, line, strlen(line), 0);
	
	sprintf(line, "\r\n");
	send(sock, line, strlen(line), 0);

	//发送正文,文件内容  sendfile, 拷贝两个文件描述符的内容
	sendfile(sock, fd, NULL, size);

	close(fd);

	return 200;
}

int handlerRequest(int sock) //请求行
{
	int status_code = 200;
	char line[MAX];
	char method[MAX/16] = {0};
	char url[MAX] = {0};
	char path[MAX];
	int cgi = 0;
	char *query_string = NULL;

	getLine(sock, line, sizeof(line));
	//printf("%s", line);

	LOG(INFO, "Start parsing the first line");

	size_t i = 0;
	size_t j = 0;
	while(i < sizeof(method)-1 && j < sizeof(line) && \
          !isspace(line[j])){
		method[i] = line[j];
        i++, j++;
	}
	method[i] = '\0';

	while(j < sizeof(line) && isspace(line[j])){
		j++;
	}

	i = 0;
	while(i < sizeof(url)-1 && j < sizeof(line) && !isspace(line[j])){
		url[i] = line[j];
        i++, j++;
	}
	url[i] = '\0'; 
	//printf("method: %s, url: %s\n", method, url);
	LOG(INFO, "frst line parse done");

	//忽略大小写比较
	//有传参,模式改为cgi
	//get 有传参,是通过url传参
	//post 传参是将参数填充至报文的正文部分, 传敏感数据时使用
	if(strcasecmp(method, "GET") == 0){
	}
	else if(strcasecmp(method, "POST") == 0){
		cgi = 1;
	}
	else{ //method error
		status_code = 400;
		clearHeaer(sock); //清理头部
		LOG(WARNING, "method error");
		goto end;
	}
	LOG(INFO, "method parse done");

	if(strcasecmp(method, "GET") == 0){
		query_string = url;
		while(*query_string){
			if(*query_string == '?'){
				cgi = 1; //传参设置
				*query_string = '\0';
				query_string++;
				break;
			}
			query_string++;
		}
	}

	//   [wwwroot]/a/b/c\0x=100&y=200
	sprintf(path, "wwwroot%s", url); //格式化输出到path
	if(path[strlen(path)-1] == '/'){
		strcat(path, HOME_PAGE); //给出默认首页
	}

	struct stat st;
	//判断访问资源是否存在, 函数stat
	if(stat(path, &st) < 0){
		status_code = 404;
		clearHeaer(sock);
		LOG(WARNING, "path not found");
		goto end;
	}
	else{
		//   [wwwroot]/a/b/c \0 x=100&y=200
		if(S_ISDIR(st.st_mode)){
			strcat(path, "/");
			strcat(path, HOME_PAGE);
		}else if((st.st_mode&S_IXUSR) || (st.st_mode&S_IXGRP) || (st.st_mode&S_IXOTH)){
			cgi = 1;
		}

		//method, path, cgi, get->query_string
		LOG(INFO, "starting responce");
		if(cgi == 1){
			status_code = exec_cgi(sock, method, path, query_string);
		}else{
			status_code = echo_www(sock, path, st.st_size); //响应资源, 此处是get方法
		}
	}
	

end:
	//status_code 204:请求资源存在,但是为空(成功)
	//			  206:局部请求
	//			  301:永久性重定向
	//			  302:临时性重定向
	//			  400:请求报文中存在语法错误
	//			  403:请求资源被服务器拒绝
	//			  404:请求资源不存在(error)
	//			  500:服务器执行发生错误
	//			  503:服务器处于超负载或停机维护状态
	if(status_code != 200){
		echoErrMsg(sock, status_code);
	}
	LOG(INFO, "close sock");
	close(sock);
	return status_code;
}

int main(int argc, char *argv[])
{
	if(argc != 2){
		usage(argv[0]);
		return 1;
	}

	signal(SIGPIPE, SIG_IGN);

	LOG(INFO, "Start server");
	int listen_sock = startup(atoi(argv[1]));


	for( ; ; ){
		struct sockaddr_in client;
		socklen_t len = sizeof(client);
		int sock = accept(listen_sock, (struct sockaddr*)&client, &len);
		if(sock < 0){
			perror("accept");
			continue;
		}

		LOG(INFO, "get a new link, handlerRequest...");

		Task t_;
		threadPoll *tp_ = new threadPoll();
		tp_->initPthread();
		t_.setTask(sock, handlerRequest);
		tp_->pushTask(t_);
	}
}

项目地址:https://github.com/Gzmy/project/tree/master/codeOnline

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在线代码测试小项目 的相关文章

  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • 为什么 Linux 原始套接字的 RX 环大小限制为 4GB?

    背景 我试图mmap 我的原始套接字的 RX 环形缓冲区64 bitLinux 应用程序 我的环由 4096 个块组成 每个块大小为 1MB 总共 4GB 请注意 每个 1MB 块中可以有许多帧 如果您好奇 请参阅此文档了解背景信息 htt
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 如何使用 Cloud Init 挂载未格式化的 EBS 卷

    Context 我正在使用https wiki jenkins io display JENKINS Amazon EC2 Plugin https wiki jenkins io display JENKINS Amazon EC2 Pl
  • tcpdump 是否受 iptables 过滤影响?

    如果我的开发机器有iptables规则到FORWARD一些数据包 这些数据包是否被 tcpdump 捕获 我有这个问题 因为我知道存在其他链称为INPUT如果数据包路由到 它会过滤发往应用程序的数据包FORWARD链 它会到达吗tcpdum
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • linux-x64 二进制文件无法在 linuxmusl-x64 平台上使用错误

    我正在安装Sharp用于使用 package json 的 Nodejs 项目的 docker 映像上的映像压缩包 当我创建容器时 我收到有关 Sharp 包的以下错误 app node modules sharp lib libvips
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

    我无法使用以下汇编代码产生 总线错误 这里我使用的内存地址不是合法的 规范地址 那么 我怎样才能触发该错误呢 我在带有 NASM 2 14 02 的 Ubuntu 20 04 LTS 下运行这段代码 但它会导致负载出现 SIGSEGV 分段
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • 从 Xlib 转换为 xcb

    我目前正在将我的一个应用程序从 Xlib 移植到 libxcb 但在查找有关我有时使用的 XInput2 扩展的信息时遇到了一些麻烦 libxcb 中有 XInput2 实现吗 如果是的话 在哪里可以找到文档 目前我在使用此功能时遇到问题
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • Linux 为一组进程保留一个处理器(动态)

    有没有办法将处理器排除在正常调度之外 也就是说 使用sched setaffinity我可以指示线程应该在哪个处理器上运行 但我正在寻找相反的情况 也就是说 我想从正常调度中排除给定的处理器 以便只有已明确调度的进程才能在那里运行 我还知道
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设

随机推荐

  • Kubernetes中如何保持Session的会话?

    0x01 Kubernetes中Session的会话保持 背景说明 基于kubernetes集群中部署Java项目 您发现在多pod模式下会出现登录成功但是页面无法跳转的问题 或验证明明输入正确却提示验证码错误无法登陆 而在单一pod时却可
  • mysql之sql优化知识点干货分享7827字数

    文章目录 前言 1 mysql结构简介 2 SQL解析过程 3 SQL索引 4 explain详解 5 小试牛刀 6 定位慢查询SQL 前言 java学友们 咱们不能一直在做增删改查的功能呀 做技术的实质要技术过硬 现在哪次跳槽不问你做过s
  • 【Protocol-WebSocket】WebSocket基本概念

    目录 1 概念图 2 定义 3 握手协议 4 优点 5 用途 1 概念图 WebSocket概念图 其中客户端Client 此处是浏览器 服务端Server 此处是给客户端提供资源数据的电脑 2 定义 WebSocket是一种在单个TCP连
  • 伺服控制的三环控制原理及整定仿真和Simulink模型

    伺服控制的三环控制原理及整定仿真和Simulink模型 我们平时使用的工业伺服 通常是成套伺服 即驱动器和电机型号存在配对关系 但有些时候 我们要用电机定转子和编码器制作非成套电机 例如机床上使用的直驱转台 永磁同步电机直接驱动的主轴 这种
  • 理解脸书为何从互联网消失了

    原文 https blog cloudflare com october 2021 facebook outage 译 时序 FaceBook不会宕机 不是吗 我们想了几分钟这个问题 今天2021 10 4 16 51 UTC 我们建了一条
  • mysql:使用已有的记录更新另一条数据

    create table test id integer primary key name varchar 100 例如现在在test表中有N条数据 其中有两条为 12 hello 13 world 如果想把上一条中的数据改成和下一条记录一
  • sql中having,group,select,where,order by,join的执行顺序

    在SQL中执行的顺序 1 先连接from后的数据源 若有join 则先执行on后条件 再连接数据源 2 执行where条件 3 执行group by 4 执行having 5 执行order by 6 输出结果 顺序 FROM ON JOI
  • C++ 指针

    每个变量都有一个内存位置 每一个内存位置都定义了可使用连字号 运算符访问的地址 它表示了在内存中的一个地址 例如输出定义变量的地址 include
  • 【分享之路001】springboot整合双redis配置

    springboot双redis配置 1 背景 springboot项目中本来用到了redis 由于业务要求 需要将数据也写到另一个redis中 2 配置文件改动 2 1 之前redis配置 spring redis database xx
  • 【计算机网络篇】TCP协议

    作者简介 大家好 我是小杨 个人主页 小杨 的csdn博客 希望大家多多支持 一起进步呀 TCP协议 1 TCP 简介 TCP Transmission Control Protocol 是一种在计算机网络中广泛使用的传输层协议 用于在网络
  • [机器学习与scikit-learn-29]:算法-回归-普通线性回归LinearRegression拟合线性分布数据的代码示例

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 第1章 LinearRegression类说明 第2章 LinearRegression使用的代码示例 2 1 导入库 2 2 导数数
  • SSM框架的流程及优点

    SSM框架 SSM Spring SpringMVC MyBatis 框架集由Spring MyBatis两个开源框架整合而成 SpringMVC是Spring中的部分内容 在这个快速发展的互联经济的时代 SSM框架提高了开发人员的工作效率
  • 查询topn的另一种方法通过orderby排序后利用limit来实现

    文章目录 前言 1 热身题实践 其他 前言 一直有个想法 把面试需要的知识点全都总结一下 包括数据库 语言 算法 数据结构等知识 形成一个面试总结笔记 这样以后面试的时候只看这些文章回顾下就行了 今天就先总结下Mysql的面试热身题吧 后续
  • HBase运维中遇到的问题

    1 PleaseHoldException Master is initializing hadoop 3 2 1 hbase 2 2 5 各种配置之后 出现的错误具体为 进去 hbase shell 之后 出现 hbase main 00
  • C#协变

    namespace 协变 public class Animal public string name public Animal string name1 name name1 public class dog Animal public
  • 【vue】vue 中插槽的三种类型:

    文章目录 一 匿名插槽 二 具名插槽 三 作用域插槽 一 匿名插槽
  • CSS学习笔记——搭建京东购物车网页

    大家好 作为一名互联网行业的小白 写博客只是为了巩固自己学习的知识 但由于水平有限 博客中难免会有一些错误出现 有不妥之处恳请各位大佬指点一二 博客主页 链接 https blog csdn net weixin 52720197 spm
  • elasticsearch心得记录-搭建到使用过程中

    1 es评分机制 使用场景 匹配多个关键词的时候 增加其中某个关键词的权重 增加其评分 搜索出来即可排到前面 评分默认为倒叙排 2 es基础的增删改查 搜索 search type dfs query then fetch 每个分片会根据
  • 条码规范——Code 93

    CODE 93 BACKGROUND INFORMATION Code 93 was designed to complement and improve upon Code 39 Code 93 is similar in that it
  • 在线代码测试小项目

    小项目 代码在线测试 http是我们生活中最常使用的协议 现如今网络浏览器越来越贴近人们的生活 使得做什么事都很方便 但是想要运行一段代码还得需要在电脑指定的环境下来运行 这在有些情况下让人很抓狂 我在网上也看到过很多代码在线测试的网页 感