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

推荐系统三十六式学习笔记:工程篇.常见架构24|典型的信息流架构是什么样的

目录

  • 整体框架
  • 数据模型
    • 1.内容即Activity
    • 2.关系即连接
  • 动态发布
  • 信息流排序
  • 数据管道
  • 总结

从今天起,我们不再单独介绍推荐算法的原理,而是开始进入一个新的模块-工程篇。

在工程实践的部分中,我首先介绍的内容是当今最热门的信息流架构。

信息流是推荐系统应用中的热门,它表现形式有很多:社交网络的动态信息流、新闻阅读的图文信息流、短视频信息流等等。

如果要搭建一个自己的信息流系统,它应该怎么样呢?今天,我就来带你一探信息流架构的究竟。

整体框架

信息流,通常也叫做feed,这个英文也很有意思,就是喂给用户的意思。

传统的信息流产品,知识简单按照时间排序,而被推荐系统接管后的信息流逐渐成为主流,按照兴趣排序,也叫作“兴趣feed” 。

所以我们通常提到信息流,或者兴趣feed,其实都是在说同一个话题。搜索 fedd相关的技术文章,应该用Activity Stream作为关键词去搜。

要实现一个信息流,整体逻辑上是比较清楚的。可以划分为两个子问题。

1.如何实现一个按照时间顺序排序的信息流体系?
2.如何给信息流内容按照兴趣重排序?

我这里先给出一个整体的框架,然后再分别详谈。

在这里插入图片描述

这张架构图划分为几个大的模块:日志收集、内容发布、机器学习、信息流服务、监控。这里分别介绍一下:
1.日志收集,是所有排序训练的数据来源,要收集的最核心数据就是用户在信息流上产生的行为,用于机器学习更新排序模型;
2.内容发布,就是用推或拉的模式把信息流的内容从源头发布到受众端;
3.机器学习,从收集到用户行为日志中训练模型,然后为每一个用户即将收到的信息流内容提供打分服务;
4.信息流服务,为信息流的展示前端提供Rest API;
5.监控,这是系统的运维标准,保证系统的安全和稳定等;

数据模型

信息流的基本数据有三个:用户(User)、内容(Activity)和关系(Connection)
用户自不用说,即不同用户的身份ID,我来说一说其他两种。

1.内容即Activity

用于表达Activity的元素有相应的规范,叫作Atom,根据Atom的定义,一条Activity包含的元素有:Time,Actor,Verb,Object,Target,Title,Summary;下面详细解释一下这些元素。

1.Time :即Activity发生的时间
2.Actor:即Activity由谁发出的。通常Actor就是用户id,也可以拓展到拟人化的物体上,如关注的一个店铺,收藏的一部电影,或者用户喜欢的一个标签或者分类。
3.Verb:动词,就是连接的名字,比如“follow”“like”等,也可以是隐含的连接,如挖掘出的用户兴趣词和用户之间的这种潜规则。
4.Object:即动作作用到最主要的对象,只能有一个,比如一个人赞过一张照片,店铺上新了一件商品,一个分类下一篇新的文章。
5.Target:动作的最终目标,与verb有关,可能没有。它对应英语中介词to后接的事物,比如“john saved a movie to his wishlist”(john保存了一部电影到清单里),
这里电影就是object,而清单就是target.
6.Title ;这个是Activity的标题,用自然语言描述,用于展示给用户。
7.Summary:通常是一小段HTML代码,是对这个Activity的描述,还可能包含类似缩略图这样的可视化元素,可以理解为Activity的视图,不是必须的。

除了上面的字段外,还有一个隐藏的id,用于唯一标识一个Activity。社交电商Etsy在介绍他们的信息流系统时,还创造性地给Activity增加了Owner属性,
同一个Activity可以属于不同的用户,相当于考虑了方向。

2.关系即连接

互联网产品里处处有连接,有强有弱,好友关系、关注关系等社交是较强的连接,还有点赞、收藏,评论,浏览这些动作都可以认为是用户和另一对象之间建立了连接。有了连接,就有信息流的传递和发布。

定义一个连接的元素有下面几种:
1.From:连接的发起方
2.To:被连接方
3.Type/Name:就是Atom模型中的verb,即连接的类型:关注、加好友,点赞、浏览、评论等等
4.Affinity:连接的强弱。

如果把建立一个连接视为一个Activity的话,From就对应Activity中的Actor,To就对应Activity中的Object。

Connection和Activity是相互加强的,有了Activity,就会产生Connnection,有了connection,就可以喂(feed)给你更多的Activity.

在数据存储上可以选择的工具有下面的几种:
1.Activity存储可以采用Mysql、Redis、Cassandra等;
2.connection存储可以采用Mysql;
3.User存储可以采用Mysql;

动态发布

用户登录或者刷新后,信息流是怎么产生的呢?我们把动态内容出现在受众的信息流中这个过程称为Fan-out,直觉上是这样实现的:
1.获取用户所有的连接的终点(如好友、关注对象、兴趣标签);
2.获取这些连接终点(关注对象)产生的新内容(Activity);
3.按照某个指标排序后输出。

上面这个步骤别看简单,在一个小型的社交网络上,通常很有效,而且Twitter早期也是这么做的。这就是江湖行话说的“拉”模式(Fan-out-on-load),即:信息流是在用户登录或者刷新后实时产生的。
这里有一个示意图:
在这里插入图片描述

拉模式就是当用户访问时,信息流服务才会去相应的发布源拉取内容到自己的feed区来,这是一个阻塞同步的过程。“拉”模式的好处也显而易见,主要有下面两种:
1.实现简单直接
2.实时:内容产生了,受众只要刷新就能看见。

不足:
1.随着连接数的增加,这个操作的复杂度指数级增加;
2.内容中要保留每个人产生的内容
3.服务很难做到高可用。

与拉模式相应,还有一个推模式(Fan -out-on-write).如下图:

在这里插入图片描述

当一个Actor产生了一条Activity后,不管受众在不在线,刷没刷新,都会立即将这条内容推送给相应的用户(即和这个Actor建立了连接的人),系统为每一个用户单独开辟一个信息流存储区域,用于接收 推送的内容。如此一来,当用户登录后,系统只需读取他自己的信息流即可。

推的模式好处显而易见:在用户访问自己的信息流时,几乎没有任何复杂的查询操作,所以服务可用性较高。

不足:
1.大量的写操作:每一个粉丝都要写一次。
2.大量冗余存储:每一条内容都要存储N份(受众数量)。
3.非实时:一条内容产生后,有一定的延迟才会到达受众信息流中。
4.无法解决新用户的信息流产生问题。

既然两者各有优劣,那么实际上就应该将两者结合起来,一种简单的结合方案是全局的:
1.对于活跃度高的用户,使用推模式,每次他们刷新时不用等待太久,而且内容页相对多一些;
2.对于活跃度没那么高的用户,使用拉模式,当他们登录是才拉取最近的内容;
3.对于热门的内容产生者,缓存其最新的N条内容,用于不同场景下的拉取。

还有一种结合方案是分用户的,这是Etsy的设计方案:
1.如果受众用户和内容产生用户之间的亲密度高,则优先推送,因为更可能被这个受众所感兴趣;
2.如果受众用户与内容产生用户之间的亲密度低,则推迟推送或者不推送;
3.也不是完全遵循亲密度顺序,而是采用与之相关的概率。

在中小型的社交网络上,小样纯推模式就够用了,结合的方案可以等业务发展到一定规模后再考虑。

对于信息流的产生和存储可以选择的工具有:
1.用户信息流的存储可以采用Redis等KV数据库,使用uid作为key
2.信息流推送的任务队列可以采用Celery等成熟架构。

信息流排序

信息流排序要避免两个误区:1.没有目标;2.人工量化
第一个误区“没有目标”意思是说,设计排序算法之前,一定要弄清楚为什么要对时间序列重排?希望达到什么目标?只有先确定目标,才能检验和优化算法。
第二个误区是“人工量化”,也就是我们常见到的产品同学或者运营同学要求对某个因素加权或者降权。这样做很不明智,主要是不能很好地持续优化。

目前信息流采用机器学习排序,以提升类似互动率,停留时长等指标,这已经成为共识。比如说提高互动率则需要下面几个内容。
1.首先,定义好互动行为包括哪些,比如点赞。转发。评论。查看详情等;
2.其次,区分好正向互动和负向互动,比如隐藏某条内容、点击不感兴趣等是负向的互动。

基本上到这里可以设计成一个典型的二分类监督学习问题了,对一条信息流的内容,在展示给用户之前,预测其获得用户正向互动的概率,概率就可以作为兴趣排序分数输出。
能产生概率输出的二分类算法有贝叶斯,最大熵,逻辑回归等。互联网常用的是逻辑回归(Logistic Regression),也有Facebook等大厂采用了逻辑回归加梯度提升树模型(又称GBDT)来对
信息流排序,效果显著。

如今很多大厂已经转向深度学习了,但我还是建议小厂或者刚起步的信息流线采用线性模型。
对于线性模型,一个重要的工作就是特征工程。信息流的特征有三类;
1.用户特征,包括用户人口统计学属性,用户兴趣标签、活跃程度等;
2.内容特征,一条内容本身可以根据其属性提取文本、图像、音频等特征,并且可以利用主题模型提取更抽象的特征。
3.其他特征,比如刷新时间,所处页面等。
排序模型在实际使用时,通常做成RPC服务,以供发布信息流时调用。

数据管道

信息流是一个数据驱动的系统,既要通过历史数据来寻找算法的最优参数,又要通过新的数据验证排序效果,所以搭建一个数据流管道就是大家翘首期盼的。

这个管道中要使用的相关数据可能有:
1.互动行为数据,用于记录每一个用户在信息流上的反馈行为;
2.曝光内容,每一条曝光要有唯一的ID,曝光的内容仅记录ID即可;
3.互动行为与曝光的映射关系,每条互动数据要对应到一条曝光数据;
4.用户画像内容,即用户画像,提供用户特征
5.信息流的内容分析数据,提供内容特征,即物品画像。

对于一个从零开始的信息流,没必要做到在线实时更新排序算法的参数,所以数据的管道可以分为三块:
1.生成训练模型,可离线
2.排序模型训练,可离线;
3.模型服务化,实时服务;

在离线训练优化模型时,关注模型的AUC是否有提升,线上AB测试时关注具体的产品目标是否有提升,比如互动率等,同时还要根据产品具体形态关注一些辅助指标。

另外,互动数据相比全部曝光数据,数据量会小得多,所以在生成训练数据时需要对负样本进行采样,采样比例也是一个可以优化的参数。

固定算法和特征后,在0.1-0.9之间遍历对比实验,选择最佳的正负比例即可。经验比例在2:3左右,即负样本略大于正样本。

总结

今天我逐一梳理了实现一个通用信息流的关键模块,及其已有的轮子,从而能最大限度地降低开发成本。这些对于一个中小型的社交网路来说已经足够,当你面临更大的社交网络,会有更多复杂的情况出现,尤其是系统上的,请时刻观察系统的监控、日志的规模。

相关文章:

推荐系统三十六式学习笔记:工程篇.常见架构24|典型的信息流架构是什么样的

目录 整体框架数据模型1.内容即Activity2.关系即连接 动态发布信息流排序数据管道总结 从今天起,我们不再单独介绍推荐算法的原理,而是开始进入一个新的模块-工程篇。 在工程实践的部分中,我首先介绍的内容是当今最热门的信息流架构。 信息…...

解决QEMU无法从非0x80000000处开始执行

解决QEMU无法从非0x80000000处开始执行 1 背景介绍2 问题描述3 原因分析4 解决办法5 踩坑回忆5.1 坑1 - 怀疑设备树有问题5.2 坑2 - 怀疑QEMU中内存未写入成功5.3 QEMU地址空间分析过程 1 背景介绍 在使用NEMU与QEMU做DiffTest的场景下,运行的固件为《RISC-V体系结…...

AI在候选人评估中的作用:精准筛选与HR决策的助力

一、引言 随着科技的迅猛发展,人工智能(AI)技术已逐渐渗透到各个行业和领域,人力资源管理(HRM)亦不例外。在候选人评估的环节中,AI技术以其高效、精准的特性,正在逐步改变着传统的招…...

自动化测试的艺术:Xcode中GUI测试的全面指南

自动化测试的艺术:Xcode中GUI测试的全面指南 在软件开发过程中,图形用户界面(GUI)测试是确保应用质量和用户体验的关键环节。Xcode,作为苹果的官方集成开发环境(IDE),提供了一套强大…...

uniapp封装请求拦截器,封装请求拦截和响应拦截的方法

首先我们先看一下uni官方给开发者提供的uni.request用来网络请求的api 1 2 3 4 5 6 7 8 9 uni.request({ url: , method: GET, data: {}, header: {}, success: res > {}, fail: () > {}, complete: () > {} }); 可以看到我们每次请求数据的时候都需…...

开局一个启动器:从零开始入坑ComfyUI

前几天刷某乎的时候看到了一位大佬写的好文,可图 IP-Adapter 模型已开源,更多玩法,更强生态! - 知乎 (zhihu.com) 久闻ComfyUI大名,决定试一下。这次打算不走寻常路,不下载现成的一键包了,而是…...

34_YOLOv5网络详解

1.1 简介 YOLOV5是YOLO(You Only Look Once)系列目标检测模型的一个重要版本,由 Ultralytics 公司的Glenn Jocher开发并维护。YOLO系列以其快速、准确的目标检测能力而闻名,尤其适合实时应用。YOLOV5在保持高效的同时&#xff0c…...

深入解析Perl的正则表达式:功能、应用与技巧

在编程世界中,正则表达式是一种强大的文本处理工具,它能够用于搜索、替换、匹配字符串等操作。Perl语言以其强大的文本处理能力著称,而其正则表达式功能更是其核心特性之一。本文将深入探讨Perl中的正则表达式,包括其基本语法、应…...

【JAVA】Hutool CollUtil.sort 方法:多场景下的排序解决方案

在 Java 开发中&#xff0c;集合的排序是常见需求。Hutool 库的 CollUtil.sort 方法提供了一系列用于排序的实用功能&#xff0c;适用于不同的场景。以下是对几种常见场景及其实现方式的总结&#xff1a; <dependency><groupId>org.dromara.hutool</groupId>…...

Mysql-安装(Linux)

1、下载mysql 切换到/opt/app目录下&#xff0c;执行如下命令&#xff0c;下载mysql 5.7.38版本。 [rootywxtdb app]# wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz 解压安装包 [rootywxtdb app]# tar -zxvf mysql-5.7.38-l…...

如何查看日志

别用 cat cat 把整个日志文件刷屏 慎用 vim 日志不大随便整&#xff0c;因为vim会把整个日志文件读到内存&#xff0c;大日志文件&#xff08;G级别&#xff09;会造成内存占用过高&#xff0c;影响其他程序&#xff0c;在业务机器上查看日志这样尤其危险 less is more 还…...

python实现责任链模式

把多个处理方法串成一个list。下一个list的节点是上一个list的属性。 每个节点都有判断是否能处理当前数据的方法。能处理&#xff0c;则直接处理&#xff0c;不能处理则调用下一个节点&#xff08;也就是当前节点的属性&#xff09;来进行处理。 Python 实现责任链模式&#…...

Prometheus监控ZooKeeper

1. 简介 ZooKeeper是一个分布式协调服务,在分布式系统中扮演着重要角色。为了确保ZooKeeper集群的健康运行,有效的监控至关重要。本文将详细介绍如何使用Prometheus监控ZooKeeper,包括安装配置、关键指标、告警设置以及最佳实践。 2. 安装和配置 2.1 安装ZooKeeper Exporter…...

vuepress搭建个人文档

vuepress搭建个人文档 文章目录 vuepress搭建个人文档前言一、VuePress了解二、vuepress-reco主题个人博客搭建三、vuepress博客部署四、vuepress后续补充 总结 vuepress搭建个人文档 所属目录&#xff1a;项目研究创建时间&#xff1a;2024/7/23作者&#xff1a;星云<Xing…...

面试题 17.14.最小K个数

题目&#xff1a;如下图 答案&#xff1a;如下图 /*** Note: The returned array must be malloced, assume caller calls free().*/ void AdjustDown(int* a,int n,int root) {int parent root;int child parent * 2 1;//默认左孩子是大的&#xff0c;将其与右孩子比较&am…...

C++实现LRU缓存(新手入门详解)

LRU的概念 LRU&#xff08;Least Recently Used&#xff0c;最近最少使用&#xff09;是一种常用的缓存淘汰策略&#xff0c;主要目的是在缓存空间有限的情况下&#xff0c;优先淘汰那些最长时间没有被访问的数据项。LRU 策略的核心思想是&#xff1a; 缓存空间有限&#xff1…...

汇昌联信数字做拼多多运营实力好吗?

汇昌联信数字在拼多多运营方面的实力如何?汇昌联信数字作为一家专注于电子商务运营服务的公司&#xff0c;其在拼多多平台的运营能力是值得关注的。根据市场反馈和客户评价&#xff0c;汇昌联信数字在拼多多的运营实力表现良好&#xff0c;能够为客户提供专业的店铺管理、产品…...

【云原生】Prometheus 服务自动发现使用详解

目录 一、前言 二、Prometheus常规服务监控使用现状​​​​​​​ 2.1 Prometheus监控架构图 2.2 Prometheus服务自动发现的解决方案 三、Prometheus服务自动发现介绍 3.1 什么是Prometheus服务自动发现 3.2 Prometheus自动服务发现策略 3.3 Prometheus自动服务发现应用…...

(十九)原生js案例之h5地里位置信息与高德地图的初使用

h5 地里位置信息 1. 获取当前位置信息 window.onload function () {const oBtn document.querySelector("#btn");const oBox document.querySelector("#box");oBtn.onclick function () {window.navigator.geolocation.getCurrentPosition(function (…...

三、基础语法2(30小时精通C++和外挂实战)

三、基础语法2&#xff08;30小时精通C和外挂实战&#xff09; B-02内联函数B-04内联函数与宏B-05_constB-06引用B-07引用的本质B-08-汇编1-X86-X64汇编B-09-汇编2-内联汇编B-10-汇编3-MOV指令C-02-汇编5-其他常见指令C-05-汇编8-反汇编分析C-07-const引用、特点 B-02内联函数 …...

gitee设置ssh公钥密码频繁密码验证

gitee中可以创建私有项目&#xff0c;但是在clone或者push都需要输入密码&#xff0c; 比较繁琐。 公钥则可以解决该问题&#xff0c;将私钥放在本地&#xff0c;公钥放在gitee上&#xff0c;当对项目进行操作时带有的私钥会在gitee和公钥进行验证&#xff0c;避免了手动输入密…...

BGP选路之Next Hop

原理概述 当一台BGP路由器中存在多条去往同一目标网络的BGP路由时&#xff0c;BGP协议会对这些BGP路由的属性进行比较,以确定出去往该目标网络的最优BGP路由,然后将该最优BGP路由与去往同一目标网络的其他协议路由进行比较&#xff0c;从而决定是否将该最优BGP路由放进P路由表中…...

牛客14666(优先屏障) + 牛客14847(Masha与老鼠)

文章目录 写在前面14666-优先屏障思路编程 14847-Masha与老鼠思路编程 写在前面 昨天刷的这两道题写了很久&#xff0c;特别是Masha与老鼠这道题&#xff0c;写了都快3个小时&#xff0c;主要还是理解代码逻辑有点难&#xff0c;不过写完之后感觉收获挺大的&#xff0c;给我以…...

Git下载与安装

下载网址&#xff1a;https://git-scm.com/downloads 下载之后开始安装 选择安装路径&#xff0c;next 选择需要安装的组件&#xff0c;这里默认即可&#xff0c;next 选择菜单文件夹&#xff0c;这里默认即可&#xff0c;next 选择默认编辑器&#xff0c;默认推荐的即可&…...

创建vue2/vue3项目

目录 创建一个Vue2项目创建一个Vue3项目 创建一个Vue2项目 ## 安装Vue-Cli &#xff1a; npm install -g vue/cli // Vue CLI 4.x 需要 Node.js v8.9 或更高版本 (推荐 v10 以上)vue --version // 检测版本是否正确## 创建一个项目&#xff1a; vue create hello-world // hel…...

IOS七层模型对应的网络协议和物理设备

以下是网络模型、对应的协议以及对应的物理设备的表格总结&#xff1a; 网络模型层次主要功能对应协议对应物理设备物理层透明的传输比特流&#xff0c;确定机械及电气规范RS-232、V.35、RJ-45、FDDI等中继器、集线器、网线、调制解调器、网卡数据链路层将比特组装成帧和点到点…...

论文复现:Predictive Control of Networked Multiagent Systems via Cloud Computing

Predictive Control of Networked Multiagent Systems via Cloud Computing论文复现 文章目录 Predictive Control of Networked Multiagent Systems via Cloud Computing论文复现论文摘要系统参数初始化系统模型观测器预测过程控制器设计系统的整体框图仿真结果 论文摘要 翻译…...

JSON 文件存储

JSON 全称为&#xff1a; JavaScript Object Notation 也就是 javaScript 对象标记&#xff0c;通过对象和数组的组合来表示数据&#xff0c; 虽然构造简洁&#xff0c;但是结构化程度非常高&#xff0c; 是一种轻量级的数据交换格式 对象和数组 在 JavaScript 语言中&#…...

python——pynput

pynput 是一个 Python 库&#xff0c;用于控制和监听键盘与鼠标输入。它在 Windows、macOS 和 Linux 上都可以工作&#xff0c;为用户提供了一个跨平台的输入事件处理方式。pynput 包含两个主要模块&#xff1a;keyboard 和 mouse&#xff0c;分别用于处理键盘和鼠标事件。 主…...

[用AI日进斗金系列]用码上飞在企微接单开发一个项目管理系统!

今天是【日进斗金】系列的第二期文章。 先给不了解这个系列的朋友们介绍一下&#xff0c;在这个系列的文章中&#xff0c;我们将会在企微的工作台的“需求发布页面”中寻找有软件开发需求的用户 并通过自研的L4级自动化智能软件开发平台「码上飞CodeFlying」让AI生成应用以解…...

《JavaEE篇》--多线程(2)

《JavaEE篇》--多线程(1) 线程安全 线程不安全 我们先来观察一个线程不安全的案例&#xff1a; public class Demo {private static int count 0;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(() -> {//让count自增5W次…...

防爆智能手机如何助力电气行业保驾护航?

在电气行业的智能化转型浪潮中&#xff0c;防爆智能手机以其强大的数据处理能力、实时通讯功能及高度集成的安全特性&#xff0c;正成为保障电力网络稳定运行、预防安全隐患的得力助手。 防爆智能手机在电气行业中发挥着重要的保驾护航作用&#xff0c;主要体现在以下几个方面&…...

24.7.24数组|那几个课后得做的题

1、对长整形数据进行反转 2、对字符串进行反转 一、题目地址&#xff1a; 1. 实现一个函数atoi&#xff0c;使其能够将字符串转换整数 (Leetcode 8/中等). - 力扣&#xff08;LeetCode&#xff09; 2. 颠倒给定的32位无符号整数的二进制位&#xff08;Leetcode 190/简单&…...

03Spring底层架构核心概念解析

为了感谢罕哥对我工作的帮助&#xff0c;特此记录下学习过程&#xff0c;期待成为和罕哥一样优秀的人 时间&#xff1a;2024.7.13 内容&#xff1a;spring源码课程3学习记录 一、BeanDefinition BeanDefinition表示Bean的定义&#xff0c;BeanDefinition中存在很多属性用来…...

Vue学习---vue 防抖处理函数,是处理什么场景

Vue防抖处理函数是用来处理在快速连续操作中&#xff0c;只执行最后一次操作的情况。 例如&#xff0c;在输入框输入时&#xff0c;我们可能希望只在用户完成输入后进行处理&#xff0c;而不是在每次键入时都处理。(n秒后触发一次) 以下是一个简单的Vue防抖处理函数的例子&am…...

力扣爆刷第166天之TOP100五连刷96-100(单词拆分、回溯、旋转数组)

力扣爆刷第166天之TOP100五连刷96-100&#xff08;单词拆分、回溯、旋转数组&#xff09; 文章目录 力扣爆刷第166天之TOP100五连刷96-100&#xff08;单词拆分、回溯、旋转数组&#xff09;一、24. 两两交换链表中的节点二、139. 单词拆分三、560. 和为 K 的子数组四、209. 长…...

2024在线PHP加密网站源码

源码介绍 2024在线PHP加密网站源码 更新内容: 1.加强算法强度 2.优化模版UI 加密后的代码示例截图 源码下载 https://download.csdn.net/download/huayula/89568335...

网络驱动移植(RTL8189)

1、把驱动放到内核文件夹中&#xff08;linux/drivers/net/wireless&#xff09;&#xff0c;对应的驱动可以在网上下载 2、修改该目录下的Kconfig和Makefile文件 3、配置内核&#xff08;make menuconfig&#xff09; 配置支持IEEE 802.11&#xff0c;选中8189模块&#xff0…...

go语言中map学习

在 Go 语言中,map 是一种引用类型,这意味着它有以下特点: 内存结构: map 实际上是一个指向底层数据结构的指针。这个底层数据结构包含键值对的集合。 赋值与传参: 当你给一个变量赋值一个 map 时,或者将 map 作为函数参数传递时,实际上传递的是指针,而不是完整的数据结构副本。…...

【C#】| 与 及其相关例子

按位或&#xff08;|&#xff09; 按位或运算符 | 对两个数的每一位进行比较&#xff0c;如果两个数中至少有一个为 1&#xff0c;则结果位为 1&#xff1b;否则&#xff0c;结果位为0。 1010 (10 in decimal) | 1100 (12 in decimal) ------1110 (14 in decimal) 力扣相关…...

【数据结构 | 哈希表】一文了解哈希表(散列表)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

go创建对象数组

在 Go 语言中&#xff0c;可以使用字面量的方式创建结构体对象数组。以下是一个示例代码&#xff0c;展示了如何使用字面量创建一个结构体对象数组&#xff1a; package mainimport "fmt"// 定义一个结构体 type Person struct {Name stringAge intAddress Address…...

Golang | Leetcode Golang题解之第278题第一个错误的版本

题目&#xff1a; 题解&#xff1a; func firstBadVersion(n int) int {return sort.Search(n, func(version int) bool { return isBadVersion(version) }) }...

自动化网络爬虫:如何它成为提升数据收集效率的终极武器?

摘要 本文深入探讨了自动化网络爬虫技术如何彻底改变数据收集领域的游戏规则&#xff0c;揭示其作为提升工作效率的终极工具的奥秘。通过分析其工作原理、优势及实际应用案例&#xff0c;我们向读者展示了如何利用这一强大工具加速业务决策过程&#xff0c;同时保持数据收集的…...

软件测试---测试需求分析

课程目标 什么是软件测试需求 软件测试需求的必要性 如何对软件测试需求进行分析&#xff08;重点&#xff09; 课程补充 灰度测试&#xff08;基于功能&#xff09;&#xff1a;先发布部分功能&#xff0c;然后看用户的反馈&#xff0c;再去发布另外一部分的功能更新。 A/B测…...

Android11 framework 禁止三方应用通过广播开机自启动-独立方案

之前的文章Android11 framework 禁止三方应用开机自启动记录了我调试Android11应用自启动限制的全过程&#xff0c;但是之前的方案感觉还能再研究&#xff0c;所以有了这一篇文章。 这一篇文章主要探讨Android11上&#xff0c;以广播来进行自启动的应用的限制&#xff0c;极个别…...

Node:解决Error: error:0308010C:digital envelope routines::unsupported的解决方法

问题描述 在使用vuepress搭建博客的时候&#xff0c;运行项目发现报错了&#xff0c;检查了node的版本是18&#xff0c;之前用的是16或14的版本&#xff0c;现在报&#xff1a;Error: error:0308010C:digital envelope routines::unsupported错误。 查找了一些资料&#xff0…...

spring boot(学习笔记第十四课)

spring boot(学习笔记第十四课) Spring Security的密码加密&#xff0c;基于数据库认证 学习内容&#xff1a; Spring Security的密码加密基于数据库认证 1. Spring Security的密码加密 如果用户的密码保存在数据库中是以明文保存&#xff0c;对于公司的安全将是灾难性的&…...

Android 11 Unable to start/bind service

今天在Android11上发现了一个的问题&#xff0c;如果目标Service的进程没有启动&#xff0c;那么无论是bindService还是startService都没有办法拉起指定的Service。 网上查了很多资料如下: 1.目标Service 设置 android:exported"true" 2.目标Service需要声明自定义权…...

走难而正确的路并持之以恒

走难而正确的路并持之以恒 接近八月&#xff0c;台风频繁。气象台说台风“格美”今夜将至&#xff0c;往粤北走&#xff0c;而留在粤东的将是持续的高温。高温的广州&#xff0c;这几晚的天空惊喜不断&#xff0c;成片的火烧云&#xff0c;站在猎德大桥观望&#xff0c;丹红的凤…...