当前位置: 首页 > news >正文

Android(Kotlin)+ ML Kit:移动端英文数字验证码识别实战

1 概述与适用场景

在移动端直接对截图或拍照的英文数字验证码做识别,可以用于自动化测试、无障碍辅助或内部工具。使用 Google ML Kit 的 Text Recognition(可离线运行)可以避免服务端延迟。为了提升识别率,我们在前端加入图像预处理(灰度、二值化、去噪和放大)再送给 OCR。

2 环境与依赖
更多内容访问ttocr.com或联系1436423940
Android Studio Arctic Fox 或更高

Kotlin 1.5+

AndroidX

使用 ML Kit Text Recognition(on-device API)

在 app/build.gradle(module)中添加依赖(版本根据你的 Android Studio / Kotlin 版本微调):

dependencies {
implementation "androidx.appcompat:appcompat:1.4.0"
implementation "com.google.mlkit:text-recognition:16.0.0" // ML Kit on-device
implementation "com.google.android.material:material:1.4.0"
implementation "androidx.constraintlayout:constraintlayout:2.1.2"
}

(注:若你需要支持中文等,ML Kit 还有其他模型。本文只用默认英文数字识别。)

3 Android 权限与清单

在 AndroidManifest.xml 添加相机权限(若启用拍照):

并在 中保持默认设置。运行时要请求 CAMERA 权限(后面代码会示范)。

4 简单 UI(activity_main.xml)

创建一个极简界面,包含:拍照/选择按钮、ImageView 显示处理后图像、识别按钮、TextView 显示结果。

<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ImageViewandroid:id="@+id/imageView"android:layout_width="0dp"android:layout_height="0dp"android:contentDescription="captcha"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toTopOf="@+id/buttonRow"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"android:scaleType="fitCenter"android:adjustViewBounds="true"android:background="#EEE"/><LinearLayoutandroid:id="@+id/buttonRow"android:layout_width="0dp"android:layout_height="wrap_content"app:layout_constraintBottom_toTopOf="@+id/resultText"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"android:gravity="center"android:orientation="horizontal"android:padding="8dp"><Buttonandroid:id="@+id/btnSelect"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Select" /><Buttonandroid:id="@+id/btnCapture"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Capture"android:layout_marginStart="12dp"/><Buttonandroid:id="@+id/btnProcess"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Process+OCR"android:layout_marginStart="12dp"/>
</LinearLayout><TextViewandroid:id="@+id/resultText"android:layout_width="0dp"android:layout_height="wrap_content"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"android:padding="12dp"android:textSize="18sp"android:textColor="#111"/>

</androidx.constraintlayout.widget.ConstraintLayout>

5 Kotlin 主 Activity(核心逻辑)

下面给出 MainActivity.kt 的完整可运行骨架,包含:图片选择/拍照、处理函数(灰度、二值化、放大、去噪)、调用 ML Kit TextRecognizer、白名单过滤与结果显示。

// MainActivity.kt
package com.example.captchaocr

import android.Manifest
import android.app.Activity
import android.content.Intent
import android.graphics.*
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import com.google.mlkit.vision.common.InputImage
import com.google.mlkit.vision.text.TextRecognition
import java.io.IOException
import java.util.regex.Pattern

class MainActivity : AppCompatActivity() {

private lateinit var imageView: ImageView
private lateinit var resultText: TextViewprivate var currentBitmap: Bitmap? = nullprivate val pickImageLauncher =registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { ar ->if (ar.resultCode == Activity.RESULT_OK) {val data = ar.dataval uri = data?.datauri?.let { loadBitmapFromUri(it) }}}private val takePhotoLauncher =registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { ar ->if (ar.resultCode == Activity.RESULT_OK) {val bitmap = ar.data?.extras?.get("data") as? Bitmapbitmap?.let {currentBitmap = itimageView.setImageBitmap(it)}}}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), 0)setContentView(R.layout.activity_main)imageView = findViewById(R.id.imageView)resultText = findViewById(R.id.resultText)findViewById<Button>(R.id.btnSelect).setOnClickListener {val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)pickImageLauncher.launch(intent)}findViewById<Button>(R.id.btnCapture).setOnClickListener {val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)takePhotoLauncher.launch(intent)}findViewById<Button>(R.id.btnProcess).setOnClickListener {currentBitmap?.let { bmp ->val processed = preprocessForOCR(bmp)imageView.setImageBitmap(processed)runTextRecognition(processed)} ?: run {resultText.text = "No image loaded"}}
}private fun loadBitmapFromUri(uri: Uri) {try {val bmp = MediaStore.Images.Media.getBitmap(contentResolver, uri)currentBitmap = bmpimageView.setImageBitmap(bmp)} catch (e: IOException) {e.printStackTrace()}
}// ------- 图像预处理函数 -------
private fun preprocessForOCR(src: Bitmap): Bitmap {// 1. 灰度化val gray = toGrayscale(src)// 2. 放大(放大有助于小字体识别)val scaled = Bitmap.createScaledBitmap(gray, gray.width * 2, gray.height * 2, true)// 3. 轻度模糊去噪(可选)val denoised = gaussianBlur(scaled, 1)// 4. 自适应/固定阈值二值化val bin = thresholdOtsu(denoised)// 5. 可选:形态学操作(在 Android 上我们用简单的 dilate/erode 心得实现)val morph = simpleMorphology(bin)return morph
}private fun toGrayscale(src: Bitmap): Bitmap {val w = src.widthval h = src.heightval bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888)val canvas = Canvas(bmp)val paint = Paint()val cm = ColorMatrix()cm.setSaturation(0f)paint.colorFilter = ColorMatrixColorFilter(cm)canvas.drawBitmap(src, 0f, 0f, paint)return bmp
}private fun gaussianBlur(src: Bitmap, radius: Int): Bitmap {// 简单 box blur 代替,性能较好;可用 RenderScript/ScriptIntrinsicBlur(废弃)或第三方库if (radius <= 0) return srcval w = src.widthval h = src.heightval bmp = src.copy(Bitmap.Config.ARGB_8888, true)val pixels = IntArray(w*h)bmp.getPixels(pixels, 0, w, 0, 0, w, h)// 简单均值模糊 kernel size = 3val out = IntArray(w*h)for (y in 1 until h-1) {for (x in 1 until w-1) {var rSum=0; var gSum=0; var bSum=0for (ky in -1..1) {for (kx in -1..1) {val p = pixels[(y+ky)*w + (x+kx)]rSum += (p shr 16) and 0xFFgSum += (p shr 8) and 0xFFbSum += p and 0xFF}}val nr = (rSum/9)val ng = (gSum/9)val nb = (bSum/9)out[y*w+x] = (0xFF shl 24) or (nr shl 16) or (ng shl 8) or nb}}val outBmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888)outBmp.setPixels(out, 0, w, 0, 0, w, h)return outBmp
}private fun thresholdOtsu(src: Bitmap): Bitmap {val w = src.widthval h = src.heightval gray = IntArray(w*h)src.getPixels(gray, 0, w, 0, 0, w, h)val hist = IntArray(256)for (p in gray) {val v = (p shr 16) and 0xFF // R channel (灰度后 R=G=B)hist[v]++}val total = w*h// Otsuvar sum = 0for (t in 0..255) sum += t * hist[t]var sumB = 0var wB = 0var wF: Intvar varMax = 0.0var threshold = 0for (t in 0..255) {wB += hist[t]if (wB == 0) continuewF = total - wBif (wF == 0) breaksumB += t * hist[t]val mB = sumB.toDouble() / wBval mF = (sum - sumB).toDouble() / wFval between = wB.toDouble() * wF.toDouble() * (mB - mF) * (mB - mF)if (between > varMax) {varMax = betweenthreshold = t}}// apply thresholdval out = IntArray(w*h)for (i in gray.indices) {val v = (gray[i] shr 16) and 0xFFout[i] = if (v > threshold) Color.WHITE else Color.BLACK}val bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888)bmp.setPixels(out, 0, w, 0, 0, w, h)return bmp
}private fun simpleMorphology(src: Bitmap): Bitmap {// 简单膨胀 + 腐蚀实现,kernel 3x3val w = src.widthval h = src.heightval pixels = IntArray(w*h)src.getPixels(pixels, 0, w, 0, 0, w, h)val tmp = pixels.copyOf()// 膨胀(扩大白色区域)for (y in 1 until h-1) {for (x in 1 until w-1) {var anyWhite = falsefor (ky in -1..1) {for (kx in -1..1) {val v = tmp[(y+ky)*w + (x+kx)]if (v == Color.WHITE) { anyWhite = true; break }}if (anyWhite) break}pixels[y*w + x] = if (anyWhite) Color.WHITE else Color.BLACK}}val bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888)bmp.setPixels(pixels, 0, w, 0, 0, w, h)return bmp
}// ------- ML Kit 调用 -------
private fun runTextRecognition(bitmap: Bitmap) {val image = InputImage.fromBitmap(bitmap, 0)val recognizer = TextRecognition.getClient() // on-device recognizerrecognizer.process(image).addOnSuccessListener { visionText ->val raw = visionText.textval cleaned = filterAlphaNum(raw)resultText.text = "Raw: $raw\nCleaned: $cleaned"}.addOnFailureListener { e ->resultText.text = "Error: ${e.message}"}
}private fun filterAlphaNum(s: String): String {// 只保留大小写字母和数字,且移除空格与换行val pattern = Pattern.compile("[^A-Za-z0-9]")return pattern.matcher(s).replaceAll("").trim()
}

}

说明:

这段代码在 btnProcess 被点击时,完成预处理并调用 ML Kit 做识别。

toGrayscale 使用 ColorMatrix 做灰度化(效率好)。

thresholdOtsu 实现 Otsu 自适应阈值用于二值化。

runTextRecognition 使用 ML Kit 的 on-device API;识别完成后用 filterAlphaNum 做白名单过滤。

为简洁起见,图像处理函数没有做极致性能优化。实际 App 可把耗时操作放在后台线程(例如使用 Coroutine 或 ExecutorService)。

6 流程说明与测试

启动 App,点击 Select 选择相册中的验证码图片,或点击 Capture 拍照。

点击 Process+OCR,App 会先进行预处理(灰度、放大、去噪、二值化、形态学),把处理后的图像显示在 ImageView,然后调用 ML Kit 识别,并显示 Raw 和 Cleaned(只保留字母数字)的结果。

如果对识别不满意,可调整 thresholdOtsu 的后处理、放大倍数或形态学参数,再测试效果。

7 提升识别率的实战技巧

白名单更严格:如果验证码只包含数字,把 filterAlphaNum 改为只保留 0-9,并在 ML Kit 请求前后尽量限制字符。

放大倍数:把图片放大 1.5-3 倍通常能提高小字的识别率,但放太大影响性能。

多配置投票:对同一图像用两到三套不同阈值或滤波参数进行预处理,分别识别后投票决定最终结果。

字符分割:若验证码字符间隔明显,先做字符切割分别识别单字符(提高在干扰严重时的准确率)。

模型微调:ML Kit 的 on-device 模型不支持在设备上微调;如果需要高准确率,建议训练定制模型(CRNN/Transformer)并用 TensorFlow Lite 部署到移动端。

并发与异步:在 UI 线程外做预处理与识别,防止界面卡顿。使用 Kotlin Coroutines 是个好选择。

预处理 tuned per-site:不同验证码样式差异大,通常需要针对性调整阈值和去噪策略。

8 性能与用户体验建议

在处理大量图片或高分辨率图片时,以性能优先:先缩放到合适的尺寸再处理。

对于批量识别场景(例如测试脚本),可以把预处理与识别放到 WorkManager 或后台 Service 中运行。

显示处理后图像给用户可帮助调试识别效果与参数调整。

9 隐私与法律提醒

在实际对真实网站验证码做自动化识别前,请确保你有合法授权。不要用本技术绕过他人网站的安全机制或用于未授权的爬虫行为。

当在 App 中处理用户图片时,请尊重隐私,不上传用户数据到未经说明或未经授权的远程服务器。

相关文章:

Android(Kotlin)+ ML Kit:移动端英文数字验证码识别实战

1 概述与适用场景 在移动端直接对截图或拍照的英文数字验证码做识别,可以用于自动化测试、无障碍辅助或内部工具。使用 Google ML Kit 的 Text Recognition(可离线运行)可以避免服务端延迟。为了提升识别率,我们在前端加入图像预处理(灰度、二值化、去噪和放大)再送给 OC…...

用Android(Kotlin)+ ML Kit:移动端英文数字验证码识别实战

1 概述与适用场景 在移动端直接对截图或拍照的英文数字验证码做识别,可以用于自动化测试、无障碍辅助或内部工具。使用 Google ML Kit 的 Text Recognition(可离线运行)可以避免服务端延迟。为了提升识别率,我们在前端加入图像预处理(灰度、二值化、去噪和放大)再送给 OC…...

“人工智能+”的坚硬内核,边缘地带的“数字火种”:大模型如何烧出一片新天地

本文由大模型根据作者提问生成,仅修改标题。一场由“失业工程师+过气博主+快烂了的瓜”引发的变革,正悄然重塑中国AI的商业逻辑。如果你只关注科技头条,你会觉得AI的故事属于巨头:万亿参数、军备竞赛、AGI威胁论。但在主流视野之外,真正的革命正在边缘地带发生。这里没有光…...

详细介绍:10:00开始面试,10:06就出来了,问的问题有点变态。。。

详细介绍:10:00开始面试,10:06就出来了,问的问题有点变态。。。pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier Ne…...

PHP启动报错:liboing.so.5:cannot op如何处理?

在 PHP 启动时报错 liboing.so.5: cannot open shared object file: No such file or directory 是因为系统无法找到或加载 liboing.so.5 共享库。这通常是由于以下原因之一导致的:库文件缺失:系统中没有安装 liboing.so.5 文件。 路径未配置:系统未正确配置动态链接库路径。…...

时空倒流 Time - 题解

设 \(x\) 轮为负操作,\(y\) 轮为正操作,\(d\) 为需要修改的差值(正负同理,取正即可),那么可更改成的范围为 \(-x \times R +y*L \sim -x*L+y*R\),令上式为 \(M \sim N\),易得 M 为最小的可能值,N 为最大的可能值,可通过不断给 M 加 1,使 M 变成 N。 综上,枚举 \(x \…...

202508_QQ_XORPNG

Tags:XOR,PNGLSB 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202508_QQ_XOR&PNG 0x01. WP 01.十六进制编辑器核对 打开发现文件内容并非PNG常见文件头,尝试与常见PNG文件头XOR发现循环的KEY为kelaibe…...

Voice Agent 全球开发者比赛,TEN Dev Challenge 2025 等你来战!

TEN Dev Challenge 2025 全球开发者大赛现已启动,本次赛事聚焦实时交互与对话式AI领域,面向全球开发者开放参与通道。无论您是独立开发者,还是 3 人以内的小型开发团队,均可通过线上形式参与,并有机会角逐总计 1.1 万美元奖金,同时获得行业级展示与合作资源。💰 USD 11…...

第02周 预习:Java基础语法2、面向对象入门 - hohohoho--

第02周 预习:Java基础语法2、面向对象入门项目名称 内容课程名称 java班级 网安2413学生姓名 王璐学号 202421336068预习 1.1 学习目标掌握引用类型及常见类:数组、数组列表(ArrayList)、方法及引用类型作为方法参数 掌握类、对象、方法、属性相关基本概念,对象的初始化。 能…...

第六届机器学习与计算机应用国际学术会议(ICMLCA 2025)

第六届机器学习与计算机应用国际学术会议(ICMLCA 2025) 2025 6th International Conference on Machine Learning and Computer Application(ICMLCA 2025) 第六届机器学习与计算机应用国际学术会议(ICMLCA 2025)定于2025年10月17-19日在中国深圳隆重举行。本届会议将主要关注…...

设计模式-享源模式 - MaC

什么是享元模式? 享元模式是一种结构型设计模式,它通过共享技术来有效地支持大量细粒度的对象。享元模式通过共享已经存在的对象来减少创建对象的数量,从而减少内存占用和提高性能。 享元模式包含以下角色:享元接口(Flyweight):声明一个接口,通过它可以接受并作用于外部状…...

# 数论知识讲解与C++代码:唯一分解定理、辗转相除法、埃氏筛与线性筛(含质因数分解示例)

C++ 模板:唯一分解定理、辗转相除法、埃氏筛与线性筛(含质因数分解示例) 下面给出一套实用的 C++ 模板,包含:辗转相除法(求 gcd / lcm) 试除法的质因数分解(适合小到中等 n) 使用埃氏筛预生成素数(并用于分解) 线性筛(线性时间生成素数,并可得到每个数的最小质因子…...

第九届交通工程与运输系统国际学术会议(ICTETS 2025)

第九届交通工程与运输系统国际学术会议(ICTETS 2025) 2025 9th International Conference on Traffic Engineering and Transportation System (ICTETS 2025) 第九届交通工程与运输系统国际学术会议(ICTETS 2025)将由大连理工大学主办,大连理工大学建设工程学院交通运输系…...

小红书开源 FireRedTTS-2;全栈开源应用+嵌入式+电路设计:BUDDIE AI 语音交互方案丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…...

深度解析 ADC 偶联技术:从随机偶联到定点偶联,如何平衡抗肿瘤 ADC 的活性、稳定性与均一性?

抗体药物偶联物(ADC)作为 “精准抗癌利器”,通过重组单克隆抗体的靶向性与小分子细胞毒性药物的高活性结合,实现了 “靶向递送、精准杀伤” 的治疗理念 —— 既降低了小分子毒素对正常细胞的毒副作用,又提升了肿瘤治疗的疗效,已成为近年来抗肿瘤药物研发的核心赛道。然而…...

豆包P图大更新,网友们已经玩嗨了。

https://news.cnblogs.com/n/800390/最近,大伙有没有感觉互联网被 AI 图片占领了。不是刷到朋友圈的大伙自己搓的手办。。神秘锅哥就是刷到大伙和各路大佬的偶遇合照。。怎么像有人一夜之间给地球开了个创造模式,想创啥就创啥,就我连篇稿都创不出来是吧?关注 AI 圈的差友应…...

【初赛】无向图度数性质 - Slayer

无向图度数性质 一、基础概念:顶点度数定义 在无向图 $ G = (V, E) $ 中:顶点 $ v \in V $ 的度数 $ \deg(v) $ 指关联于该顶点的边的数量 特殊情况:环($ (v, v) $)对 $ \deg(v) $ 贡献 2 孤立点度数为 0 非环边 $ (u, v) $ 对 $ \deg(u) $ 和 $ \deg(v) $ 各贡献 1二、核…...

$p\oplus q=r$

很牛很好的题,但不知道为什么 qoj 这么多踩。 原题/原题 简介题面:问题 A:构造两个长度为 \(n\) 的包含 \(0\sim n-1\) 的排列 \(p,q\),使得 \(r=p\oplus q\) 也是个排列。首先特判 \(n=1\)。然后发现 \(\oplus_{i=0}^{n-1} r_i=\oplus_{i=0}^{n-1} q_i\oplus_{i=0}^{n-1}q…...

2025年金融行业API安全最佳实践:构建纵深防御体系

2025年金融行业API安全最佳实践:构建纵深防御体系金融行业数字化转型深度依赖API技术,开放业务模式也带来新的安全挑战。构建有效的API安全防护体系需覆盖全生命周期,结合管理要求、技术工具和运营机制,并借鉴行业实践案例。提出关键实践方法与实施框架金融行业数字化转型深…...

Jack-of-All-Trades

Jack-of-All-Trades 一、信息收集先使用nmap扫一下Ip看看开放了哪些端口,这里很奇怪,22端口上面却是部署着http协议,看了一下wp这里要使用浏览器绕过这个限制nmap -sS -A -Pn 10.10.196.165 这里使用firefox,在导航栏里面搜索about config然后再出来的搜索框这里再搜索netw…...

Matlab的交通标志定位实现

基于Matlab的交通标志定位实现方案,结合颜色分割、形态学处理和轮廓分析技术一、代码 %% 参数设置 imgPath = traffic_sign.jpg; minArea = 500; % 最小区域面积 maxArea = 10000; % 最大区域面积 colorThreshold = 0.8; % 颜色相似度阈值%% 图像预处理 img = imread(imgP…...

怎样在 Salesforce Flow 中获取当前 Salesforce 组织的 URL

可以在 Flow 中配置一个 Formula 类型的变量: LEFT($Api.Partner_Server_URL_260, FIND( /services, $Api.Partner_Server_URL_260))...

reLeetCode 热题 100-3 最长连续序列扩展 排序算法 - MKT

reLeetCode 热题 100-3 最长连续序列扩展 排序算法...

vuejs3.0 从入门到精通【左扬精讲】—— 从原生到原子化:一文梳理现代 CSS 技术体系(2025 版)

vuejs3.0 从入门到精通【左扬精讲】—— 从原生到原子化:一文梳理现代 CSS 技术体系(2025 版)作为前端开发的核心技术之一,CSS(层叠样式表)早已不是 “写几行样式” 那么简单。随着项目规模扩大和工程化需求升级,CSS 技术栈也衍生出众多分支 —— 从解决复用性的预处理器…...

java中JSON字符串处理的踩坑

在处理JSON字符串的时候,读取的数据原封不动每一行是,前后有两个引号"{\"cuidC54E92418CA1CD099A5AFC4D2F322015|VECB5VMT4\": {\"REFINED_APPLIST_TIMESTAMP\": 1756716480, \"DEVICE_INFO\": {\"SOURCE\": 131072, \"br…...

11111

1111111111...

阿里云微服务引擎 MSE 及 API 网关 2025 年 8 月产品动态

...

TIA Portal中S7-1500F CPU与ET200SP安全模块的配置例程(转载)

ET200SP 分布式 IO 系统除 ET200SP 标准模块外,还包含故障安全模块。具有 PROFINET接口的安全 CPU 与配有故障安全模块的 ET200SP IO设备可以实现安全功能。配置过程与标准系统中一样,通过在硬件组态中进行网络连接,并在在线状态下分配从站的设备名称。ET200SP上的故障安全模…...

获取第一个运行的Word应用程序实例

获取第一个运行的COM应用程序实例1 using System;2 using System.Collections.Generic;3 using System.Runtime.InteropServices;4 using System.Runtime.InteropServices.ComTypes;5 6 /// <summary>7 /// 提供查询运行中COM对象的改进方案8 /// </summary>9 publ…...

S7-1500 TRACE功能组态 (转载)

1、TRACE配置介绍1.1、新建TRACE配置 在TIA博途软件中,双击项目树相应PLC站点下的“Traces”,展开后来实现TRACE的各项功能,TRACE在线视图如图2所示。图2. 创建TRACE ①点击“添加新Trace”,用于新建Trace配置;② 为目前离线文件和CPU已装载有相同名称的TRACE; 为目前仅…...

如何在Proxmox VE中使用fdisk命令行扩展LVM存储池 - 若

前言 在Proxmox VE(PVE)的使用过程中,为虚拟机和容器添加额外的存储空间是一项常见任务。当你为服务器新增了一块硬盘后,Web管理界面有时可能无法提供所有所需的图形化操作选项。本篇教程将介绍如何完全通过命令行,使用经典的 fdisk 和 lvm 工具,安全地将一块新硬盘添加到…...

垃圾AV覆盖defender

免责声明 本文章涉及的内容仅用于安全研究、学习和技术讨论,不针对任何杀毒软件进行虚假陈述或恶意操作。文中所提及的软件及操作均不旨在贬低、攻击或损害其品牌、名誉及正常功能。请读者仅在合法、受控的环境下进行实验和测试,作者对因使用本文内容而产生的任何后果不承担责…...

SAP-PO:怎么控制传输的内容在单数据情况下是数组格式还是单对象格式

像下图,没设置前是对象格式 设置后是数组格式 可以在CC的Custom XML/JSON Comversion Rules下进行设置 sender通道是在general第一个页签 receiver是在dataformat页签 如果字段为空则在结构中就不会显示该字段,需要在函数中可以配置一下...

开源新基建:数字中国创新发展的底层密码与生态实践

开源新基建:数字中国创新发展的底层密码与生态实践 在全球数字化转型加速的背景下,开源技术已从开发者工具演变为国家数字战略的核心基础设施。中国正通过构建自主可控的开源生态体系,打造数字经济发展的安全基座,这一战略布局正在重塑产业创新范式并创造显著的商业价值。最…...

员工离职停用Salesforce帐号?这11个“坑”千万别踩!

在Salesforce里,用户离职很常见,看似只是一个“停用账号”的小操作。但如果涉及到管理员(Admin)账号,情况就完全不同。管理员往往绑定了大量的报表、自动化流程和系统配置,一旦处理不当,轻则报表失效、流程中断,重则影响关键业务。 本文结合实践,总结了停用Salesforce…...

Linux的运行模式

在 Linux 系统中,getenforce 是一个用于查询 SELinux(Security-Enhanced Linux)当前运行模式的命令。 SELinux 是一种强制访问控制(MAC)安全机制,它有三种主要运行模式: Enforcing(强制模式):SELinux 会强制执行所有安全策略,违反策略的操作会被阻止并记录日志 Perm…...

Spring Boot + MybatisX,效率翻倍!

1.什么是MybatisX? 2.使用MybatisX的好处 3.如何使用MybatisX?1.什么是MybatisX? MybatisX 是一款基于 IDEA 的快速开发插件,方便在使用mybatis以及mybatis-plus开始时简化繁琐的重复操作,提高开发速率。 2.使用MybatisX的好处节省大量持久层代码开发时间 强大的功能为业务…...

条码控件Aspose.BarCode教程:使用 Java 自动生成 DotCode 条形码

DotCode 是一种二维条码符号,广泛应用于制造业和制药业等行业。这种条码简化了创建机器可读代码的流程,从而提升了物流效率。借助Aspose.BarCode for Java,我们可以构建一个工具,以 Java 编程方式自动生成 DotCode 条码。此 Java SDK 允许您自定义属性并将条码导出为图像格…...

AI 玩转网页自动化无压力:基于函数计算 FC 构建 Browser Tool Sandbox

从 Web 1.0 到 Web2.0,再到单页应用(SPA)和 React/Vue 等前端框架时代,再到当下的 AI Agent 时代。每个阶段都有当时的浏览器自动化的王者。作者:计缘 浏览器自动化的前世今生 从 Web 1.0 到 Web2.0,再到单页应用(SPA)和 React/Vue 等前端框架时代,再到当下的 AI Agen…...

AI时代的全栈框架:独立开发者的机会与挑战

独立开发者终于能全干了?AI帮忙还愁生态?一体性是王道,但选什么框架还得自己纠结。AI写代码真靠谱?前言 本文本来只是 DjangoStarter v3.2.1 新版本发布博客里的一段思考,不过越写越长,干脆拆分成一篇独立的文章得了。😄全栈这个词已经被喊烂了,但在 AI 时代,它的含义…...

创建逻辑卷

查看创建pv创建vg创建lv...

Server 13 ,CentOS 上使用 Nginx 部署多个前端项目完整指南( 协助多端口与脚本自动化 )

Server 13 ,CentOS 上使用 Nginx 部署多个前端项目完整指南( 协助多端口与脚本自动化 )pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&quo…...

洛谷P2490 [SDOI2011] 黑白棋

传送门 首先容易想到,白色棋子与其右边的黑色棋子越靠越近,最后挨在一起,与其他棋子无关。 朴素地想到 \(NimK\) 的建模,一共有 \(\dfrac{k}{2}\) 堆石子,每次取 \(d\) 堆。 注意到必胜局面比较难求,适合正难则反,用总方案数 \(\dbinom{n}{k}\) 减去必败局势。 难点在于…...

WGCLOUD的告警日志在哪儿存贮的?

WGCLOUD所有发送的告警消息都存贮在【系统日志】模块里 WGCLOUD系统日志功能模块,用于存贮系统操作的各种记录,也包括各种系统运行的日志信息,告警通知信息,告警恢复信息 所有系统运行产生的错误日志,操作日志,告警日志都会记录在系统日志中 系统日志记录只能查看,不能删…...

传统软件部署的痛点

这是对之前《Docker 容器化》文章的一个补充 在 Docker 等容器技术普及前,开发、测试、运维团队常被环境不一致、部署复杂、资源浪费、扩容低效为典型的问题困扰,这些问题不仅可能导致项目的交付周期的延后,还会引发跨团队协作矛盾,甚至导致线上故障,我们逐一来看每个问题…...

HarmonyOS 5分布式数据管理初探:实现跨设备数据同步

本文将引导您了解HarmonyOS 5的分布式数据管理能力,并通过一个简单的示例演示如何实现跨设备数据同步。1. 分布式数据管理简介 HarmonyOS的分布式数据管理能力允许应用程序在多个设备之间无缝地同步和共享数据。它抽象了底层设备差异,让开发者可以像操作本地数据一样处理跨设…...

qoj965 Trade

题意 有 \(n\) 件商品,第 \(i\) 件商品有基准价格 \(c_i\) 和抬价价格 \(p_i\),\(p_i\) 互不相同,每件商品只能买一件,你有 \(S\) 元钱。 若你买了 \(k\) 件商品,则第 \(i\) 件商品的价格为 \(c_i+k\times p_i\)。问你最多能买多少件商品。 \(1\le c_i\le 10^9,0\le p_i,S…...

复盘我的第一个 大模型Agent:从核心循环到模块化架构的演进之路

本文将以我编写的一个 Go Agent Demo 为例,穿透各类框架的表层封装,回归其工程本质。我将首先分析其核心的 ReAct 循环,并展示这个看似简单的循环是如何通过模块化设计,演进为一个结构化、可扩展的软件系统。最近,我投入了一些时间学习和研究大语言模型(LLM)驱动的 Agen…...

Linux内核不使用bear如何快速生成compile_commands.json使用vscode阅读源码

野火鲁班猫SDK 进入内核目录 cd /opt/LubanCat_SDK/kernel-5.10 编译内核 ../build.sh kernel 生成compile_commands.json /opt/LubanCat_SDK/kernel-5.10/scripts/clang-tools/gen_compile_commands.py打开vscode code . 安装clangd插件 打开一个c文件 开始生成clangd数据库...

Docker 容器化

引言 在解释docker是什么之前,我们首先应该先了解的是容器化的概念。 什么是容器?就是一个沙箱,在这个沙箱中涵盖了特定应用运行的一切依赖的内容。但他不是一个操作系统,且和底层的操作系统是隔离的。 什么是容器化?容器化就是将软件和应用所需要的所有依赖打包到一个独立…...