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

BCC-应用程序组件分析

libbpf-tools/gethostlatency

追踪glibc中的getaddrinfogethostbynamegethostbyname2函数用时

# /usr/share/bcc/libbpf-tools/gethostlatency 
TIME     PID     COMM             LATms      HOST
14:58:32 8418    curl             313.635    www.taobao.com

# curl www.taobao.com为例,域名的访问需要先解析域名为ip,再对ip进行访问。解析域名大多数应用层程序会通过调用glibc的相关函数解析。

原理

通过uprobe glibc的三个函数getaddrinfogethostbynamegethostbyname2,分别在进入时记录时间戳,在函数退出时计算时间差。

static int probe_entry(struct pt_regs *ctx)
{__u64 pid_tgid = bpf_get_current_pid_tgid();__u32 tid = (__u32)pid_tgid;struct event event = {};event.time = bpf_ktime_get_ns();bpf_map_update_elem(&starts, &tid, &event, BPF_ANY);return 0;
}static int probe_return(struct pt_regs *ctx)
{__u32 tid = (__u32)bpf_get_current_pid_tgid();struct event *eventp;eventp = bpf_map_lookup_elem(&starts, &tid);/* update time from timestamp to delta */eventp->time = bpf_ktime_get_ns() - eventp->time;bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, eventp, sizeof(*eventp));bpf_map_delete_elem(&starts, &tid);return 0;
}SEC("kprobe/handle_entry")
int BPF_KPROBE(handle_entry)
{return probe_entry(ctx);
}SEC("kretprobe/handle_return")
int BPF_KRETPROBE(handle_return)
{return probe_return(ctx);
}

场景

参考

  • github bcc/tools/gethostlatency_example.txt

libbpf-tools/syscount

统计系统调用次数

# /usr/share/bcc/libbpf-tools/syscount 
Tracing syscalls, printing top 10... Ctrl+C to quit.
^C[16:21:23]
SYSCALL                   COUNT
epoll_pwait                 757
fcntl                       590
futex                       501
times                       488
epoll_ctl                   347
read                        337
nanosleep                   235
openat                      220
close                       202
poll                        112

原理

通过syscall原始跟踪点计数系统调用调用次数与时间差。所有的系统调用都会在raw_syscall处统计到。

场景

参考

  • github bcc/tools/syscount_example.txt

libbpf-tools/bashreadline

追踪bash进程中处理的命令行

# /usr/share/bcc/libbpf-tools/bashreadline 
TIME      PID     COMMAND
16:03:45  1844    pwd

注:最大字符串长度为80,超过80的不予处理

原理

readline是bash处理命令行解析过程中的一个函数,函数的返回值是命令行一行的字符串。bashreadline通过uretprobe
(用户态返回插桩)在该函数返回时直接根据返回值字符指针读取命令行。

readline.c:391/* Read a line of input.  Prompt with PROMPT.  An empty PROMPT meansnone.  A return value of NULL means that EOF was encountered. */
char *
readline (prompt)
#0  readline (prompt=0x557178e5ec30 "[root@localhost gitlab]# ") at readline.c:391
#1  0x00005571770309da in yy_readline_get () at ./parse.y:1457
#2  0x0000557177032d03 in yy_getc () at ./parse.y:2300
#3  shell_getc (remove_quoted_newline=1) at ./parse.y:2300
#4  shell_getc (remove_quoted_newline=1) at ./parse.y:2219
#5  0x00005571770360aa in read_token (command=<optimized out>) at ./parse.y:3117
#6  read_token (command=0) at ./parse.y:3067
#7  0x0000557177039ad8 in yylex () at ./parse.y:2676
#8  yyparse () at y.tab.c:1817
#9  0x000055717703014a in parse_command () at eval.c:262
#10 0x0000557177030258 in read_command () at eval.c:306
#11 0x00005571770304e0 in reader_loop () at eval.c:150
#12 0x000055717702ebdb in main (argc=1, argv=0x7ffc9dbd7a28, env=0x7ffc9dbd7a38) at shell.c:802

场景

bash是大多数操作系统的默认终端,使用此工具可以获取操作系统当前所有bash终端的命令执行状态。

  • 如果用户制定了其他shell,不可捕获
  • 高级语言执行的命令可能不通过bash处理,即使高级语言封装了shell=True传递的是脚本内容

参考

  • github bcc/tools/bashreadline_example.txt

tools/killsnoop

追踪任务发送信号,PID为发送者,TPID为信号接收者。

# /usr/share/bcc/tools/killsnoop 
TIME      PID    COMM             SIG  TPID   RESULT
14:19:54  5748   node             0    327    0
  • 任务task包括进程和线程,在Linux中进程和线程都是通过task统一调度。
  • kill 不一定是字面意思杀掉任务,仅仅是向指定任务发送信号。
  • 如果信号发送给进程,进程含有多个线程,那么进程的信号handle是哪个线程不可保证,除非进程额外处理。

原理

该模块长时间未得到维护,仅支持kprobe模式。

通过在系统调用kill中kprobe,获取信号发送目标进程pid和信号值。

场景

通过kill系统调用发送信号有一些典型场景,如杀死其他进程TERMKILL信号,和其他进程交互USR信号。系统调用不仅仅可以通过kill命令触发,其他程序设计中也可能使用到系统调用发送信号交互。

参考

  • github bcc/tools/killsnoop_example.txt

tools/bpflis

统计当前正在运行的bpf程序

# /usr/share/bcc/tools/bpflist
PID    COMM             TYPE  COUNT
38284  execsnoop        map   4
38284  execsnoop        prog  2

原理

遍历/proc/<fd>/fd下文件查找文件夹内是否有链接为anon_inode:bpf-*的文件。

/proc是内核提供的虚拟文件系统,提供接口可以获取进程信息,当bpf程序运行时通常会创建对应的map等数据结构,这些数据结构映射为文件描述符供程序调用,/proc/<fd>/fd下是进程已打开的文件描述符并使用软连接指向文件。

场景

该模块仅仅是遍历/proc效率较高,可快速定位是否有bpf类进程运行。

参考

  • proc(5) — Linux manual page
  • proc_pid_fd(5) — Linux manual page
  • github bcc/tools/bpflist_example.txt

libbpf-tools/execsnoop

追踪进程执行

/usr/share/bcc/libbpf-tools/execsnoop 
PCOMM            PID    PPID   RET ARGS
ls               3438   2601     0 /usr/bin/ls

原理

linux中执行新的程序需要通过clone/fork先创建出子进程,由子进程通过exec系统调用才能执行新的程序替换子进程空间。

以命令行中执行ls命令为例,父进程bash的pid是3589,此时使用strace -p 3589 -f跟踪bash的系统调用,bashclone创建自身的子进程3702,由子进程3702执行系统调用execve变为ls进程。

# psPID TTY          TIME CMD3589 pts/1    00:00:00 bash
# ls
# strace -p 3589 -f
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLDstrace: Process 3702 attached
[pid  3702] execve("/usr/bin/ls", ["ls", "--color=auto"], 0x556e71ce7510 /* 46 vars */) = 0

execsnoopexecve系统调用追踪点获取事件。

场景

追踪系统中的新程序执行

参考

  • github bcc/tools/execsnoop_example.txt

tools/threadsnoop

追踪使用libc.solibpthread.sopthread_create函数创建线程任务。

# /usr/share/bcc/tools/threadsnoop
Attaching 2 probes...
TIME(ms)   PID    COMM             FUNC
1938       28549  dockerd          threadentry
  • 部分高级语言(如python)、使用其他库、程序特殊设计的可能不使用pthread_create创建线程,此类追踪不到。

原理

使用uprobe用户态插桩libc.solibpthread.sopthread_create函数收集信息并输出。

场景

参考

  • github bcc/tools/threadsnoop_example.txt

tools/sslsniff

# /usr/share/bcc/tools/sslsniff 
FUNC         TIME(s)            COMM             PID     LEN    
WRITE/SEND   0.000000000        curl             1968    77    
----- DATA -----
GET / HTTP/1.1
Host: www.baidu.com
User-Agent: curl/7.79.1
Accept: */*
----- END DATA -----

仅适用于使用了opensslgnutlsnss动态库的应用层软件。

使用readelf -d <path_to_your_executable_program>判断使用的动态库。

原理

使用uprobe方式追踪用户态的opensslgnutlsnss三个动态库的ssl相关函数执行。

bcc/tools/sslsniff.py: 280def attach_openssl(lib):b.attach_uprobe(name=lib, sym="SSL_write",fn_name="probe_SSL_rw_enter", pid=args.pid or -1)b.attach_uretprobe(name=lib, sym="SSL_write",fn_name="probe_SSL_write_exit", pid=args.pid or -1)b.attach_uprobe(name=lib, sym="SSL_read",fn_name="probe_SSL_rw_enter", pid=args.pid or -1)b.attach_uretprobe(name=lib, sym="SSL_read",fn_name="probe_SSL_read_exit", pid=args.pid or -1)if args.latency and args.handshake:b.attach_uprobe(name="ssl", sym="SSL_do_handshake",fn_name="probe_SSL_do_handshake_enter", pid=args.pid or -1)b.attach_uretprobe(name="ssl", sym="SSL_do_handshake",fn_name="probe_SSL_do_handshake_exit", pid=args.pid or -1)def attach_gnutls(lib):b.attach_uprobe(name=lib, sym="gnutls_record_send",fn_name="probe_SSL_rw_enter", pid=args.pid or -1)b.attach_uretprobe(name=lib, sym="gnutls_record_send",fn_name="probe_SSL_write_exit", pid=args.pid or -1)b.attach_uprobe(name=lib, sym="gnutls_record_recv",fn_name="probe_SSL_rw_enter", pid=args.pid or -1)b.attach_uretprobe(name=lib, sym="gnutls_record_recv",fn_name="probe_SSL_read_exit", pid=args.pid or -1)def attach_nss(lib):b.attach_uprobe(name=lib, sym="PR_Write",fn_name="probe_SSL_rw_enter", pid=args.pid or -1)b.attach_uretprobe(name=lib, sym="PR_Write",fn_name="probe_SSL_write_exit", pid=args.pid or -1)b.attach_uprobe(name=lib, sym="PR_Send",fn_name="probe_SSL_rw_enter", pid=args.pid or -1)b.attach_uretprobe(name=lib, sym="PR_Send",fn_name="probe_SSL_write_exit", pid=args.pid or -1)b.attach_uprobe(name=lib, sym="PR_Read",fn_name="probe_SSL_rw_enter", pid=args.pid or -1)b.attach_uretprobe(name=lib, sym="PR_Read",fn_name="probe_SSL_read_exit", pid=args.pid or -1)b.attach_uprobe(name=lib, sym="PR_Recv",fn_name="probe_SSL_rw_enter", pid=args.pid or -1)b.attach_uretprobe(name=lib, sym="PR_Recv",fn_name="probe_SSL_read_exit", pid=args.pid or -1)

场景

ssl常用于https通信中。使用https通信时常规的网络抓包工具如果需要解析报文非常麻烦,使用此工具可以建议看到双方通讯内容。

参考

  • github bcc/tools/sslsniff_example.txt

tools/ttysnoop

追踪终端输出。

# /usr/share/bcc/tools/ttysnoop  1
[root@localhost ~]# pwd
/root

原理

追踪kprobe/tty_write位置,此位置实现的是file_operationswrite接口,位于驱动层,tty实现了文件系统的写入接口,所有打开了tty的程序都拥有tty的句柄(文件描述符),对该tty的写入都会通过此函数。

参考《文件系统模块梳理》。

linux-5.10.202/drivers/tty/tty_io.c: 474static const struct file_operations tty_fops = {.write_iter	= tty_write,

场景

参考

  • github bcc/tools/ttysnoop_example.txt

tools/capable

追踪权能验证。

#  /usr/share/bcc/tools/capable 
TIME      UID    PID    COMM             CAP  NAME                 AUDIT 
14:37:11  0      2490   modprobe         16   CAP_SYS_MODULE       1     
14:37:11  0      549    systemd-udevd    12   CAP_NET_ADMIN        1     
14:37:11  0      2489   tcpdump          13   CAP_NET_RAW          1

原理

追踪kprobe/cap_capable,此函数是内核用来检查权能是否允许的函数。

cap_capable在内核的位置与说明:

linux-5.10.202/security/commoncap.c: 50/*** cap_capable - Determine whether a task has a particular effective capability* @cred: The credentials to use* @ns:  The user namespace in which we need the capability* @cap: The capability to check for* @opts: Bitmask of options defined in include/linux/security.h** Determine whether the nominated task has the specified capability amongst* its effective set, returning 0 if it does, -ve if it does not.** NOTE WELL: cap_has_capability() cannot be used like the kernel's capable()* and has_capability() functions.  That is, it has the reverse semantics:* cap_has_capability() returns 0 when a task has a capability, but the* kernel's capable() and has_capability() returns 1 for this case.*/
int cap_capable(const struct cred *cred, struct user_namespace *targ_ns,int cap, unsigned int opts)
{
/*** cap_capable - 判断一个任务是否具有特定的有效权限能力* @cred: 要使用的凭证* @ns:   需要该权限的用户命名空间* @cap:  要检查的权限能力* @opts: 在 include/linux/security.h 中定义的选项位掩码** 判断指定的任务在其有效集内是否具有指定的权限能力,如果具有返回 0,不具有则返回负值。** 注意:cap_has_capability() 不能像内核的 capable() 和 has_capability() 函数那样使用。* 即,它的语义是相反的:当一个任务具有某权限时,cap_has_capability() 返回 0,* 而内核的 capable() 和 has_capability() 在这种情况下返回 1。*/

场景

参考文章:抓虫:chown失败 Couldn‘t change ownership of savefile 内的此段,正好是在cap_capable函数内检查权能失败而导致的问题。

# perf ftrace -G setattr_prepare  --graph-opts depth=5 chown tcpdump:tcpdump a.pcap            chown: 正在更改'a.pcap' 的所有者: 不允许的操作
# tracer: function_graph
#
# CPU  DURATION                  FUNCTION CALLS
# |     |   |                     |   |   |   |0)               |  setattr_prepare() {0)               |    capable_wrt_inode_uidgid() {0)               |      ns_capable_common() {0)               |        security_capable() {0)   0.099 us    |          cap_capable();0)   0.433 us    |        }0)   0.651 us    |      }0)   0.854 us    |    }0) + 31.484 us   |  }

权能问题的追踪较为复杂,因为不容易直接发现是否是权能导致的问题。如发现类似内核拒绝执行的内容,可先检查如audit类日志,在使用如ftrace类工具追踪内核。

参考

  • 抓虫:chown失败 Couldn‘t change ownership of savefile
  • capabilities(7) — Linux manual page
  • github bcc/tools/capable_example.txt

相关文章:

BCC-应用程序组件分析

libbpf-tools/gethostlatency 追踪glibc中的getaddrinfo、gethostbyname、gethostbyname2函数用时 # /usr/share/bcc/libbpf-tools/gethostlatency TIME PID COMM LATms HOST 14:58:32 8418 curl 313.635 www.taobao.com以# cur…...

无参数读文件和RCE

什么是无参数&#xff1f; 无参数&#xff08;No-Argument&#xff09;的概念&#xff0c;顾名思义&#xff0c;就是在PHP中调用函数时&#xff0c;不传递任何参数。我们需要利用仅靠函数本身的返回值或嵌套无参数函数的方式&#xff0c;达到读取文件或远程命令执行&#xff0…...

SpringMVC_day02

一、SSM 整合 核心步骤 依赖管理 包含 SpringMVC、Spring JDBC、MyBatis、Druid 数据源、Jackson 等依赖。注意点&#xff1a;确保版本兼容性&#xff08;如 Spring 5.x 与 MyBatis 3.5.x&#xff09;。 配置类 SpringConfig&#xff1a;扫描 Service 层、启用事务管理、导入…...

在Linux、Windows系统上安装开源InfluxDB——InfluxDB OSS v2并设置开机自启的保姆级图文教程

一、进入InfluxDB下载官网 InfluxData 文档https://docs.influxdata.com/Install InfluxDB OSS v2 | InfluxDB OSS v2 Documentation...

LinkedIn数据抓取零风险指南:亮数据住宅代理实现企业级合规采集

亮数据住宅代理实现企业级合规采集 一、前言二、尝试使用三、使用体验高效稳定易用性&#xff1a;合规与安全&#xff1a;技术支持&#xff1a; 四、适用场景五、推荐程度六、试用地址 一、前言 最近一位猎头小伙伴找到我&#xff0c;说目前很多公司的出海业务都在招人&#x…...

ROS2的发展历史、核心架构和应用场景

以下是对**ROS2&#xff08;Robot Operating System 2&#xff09;**的发展历史、核心架构和应用场景的详细解析&#xff0c;覆盖其技术演变、关键特性和生态系统&#xff1a; 一、ROS2的诞生背景&#xff1a;从ROS1到ROS2 1. ROS1的历史与局限 ROS1的起源&#xff1a; 2007年…...

PHP eval 长度限制绕过与 Webshell 获取

在 PHP 代码中&#xff0c;如果 eval($param); 存在且长度受限&#xff0c;并且过滤了 eval 和 assert&#xff0c;仍然可以通过多种方法绕过限制&#xff0c;获取 Webshell。 源码 <?php $param $_REQUEST[param]; if(strlen($param)<17 && stripos($param,…...

自然语言处理(14:处理时序数据的层的实现)

系列文章目录 第一章 1:同义词词典和基于计数方法语料库预处理 第一章 2:基于计数方法的分布式表示和假设&#xff0c;共现矩阵&#xff0c;向量相似度 第一章 3:基于计数方法的改进以及总结 第二章 1:word2vec 第二章 2:word2vec和CBOW模型的初步实现 第二章 3:CBOW模型…...

Pytest的Fixture使用

概述 Pytest中的Fixture可以使得测试代码高度复用,同时对资源进行安全的管理,以及在复杂的测试场景用进行灵活的组合。 概念 Fixture:可重用的函数,用@pytest.fixture来进行装饰,用于为测试提供数据、环境或者服务作用域:控制Fixture的生命周期,默认是function,可设置…...

【蓝桥杯】每日练习 Day13

前言 今天做了不少题&#xff0c;但是感觉都太水了&#xff0c;深思熟虑之下主播决定拿出两道相对不那么水的题来说一下&#xff08;其实还是很水&#xff09;。 两道问题&#xff0c;一道是日期问题&#xff08;模拟&#xff09;&#xff0c;一道是区间合并问题。 日期差值 …...

Vue3 中使用 vuedraggable 实现拖拽排序功能,分组拖拽

Vue3 中使用 vuedraggable 实现拖拽排序功能&#xff0c;分组拖拽 安装draggable npm install vuedraggablenext --save基础用法示例 <template><div class"app-container"><draggable v-model"list" item-key"id":group"…...

husky的简介以及如果想要放飞自我的解决方案

husky 是一个 Git Hooks 管理工具&#xff0c;它的主要作用是 在 Git 提交&#xff08;commit&#xff09;、推送&#xff08;push&#xff09;等操作时执行自定义脚本&#xff0c;比如代码检查&#xff08;Lint&#xff09;、单元测试&#xff08;Test&#xff09;、格式化代码…...

Maven工具学习使用(四)——仓库

仓库分类 对于Mavne来说,仓库只分为两类:本地仓库和远程仓库。当Maven根据坐标查询寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在此构件,则直接使用;如果本地仓库不存在此构件,或者需要查看是否有更新的构件版本,Maven就会去远程仓库查找,发现需要的构件之后…...

【BFS】《单源、多源 BFS:图搜索算法的双生力量》

文章目录 前言单源BFS例题一、迷宫中离入口最近的出口二、 最小基因变化三、单词接龙四、为高尔夫比赛砍树 多源BFS例题一、 01 矩阵二、飞地的数量三、地图中的最高点四、地图分析 结语 前言 什么是单源、多源BFS算法问题呢&#xff1f; BFS&#xff08;Breadth - First Sear…...

批量取消 PDF 文档中的所有超链接

在 PDF 文档中我们可以插入各种各样的文本也可以给文本设置字体&#xff0c;颜色等多种样式&#xff0c;同时还可以给文字或者图片添加上超链接&#xff0c;当我们点击超链接之后&#xff0c;就会跳转到对应的网页。有时候这会对我们的阅读或者使用形成一定的干扰&#xff0c;今…...

13.2 kubelet containerRuntime接口定义和初始化

本节重点总结 &#xff1a; containerRuntime 需要实现3类接口 管理容器的接口管理镜像的接口Streaming API 用于客户端与容器进行交互 type KubeGenericRuntime interface {kubecontainer.Runtimekubecontainer.StreamingRuntimekubecontainer.CommandRunner }containerRun…...

使用 gone.WrapFunctionProvider 快速接入第三方服务

项目地址&#xff1a;https://github.com/gone-io/gone 本文中源代码&#xff1a; esexamples/es 文章目录 1. gone.WrapFunctionProvider 简介2. 配置注入实现3. 实战示例&#xff1a;Elasticsearch 集成4. 使用方式5. 最佳实践6. 总结 在如何给Gone框架编写Goner组件&#xf…...

git 标签学习笔记

目录 轻量级标签 带注释的标签&#xff08;推荐&#xff09; 给指定 commit 打标签 推送单个标签&#xff0c;需要单独推送&#xff0c;代码推送不会推送标签 推送所有标签 删除标签 轻量级标签 git tag v1.0.0 只是简单地给当前 commit 打上 v1.0.0 标签。 带注释的标…...

【论文阅读】基于思维链提示的大语言模型软件漏洞发现与修复方法研究

这篇文章来自于 Chain-of-Thought Prompting of Large Language Models for Discovering and Fixing Software Vulnerabilities 摘要 软件安全漏洞在现代系统中呈现泛在化趋势&#xff0c;其引发的社会影响日益显著。尽管已有多种防御技术被提出&#xff0c;基于深度学习&…...

企业在人工智能创新与安全之间走钢丝

2025 年全球 AI/ML 工具使用量将激增&#xff0c;企业将 AI 融入运营之中&#xff0c;员工也将 AI 嵌入日常工作流程中。报告显示&#xff0c;企业对 AI/ML 工具的使用同比增长 3,000% 以上&#xff0c;凸显了各行各业迅速采用 AI 技术&#xff0c;以提升生产力、效率和创新水平…...

CSS动画

目录 一、核心概念与语法 1. keyframes 关键帧 2. animation 属性 二、动画调速函数&#xff08;animation-timing-function&#xff09; 1. 预设值 2. 贝塞尔曲线 3. 步进函数&#xff08;steps()&#xff09; 三、动画控制与交互 1. 暂停与恢复 2. JavaScript 控制…...

计算机视觉(CV)技术的优势和挑战

计算机视觉&#xff08;CV&#xff09;技术是人工智能领域中的一个重要分支&#xff0c;它主要通过让机器学会“看”和“理解”图像或视频来模拟人类视觉系统。以下是计算机视觉技术的一些优势和挑战&#xff1a; 优势&#xff1a; 自动化&#xff1a;计算机视觉技术可以实现…...

动态IP与静态IP该如何选?

一、当IP地址成为"网络身份" 2023年亚马逊封号潮中&#xff0c;某杭州卖家因登录IP频繁切换&#xff08;早8点在纽约&#xff0c;午间瞬移到东京&#xff09;&#xff0c;触发平台风控导致账号冻结。这类"时空错乱症"揭示了跨境电商的生存法则&#xff1a…...

Vue.js 完全指南:从入门到精通

1. Vue.js 简介 1.1 什么是 Vue.js? Vue.js(通常简称为 Vue)是一个用于构建用户界面的渐进式 JavaScript 框架。所谓"渐进式",意味着 Vue 的设计是由浅入深的,你可以根据自己的需求选择使用它的一部分或全部功能。 Vue 最初由尤雨溪(Evan You)在 2014 年创…...

《TypeScript 7天速成系列》第3天:TypeScript高级类型通关秘籍:泛型+联合+交叉类型实战

TypeScript 的类型系统是其最强大的特性之一&#xff0c;但也是许多开发者感到困惑的地方。今天我们就来破解 TypeScript 中最难的类型系统&#xff0c;掌握泛型、联合类型和交叉类型的使用技巧。 一、泛型函数与泛型接口 泛型是 TypeScript 中创建可重用组件的重要工具&…...

Python----数据分析(足球运动员数据分析)

一、数据展示 1.1、数据 1.2、列名 字段名备注Name姓名Nationality国籍National_Position国家队位置National_Kit国家队号码Club所在俱乐部Club_Position所在俱乐部位置Club_Kit俱乐部号码Club_Joining加入俱乐部时间Contract_Expiry合同到期时间Rating评分Height身高Weight体…...

音视频 三 看书的笔记 MediaPlayer的C/S架构

MediaPlayer在运行时分为Client和Server两部分 Client层‌&#xff1a;位于Java层&#xff0c;用户通过调用Java层的API&#xff08;如setDataSource&#xff09;来操作MediaPlayer。 Server层‌&#xff1a;位于C层&#xff0c;负责实际的媒体处理工作。Server层通过Binder机…...

Elasticsearch:使用 AI SDK 和 Elastic 构建 AI 代理

作者&#xff1a;来自 Elastic Carly Richmond 你是否经常听到 AI 代理&#xff08;AI agents&#xff09;这个词&#xff0c;但不太确定它们是什么&#xff0c;或者如何在 TypeScript&#xff08;或 JavaScript&#xff09;中构建一个&#xff1f;跟我一起深入了解 AI 代理的概…...

echarts添加坐标轴点击事件

echarts添加坐标轴点击事件 chart.on(click, (params) > {if(params.componentType yAxis && this.type ! 1){console.log(params);// 检查是否点击了系列数据console.log(你点击了 ${params.name} 的数据点&#xff0c;值为 ${params.value}); this.$bus.$emi…...

如何在linux中部署dns服务 主备dns (详细全过程)

环境centos 7.9 主DNS&#xff1a;192.168.60.131 备DNS&#xff1a;192.168.60.134 我以 chenxingyu0.com 指向 192.168.60.200为例 首先是主dns #!/bin/bash# 检查是否为 root 用户 if [ "$(id -u)" ! "0" ]; thenecho "请使用…...

GitLab 中文版17.10正式发布,27项重点功能解读【二】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…...

matplotlib——南丁格尔玫瑰

南丁格尔玫瑰图&#xff08;Nightingale Rose Chart&#xff09;&#xff0c;是一种特殊形式的柱状图&#xff0c;它以南丁格尔&#xff08;Florence Nightingale&#xff09;命名&#xff0c;她在1858年首次使用这种图表来展示战争期间士兵死亡原因的数据。 它将数据绘制在极坐…...

WPF 与 C# 融合开发:从基础到高级应用(一)

WPF 与 C# 融合开发&#xff1a;从基础到高级应用 一、C# 语言基础回顾 1.1 C# 语言概述 C# 是微软开发的一种现代、面向对象的编程语言&#xff0c;它融合了 C、C 和 Java 等语言的优点&#xff0c;具有简洁、安全、高效等特点。C# 广泛应用于 Windows 平台的应用开发&…...

ref和reactive区别

在 Vue 3 中&#xff0c;ref 和 reactive 是两种创建响应式数据的主要 API&#xff0c;但它们的适用场景和使用方式有所不同。以下是它们的核心区别和示例&#xff1a; 一、核心区别 特性refreactive适用数据类型所有类型&#xff08;基本类型、对象、数组&#xff09;仅对象或…...

精选10个好用的WordPress免费主题

10个好用的WordPress免费主题 1. Astra Astra 是全球最受欢迎的 WordPress 主题。它功能丰富&#xff0c;易于使用&#xff0c;SEO友好&#xff0c;是第一个安装量突破100万的非默认主题&#xff0c;并获得了5000多个五星好评。 它完美集成了Elementor、Beaver&#xff0c;古…...

DerpNStink: 1靶场渗透

DerpNStink: 1 来自 <DerpNStink: 1 ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23.213 3&#xff0c;对靶机进行端…...

apache安装脚本使用shell建立

注意防火墙&#xff0c;yum&#xff0c;网络连接等 以下是具体的apache安装脚本 #!/bin/bash # Set Apache version to install ## author: yuan # 检查外网连接 echo "检查外网连接..." ping www.baidu.com -c 3 > /dev/null 2>&1 if [ $? -eq 0 ]; …...

Azure SDK 使用指南

​Azure SDK&#xff08;软件开发工具包&#xff09;是一组由微软提供的工具和库&#xff0c;旨在帮助开发者以多种编程语言&#xff08;如 .NET、Java、Python、JavaScript 等&#xff09;与 Azure 服务进行交互。 ​通过使用 Azure SDK&#xff0c;开发者可以更高效地构建、部…...

DeepSeek-V3-0324 版本升级概要

DeepSeek-V3-0324 魔搭社区汇聚各领域最先进的机器学习模型&#xff0c;提供模型探索体验、推理、训练、部署和应用的一站式服务。https://modelscope.cn/models/deepseek-ai/DeepSeek-V3-0324 发布背景与改进 根DeepSeek-V3-0324 展示了以下关键改进&#xff1a; 推理性能提…...

leetcode 150. 逆波兰表达式求值

150. 逆波兰表达式求值 - 力扣&#xff08;LeetCode&#xff09; class Solution:def evalRPN(self, tokens: List[str]) -> int:stack[]for item in tokens:if item not in ( ,-,* , / ):stack.append(item)else:preint(stack.pop())pre_beforeint(stack.pop())sign itemi…...

LangChain4j与DashScope深度集成实战:一站式开发指南

本篇文章会通篇详细的讲清楚LangChain4j与DashScope集成的各个方面&#xff0c;从Springboot的集成到Ai对话、会话记忆、RAG、FunctionCalling、互联网搜索、结构化的输出、多模态等都给出相应的说明&#xff0c;希望通过这篇文章对于LLM不了解的同仁一样可以扩展出自己的AI应用…...

逼用户升级Win11,微软开始给Win10限速

随着Windows10的支持时间越来越短&#xff0c;微软也加大了对Win10用户的驱赶力度。 最近&#xff0c;微软官宣了将要在今年6月份降低OneNote for Windows 10的同步速度。软件也将和Windows10在今年的10月14日一同停止支持和维护。 这将影响实时协作和多设备访问。 对OneNote…...

工作流引擎Flowable介绍及SpringBoot整合使用实例

Flowable简介 Flowable 是一个轻量级的业务流程管理&#xff08;BPM&#xff09;和工作流引擎&#xff0c;基于 Activiti 项目发展而来&#xff0c;专注于提供高性能、可扩展的工作流解决方案。它主要用于企业级应用中的流程自动化、任务管理和审批流等场景。 Flowable 的核心…...

推荐一个可以自定义github主页的网站

一、简介 Profile Readme Generator 是一个开源工具&#xff0c;可以帮助你快速创建个性化的 GitHub 个人简介&#xff08;README&#xff09;。它支持自定义内容和样式&#xff0c;让你的 GitHub 个人主页更加美观和专业。 二、使用步骤 &#xff08;一&#xff09;访问网站…...

【R语言可视化】相关系数热图

目录 热图无显著性 结果展示01&#xff1a; 热图显著性 结果展示02&#xff1a; ggplot2绘制三角热图 结果展示03&#xff1a; corrplot绘制三角热图 结果展示04: 热图无显著性 # 示例数据 data(mtcars) df <- mtcars# 计算相关矩阵 cor_matrix <- round(cor(df…...

【区块链 + 文化版权】文创链 | FISCO BCOS 应用案例

“文创链”是由四川省区块链行业协会、成都音像出版社有限公司共同发起&#xff0c; 由成都九天星空科技有限公司等联合打造的数字文创领域联盟链。平台采用FISCO BCOS 开源底层框架&#xff0c; 为数字文创产业构建一个高效、透明、可信的版权管理与交易平台。 平台专注于数字…...

# 使用自定义Shell脚本hello快速配置Linux用户账户

使用自定义Shell脚本快速配置Linux用户账户 在学校实验室管理Linux服务器&#xff0c;或者公司小团队管理服务器时&#xff0c;大家需要一个能隔离自己服务&#xff0c;但是自己又需要对服务器的完整权限的情形。创建和配置用户账户是一项常见但繁琐的任务。特别是当你需要频繁…...

PyTorch中的Tensor

PyTorch中的Tensor‌ 是核心数据结构&#xff0c;类似于 NumPy 的多维数组&#xff0c;但具备 GPU 加速和自动求导等深度学习特性。 一、基本概念 ‌核心数据结构‌ Tensor 是存储和操作数据的基础单元&#xff0c;支持标量&#xff08;0D&#xff09;、向量&#xff08;1D&am…...

16-CSS3新增选择器

知识目标 掌握属性选择器的使用掌握关系选择器的使用掌握结构化伪类选择器的使用掌握伪元素选择器的使用 如何减少文档内class属性和id属性的定义&#xff0c;使文档变得更加简洁&#xff1f; 可以通过属性选择器、关系选择器、结构化伪类选择器、伪元素选择器。 1. 属性选择…...

关于笔记本电脑突然没有wifi图标解决方案

笔记本电脑突然没有wifi图标解决方案&#xff0c;设置里也看不见wifi&#xff0c;电脑突然就连不网络了 解决方案&#xff1a; 我的电脑——>管理——>服务和应用程序——>服务——>找到WLAN AutoConfig——>点击启动就好了...