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

SearchIndexablesProvider

  1. 实现的 provider
    根据索引添加文档可知,该 provider 需要继承自 frameworks/base/core/java/android/provider/SearchIndexablesProvider.java 类,并且添加权限 android.permission.READ_SEARCH_INDEXABLES。过滤 Settings 代码,可以轻易找到:






3. queryXmlResources 实现
以 queryXmlResources 方法为例,该方法用于查询 xml 文件添加的索引数据。

@Override
public Cursor queryXmlResources(String[] projection) {
// 构建 cursor
final MatrixCursor cursor = new MatrixCursor(INDEXABLES_XML_RES_COLUMNS);
final List resources =
getSearchIndexableResourcesFromProvider(getContext());
// 遍历返回的数组,填充 cursor
for (SearchIndexableResource val : resources) {
final Object[] ref = new Object[INDEXABLES_XML_RES_COLUMNS.length];
ref[COLUMN_INDEX_XML_RES_RANK] = val.rank;
ref[COLUMN_INDEX_XML_RES_RESID] = val.xmlResId;
ref[COLUMN_INDEX_XML_RES_CLASS_NAME] = val.className;
ref[COLUMN_INDEX_XML_RES_ICON_RESID] = val.iconResId;
ref[COLUMN_INDEX_XML_RES_INTENT_ACTION] = val.intentAction;
ref[COLUMN_INDEX_XML_RES_INTENT_TARGET_PACKAGE] = val.intentTargetPackage;
ref[COLUMN_INDEX_XML_RES_INTENT_TARGET_CLASS] = null; // intent target class
cursor.addRow(ref);
}

return cursor;

}
可以看到,queryXmlResources 方法返回了一个 MatrixCursor 对象,该对象填充了 getSearchIndexableResourcesFromProvider 方法返回的数组。

private List getSearchIndexableResourcesFromProvider(Context context) {
// 根据 SearchFeatureProvider 对象获取 SearchIndexableResources 对象
// 然后拿到一个 Set 集合
final Collection bundles = FeatureFactory.getFeatureFactory()
.getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();
List resourceList = new ArrayList<>();

for (SearchIndexableData bundle : bundles) {// 通过 SearchIndexableData 获取 SearchIndexProvider 对象Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();final List<SearchIndexableResource> resList =// getXmlResourcesToIndex 获取到 SearchIndexableResourceprovider.getXmlResourcesToIndex(context, true);if (resList == null) {continue;}for (SearchIndexableResource item : resList) {item.className = TextUtils.isEmpty(item.className)? bundle.getTargetClass().getName(): item.className;}resourceList.addAll(resList);
}return resourceList;

}
其他查询数据的方法可自行查看源码。

  1. SearchIndexableResources 生成
    可查看文件:frameworks/base/packages/SettingsLib/search/processor-src/com/android/settingslib/search/IndexableProcessor.java

/**

  • Annotation processor for {@link SearchIndexable} that generates {@link SearchIndexableResources}

  • subclasses.
    */
    @SupportedSourceVersion(SourceVersion.RELEASE_17)
    @SupportedOptions(IndexableProcessor.PACKAGE_KEY)
    // 声明该 processor 支持处理的注解类型
    @SupportedAnnotationTypes({“com.android.settingslib.search.SearchIndexable”})
    public class IndexableProcessor extends AbstractProcessor {

    // 定义生成文件的默认包名和类名
    private static final String SETTINGSLIB_SEARCH_PACKAGE = “com.android.settingslib.search”;
    private static final String CLASS_BASE = “SearchIndexableResourcesBase”;
    private static final String CLASS_MOBILE = “SearchIndexableResourcesMobile”;
    private static final String CLASS_TV = “SearchIndexableResourcesTv”;
    private static final String CLASS_WEAR = “SearchIndexableResourcesWear”;
    private static final String CLASS_AUTO = “SearchIndexableResourcesAuto”;
    private static final String CLASS_ARC = “SearchIndexableResourcesArc”;

    static final String PACKAGE_KEY = “com.android.settingslib.search.processor.package”;

    private String mPackage;
    private Filer mFiler;
    private Messager mMessager;
    private boolean mRanOnce;

    @Override
    public boolean process(Set<? extends TypeElement> annotations,
    RoundEnvironment roundEnvironment) {
    if (mRanOnce) {
    // Will get called once per round, but we only want to run on the first one.
    return true;
    }
    mRanOnce = true;

     // 获取 SearchIndexableData 的 全类名final ClassName searchIndexableData =ClassName.get(SETTINGSLIB_SEARCH_PACKAGE, "SearchIndexableData");// 定义字段 mProvidersfinal FieldSpec providers = FieldSpec.builder(ParameterizedTypeName.get(ClassName.get(Set.class),searchIndexableData),"mProviders",Modifier.PRIVATE, Modifier.FINAL).initializer("new $T()", HashSet.class).build();// 定义方法 addIndex,用于向 mProviders 中添加 SearchIndexableDatafinal MethodSpec addIndex = MethodSpec.methodBuilder("addIndex").addModifiers(Modifier.PUBLIC).addParameter(searchIndexableData, "indexClass").addCode("$N.add(indexClass);\n", providers).build();// 定义构造函数final MethodSpec.Builder baseConstructorBuilder = MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC);final MethodSpec.Builder mobileConstructorBuilder = MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC);final MethodSpec.Builder tvConstructorBuilder = MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC);final MethodSpec.Builder wearConstructorBuilder = MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC);final MethodSpec.Builder autoConstructorBuilder = MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC);final MethodSpec.Builder arcConstructorBuilder = MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC);// 遍历带 @SearchIndexable 注解的类,提取for (Element element : roundEnvironment.getElementsAnnotatedWith(SearchIndexable.class)) {if (element.getKind().isClass()) {// 提取类名Name className = element.accept(new SimpleElementVisitor8<Name, Void>() {@Overridepublic Name visitType(TypeElement typeElement, Void aVoid) {return typeElement.getQualifiedName();}}, null);if (className != null) {SearchIndexable searchIndexable = element.getAnnotation(SearchIndexable.class);// 提取 forTarget,指定适用于哪些设备int forTarget = searchIndexable.forTarget();MethodSpec.Builder builder = baseConstructorBuilder;if (forTarget == SearchIndexable.ALL) {builder = baseConstructorBuilder;} else if ((forTarget & SearchIndexable.MOBILE) != 0) {builder = mobileConstructorBuilder;} else if ((forTarget & SearchIndexable.TV) != 0) {builder = tvConstructorBuilder;} else if ((forTarget & SearchIndexable.WEAR) != 0) {builder = wearConstructorBuilder;} else if ((forTarget & SearchIndexable.AUTO) != 0) {builder = autoConstructorBuilder;} else if ((forTarget & SearchIndexable.ARC) != 0) {builder = arcConstructorBuilder;}builder.addCode("$N(new com.android.settingslib.search.SearchIndexableData($L.class, $L"+ ".SEARCH_INDEX_DATA_PROVIDER));\n",addIndex, className, className);} else {throw new IllegalStateException("Null classname from " + element);}}}// 定义方法 getProviderValues,用于返回 mProvidersfinal MethodSpec getProviderValues = MethodSpec.methodBuilder("getProviderValues").addAnnotation(Override.class).addModifiers(Modifier.PUBLIC).returns(ParameterizedTypeName.get(ClassName.get(Collection.class),searchIndexableData)).addCode("return $N;\n", providers).build();// 基类final TypeSpec baseClass = TypeSpec.classBuilder(CLASS_BASE).addModifiers(Modifier.PUBLIC).addSuperinterface(ClassName.get(SETTINGSLIB_SEARCH_PACKAGE, "SearchIndexableResources")).addField(providers).addMethod(baseConstructorBuilder.build()).addMethod(addIndex).addMethod(getProviderValues).build();final JavaFile searchIndexableResourcesBase = JavaFile.builder(mPackage, baseClass).build();// 子类final JavaFile searchIndexableResourcesMobile = JavaFile.builder(mPackage,TypeSpec.classBuilder(CLASS_MOBILE).addModifiers(Modifier.PUBLIC).superclass(ClassName.get(mPackage, baseClass.name)).addMethod(mobileConstructorBuilder.build()).build()).build();...// 写入文件try {searchIndexableResourcesBase.writeTo(mFiler);searchIndexableResourcesMobile.writeTo(mFiler);searchIndexableResourcesTv.writeTo(mFiler);searchIndexableResourcesWear.writeTo(mFiler);searchIndexableResourcesAuto.writeTo(mFiler);searchIndexableResourcesArc.writeTo(mFiler);} catch (IOException e) {mMessager.printMessage(Kind.ERROR, "Error while writing file: " + e);}return true;
    

    }

    // 初始化
    @Override
    public synchronized void init(ProcessingEnvironment processingEnvironment) {
    super.init(processingEnvironment);
    mPackage = processingEnvironment.getOptions()
    .getOrDefault(PACKAGE_KEY, SETTINGSLIB_SEARCH_PACKAGE);
    mFiler = processingEnvironment.getFiler();
    mMessager = processingEnvironment.getMessager();
    }
    }

// 生成的部分文件
// SearchIndexableData
public class SearchIndexableData {
private final Class mTargetClass;
private final Indexable.SearchIndexProvider mSearchIndexProvider;

public SearchIndexableData(Class targetClass, Indexable.SearchIndexProvider provider) {this.mTargetClass = targetClass;this.mSearchIndexProvider = provider;
}public Class getTargetClass() {return this.mTargetClass;
}public Indexable.SearchIndexProvider getSearchIndexProvider() {return this.mSearchIndexProvider;
}

}

// SearchIndexableResourcesMobile
public class SearchIndexableResourcesMobile extends SearchIndexableResourcesBase {
public SearchIndexableResourcesMobile() {
this.addIndex(new SearchIndexableData(DisplaySettings.class, DisplaySettings.SEARCH_INDEX_DATA_PROVIDER));

}
}

// SearchIndexableResourcesBase
public class SearchIndexableResourcesBase implements SearchIndexableResources {
private final Set mProviders = new HashSet();

public SearchIndexableResourcesBase() {this.addIndex(new SearchIndexableData(LegalSettings.class, LegalSettings.SEARCH_INDEX_DATA_PROVIDER));...
}public void addIndex(SearchIndexableData indexClass) {this.mProviders.add(indexClass);
}public Collection<SearchIndexableData> getProviderValues() {return this.mProviders;
}

}
5. queryNonIndexableKeys 实现
queryNonIndexableKeys 方法用于查询非索引键。

@Override
public Cursor queryNonIndexableKeys(String[] projection) {
// 构建 MatrixCursor
final MatrixCursor cursor = new MatrixCursor(NON_INDEXABLES_KEYS_COLUMNS);
// 获取非索引键
final List nonIndexableKeys = getNonIndexableKeysFromProvider(getContext());
for (String nik : nonIndexableKeys) {
final Object[] ref = new Object[NON_INDEXABLES_KEYS_COLUMNS.length];
ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] = nik;
cursor.addRow(ref);
}

return cursor;

}
getNonIndexableKeysFromProvider 方法接收 Context 对象,并返回一个 List,其中包含所有非索引键。

private List getNonIndexableKeysFromProvider(Context context) {
// 获取 SearchIndexableData 数据集
final Collection bundles = FeatureFactory.getFeatureFactory()
.getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();

final List<String> nonIndexableKeys = new ArrayList<>();for (SearchIndexableData bundle : bundles) {final long startTime = System.currentTimeMillis();// 获取 Indexable.SearchIndexProvider 对象Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();List<String> providerNonIndexableKeys;try {// 各个 provider 实现的 getNonIndexableKeys 方法providerNonIndexableKeys = provider.getNonIndexableKeys(context);} catch (Exception e) {// Catch a generic crash. In the absence of the catch, the background thread will// silently fail anyway, so we aren't losing information by catching the exception.// We crash when the system property exists so that we can test if crashes need to// be fixed.// The gain is that if there is a crash in a specific controller, we don't lose all// non-indexable keys, but we can still find specific crashes in development.if (System.getProperty(SYSPROP_CRASH_ON_ERROR) != null) {throw new RuntimeException(e);}Log.e(TAG, "Error trying to get non-indexable keys from: "+ bundle.getTargetClass().getName(), e);continue;}...nonIndexableKeys.addAll(providerNonIndexableKeys);
}return nonIndexableKeys;

}
6. Indexable.SearchIndexProvider 的实现
设置中实现该接口的是 BaseSearchIndexProvider,具体逻辑:

public class BaseSearchIndexProvider implements Indexable.SearchIndexProvider {
public BaseSearchIndexProvider() {
}

public BaseSearchIndexProvider(int xmlRes) {mXmlRes = xmlRes;
}// 初始化 SearchIndexableResource 并返回,提供了 xmlResId
@Override
public List<SearchIndexableResource> getXmlResourcesToIndex(Context context, boolean enabled) {if (mXmlRes != 0) {final SearchIndexableResource sir = new SearchIndexableResource(context);sir.xmlResId = mXmlRes;return Arrays.asList(sir);}return null;
}
...// 获取非索引键
@Override
@CallSuper
public List<String> getNonIndexableKeys(Context context) {final List<String> nonIndexableKeys = new ArrayList<>();if (!isPageSearchEnabled(context)) {// Entire page should be suppressed, mark all keys from this page as non-indexable.nonIndexableKeys.addAll(getNonIndexableKeysFromXml(context, true /* suppressAllPage */));nonIndexableKeys.addAll(getRawDataToIndex(context, true /* enabled */).stream().map(data -> data.key).collect(Collectors.toList()));return nonIndexableKeys;}nonIndexableKeys.addAll(getNonIndexableKeysFromXml(context, false /* suppressAllPage */));final List<AbstractPreferenceController> controllers = getPreferenceControllers(context);if (controllers != null && !controllers.isEmpty()) {for (AbstractPreferenceController controller : controllers) {if (controller instanceof PreferenceControllerMixin) {((PreferenceControllerMixin) controller).updateNonIndexableKeys(nonIndexableKeys);} else if (controller instanceof BasePreferenceController) {((BasePreferenceController) controller).updateNonIndexableKeys(nonIndexableKeys);} else {Log.e(TAG, controller.getClass().getName()+ " must implement " + PreferenceControllerMixin.class.getName()+ " treating the key non-indexable");nonIndexableKeys.add(controller.getPreferenceKey());}}}return nonIndexableKeys;
}// 获取界面控制器
public List<AbstractPreferenceController> getPreferenceControllers(Context context) {List<AbstractPreferenceController> controllersFromCode = new ArrayList<>();try {controllersFromCode = createPreferenceControllers(context);} catch (Exception e) {Log.w(TAG, "Error initializing controller in fragment: " + this + ", e: " + e);}final List<SearchIndexableResource> res = getXmlResourcesToIndex(context, true);if (res == null || res.isEmpty()) {return controllersFromCode;}List<BasePreferenceController> controllersFromXml = new ArrayList<>();for (SearchIndexableResource sir : res) {controllersFromXml.addAll(PreferenceControllerListHelper.getPreferenceControllersFromXml(context, sir.xmlResId));}controllersFromXml = PreferenceControllerListHelper.filterControllers(controllersFromXml,controllersFromCode);final List<AbstractPreferenceController> allControllers = new ArrayList<>();if (controllersFromCode != null) {allControllers.addAll(controllersFromCode);}allControllers.addAll(controllersFromXml);return allControllers;
}
...private List<String> getKeysFromXml(Context context, @XmlRes int xmlResId,boolean suppressAllPage) {final List<String> keys = new ArrayList<>();try {// 解析 xml 文件final List<Bundle> metadata = PreferenceXmlParserUtils.extractMetadata(context,xmlResId, FLAG_NEED_KEY | FLAG_INCLUDE_PREF_SCREEN | FLAG_NEED_SEARCHABLE);for (Bundle bundle : metadata) {// 判断 suppressAllPage 或 settings:searchable 配置的属性if (suppressAllPage || !bundle.getBoolean(METADATA_SEARCHABLE, true)) {keys.add(bundle.getString(METADATA_KEY));}}} catch (IOException | XmlPullParserException e) {Log.w(TAG, "Error parsing non-indexable from xml " + xmlResId);}return keys;
}

}
如上,可以根据 BaseSearchIndexProvider 的实现,控制某个页面是否索引,或者控制某个页面的某个键是否索引。

每个页面可单独实现对应的方法来控制索引。

相关文章:

SearchIndexablesProvider

实现的 provider 根据索引添加文档可知&#xff0c;该 provider 需要继承自 frameworks/base/core/java/android/provider/SearchIndexablesProvider.java 类&#xff0c;并且添加权限 android.permission.READ_SEARCH_INDEXABLES。过滤 Settings 代码&#xff0c;可以轻易找到…...

《k-means 散点图可视化》实验报告

一&#xff0c;实验目的 本次实验旨在通过Python编程实现k - means算法的散点图可视化。学习者将编写代码&#xff0c;深入理解聚类分析基本原理与k - means算法实现流程&#xff0c;掌握数据聚类及可视化方法&#xff0c;以直观展示聚类结果。 二&#xff0c;实验原理 k-mea…...

数学复习笔记 12

前言 现在做一下例题和练习题。矩阵的秩和线性相关。另外还要复盘前面高数的部分的内容。奥&#xff0c;之前矩阵的例题和练习题&#xff0c;也没有做完&#xff0c;行列式的例题和练习题也没有做完。累加起来了。以后还是得学一个知识点就做一个部分的内容&#xff0c;日拱一…...

Web-CSS入门

WEB前端&#xff0c;三部分&#xff1a;HTML部分、CSS部分、Javascript部分。 1.HTML部分&#xff1a;主要负责网页的结构层 2.CSS部分&#xff1a;主要负责网页的样式层 3.JS部分&#xff1a;主要负责网页的行为层 **基本概念** 层叠样式表&#xff0c;Cascading Style Sh…...

Qt/C++编写音视频实时通话程序/画中画/设备热插拔/支持本地摄像头和桌面

一、前言 近期有客户提需求&#xff0c;需要在嵌入式板子上和电脑之间音视频通话&#xff0c;要求用Qt开发&#xff0c;可以用第三方的编解码组件&#xff0c;能少用就尽量少用&#xff0c;以便后期移植起来方便。如果换成5年前的知识储备&#xff0c;估计会采用纯网络通信收发…...

Ubuntu快速安装Python3.11及多版本管理

之前文章和大家分享过&#xff0c;将会出一篇专栏&#xff08;从电脑装ubuntu系统&#xff0c;到安装ubuntu的常用基础软件&#xff1a;jdk、python、node、nginx、maven、supervisor、minio、docker、git、mysql、redis、postgresql、mq、ollama等&#xff09;&#xff0c;目前…...

Qt功能区:Ribbon使用

Ribbon使用 1. Ribbon功能区介绍1.1 样式 2. 基本功能区设置2.1 安装动态库&#xff08;推荐&#xff09;2.2 在MainWindow中使用Ribbon2.3 在QWidget中使用SARibbonBar2.4 创建Category和Pannel2.5 ContextCategory 上下文标签创建 2.6 ApplicationButton2.7 QuickAccessBar和…...

【学习心得】Jupyter 如何在conda的base环境中其他虚拟环境内核

如果你在conda的base环境运行了jupyter lab打开了一个ipynb文本&#xff0c;此时选择的内核是base虚拟环境的Python内核&#xff0c;如果我想切换成其他conda虚拟环境来运行这个文件该怎么办&#xff1f;下面我们试着还原一下问题&#xff0c;并且解决问题。 【注】 这个问题出…...

在微创手术中使用Kinova轻型机械臂进行多视图图像采集和3D重建

在微创手术中&#xff0c;Kinova轻型机械臂通过其灵活的运动控制和高精度的操作能力&#xff0c;支持多视图图像采集和3D重建。这种技术通过机械臂搭载的光学系统实现精准的多角度扫描&#xff0c;为医疗团队提供清晰且详细的解剖结构模型。其核心在于结合先进的传感器配置与重…...

[Java][Leetcode middle] 238. 除自身以外数组的乘积

第一个想法是&#xff1a; 想求出所有元素乘积&#xff0c;然后除以i对应的元素本书&#xff1b;这个想法是完全错误的&#xff1a; nums[I] 可能有0题目要求了不能用除法 第二个想法是&#xff1a; 其实写之前就知道会超时&#xff0c;但是我什么都做不到啊&#xff01; 双…...

【leetcode】144. 二叉树的前序遍历

给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 解释&#xff1a; 示例 2&#xff1a; 输入&#xff1a;root [1,2,3,4,5,null,8,null,null,6,7,9] 输出&#xff1a…...

SpringBoot常用注解详解

文章目录 1. 前言2. 核心注解2.1 SpringBootApplication2.2 Configuration2.3 EnableAutoConfiguration2.4 ComponentScan2.5 Bean2.6 Autowired2.7 Qualifier2.8 Primary2.9 Value2.10 PropertySource2.11 ConfigurationProperties2.12 Profile 3. Web开发相关注解3.1 Control…...

中文分词与数据可视化02

jieba 库简介 jieba&#xff08;结巴分词&#xff09;是一个高效的中文分词工具&#xff0c;广泛用于中文自然语言处理&#xff08;NLP&#xff09;任务。它支持以下功能&#xff1a; 分词&#xff1a;将句子切分为独立的词语。 自定义词典&#xff1a;添加专业词汇或新词&am…...

SSH主机密钥验证失败:全面解决方案与技术手册

一、问题本质与安全机制解析 SSH(Secure Shell)的主机密钥验证是安全通信的核心机制&#xff0c;当出现"Host key verification failed"错误时&#xff0c;表明客户端检测到服务器身份异常。这种设计可有效防范中间人攻击(Man-in-the-Middle)&#xff0c;其工作原理…...

buuctf Crypto-鸡藕椒盐味1

1.题目&#xff1a; 公司食堂最新出了一种小吃&#xff0c;叫鸡藕椒盐味汉堡&#xff0c;售价八块钱&#xff0c;为了促销&#xff0c;上面有一个验证码&#xff0c;输入后可以再换取一个汉堡。但是问题是每个验证码几乎都有错误,而且打印的时候倒了一下。小明买到了一个汉堡&a…...

真题卷001——算法备赛

蓝桥杯2024年C/CB组国赛卷 1.合法密码 问题描述 小蓝正在开发自己的OJ网站。他要求用户的密码必须符合一下条件&#xff1a; 长度大于等于8小于等于16必须包含至少一个数字字符和至少一个符号字符 请计算一下字符串&#xff0c;有多少个子串可以当作合法密码。字符串为&am…...

基于MCP的桥梁设计规范智能解析与校审系统构建实践

引言 在腾讯云开发者社区中&#xff0c;有多种MCP工具可以用于本系统的开发和优化中&#xff0c;以下是一些潜在的应用场景&#xff1a; ‌PDF解析工具‌&#xff1a;如pdfplumber等&#xff0c;可以用于规范文件的预处理&#xff0c;提取文本和图像信息。‌自然语言处理工具…...

matlab与python问题解析

Python requests乱码的五种解决办法 Python requests乱码的五种解决办法_requests.get乱码-CSDN博客 requests库post请求参数data、json和files的使用 requests库post请求参数data、json和files的使用_requests post data-CSDN博客 如何在浏览器中查看POST请求提交的数据内…...

【分布式锁通关指南 10】源码剖析redisson之MultiLock的实现

引言 本期我们将把目光聚焦在 Redisson 中另一个颇具代表性的分布式锁实现——MultiLock。它的核心思想是&#xff1a;一次性对多个独立的 RLock 进行加锁或解锁操作&#xff0c;只有当多个锁都成功加锁时才算真正完成锁的获取&#xff0c;一旦有任何一个失败&#xff0c;整体操…...

MySQL 8.0 OCP 1Z0-908 131-140题

Q131.You have upgraded the MySQL binaries from 5.7.28 to 8.0.18 by using an in-place upgrade. Examine the message sequence generated during the first start of MySQL 8.0.18: 。。。[System]。。。/usx/sbin/mysqld (mysqld 8.0.18-commercial) starting as process…...

实战解析MCP-使用本地的Qwen-2.5模型-AI协议的未来?

文章目录 目录 文章目录 前言 一、MCP是什么&#xff1f; 1.1MCP定义 1.2工作原理 二、为什么要MCP&#xff1f; 2.1 打破碎片化的困局 2.2 实时双向通信&#xff0c;提升交互效率 2.3 提高安全性与数据隐私保护 三、MCP 与 LangChain 的区别 3.1 目标定位不同 3.…...

从零开始学习three.js(20):three.js实现天气与时间动态效果(白天,黑夜,下雨,下雪)

基于Three.js的天气与时间动态效果实现 本文将通过代码解析&#xff0c;介绍如何使用Three.js实现动态天气&#xff08;下雨、下雪&#xff09;和时间&#xff08;白天、黑夜&#xff09;切换效果。完整代码基于一个交互式天气模拟项目&#xff0c;支持粒子密度、速度和环境亮…...

sqli-labs靶场23-28a关(过滤)

目录 less23&#xff08;--过滤&#xff09; less24&#xff08;二次注入&#xff09; less25&#xff08;or过滤&#xff09; less25a&#xff08;or过滤&#xff09; less26&#xff08;--和空格过滤报错&#xff09; less26a&#xff08;--空格过滤盲注&#xff09; …...

Sigmoid与Softmax:从二分类到多分类的深度解析

Sigmoid与Softmax:从二分类到多分类的深度解析 联系 函数性质:二者都是非线性函数 ,也都是指数归一化函数,可将输入值映射为0到1之间的实数 ,都能把输出转化成概率分布的形式,在神经网络中常作为激活函数使用。Softmax是Sigmoid的推广:从功能角度看,Softmax函数可视为…...

uni-app x正式支持鸿蒙原生应用开发

DCloud发布的HBuilderX 4.64正式版&#xff0c;支持编译uni-app x项目到鸿蒙平台&#xff0c;实现跨平台开发鸿蒙原生应用。至此&#xff0c;uni-app x 已经完成Android、iOS、鸿蒙、Web、微信小程序等主流平台全覆盖。 uni-app x&#xff0c;是下一代 uni-app&#xff0c;是一…...

【软件推荐——pdf2docx】

pdf2docx Open source Python library for converting PDF to DOCX. https://github.com/ArtifexSoftware/pdf2docx Install pip install pdf2docx使用 from pdf2docx import Converterpdf_file D:\my\c4611_sample_explain.pdf docx_file D:\my\c4611_sample_explain.d…...

HarmonyOS开发组件基础

个人简介 &#x1f468;‍&#x1f4bb;‍个人主页&#xff1a; 魔术师 &#x1f4d6;学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全栈发展 &#x1f6b4;个人状态&#xff1a; 研发工程师&#xff0c;现效力于政务服务网事业 &#x1f1e8;&#x1f1f3;人生格言&…...

JMeter 测试工具--组件--简单介绍

目录 ​编辑 一、测试计划&#xff08;Test Plan&#xff09; 二、线程组&#xff08;Thread Group&#xff09; 三、取样器&#xff08;Sampler&#xff09; 四、监听器&#xff08;Listener&#xff09; 五、逻辑控制器&#xff08;Logic Controller&#xff09; 六、断…...

ECPF 简介

ECPF&#xff08;Embedded CPU Function&#xff0c;嵌入式CPU功能&#xff09;是NVIDIA BlueField DPU特有的一种功能类型&#xff0c;和PF&#xff08;Physical Function&#xff0c;物理功能&#xff09;、VF&#xff08;Virtual Function&#xff0c;虚拟功能&#xff09;密…...

【Opencv】canny边缘检测提取中心坐标

采用opencv 对图像中的小球通过canny边缘检测的方式进行提取坐标 本文介绍了如何使用OpenCV对图像中的小球进行Canny边缘检测&#xff0c;并通过Zernike矩进行亚像素边缘检测&#xff0c;最终拟合椭圆以获取小球的精确坐标。首先&#xff0c;图像被转换为灰度图并进行高斯平滑…...

C#实现访问远程硬盘(附源码)

在现实场景中&#xff0c;我们经常用到远程桌面功能&#xff0c;而在某些场景下&#xff0c;我们需要使用类似的远程硬盘功能&#xff0c;这样能非常方便地操作对方电脑磁盘的目录、以及传送文件。那么&#xff0c;这样的远程硬盘功能要怎么实现了&#xff1f; 这次我们将给出…...

AI日报 · 2025年05月16日|Google DeepMind推出AlphaEvolve,能自主设计高级算法的编码代理

全球AI新闻日报 日期&#xff1a;2025年5月16日 目录 OpenAI与CoreWeave签署40亿美元新协议&#xff0c;GPT-4.1模型全面推出Google DeepMind推出AlphaEvolve&#xff0c;能自主设计高级算法的编码代理Anthropic律师因Claude模型虚构法律引用被迫道歉Meta推迟旗舰AI模型&quo…...

TCP/IP 知识体系

TCP/IP 知识体系 一、TCP/IP 定义 全称&#xff1a;Transmission Control Protocol/Internet Protocol&#xff08;传输控制协议/网际协议&#xff09;核心概念&#xff1a; 跨网络实现信息传输的协议簇&#xff08;包含 TCP、IP、FTP、SMTP、UDP 等协议&#xff09;因 TCP 和…...

记一次缓存填坑省市区级联获取的操作

先说缓存是什么&#xff1f; 缓存主要是解决高并发&#xff0c;大数据场景下&#xff0c;热点数据快速访问。缓存的原则首先保证数据的准确和最终数据一致&#xff0c;其次是距离用户越近越好&#xff0c;同步越及时越好。 再说我们遇到的场景&#xff1a; 接手项目后&#…...

【时空图神经网络 交通】相关模型2:STSGCN | 时空同步图卷积网络 | 空间相关性,时间相关性,空间-时间异质性

注:仅学习使用~ 前情提要: 【时空图神经网络 & 交通】相关模型1:STGCN | 完全卷积结构,高效的图卷积近似,瓶颈策略 | 时间门控卷积层:GLU(Gated Linear Unit),一种特殊的非线性门控单元目录 STSGCN-2020年1.1 背景1.2 模型1.2.1 问题背景:现有模型存在的问题1.2…...

uniapp实现在线pdf预览以及下载

uniapp实现在线pdf预览以及下载 在线预览 遇到的问题 后端返回一个url地址&#xff0c;我需要将在在页面中渲染出来。因为在浏览器栏上我输入url地址就可以直接预览pdf文件&#xff0c;因此直接的想法是通过web-view组件直接渲染。有什么问题呢&#xff1f;在h5端能够正常渲…...

【Rust闭包】rust语言闭包函数原理用法汇总与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

裸金属服务器和云服务器之间的差别

裸金属服务器能够直接在硬件上运行&#xff0c;不需要额外的虚化层&#xff0c;让每个应用程序或者是服务都能够在实际的硬件上运行&#xff0c;不需要和其他虚拟服务器来共享资源&#xff1b;而云服务器作为一种虚拟服务器&#xff0c;是通过虚拟化技术为企业提供一个独立的计…...

CentOS系统中升级Python 3.12.2版本

在CentOS系统中升级Python版本是一项常见的操作&#xff0c;尤其是在需要使用较新功能或满足某些软件依赖的情况下。以下是详细的步骤和注意事项&#xff0c;帮助您顺利完成Python版本的升级。 1. 升级Python版本前的准备 在开始升级之前&#xff0c;请确保以下几点&#xff1…...

win10-django项目与mysql的基本增删改查

以下都是在win10系统下&#xff0c;django项目的orm框架对本地mysql的表的操作 models.py----->即表对应的类所在的位置 在表里新增数据 1.引入表对应的在models.py中的类class 2.在views.py中使用函数&#xff1a;类名.objects.create(字段名值,字段名"值"。。。…...

图像处理:预览并绘制图像细节

前言 因为最近在搞毕业论文的事情&#xff0c;要做出一下图像细节对比图&#xff0c;所以我这里写了两个脚本&#xff0c;一个用于框选并同时预览图像放大细节&#xff0c;可显示并返回框选图像的坐标&#xff0c;另外一个是输入框选图像的坐标并将放大的细节放置在图像中&…...

针对面试-微服务篇

1.Spring Cloud 5大组件有哪些? 随着SpringCloudAlibba在国内兴起&#xff0c;我们项目中使用了一些阿里巴巴的组件 注册中心/配置中心 Nacos 负载均衡 Ribbon 服务调用 Feign 服务保护 sentinel 服务网关 Gateway 2. 我看你之前也用过nacos、你能说下nacos与eureka的区别?…...

SRS流媒体服务器(5)源码分析之RTMP握手

1.概述 学习 RTMP 握手逻辑前&#xff0c;需明确两个核心问题&#xff1a; rtmp协议连接流程阶段rtmp简单握手和复杂握手区别 具体可以学习往期博客&#xff1a; RTMP协议分析_rtmp与264的关系-CSDN博客 2.rtmp握手源码分析 2.1 握手入口 根据SRS流媒体服务器(4)可知&am…...

线程池(ThreadPoolExecutor)实现原理和源码细节是Java高并发面试和实战开发的重点

一、线程池核心流程图 ----------------- | 提交任务 | submit/execute -----------------|v ----------------- | 判断核心线程数 | < corePoolSize&#xff1f; -----------------|Yes |Nov v [创建新线程] -----------------| 队列是否满&a…...

C# DataGridView 选中所有复选框

问题描述 在程序中尝试选中所有复选框&#xff0c;但出现错误。如果单击顶部的完整选中/释放复选框&#xff0c;同时选中包含复选框的列&#xff0c;则选定区域不会改变。该如何解决&#xff1f; 上面的图片是点击完整版本之后的。 下面是本文的测试代码&#xff0c;函数 dat…...

linux 服务器安装jira-8.22.0和confluence-8.5.21

前提&#xff1a; 下载资源包 z_atlassian-agent-v1.3.1.zip z_atlassian-confluence-8.5.21-x64.zip z_atlassian-jira-software-8.22.0-x64.zip z_jdk-8u131-linux-x64.tar.gz z_postgresql-12.0.tar.gz 可通过作者本身资源库下载 一&#xff1a;服务器构建文件夹 mkdir /z …...

【计算机网络】HTTP/1.0,HTTP/1.1,HTTP/2,HTTP/3汇总讲解,清晰表格整理面试重点对比

表格汇总 对比维度HTTP/1.0HTTP/1.1HTTP/2HTTP/3传输协议TCPTCPTCP/TLS&#xff08;默认加密&#xff09;UDP&#xff08;基于 QUIC 协议&#xff09;连接方式短连接&#xff08;每次请求/响应后断开&#xff09;引入持久连接&#xff08;Persistent Connection&#xff09;&a…...

Go语言之路————并发

Go语言之路————并发 前言协程管道SelectsyncWaitGroup锁 前言 我是一名多年Java开发人员&#xff0c;因为工作需要现在要学习go语言&#xff0c;Go语言之路是一个系列&#xff0c;记录着我从0开始接触Go&#xff0c;到后面能正常完成工作上的业务开发的过程&#xff0c;如…...

python的家教课程管理系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…...

0x08.Redis 支持事务吗?如何实现?

回答重点 Redis 支持事务,但它的事务与 MySQL 等关系型数据库的事务有着本质区别。MySQL 中的事务严格遵循 ACID 特性,而 Redis 中的事务主要保证的是命令执行的原子性和隔离性,即所有命令在一个不可分割的操作中顺序执行,不会被其他客户端的命令请求所打断。 最关键的区…...