图像识别与 OCR 应用实践
图像识别是一种让计算机具备“看”与“理解”图像能力的人工智能技术,其目标是从图像或视频中提取有意义的信息,如物体、人物、场景或文字。在现实生活中,这项技术被广泛应用于面部识别、自动驾驶、安防监控、医疗诊断、图像搜索等多个领域。
图像识别的发展离不开**计算机视觉(Computer Vision)和深度学习(Deep Learning)**的持续演进。传统方法依赖人工设计特征(如边缘、角点、纹理等),而现在的主流方法是使用卷积神经网络(CNN)等深度模型,自动提取特征并进行分类或识别,大幅提升了准确率和泛化能力。
图像识别常见的任务包括:
-
图像分类:判断图像属于哪一类(如猫、狗、飞机等)
-
目标检测:定位图中出现的各类物体
-
图像分割:为图像中的不同区域赋予语义标签
-
面部识别:识别和匹配人脸信息
-
OCR(光学字符识别):从图像中提取文字内容
从手写数字识别到实用 OCR 工具
我最初通过一个 CNN 架构尝试识别手写数字,使用经典的 MNIST 数据集/自制的手写训练集进行训练。模型通过反向传播和梯度下降来降低预测误差,实现数字识别的功能。
代码开源地址:
👉 SimpleCNN - GitHub
不过,这个项目更适合教学与实验目的,在实际应用中无法直接应对复杂图像或模糊文字识别的需求。因此我转而使用一些成熟的图像识别 API 服务,比如阿里云的 OCR 识别服务,它对中文文字识别支持较好,使用方便,但在图像模糊或光线不佳时,识别准确率仍有限,需要配合图像预处理优化结果。
实用 OCR API 推荐(阿里云)
以下是我实际使用过,觉得比较实用的一些 API(整理备份,也方便其他人参考):
-
🔍 [阿里官方] 通用 OCR 文字识别 API
-
🔍 [阿里官方] 高精度 OCR 图像识别 API
-
📚 API 专区 - 云市场
-
🧠 阿里云通义千问 - DashScope(大语言模型接口)
-
🧠 智谱 AI 模型服务(GLM-4 Flash 免费/付费)
-
🎓 阿里云高校学生一年免费服务器计划(申请制)
阿里 OCR API 调用代码示例(Python)
这里是一个实际使用的调用代码,支持上传图片文件或图片链接:
# -*- coding: utf-8 -*-import json
import base64
import os
import ssltry:from urllib.error import HTTPErrorfrom urllib.request import Request, urlopen
except ImportError:from urllib2 import Request, urlopen, HTTPErrorcontext = ssl._create_unverified_context()def get_img(img_file):"""将本地图片转成base64编码的字符串,或者直接返回图片链接"""# 简单判断是否为图片链接if img_file.startswith("http"):return img_fileelse:with open(os.path.expanduser(img_file), 'rb') as f: # 以二进制读取本地图片data = f.read()try:encodestr = str(base64.b64encode(data), 'utf-8')except TypeError:encodestr = base64.b64encode(data)return encodestrdef posturl(headers, body):"""发送请求,获取识别结果"""try:params = json.dumps(body).encode(encoding='UTF8')req = Request(REQUEST_URL, params, headers)r = urlopen(req, context=context)html = r.read()return html.decode("utf8")except HTTPError as e:print(e.code)print(e.read().decode("utf8"))def request(appcode, img_file, params):# 请求参数if params is None:params = {}img = get_img(img_file)params.update({'image': img})# 请求头headers = {'Authorization': 'APPCODE %s' % appcode,'Content-Type': 'application/json; charset=UTF-8'}response = posturl(headers, params)print(response)# 请求接口
REQUEST_URL = "https://tysbgpu.market.alicloudapi.com/api/predict/ocr_general"if __name__ == "__main__":# 配置信息appcode = "你的APPCODE"img_file = "图片链接/本地图片路径"params = {"configure": {"min_size": 16, # 图片中文字的最小高度,单位像素(此参数目前已经废弃)"output_prob": True, # 是否输出文字框的概率"output_keypoints": False, # 是否输出文字框角点"skip_detection": False, # 是否跳过文字检测步骤直接进行文字识别"without_predicting_direction": False, # 是否关闭文字行方向预测}}request(appcode, img_file, params)
你只需要填入你的 AppCode
和图片地址即可直接运行。
以及 动态爬虫+OCR识别自动登录人民邮电出版社
recognition.py
# -*- coding: utf-8 -*-
import json
import base64
import os
import ssltry:from urllib.error import HTTPErrorfrom urllib.request import Request, urlopen
except ImportError:from urllib2 import Request, urlopen, HTTPErrorcontext = ssl._create_unverified_context()def get_img(img_file):"""将本地图片转成base64编码的字符串,或者直接返回图片链接"""# 简单判断是否为图片链接if img_file.startswith("http"):return img_fileelse:with open(os.path.expanduser(img_file), 'rb') as f: # 以二进制读取本地图片data = f.read()try:encodestr = str(base64.b64encode(data), 'utf-8')except TypeError:encodestr = base64.b64encode(data)return encodestr# 请求接口
REQUEST_URL = "https://gjbsb.market.alicloudapi.com/ocrservice/advanced"
def posturl(headers, body):"""发送请求,获取识别结果"""try:params = json.dumps(body).encode(encoding='UTF8')req = Request(REQUEST_URL, params, headers)r = urlopen(req, context=context)html = r.read()return html.decode("utf8")except HTTPError as e:print(e.code)print(e.read().decode("utf8"))def request(appcode, img_file, params):# 请求参数if params is None:params = {}img = get_img(img_file)if img.startswith('http'): # img 表示图片链接params.update({'url': img})else: # img 表示图片base64params.update({'img': img})# 请求头headers = {'Authorization': 'APPCODE %s' % appcode,'Content-Type': 'application/json; charset=UTF-8'}response = posturl(headers, params)return responsedef run():"""运行函数:return:返回识别结果"""return request(appcode, img_file, params)if __name__ == '__main__':# 请求接口REQUEST_URL = "https://gjbsb.market.alicloudapi.com/ocrservice/advanced"# 配置信息appcode = "95eaaede7e784cb0a87ab55c8445a766"img_file = "./captcha.png"params = {# 是否需要识别结果中每一行的置信度,默认不需要。 true:需要 false:不需要"prob": False,# 是否需要单字识别功能,默认不需要。 true:需要 false:不需要"charInfo": False,# 是否需要自动旋转功能,默认不需要。 true:需要 false:不需要"rotate": False,# 是否需要表格识别功能,默认不需要。 true:需要 false:不需要"table": False,# 字块返回顺序,false表示从左往右,从上到下的顺序,true表示从上到下,从左往右的顺序,默认false"sortPage": False,# 是否需要去除印章功能,默认不需要。true:需要 false:不需要"noStamp": False,# 是否需要图案检测功能,默认不需要。true:需要 false:不需要"figure": False,# 是否需要成行返回功能,默认不需要。true:需要 false:不需要"row": False,# 是否需要分段功能,默认不需要。true:需要 false:不需要"paragraph": False,# 图片旋转后,是否需要返回原始坐标,默认不需要。true:需要 false:不需要"oricoord": True}message = request(appcode, img_file, params)print(message['content'])# import json# message = '{"sid":"95246a4ddeadba2492f40f4e4be26315d0abf8aae801ca51727b6c677632bd3ac000a754","prism_version":"1.0.9","prism_wnum":1,"prism_wordsInfo":[{"word":"me3xy","pos":[{"x":2,"y":8},{"x":63,"y":8},{"x":63,"y":30},{"x":2,"y":30}],"direction":0,"angle":-90,"x":21,"y":-11,"width":22,"height":61}],"height":34,"width":68,"orgHeight":34,"orgWidth":68,"content":"me3xy ","algo_version":""}'# # 怎么获取content中的信息# print(json.loads(message)['content'])
main.py
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time
from PIL import Imageurl = 'https://www.ptpress.com.cn/login'# 无头浏览器配置
options = webdriver.ChromeOptions()
options.add_argument('--headless') # 无头模式
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')driver = webdriver.Chrome(options=options) # options: 无头模式
driver.get(url=url)time.sleep(2)# 找到验证码图片元素
captcha_img = driver.find_element(By.XPATH, '//*[@id="loginForm"]/div[3]/div[2]/div/img')# 保存验证码图片(可选)
captcha_img.screenshot('captcha.png')im = Image.open('./captcha.png')
im.show()# ----------------------------------------------------
# 图像识别
import recognition# 请求接口
REQUEST_URL = "https://gjbsb.market.alicloudapi.com/ocrservice/advanced"# 配置信息
appcode = "95eaaede7e784cb0a87ab55c8445a766"
img_file = "./captcha.png"
params = {# 是否需要识别结果中每一行的置信度,默认不需要。 true:需要 false:不需要"prob": False,# 是否需要单字识别功能,默认不需要。 true:需要 false:不需要"charInfo": False,# 是否需要自动旋转功能,默认不需要。 true:需要 false:不需要"rotate": False,# 是否需要表格识别功能,默认不需要。 true:需要 false:不需要"table": False,# 字块返回顺序,false表示从左往右,从上到下的顺序,true表示从上到下,从左往右的顺序,默认false"sortPage": False,# 是否需要去除印章功能,默认不需要。true:需要 false:不需要"noStamp": False,# 是否需要图案检测功能,默认不需要。true:需要 false:不需要"figure": False,# 是否需要成行返回功能,默认不需要。true:需要 false:不需要"row": False,# 是否需要分段功能,默认不需要。true:需要 false:不需要"paragraph": False,# 图片旋转后,是否需要返回原始坐标,默认不需要。true:需要 false:不需要"oricoord": True
}data = recognition.request(appcode, img_file, params)import json
data = json.loads(data)['content']
print(data)# -----------------------------------------------------# 输入用户名、密码和验证码(这里验证码需要手动输入或者使用第三方验证码识别服务)
username = ''
password = ''
# verify_code = input('请输入验证码:') # 手动输入验证码driver.find_element(By.XPATH, '//*[@id="loginForm"]/div[1]/input').send_keys(username)
driver.find_element(By.XPATH, '//*[@id="loginForm"]/div[2]/input').send_keys(password)
driver.find_element(By.XPATH, '//*[@id="loginForm"]/div[3]/div[1]/div/input').send_keys(data)# 点击登录按钮
driver.find_element(By.XPATH, '//*[@id="loginBtn"]').click()time.sleep(3) # 等待登录结果page_source = driver.page_source
print(page_source)driver.quit()
小结与感想
图像识别技术是一个非常实用又持续进化的领域。虽然自己动手训练 CNN 模型很有成就感,但面对实际应用场景,使用成熟的云服务往往更高效也更稳定。当然,这也让我意识到:图像识别不仅是“训练模型”,更是一个包括图像采集、预处理、模型调用、结果处理的完整链条。
相关文章:
图像识别与 OCR 应用实践
图像识别是一种让计算机具备“看”与“理解”图像能力的人工智能技术,其目标是从图像或视频中提取有意义的信息,如物体、人物、场景或文字。在现实生活中,这项技术被广泛应用于面部识别、自动驾驶、安防监控、医疗诊断、图像搜索等多个领域。…...
深入理解卷积神经网络:从基础原理到实战应用
在人工智能领域,卷积神经网络(Convolutional Neural Network,简称 CNN)凭借其强大的图像识别、处理能力,成为深度学习中不可或缺的技术。无论是自动驾驶汽车识别道路标志,还是医学影像分析辅助疾病诊断&…...
51单片机——交通指示灯控制器设计
设计目标 1、设计一交通灯控制,控制东西方向的红、黄、绿灯和南北方向的红、黄、绿灯。 2、可手动控制和自动控制,设置两个输入控制开关。 手动/自动开关,通过P11的按键输入控制 3、手动:设置开关P11,两种情况&#x…...
vue2 头像上传+裁剪组件封装
背景:最近在进行公司业务开发时,遇到了头像上传限制尺寸的需求,即限制为一寸证件照(宽295像素,高413像素)。 用到的第三方库: "vue-cropper": "^0.5.5" 完整组件代码&…...
面向对象设计模式之代理模式详解
文章目录 面向对象设计模式之代理模式详解面向对象思想:现代软件开发的基石代理模式:巧妙的中间层设计JavaScript 语法点与代理模式的结合JavaScript 实现代理模式示例代理模式的应用场景 面向对象设计模式之代理模式详解 在现代软件开发的浩瀚领域中&a…...
Leetcode209做题笔记
力扣209 题目分析:想象一个窗口遍历着这个数组,不断扩大右边界,让r。往窗口中添加数字: 此时我们找到了这个窗口,它的和满足了大于等于target的条件,题目让我求最短的,那么我们就尝试来缩短它&…...
SVG 知识详解:从入门到精通
SVG 知识详解:从入门到精通 作为一名前端开发者,我经常会被SVG的魅力所折服。这种基于XML的矢量图形格式,不仅能完美适配各种屏幕分辨率,还能通过CSS和JavaScript进行灵活控制。今天,就让我们一起来深入探索SVG的世界…...
编译openssl源码
openssl版本 1.1.1c windows 安装环境 perl 先安装perl,生成makefile需要 https://strawberryperl.com/releases.html nasm nasm 也是生成makefile需要 https://www.nasm.us/ 安装完perl输入一下nasm,看看能不能找到,找不到的话需要配…...
土壤温湿盐分传感器用于节水农业灌溉引领者三针设计原理便于安装维护
土壤温度部分是由精密铂电阻和高精度变送器两部分组成。变送器部分由电源模块、温度传感模块、变送模块、温度补偿模块及数据处理模块等组成,彻底解决铂电阻因自身特点导入的测量误差,变送器内有零漂电路和温度补偿电路,对使用环境有较高的适…...
Kotlin Compose 与传统 Android UI 开发对比
在移动应用开发领域,Android 开发一直是技术演进的前沿阵地,而 UI 开发作为用户与应用交互的核心环节,其技术体系的变革更是备受瞩目。 技术演进背景 Android UI 开发体系发展脉络 原生 View 体系阶段 在早期的 Android 开发中,原生 View 体系占据了主导地位。开发者通…...
docker-compose——安装redis
文章目录 一、编写docker-compose.yaml文件二、编写redis.conf文件三、启动docker-compose 一、编写docker-compose.yaml文件 version: 3.3 services:redis:image: redis:latestcontainer_name: redisrestart: alwaysports:- 6379:6379volumes:- ./redis/data:/data- ./redis/…...
MFC 调用海康相机进行软触发
初始化相机类文件 #pragma once #include "MvCameraControl.h" class CMvCamera { public:CMvCamera();~CMvCamera();//初始化相机int InitCamera();int SaveCurrentImage(CString filePath);//关闭相机void CloseCamera();//设置int SetEnumValue(IN const char* s…...
第二章 变量和运算符
主要内容 关键字和标识符变量和常量八大基本数据类型Scanner键盘输入基本数据类型的类型转换算术运算符赋值运算符扩展赋值运算符比较运算符逻辑运算符三目运算符运算符的优先级别 学习目标 知识点要求关键字和标识符理解变量和常量掌握八大基本数据类型掌握Scanner键盘输入…...
【starrocks】StarRocks 常见 HTTP 操作与导入错误排查指南
文章目录 一、Stream Load:通过 HTTP 导入数据二、导入状态查询三、取消导入任务四、节点状态监控查看所有 Backend 状态:查看所有 Frontend 状态: 五、导入失败的排查方式1. 查询导入任务状态2. 下载详细错误日志3. 查看 FE/BE 节点日志FE 日…...
网络协议分析 实验七 FTP、HTTP、DHCP
文章目录 实验7.1 FTP协议练习二 使用浏览器登入FTP练习三 在窗口模式下,上传/下传数据文件实验7.2 HTTP(Hyper Text Transfer Protocol)练习二 页面提交练习三 访问比较复杂的主页实验7.3 DHCP(Dynamic Host Configuration Protocol) 实验7.1 FTP协议 dir LIST&…...
ET ProcessInnerSender类(实体) 分析
ProcessInnerSender 作用是进程内部发送Actor消息 字段 TIMEOUT_TIME 超时时间RpcId 用来累加requestCallback 存储RPC的回调事件list 用来获取MessageQueue中的Actor消息 方法 Awake 初始化在MessageQueue中注册待处理的消息队列Destroy 移除在MessageQueue中的消息队列U…...
远程连接工具
绿色轻便ToDesk https://www.todesk.com/download.html 向日葵 https://sunlogin.oray.com/download...
MySQL库级管理:数据库管理与存储引擎剖析
引言 各位数据库爱好者们好!今天我们要深入探讨MySQL数据库的基本操作,这是每位开发者必须掌握的"内功心法" 💪。无论你是刚接触MySQL的小白,还是需要复习基础的老手,这篇教程都将带你系统学习数据库的核心…...
MongoDB 的核心概念(文档、集合、数据库、BSON)是什么?
MongoDB 是一个面向文档的数据库,它的核心概念与传统的关系型数据库(RDBMS)有所不同。以下是它的四个主要核心概念: 文档 (Document) 定义: 文档是 MongoDB 中的基本数据单元。它类似于关系型数据库中的一行记录&#…...
占位符读取标准输入缓冲区规则
1、如果标准输入缓冲区中的前若干个字符都是空白字符,%s,%d,%f都能直接跳过并且从第一个非空白字符开始读取,但%c不能,而是直接读取。 2、%s遇到空白字符时停止,不会读取遇到的空白字符。 3、%d遇到非数字…...
使用Docker部署MongoDB
使用Docker部署MongoDB 使用Docker部署MongoDB是一种快速、便捷的方式,以下是详细步骤: 1. 基本部署 拉取MongoDB镜像 docker pull mongo:latest运行MongoDB容器(最简单方式) docker run --name mongodb -d -p 27017:27017 m…...
如何通过命令提示符(CMD)检查虚拟化是否已启用
想确认 Windows 11 或 10 电脑或笔记本上的虚拟化是否已启用,可以使用命令提示符或 PowerShell 中的 systeminfo 命令。之前已经介绍过使用图形界面的检查方法。在大多数现代系统中,虚拟化默认在 BIOS 中启用,但我们无需打开 BIOS/UEFI 固件菜单即可确认这一点。 虚拟化是一…...
【氮化镓】AlGaN合金中成分相关的辐射响应
2025年,美国宾夕法尼亚州立大学Miaomiao Jin等人基于分子动力学模拟方法,研究了AlGaN合金中成分依赖的辐射响应。研究结果表明,AlGaN合金的辐射损伤特性与铝含量密切相关:随铝含量增加,单次碰撞事件产生的缺陷减少,但由于累积效应,富铝系统更易形成扩展间隙缺陷簇,导致…...
『 测试 』软件测试全流程与Bug管理核心要点解析
文章目录 1 软件测试生命周期2 Bug2.1 Bug 的概念2.2 提出清晰的 Bug2.3 Bug 级别2.4 Bug 的生命周期2.5 作为测试人员与开发人员发生冲突怎么办 1 软件测试生命周期 软件测试贯穿于软件的整个生命周期; 需求分析 测试前需要对需求进行分析, 分析通常站在三个角度去考虑, 即用…...
【springcloud学习(dalston.sr1)】使用Feign实现接口调用(八)
该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍(含源代码)(一) (一)Feign的理解 前面文章【springcloud学习(dalston.sr1)】服务消费者通过restTemplat…...
嵌入式Linux Qt开发:2、Qt creator简单配置、Qt Designer使用以及信号槽机制使用
一、前言 Qt creator比较轻量,而且是Qt自带的IDE,基本可以开箱即用,个人使用起来感觉还是比较舒服的,并且其自带的FakeVim也可以做一些Vim的配置,其主界面可以简单配置显示很多的窗口,让开发更加顺畅。 Q…...
【Vue 3 + Vue Router 4】如何正确重置路由实例(resetRouter)——避免“VueRouter is not defined”错误
在使用 Vue 3 和 Vue Router 4 开发中大型 SPA 应用时,我们经常会遇到需要动态添加或删除路由的场景。尤其是在权限控制和用户登出后重置路由的需求中,正确地实现 resetRouter 非常关键。 然而,许多开发者在迁移或初始化项目时,会…...
企业内部通讯,企业级即时通讯软件选择
企业内部的沟通往往涉及大量敏感信息,如商业机密、财务数据、客户信息等。BeeWorks IM即时通讯平台采用全私有化部署,企业可以将服务器部署在自己的数据中心或私有云环境中,确保所有数据的存储和传输都在企业可控的网络内完成。这种部署方式从…...
300. 最长递增子序列
理解最长递增子序列(LIS)是解决该问题的关键。子序列是从给定数组中按顺序选取的元素序列,例如数组 [1, 2, 3, 4, 5] 的子序列可以是 [2, 3, 4]。需要注意的是,子序列的元素在原数组中不一定是连续的。因此,最长递增子…...
MongoDB入门
1.MongoDB 基本概念详解 2.MongoDB 快速实战 3.MongoDB 核心操作与原理详解 Mongo 是 humongous 的中间部分,在英文里是“巨大无比”的意思。所以 MongoDB 可以翻译 成“巨大无比的数据库”,更优雅的叫法是“海量数据库”。Mongodb是一款非关系型数据库…...
MySQL基础原理
目录 一、MySQL架构 1、四层架构 2、MySQL运行机制 二、MySQL存储引擎 1、不同存储引擎对比 2、InnoDB存储结构 2.1 内存结构 2.2 磁盘结构 3、日志先行策略 3.1 核心思想 3.2 关键组件与流程 3.3 数据安全保证 3.3.1 崩溃恢复 3.3.2 持久性保障 一、MySQL架构 …...
Python刷题练习
文章目录 1.寻找相同字串2.密钥格式化3.五键键盘的输出4.单词重量5.输出指定字母在字符串的中的索引6.污染水域7.九宫格按键输入8.任务最优调度9.高效的任务规划 1.寻找相同字串 题目描述: 给你两个字符串t和p,要求从t中找到一个和p相同的连续子串,并输…...
基于GPUGEEK 平台进行深度学习
一、平台简介 GPUGEEK 是一个专注于提供 GPU 算力租赁服务的平台,在人工智能与深度学习领域为用户搭建起便捷的算力桥梁。它整合了丰富多样的 GPU 资源,涵盖 RTX - 4090、RTX - 3090、A100 - PCIE 等多种型号,满足不同用户在模型训练、数据处…...
基于Matlab的非线性Newmark法用于计算结构动力响应
基于Matlab的非线性Newmark法用于计算结构动力响应,主要针对材料非线性或几何非线性问题。 1. Newmark法基本原理 Newmark法是一种隐式时间积分方法,通过预估-校正步骤更新位移、速度和加速度: 预测步: un1unΔtvn…...
Oracle — PL-SQL
介绍 Oracle PL/SQL是专为Oracle数据库设计的过程化编程语言,深度融合SQL语句与结构化编程逻辑,旨在高效处理复杂数据操作与业务规则。其核心特征为“块结构”,程序由声明、执行、异常处理三部分组成,支持模块化开发,显…...
第七节第二部分:接口的综合案例
案例分析 代码: Student类 package com.Interface_Demo;public class Student {private String name;private char sex;private double score;public Student() {}public Student(String name, char sex, double score) {this.name name;this.sex sex;this.scor…...
【AI古风美学渲染】:淡雅光影中的细腻呈现
“顶作AI”作为国内首个深度融合中文语义的生成式AI平台,以近百亿级参数的Lens跨模态模型为核心,开创了“自然语言即生产力”的创作模式。该平台突破传统工具对专业术语的依赖,用户仅需输入如“水墨风格的山间庭院,晨雾中若隐若现…...
JVM学习专题(二)内存模型深度剖析
目录 1.JVM结构体系 编辑 2.跨平台特性 3.JVM整体结构及内存模型 1.栈内存 1、栈帧: 1.局部变量表 2.操作数栈 3.动态链接 4.方法出口 2、创建对象 2.程序计数器: 3.方法区 4.堆 5.本地方法区 6.总结 1.JVM结构体系 JDK、JRE 和 JVM…...
Prometheus 的介绍与部署(入门)
一、什么是Prometheus; 1.介绍 Prometheus 是一个功能强大的监控工具,适用于各种环境。通过简单的安装和配置,可以快速实现对系统和服务的监控。无论是单机环境、容器化环境还是 Kubernetes 集群,Prometheus 都能提供灵活…...
JavaSwing之-JDialog
JavaSwing之-JDialog JDialog 是 Java Swing 中用于创建对话框窗口的容器类,继承自 Dialog 类(AWT),常用于显示临时信息、获取用户输入或执行模态操作。它是 javax.swing.JDialog 包中的类。 与 JFrame 不同的是,JDia…...
配置Nginx解决http host头攻击漏洞【详细步骤】
前言 大概内容: 安全系统渗透测试出host头攻击漏洞,下面是解决步骤,本人已测过无问题。 server_name aaabbb.com; if ($http_Host !~* ^127.0.0.1|aaabbb.com|localhost$){return 403;}...
如何用Redis实现分布式锁?RedLock算法的核心思想?Redisson的看门狗机制原理?
一、Redis分布式锁基础实现 public class RedisDistributedLock {private JedisPool jedisPool;private String lockKey;private String clientId;private int expireTime 30; // 默认30秒public boolean tryLock() {try (Jedis jedis jedisPool.getResource()) {// NX表示不…...
LeetCode 热题 100 35.搜索插入位置
目录 题目: 题目描述: 题目链接: 思路: 核心思路: 思路详解: 代码: Java代码: 题目: 题目描述: 题目链接: 35. 搜索插入位置 - 力扣&…...
电流检测放大器的优质选择XBLW-INA180/INA181
前言: 在当前复杂的国际贸易环境下,关税的增加使得电子元器件的采购成本不断攀升,电子制造企业面临着巨大的成本压力。为了有效应对这一挑战,实现国产化替代已成为众多企业降低生产成本、保障供应链稳定的关键战略。对此芯伯乐推出…...
序列化和反序列化:从理论到实践的全方位指南
你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…...
Leetcode (力扣)做题记录 hot100(62,64,287,108)
力扣第62题:不同路径 62. 不同路径 - 力扣(LeetCode) class Solution {public int uniquePaths(int m, int n) {int[][] array new int[m][n];for(int i 0;i<n;i){array[0][i] 1;}for(int i 0;i<m;i){array[i][0] 1;}for(int i …...
【Linux】shell内置命令fg,bg和jobs
Shell 内置命令 fg(foreground 的缩写)。它用于将后台挂起的任务恢复到前台运行。 例如: 假设你运行了一个耗时的 SVN 操作(如 svn update 或 svn checkout)。按下 CtrlZ 将该进程挂起到后台。输入 fg…...
鸿蒙OSUniApp 制作动态加载的瀑布流布局#三方框架 #Uniapp
使用 UniApp 制作动态加载的瀑布流布局 前言 最近在开发一个小程序项目时,遇到了需要实现瀑布流布局的需求。众所周知,瀑布流布局在展示不规则尺寸内容(如图片、商品卡片等)时非常美观和实用。但在实际开发过程中,我…...
通用软件项目技术报告 - 导读II
现在,我们正式进入报告的第三个主要领域:3. 领域三:核心业务逻辑与算法实现。 连接: 我们已经讨论了如何存储数据(领域一)和如何设计 API 让外部或内部服务可以访问这些数据或触发操作(领域二)。现在,我们将深入应用程序的“心脏”——实际执行业务规则、进行计算和(…...
新能源汽车三电质量护盾:蓝光三维扫描技术显身手
在绿色低碳的潮流下,新能源汽车行业快速发展,车企们纷纷加速电气化转型。由于电动汽车动力系统构造与内燃机车辆的构造有很大不同,制造商及其供应商必须加快工程研发设计及生产,而这对质量保证过程提出了新的挑战。 对于新能源汽…...