GEC6818开发板JPG图像显示,科大讯飞离线语音识别包Linux_aitalk_exp1227_1398d7c6运行demo程序,开发板实现录音
GEC6818开发板JPG图像显示 | 开发板实现录音
- 一.GEC6818开发板JPG图像显示
- 1.jpg图片特性
- 2.如何解压缩jpg图片
- 1.对jpegsrc.v8c.tar.gz进行arm移植
- 2.进入~/jpeg-8c对jpeg库进行配置
- 3.编译
- 4.安装,将动态库存放到 /home/gec/armJPegLib
- 5.清空编译记录
- 6.自己查看下 /home/gec/armJPegLib目录下是否有4个目录
- 7.将图片和程序下载到开发板运行即可
- 二.开发板设置ip
- 三.tftp使用
- 四.运行程序显示图片的时候遇到以下问题
- 五.禁用开发板开机自动执行原QT程序
- 六.科大讯飞离线语音识别包Linux_aitalk_exp1227_1398d7c6运行demo程序
- 六.开发板实现录音
- 1.将alsa.tar.gz下载到开发板并解压到根目录
- 2.设置alsa库环境变量
- 3.生效该脚本文件
- 4.查看环境变量有没有alsa库
- 5.指定ALSA库的配置文件
- 6.在开发板创建脚本 vi installAlsaNote.sh ,按i按键添加以下内容,然后按:wq退出
- 7.修改脚本权限
- 8.运行脚本,注意每次掉电后需要重新运行
- 9.录音
- 10.播放音频
- 源码
- asr_offline_sample.c
- myhead.h
- Makefile
一.GEC6818开发板JPG图像显示
1.jpg图片特性
体积小,使用到数据结构里面的
霍夫曼树(哈夫曼树)
对数据进行压缩
2.如何解压缩jpg图片
1.对jpegsrc.v8c.tar.gz进行arm移植
移植方式如下:
1.将jpegsrc.v8c.tar.gz解压缩到ubuntu ~
tar -zxvf jpegsrc.v8c.tar.gz -C ~ // -C 指定解压缩的位置
2.进入~/jpeg-8c对jpeg库进行配置
./configure --host=arm-linux --prefix=/home/gec/armJPegLib
--host=arm-linux : 指定编译的环境,arm平台
--prefix=/home/gec/armJPegLib : 指定动态库存放的路径
3.编译
make
4.安装,将动态库存放到 /home/gec/armJPegLib
make install
5.清空编译记录
make clean
6.自己查看下 /home/gec/armJPegLib目录下是否有4个目录
bin include lib share
7.将图片和程序下载到开发板运行即可
二.开发板设置ip
// 临时静态设置ip设置,每次都需要设置
ifconfig eth0 192.168.24.xxx(自己分配的ip)
// 永久ip设置vi /etc/profile设置ipifconfig eth0 192.168.24.xxx(自己分配的ip)参数如下:ifconfig lo 127.0.0.1 up ifconfig eth0 up ifconfig eth0 192.168.24.xxx 保存退出,重启开发板
// 自动获取ip(慎重使用)udhcpc
三.tftp使用
1.从飞秋下载tftp工具,解压,打开tftp32.exe
2.点击浏览选择需要下载的文件所对应的目录
3.在开发板CRT软件,执行一下命令进行下载程序
tftp 192.168.1.xxx -g -r main(需要下载的程序)
解释:
192.168.1.xxx : 电脑主机ip,注意不是开发板的ip-g -r : 从电脑下载内容到开发板-p -l : 将文件从开发板上传到电脑
四.运行程序显示图片的时候遇到以下问题
/main: error while loading shared libraries: libjpeg.so.8: cannot open shared object file: No such file or directory
将 libjpeg.so.8下载到开发板的/lib
tftp 192.168.1.xxx -g -r libjpeg.so.8
cp libjpeg.so.8 /lib
五.禁用开发板开机自动执行原QT程序
vi /etc/profile
将以下两行程序注释
#cd /IOT
#./iot &
保存退出,重启开发板 reboot
六.科大讯飞离线语音识别包Linux_aitalk_exp1227_1398d7c6运行demo程序
1.进入Linux_aitalk_exp1227_1398d7c6/asr_offline_sample/asr_offline_sample
2.sudo cp Linux_aitalk_exp1227_1398d7c6/libs/x64/libmsc.so /lib 只需要拷贝一遍即可
3.编译程序
./64_bitmake.sh
4.编译后生成的可执行程序存放在 Linux_aitalk_exp1227_1398d7c6/bin
5.进入 Linux_aitalk_exp1227_1398d7c6/bin执行asr_offline_sample程序
./asr_offline_sample
报错
./asr_offline_sample: error while loading shared libraries: libmsc.so: cannot open shared object file: No such file or directory
注意将
sudo cp Linux_aitalk_exp1227_1398d7c6/libs/x64/libmsc.so /lib
然后重新执行程序即可
六.开发板实现录音
/alsa/bin --> arecord 录音
/alsa/bin --> aplay 播放
alsa库移植
1.将alsa.tar.gz下载到开发板并解压到根目录
tftp 192.168.24.xxx -g -r alsa.tar.gz
2.设置alsa库环境变量
/etc/init.d/rcS 与 /etc/profile
#最大的区别就是,添加完环境变量以后不需要重启开发板,只需要执行
source /etc/init.d/rcS # 即可
vi /etc/init.d/rcS
#添加以下内容
export LD_LIBRARY_PATH=/alsa/lib:$LD_LIBRARY_PATH
export PATH=$PATH:/alsa/bin
3.生效该脚本文件
source /etc/init.d/rcS
4.查看环境变量有没有alsa库
env
5.指定ALSA库的配置文件
将/alsa/share/alsa/拷贝到/usr/share/,方法如下:
cp /alsa/share/alsa/ /usr/share/ -r
将/alsa拷贝到/home/gec/,方法如下:
cp /alsa /home/gec/ -rf ---> 如果/home/gec不存在,则需要创建
6.在开发板创建脚本 vi installAlsaNote.sh ,按i按键添加以下内容,然后按:wq退出
mkdir /dev/snd
cd /dev/sndmknod dsp c 14 3
mknod audio c 14 4
mknod mixer c 14 0
mknod controlC0 c 116 0
mknod seq c 116 1
mknod pcmC0D0c c 116 24
mknod pcmC0D0p c 116 16
mknod pcmC0D1c c 116 25
mknod pcmC0D1p c 116 17
mknod timer c 116 33
7.修改脚本权限
chmod 777 installAlsaNote.sh
8.运行脚本,注意每次掉电后需要重新运行
./installAlsaNote.sh
9.录音
(注意录音的时候不需要接耳机,因为开发板自带有麦克风,麦克风的位置在耳机口后面)
arecord -d3 -c1 -r16000 -twav -fS16_LE abc.wav
-d, --duration=# interrupt after # seconds ---> 录音的秒数
-c, --channels=# channels ---> 音轨
-r, --rate=# sample rate ---> 采样频率
-t, --file-type TYPE file type (voc, wav, raw or au) ---> 封装的格式
-f, --format=FORMAT sample format (case insensitive) ---> 量化位数
abc.wav : 是生成的录音文件
10.播放音频
aplay abc.wav
abc.wav : 是生成的录音文件
源码
asr_offline_sample.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#include "../../include/qisr.h"
#include "../../include/msp_cmn.h"
#include "../../include/msp_errors.h"#define SAMPLE_RATE_16K (16000)
#define SAMPLE_RATE_8K (8000)
#define MAX_GRAMMARID_LEN (32)
#define MAX_PARAMS_LEN (1024)const char * ASR_RES_PATH = "fo|res/asr/common.jet"; //离线语法识别资源路径
const char * GRM_BUILD_PATH = "res/asr/GrmBuilld"; //构建离线语法识别网络生成数据保存路径
const char * GRM_FILE = "call.bnf"; //构建离线识别语法网络所用的语法文件
const char * LEX_NAME = "contact"; //更新离线识别语法的contact槽(语法文件为此示例中使用的call.bnf)typedef struct _UserData {int build_fini; //标识语法构建是否完成int update_fini; //标识更新词典是否完成int errcode; //记录语法构建或更新词典回调错误码char grammar_id[MAX_GRAMMARID_LEN]; //保存语法构建返回的语法ID
}UserData;const char *get_audio_file(void); //选择进行离线语法识别的语音文件
int build_grammar(UserData *udata); //构建离线识别语法网络
int update_lexicon(UserData *udata); //更新离线识别语法词典
int run_asr(UserData *udata); //进行离线语法识别const char* get_audio_file(void)
{char key = 0;while(key != 27) //按Esc则退出{printf("请选择音频文件:\n");printf("1.打电话给丁伟\n");printf("2.打电话给黄辣椒\n");printf("3.打电话给奥巴马\n");key = getchar();getchar();switch(key){case '1':printf("\n1.打电话给丁伟\n");return "wav/ddhgdw.pcm";case '2':printf("\n2.打电话给黄辣椒\n");return "wav/ddhghlj.pcm";case '3':printf("\n3.打电话给奥巴马\n");return "wav/ddhgabm.pcm";default:continue;}}exit(0);return NULL;
}int build_grm_cb(int ecode, const char *info, void *udata)
{UserData *grm_data = (UserData *)udata;if (NULL != grm_data) {grm_data->build_fini = 1;grm_data->errcode = ecode;}if (MSP_SUCCESS == ecode && NULL != info) {printf("构建语法成功! 语法ID:%s\n", info);if (NULL != grm_data)snprintf(grm_data->grammar_id, MAX_GRAMMARID_LEN - 1, info);}elseprintf("构建语法失败!%d\n", ecode);return 0;
}int build_grammar(UserData *udata)
{FILE *grm_file = NULL;char *grm_content = NULL;unsigned int grm_cnt_len = 0;char grm_build_params[MAX_PARAMS_LEN] = {NULL};int ret = 0;grm_file = fopen(GRM_FILE, "rb"); if(NULL == grm_file) {printf("打开\"%s\"文件失败![%s]\n", GRM_FILE, strerror(errno));return -1; }fseek(grm_file, 0, SEEK_END);grm_cnt_len = ftell(grm_file);fseek(grm_file, 0, SEEK_SET);grm_content = (char *)malloc(grm_cnt_len + 1);if (NULL == grm_content){printf("内存分配失败!\n");fclose(grm_file);grm_file = NULL;return -1;}fread((void*)grm_content, 1, grm_cnt_len, grm_file);grm_content[grm_cnt_len] = '\0';fclose(grm_file);grm_file = NULL;snprintf(grm_build_params, MAX_PARAMS_LEN - 1, "engine_type = local, \asr_res_path = %s, sample_rate = %d, \grm_build_path = %s, ",ASR_RES_PATH,SAMPLE_RATE_16K,GRM_BUILD_PATH);ret = QISRBuildGrammar("bnf", grm_content, grm_cnt_len, grm_build_params, build_grm_cb, udata);free(grm_content);grm_content = NULL;return ret;
}int update_lex_cb(int ecode, const char *info, void *udata)
{UserData *lex_data = (UserData *)udata;if (NULL != lex_data) {lex_data->update_fini = 1;lex_data->errcode = ecode;}if (MSP_SUCCESS == ecode)printf("更新词典成功!\n");elseprintf("更新词典失败!%d\n", ecode);return 0;
}int update_lexicon(UserData *udata)
{const char *lex_content = "丁伟\n黄辣椒";unsigned int lex_cnt_len = strlen(lex_content);char update_lex_params[MAX_PARAMS_LEN] = {NULL}; snprintf(update_lex_params, MAX_PARAMS_LEN - 1, "engine_type = local, text_encoding = UTF-8, \asr_res_path = %s, sample_rate = %d, \grm_build_path = %s, grammar_list = %s, ",ASR_RES_PATH,SAMPLE_RATE_16K,GRM_BUILD_PATH,udata->grammar_id);return QISRUpdateLexicon(LEX_NAME, lex_content, lex_cnt_len, update_lex_params, update_lex_cb, udata);
}int tcp_socket=0;
int new_socket=0;void init_network()
{//1.初始化网络tcp_socket = socket(AF_INET, SOCK_STREAM, 0);//2.绑定服务器 //设置链接的服务器地址信息 struct sockaddr_in addr; addr.sin_family = AF_INET; //IPV4 协议 addr.sin_port = htons(50000); //端口addr.sin_addr.s_addr = inet_addr("192.168.24.35"); //服务器的IP 地址//解决端口复用int on=1;setsockopt(tcp_socket,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));on=1;setsockopt(tcp_socket,SOL_SOCKET,SO_REUSEPORT,&on,sizeof(on));//2.绑定服务器地址信息int ret=bind(tcp_socket,(struct sockaddr *)&addr,sizeof(addr));if(ret < 0){perror("");return 0;}else{printf("绑定成功\n");}//3.设置服务器为监听模式 ret=listen(tcp_socket,5);if(ret < 0){perror("");return 0;}else{printf("设置监听成功\n");}//4.接收客户端的链接请求 printf("等待服务器链接进来\n");new_socket=accept(tcp_socket,NULL,NULL);if(new_socket < 0){perror("");return 0;}else{printf("链接成功!!\n");}}//设计一个从网络获取文件接口
char *get_network_file()
{//进行文件的接收 //1.新建文件 int new_fd=open("wav/cmd.pcm",O_RDWR|O_CREAT|O_TRUNC,0777);int all_size=0; while(1){//读取网络数据,写入到本地文件中 char buf[4096]={0}; int size = read(new_socket,buf,4096); write(new_fd,buf,size); all_size+= size; if(all_size == 96000){printf("接收文件完毕,开始识别\n");break;}}//关闭所有打开后的文件 close(new_fd);return "wav/cmd.pcm";
}int run_asr(UserData *udata)
{char asr_params[MAX_PARAMS_LEN] = {NULL};const char *rec_rslt = NULL;const char *session_id = NULL;const char *asr_audiof = NULL;FILE *f_pcm = NULL;char *pcm_data = NULL;long pcm_count = 0;long pcm_size = 0;int last_audio = 0;int aud_stat = MSP_AUDIO_SAMPLE_CONTINUE;int ep_status = MSP_EP_LOOKING_FOR_SPEECH;int rec_status = MSP_REC_STATUS_INCOMPLETE;int rss_status = MSP_REC_STATUS_INCOMPLETE;int errcode = -1;//获取识别的音频文件 //asr_audiof = get_audio_file(); //主要修改这里,让他去识别我们自己的音频文件asr_audiof = get_network_file(); //从网络中获取文件f_pcm = fopen(asr_audiof, "rb");if (NULL == f_pcm) {printf("打开\"%s\"失败![%s]\n", f_pcm, strerror(errno));goto run_error;}//获取音频文件的大小,分配堆空间fseek(f_pcm, 0, SEEK_END);pcm_size = ftell(f_pcm);fseek(f_pcm, 0, SEEK_SET);pcm_data = (char *)malloc(pcm_size);if (NULL == pcm_data)goto run_error;//把所有的音频数据,读取到堆空间中 fread((void *)pcm_data, pcm_size, 1, f_pcm);fclose(f_pcm);f_pcm = NULL;//离线语法识别参数设置snprintf(asr_params, MAX_PARAMS_LEN - 1, "engine_type = local, \asr_res_path = %s, sample_rate = %d, \grm_build_path = %s, local_grammar = %s, \result_type = json, result_encoding = UTF-8, ",ASR_RES_PATH,SAMPLE_RATE_16K,GRM_BUILD_PATH,udata->grammar_id);session_id = QISRSessionBegin(NULL, asr_params, &errcode);if (NULL == session_id)goto run_error;printf("开始识别...\n");while (1) {unsigned int len = 6400;if (pcm_size < 12800) {len = pcm_size;last_audio = 1;}aud_stat = MSP_AUDIO_SAMPLE_CONTINUE;if (0 == pcm_count)aud_stat = MSP_AUDIO_SAMPLE_FIRST;if (len <= 0)break;printf(">");fflush(stdout);errcode = QISRAudioWrite(session_id, (const void *)&pcm_data[pcm_count], len, aud_stat, &ep_status, &rec_status);if (MSP_SUCCESS != errcode)goto run_error;pcm_count += (long)len;pcm_size -= (long)len;//检测到音频结束if (MSP_EP_AFTER_SPEECH == ep_status)break;usleep(150 * 1000); //模拟人说话时间间隙}//主动点击音频结束QISRAudioWrite(session_id, (const void *)NULL, 0, MSP_AUDIO_SAMPLE_LAST, &ep_status, &rec_status);free(pcm_data);pcm_data = NULL;//获取识别结果while (MSP_REC_STATUS_COMPLETE != rss_status && MSP_SUCCESS == errcode) {rec_rslt = QISRGetResult(session_id, &rss_status, 0, &errcode);usleep(150 * 1000);}printf("\n识别结束:\n");printf("=============================================================\n");if (NULL != rec_rslt){printf("%s\n", rec_rslt);//把结果回发给客户端 write(new_socket,rec_rslt,strlen(rec_rslt));}elseprintf("没有识别结果!\n");printf("=============================================================\n");goto run_exit;run_error:if (NULL != pcm_data) {free(pcm_data);pcm_data = NULL;}if (NULL != f_pcm) {fclose(f_pcm);f_pcm = NULL;}
run_exit:QISRSessionEnd(session_id, NULL);return errcode;
}int main(int argc, char* argv[])
{const char *login_config = "appid = 4a6e6f76"; //登录参数UserData asr_data; int ret = 0 ;char c;//初始化网络 init_network();ret = MSPLogin(NULL, NULL, login_config); //第一个参数为用户名,第二个参数为密码,传NULL即可,第三个参数是登录参数if (MSP_SUCCESS != ret) {printf("登录失败:%d\n", ret);goto exit;}memset(&asr_data, 0, sizeof(UserData));printf("构建离线识别语法网络...\n");ret = build_grammar(&asr_data); //第一次使用某语法进行识别,需要先构建语法网络,获取语法ID,之后使用此语法进行识别,无需再次构建if (MSP_SUCCESS != ret) {printf("构建语法调用失败!\n");goto exit;}while (1 != asr_data.build_fini)usleep(300 * 1000);if (MSP_SUCCESS != asr_data.errcode)goto exit;printf("离线识别语法网络构建完成,开始识别...\n"); while(1) //不断进行识别 {ret = run_asr(&asr_data);if (MSP_SUCCESS != ret) {printf("离线语法识别出错: %d \n", ret);goto exit;}}exit:MSPLogout();return 0;
}
myhead.h
#ifndef _MYHEAD_H
#define _MYHEAD_H#include <stdio.h>
#include <string.h>
#include <strings.h>
//#include <uniststat.h>
//#include <fcntld.h>#include <fcntl.h>
#include <stdio.h> //printf scanf
#include <fcntl.h> //open write read lseek close
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <linux/input.h>
#include "jpeglib.h"#define LCD_WIDTH 800
#define LCD_HEIGHT 480
#define FB_SIZE (LCD_WIDTH * LCD_HEIGHT * 4)
#define EN_LCD_SHOW_JPG 1
// 获取触摸屏坐标
int ts(int *ts_x,int *ts_y);
// 显示jpg图片
int lcd_draw_jpg(unsigned int x,unsigned int y,const char *pjpg_path,char *pjpg_buf,unsigned int jpg_buf_size,unsigned int jpg_half);
#endif
Makefile
#common makefile headerDIR_INC = ../../include
DIR_BIN = ../../bin
DIR_LIB = ../../libsTARGET = asr_offline_sample
BIN_TARGET = $(DIR_BIN)/$(TARGET)CROSS_COMPILE =
CFLAGS = -g -Wall -I$(DIR_INC)ifdef LINUX64
LDFLAGS := -L$(DIR_LIB)/x64
else
LDFLAGS := -L$(DIR_LIB)/x86
endif
LDFLAGS += -lmsc -lrt -ldl -lpthread -lstdc++OBJECTS := $(patsubst %.c,%.o,$(wildcard *.c))$(BIN_TARGET) : $(OBJECTS)$(CROSS_COMPILE)gcc $(CFLAGS) $^ -o $@ $(LDFLAGS)%.o : %.c$(CROSS_COMPILE)gcc -c $(CFLAGS) $< -o $@
clean:@rm -f *.o $(BIN_TARGET).PHONY:clean#common makefile foot
相关文章:

GEC6818开发板JPG图像显示,科大讯飞离线语音识别包Linux_aitalk_exp1227_1398d7c6运行demo程序,开发板实现录音
GEC6818开发板JPG图像显示 | 开发板实现录音一.GEC6818开发板JPG图像显示1.jpg图片特性2.如何解压缩jpg图片1.对jpegsrc.v8c.tar.gz进行arm移植2.进入~/jpeg-8c对jpeg库进行配置3.编译4.安装,将动态库存放到 /home/gec/armJPegLib5.清空编译记录6.自己查看下 /home/…...

如何判断树莓派通过GPIO与5G模块成功连接?
如果想要判断自己是否成功连接了树莓派与5G模块,可以通过以下方式进行判断: 查看设备连接状态:可以通过在树莓派终端中执行lsusb命令来查看USB设备的连接状态,如果5G模块被识别到,则会显示相关的设备信息。如果提示lsu…...

Java——包装类和List及ArrayList
目录 包装类(Wrapped Class) 包装类的使用---装箱和拆箱 自动装箱和自动拆箱 Integer的易错题 javap反编译工具 List接口的使用 方法 ArrayList 使用 打印 区别 扩容机制 ArrayList练习 字符集合 杨辉三角 编辑 包装类(Wrapped Class) Object 引用可…...

matlab - 程序流程控制、函数文件、特殊函数、调试与优化
学习视频MATLAB代码的两种执行方式:命令行、程序执行。1.程序流程控制1.1.m文件matlab中m文件分为两种:脚本文件&函数文件。脚本文件:实际上是一个命令的集合,可认为是命令行的改良版,方便我们去编写命令函数文件&…...

Toponogov 比较定理及其应用
1. Toponogov 比较定理的背景来源 Victor Andreevich Toponogov(1930-2004) 是苏联数学家,Toponogov 比较定理是他的博士论文题目,在1958年答辩。他证明这个定理是为了用于证明截面曲率假设下的分裂定理和最大直径定理࿰…...

力扣sql简单篇练习(二十二)
力扣sql简单篇练习(二十二) 1 上月播放的儿童适宜电影 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 # Write your MySQL query statement belowSELECT titleFROM ContentWHERE kids_contentY AND content_typeMoviesAND c…...

【开源硬件】STM32F030R8T6系统板
【开源硬件】STM32F030R8T6系统板✅STM32F030R8T6系统板兼容极海APM32F030R8T6 🔰支持stm32cubemx工程配置成STM32F030R8T6生成的MDK工程,经过Keil编译后可以直接使用ST-Link v2烧录器上传到极海APM32F030R8T6芯片当中,完全做到平替使用&…...

ES之DSL查询文档基础查询
分类 query查询分类 总体规律就是逻辑性的,从外层的你干嘛,到下一层的查询类型,再到下一层的查询字段(如果需要的话)和然后是查询内容 查询所有 语法 get /索引库名/_serarch {"query":{"查询条件…...

数据结构与算法之堆排序
目录堆排序概述代码实现时间复杂度堆排序概述 堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点…...

Vue3 中的模板语法
目录前言一、什么是模板语法?二、内容渲染指令1. v-text2. {{ }} 插值表达式3. v-html三、双向绑定指令1. v-model2. v-model的修饰符四、属性绑定指令1. 动态绑定多个属性值2. 绑定class和style属性五、条件渲染指令1. v-if、v-else-if、v-else2. v-show3. v-if和v…...

Redis十大类型——Hash常见操作
Redis十大类型——Hash常见操作命令操作简列存放及获取获取健值对长度元素查找列出健值对对数字进行操作赋值hsetnx很明显咯它也是以健值对方式存在的,只不过value也就是值,在这里也变成了一组简直对。 🍊个🌰: 想必多…...

Python采集本地二手房,一键知晓上万房源信息
前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 所以今天教大家用Python来采集本地房源数据,帮助大家筛选好房。 话不多说,让我们开始愉快的旅程吧~ 更多精彩内容、资源皆可点击文章下方名片获取此处跳转 本文涉及知识点 采集基本流程 requests 发送…...

Ubuntu 18.04 出现GLIBC_2.28 not found的解决方法(亲测有效)
关于/lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.28’ not found出现报错,建议不要使用源码包去编译并升级。在下文有分享一个使用官方的Debian软件包去升级使用的方法。仅供参考! 环境 # uname -a Linux Ubuntu 5.4.0-144-generic #161~18.04.…...

Java文档搜索引擎总结
Java文档搜索引擎总结项目介绍项目使用的技术栈前端页面展示后端逻辑部分索引部分搜索模块部分Web模块部分项目介绍 Java文档搜索引擎项目是一个SSM项目,该项目的前端界面部分是由搜索页面和展示页面组成,后端部分索引模块(ScanAnalysis、in…...

Linux内核学习笔记——页表的那些事。
目录页表什么时候创建内核页表变化什么时候更新到用户页表源码分析常见问题解答问题一:页表到底是保存在内核空间中还是用户空间中?问题2:页表访问,软件是不是会频繁陷入内核?问题3:内存申请,软…...

C++,Qt分别读写xml文件
XML语法 第一行是XML文档声明,<>内的代表是元素,基本语法如以下所示。C常见的是使用tiny库读写,Qt使用自带的库读写; <?xml version"1.0" encoding"utf-8" standalone"yes" ?> <根元素>…...

WebStorm安装教程【2023年最新版图解】一文教会你安装
文章目录引言一、下载WebStorm三、WebStorm激活配置及创建项目Active Code安装完成尝试新建一个项目引言 今天发现了一个专注前端开发的软件,相比VSCode的话,这个好像也不错,为了后续做个API接口项目做准备。 对于入门JavaScript 开发的者&am…...

用户态和内核态,系统调用
特权指令:具有特殊权限的指令,比如清内存,重置时钟,分配系统资源,修改用户的访问权限 由于这类指令的权限最大,所以使用不当会导致整个系统崩溃 系统调用:是操作系统提供给应用程序的接口(供应…...

Java 包装类
Java 中有些类只能操作对象,因此 Java 的基本数据类型都有一个对应的包装类。 byte:Byteshort:Shortint:Integerlong:Longfloat:Floatdouble:Doublechar:Characterbooleanÿ…...

Raspberry Pi GPIO入门指南
如果您想使用 Raspberry Pi 进行数字输入/输出操作,那么您需要使用 GPIO(通用输入/输出)引脚。在这篇文章中,我们将为您提供 Raspberry Pi GPIO 的基础知识,包括如何访问和操作 GPIO 引脚。 0.认识GPIO 树莓派上的那…...

汇编语言程序设计(三)之汇编程序
系列文章 汇编语言程序设计(一) 汇编语言程序设计(二)之寄存器 汇编程序 经过上述课程的学习,我们可以编写一个完整的程序了。这章开始我们将开始编写完整的汇编语言程序,用编译和连接程序将它们连接成可…...

用二极管和电容过滤电源波动,实现简单的稳压 - 小水泵升压改装方案
简而言之,就是类似采样保持电路,当电源电压因为电机启动而骤降时,用二极管避免电容电压跟着降低,从而让电容上连接的低功耗芯片有一个比较稳定的供电电压。没什么特别的用处,省个LDO 吧,电压跌幅太大的时候…...

【数据结构与算法】数据结构有哪些?算法有哪些?
1. 算法与数据结构总览图 2.常用的数据结构 2.1.数组(Array) 数组是一种聚合数据类型,它是将具有相同类型的若干变量有序地组织在一起的集合。数组可以说是最基本的数据结构,在各种编程语言中都有对应。一个数组可以分解为多个数…...

使用Element-UI展示数据(动态查询)
学习内容来源:视频P4 本篇文章进度接着之前的文章进行续写 精简前后端分离项目搭建 Vue基础容器使用 目录选择组件修改表格组件修改分页组件增加后端接口前端请求数据接口页面初始化请求数据点击页码请求数据选择组件 在官方文档中选择现成的组件,放在页…...

lamda 表达式例子全集
1、List 转 map 1.1、key(Model属性) value Model Map<String, Model> modeMap List.stream().collect(Collectors.toMap(Model1::属性get方法, v -> v, (p1, p2) -> p1)); 1.2、key(Model1属性) value Model2 Map<String, Model1> model2Map List.stream…...

计算机网络第八版——第一章课后题答案(超详细)
第一章 该答案为博主在网络上整理,排版不易,希望大家多多点赞支持。后续将会持续更新(可以给博主点个关注~ 【1-01】计算机网络可以向用户提供哪些服务? 解答:这道题没有现成的标准答案,因为可以从不同的…...

嵌入式和Python(二):python初识及其基本使用规则
目录 一,python基本特点 二,python使用说明 ● 两种编程方式 ① 交互式编程 ② 脚本式编程 ● python中文编码 ● python行和缩进 ● python引号 ● python空行 ● python等待用户输入 ① 没有转换变量类型 ② 转换变量类型 ● python变…...

C语言详解双向链表的基本操作
目录 双链表的定义与接口函数 定义双链表 接口函数 详解接口函数的实现 创建新节点(BuyLTNode) 初始化双链表(ListInit) 双向链表打印(ListPrint) 双链表查找(ListFind) 双链…...

面试必须要知道的常见排序算法
以下排序均为升序 1.直接插入排序 具体思想 把待排序的数据按大小比较插入到一个已经排序好的有序序列中,直到所有的待排序数据全部插入到有序序列中为止.实际生活中,我们平常斗地主摸牌时,就用到了插入排序的思想. 当插入第n个数据时,前面n-1个数据已经有序;第n个数据依次与前…...

Kubernetes之服务发布
学了服务发现后,svc的IP只能被集群内部主机及pod才可以访问,要想集群外的主机也可以访问svc,就需要利用到服务发布。 NodePort Nodeport服务是外部访问服务的最基本方式。当我们创建一个服务的时候,把服务的端口映射到kubernete…...