- 【鸿蒙生态学堂 04】ArkUI开发基础(上)
harmonyos
课程简介本课程是【HarmonyOS生态学堂】的第4课。本课程将介绍HarmonyOS的ArkUI框架,包括其基础语法和如何使用常用组件构建页面。ArkUI是HarmonyOS应用的UI开发框架,提供简洁的UI语法、丰富的组件和实时界面预览工具。您将学习到ArkUI的关键特性,如极简的UI信息语法、丰富的内置UI组件、多维度的状态管理机制,以及如何支持多设备开发。通过课程,您将能够掌握使用ArkU
- 《CPython Internals》阅读笔记:p360-p377
python
《CPythonInternals》学习第20天,p360-p377总结,总计18页。一、技术总结1.seaborn可视化工具。2.dtrace(1)安装sudoapt-getinstallsystemtap-sdt-dev(2)编译./configure--with-dtracemakecleanmake3.snakeviz适用于cProfile的可视化工具。二、英语总结(生词:0)无。关于英语
- GTO 和普通晶闸管同为 PNPN 结构为什么 GTO 能够自关断,而晶闸管不能?
ོ椿生拥蝶
硬件工程
答:GTO之所以能够自行关断,而普通晶闸管不能,是因为GTO与普通晶闸管在设计和工艺方面有以下几点不同:1)GTO在设计时a2较大,这样晶体管V2控制灵敏,易于GTO关断;2)GTO导通时a1+a2的值更接近于I,普通晶闸管a1+a2≥1.05,而GTO则为a1+a2≤1.05.GTO的饱和程度不深,接近于临界饱和,这样为门极控制关断提供了有利条件;3)多元集成结构使每个GTO元阴极面积很小,门极
- 流水灯c语言代码大全,单片机闪烁灯流水灯汇编代码大全
易个小小钡原子
流水灯c语言代码大全
1、单片机AT89C51的P2口接8个发光二极管,让这8个发光二极管显示闪烁功能,即八灯亮2S,熄灭3S,如此循环。参考程序:ORG0000Hstart:MOVP1,#0HCALLdelayMOVP1,#0FFHCALLdelayCALLdelayLJMPstartdelay:MOVR7,#200d2:MOVR6,#250d1:DJNZR6,d1DJNZR7,d2RETEND;200*250次*2
- git的常用用法(最简精华版)
MegumiKato丶
知识杂谈gitgithubgitee
一、工作区域(工作区,暂存区,本地仓库)1、工作区当前正在使用的文件2、暂存区已使用add命令提交的工作区的文件,会保存到暂存区3、本地仓库已使用commit命令提交的暂存区的文件,会保存到本地仓库。4、远程仓库(这不属于工作区域)已使用push命令提交的本地仓库的文件,会上传到远程仓库二、回退版本的三种模式使用gitreflog查看操作的历史记录和版本号1、gitreset--soft版本号当回
- YOLOv11-ultralytics-8.3.67部分代码阅读笔记-conv.py
红色的山茶花
YOLO笔记深度学习
conv.pyultralytics\nn\modules\conv.py目录conv.py1.所需的库和模块2.defautopad(k,p=None,d=1):3.classConv(nn.Module):4.classConv2(Conv):5.classLightConv(nn.Module):6.classDWConv(Conv):7.classDWConvTranspose2d(nn.
- 论文阅读笔记(9)——《A Practical Survey on Faster and Lighter Transformers》
StriveQueen
自然语言处理机器学习论文阅读笔记算法神经网络机器学习Transformer
1Abstract2Introductionrecurrentneuralnetworks(RNNs)longshort-termmemory(LSTM)networksequencetosequenceframeworkinter-attentionrelativeeffectivecontextlength(RECL)Transformer3TransformerA.EncoderB.Deco
- 简识JVM栈中的程序计数器
天天向上杰
jvm
JVM(Java虚拟机)栈中的程序计数器(ProgramCounterRegister)是JVM运行时数据区域中的一个重要组成部分,以下是对其的详细解释:一、程序计数器的定义和作用定义:程序计数器是一块较小的内存区域,每个线程在创建时都会分配一个独立的程序计数器,因此它是线程私有的。作用:程序计数器的主要作用是存储当前线程正在执行的Java方法的字节码指令地址。它是一个指示器,指向方法区中该线程正
- 简识JVM中并发垃圾回收器和多线程并行垃圾回收器的区别
天天向上杰
jvmjava算法
在JVM中,多线程并行垃圾回收器和并发垃圾回收器是两种不同类型的垃圾回收机制,它们的主要区别在于垃圾收集线程与用户线程之间的运行关系,以及这种关系对应用程序性能的影响。以下是对这两种垃圾回收器的详细比较:一、多线程并行垃圾回收器定义与特点:多线程并行垃圾回收器(如ParallelGC)利用多核CPU的优势,通过多个垃圾收集线程同时工作来提高垃圾回收的效率。这些垃圾收集线程在垃圾回收过程中是并行的,
- 简识栈结构的后进先出(LIFO)
天天向上杰
java开发语言
栈结构是一种线性数据结构,其操作遵循后进先出(LastIn,FirstOut,LIFO)的原则。以下是对栈结构后进先出特性的详细解释:一、栈结构的基本定义栈是一种只允许在一端进行插入和删除操作的线性表。这一端通常称为栈顶(Top),相对的另一端称为栈底(Bottom)。栈的基本操作包括压栈(Push)和弹栈(Pop),分别用于在栈顶插入元素和删除元素。二、后进先出(LIFO)原则后进先出原则是指,
- 初学Guns
only空格
笔记java开发语言
大道至简系列目标:系统架构师系列课程课程:大道至简之Guns框架介绍-慕课网1、系统高可用,包括:负载均衡、限流测试、分布式事务、分布式Session、压力测试等等。2、系统高并发,包括:缓存应用、HTTP缓存、异步高并发处理、JVM的优化、队列应用、动静分离等等。构建应用系统:框架guns,快速构建应用系统,Guns基本概念1.快速构建后台管理系统的开源框架2.Guns默认提高诸多业务系统的基本
- YOLOv10-1.1部分代码阅读笔记-model.py
红色的山茶花
YOLO笔记深度学习
model.pyultralytics\models\yolo\model.py目录model.py1.所需的库和模块2.classYOLO(Model):3.classYOLOWorld(Model):1.所需的库和模块#UltralyticsYOLO,AGPL-3.0licensefrompathlibimportPathfromultralytics.engine.modelimportMo
- 56.命令绑定 C#例子 WPF例子
军训猫猫头
c#wpf开发语言
一共是两个控件,绑定了属性和命令。用的是最简做法创建依赖:publicclassRelayCommand:ICommand{privatereadonlyAction_execute;publiceventEventHandlerCanExecuteChanged;publicRelayCommand(Actionexecute)=>_execute=execute;publicboolCanEx
- 浏览器页面操作——实时监控网页变化,读取网页内容
集简云-软件连接神器
人工智能大数据chatgpt
浏览器页面操作功能介绍浏览器页面操作是集简云的一款免费内置应用,它可以定时监控网页变化,精准捕捉所需信息。一键设置指定网页与元素,全自动监测并即时推送通知,助您在第一时间了解网页最新情况,让您更高效便捷地获取与同步信息。您还可以使用浏览器页面操作读取网页内容,结合集简云集成的ChatGPT应用,让ChatGPT可以结合网页实时内容进行智能问答对话或文本生成。集简云平台,赞1▲新功能讲解视频浏览器页
- 大模型应用开发极简入门-基于GPT-4和ChatGPT(含PDF)大模型入门必看书籍!
大模型RAG实战
chatgpt人工智能AI大模型大模型LLMaiagi
一、大模型入门如果你想要入门大模型,这里推荐一本《大模型应用开发极简入门-基于GPT-4和ChatGPT》这本大模型应用开发极简入门手册,为初学者提供了一份清晰、全面的“最小可用知识”,带领大家快速了解GPT-4和ChatGPT的工作原理及优势,并在此基础上使用流行的Python编程语言构建大模型应用。非常适合从其他行业想入门大模型领域的从业者作为入门书籍,对于很多概念做了很通俗易懂的说明和讲解。
- 【大模型应用开发极简入门】使用GPT-4和ChatGPT的编程起点:ChatCompletion详解
roman_日积跬步-终至千里
#LLMchatgpt人工智能
文章目录一.多轮对话二.使用起点:ChatCompletion三.调用模型:create方法1.主要的输入参数:model、message2.对话长度和token数量管理3.可选参数四.ChatCompletion端点的输出格式本文讨论如何使用GPT-4和ChatGPT背后的模型,以及OpenAIPython库。目前,GPT-3.5Turbo是最便宜且功能最多的模型。因此,它也是大多数用例的最佳选
- 为什么redis会开小差?Redis 频繁异常的深度剖析与解决方案
磐基Stack专业服务团队
redis数据库缓存
文章目录导读为什么redis会开小差?1.连接数过多2.bigkey3.慢命令操作4.内存策略不合理5.外部数据双写一致性6.保护机制未开启7.数据集中过期8.CPU饱和9.持久化阻塞10.网络问题结论导读提起分布式缓存,想必大多数同学脑海中都会浮出redis这个名字来……但是,对于它,你真的玩转了吗?为什么你的redis会慢,会卡顿,会崩溃?现在带你一探究竟。为什么redis会开小差?本文主要简
- 《CPython Internals》阅读笔记:p336-p352
codists
读书笔记python
《CPythonInternals》学习第17天,p336-p352总结,总计17页。一、技术总结1.GDBGDB是GNUDbugger的缩写。(1)安装sudoaptinstallgdb(2)创建.gdbinit文件touch~/.gdbinitvim~/.gdbinit(3)配置.gdbinit文件add-auto-load-safe-path/project/cpython注:1./proj
- 《CPython Internals》阅读笔记:p336-p352
python
《CPythonInternals》学习第17天,p336-p352总结,总计17页。一、技术总结1.GDBGDB是GNUDbugger的缩写。(1)安装sudoaptinstallgdb(2)创建.gdbinit文件touch~/.gdbinitvim~/.gdbinit(3)配置.gdbinit文件add-auto-load-safe-path/project/cpython注:1./proj
- Python 入门路线(2025 极简无废话版)
墨鱼爆蛋
Pythonpython开发语言编程
大家好,梳理一个Python从入门到精通路线大家都挺忙的,突出一个无废话注:时间仅供参考第一阶段:基础入门(0-3个月)1.Python基础语法开发环境搭建(Python安装、IDE选择)变量和数据类型运算符和表达式控制流(if/else、循环)函数定义与调用基本输入输出2.数据结构基础列表(List)和元组(Tuple)字典(Dict)和集合(Set)字符串处理文件操作3.错误处理try/exc
- 你需要知道的快速调整台式电脑显示器亮度的两种方法
简鹿办公
电脑硬件电脑显示器亮度调整如何调整显示器亮度调整屏幕亮度方法
本教程中简鹿办公将引导您掌握如何轻松且有效地调整台式电脑显示器的亮度设置,无论是直接操作显示器上的物理按键,还是利用英伟达显卡提供的高级色彩和亮度控制选项。无论您是追求极致视觉效果的游戏爱好者,还是需要长时间面对屏幕的专业人士,学会正确调整亮度都将为您的使用体验带来显著提升。一、通过显示器本身调整亮度物理按钮/触摸按键大多数显示器都配备了一组用于调整设置的物理按钮或触摸按键。这些通常位于显示器的底
- 智能温控风扇——ESP8266 + DS18B20 + OLED + WiFi插座
uote_e
单片机
智能温控风扇——ESP8266+DS18B20+OLED+WiFi插座在现在这个智能家居越来越普及的时代,智能温控风扇已经成为了很受欢迎的产品之一。本文将教大家如何使用ESP8266单片机、DS18B20温度传感器、OLED显示屏和WiFi插座,来实现家用风扇改造成智能温控风扇。材料准备ESP8266开发板DS18B20温度传感器OLED显示屏WiFi插座面包板、杜邦线、三极管、电阻、陶瓷电容等元
- 【一天一门编程语言】Scala 语言程序设计极简教程
AI天才研究院
一天一门编程语言scalajava开发语言
Scala语言程序设计极简教程用markdown格式输出答案。不少于3000字。细分到2级目录。目录简介基本语法变量数据类型运算符流程控制函数类应用安装
- 深度学习中交叉熵函数的导数:(极简)
洪小帅
深度学习人工智能神经网络python
文章目录前言一.交叉熵函数的导数二.Z,y为有n条数据的矩阵前言另一个博主有更详细的推导https://blog.csdn.net/chaipp0607/article/details/101946040一.交叉熵函数的导数softmax:令一条数据最后的输出为[z1,z2,z3,z4,…,z10],这里令输出层的神经元数量为10pi=ezi∑j=110ezjpi=\frac{e^{z_i}}{\
- 《CPython Internals》阅读笔记:p285-p328
codists
读书笔记python
《CPythonInternals》学习第15天,p285-p328总结,总计44页。一、技术总结1.shallowcomparisonp285,InObjectsobject.c,thebaseimplementationoftheobjecttypeiswritteninpureCcode.Therearesomeconcreteimplementationsofbasiclogic,like
- 《CPython Internals》阅读笔记:p250-p284
codists
读书笔记python
《CPythonInternals》学习第14天,250-p284总结,总计25页。一、技术总结介于我觉得作者写得乱七八糟的,读完我已经不想说话了,所以今日无技术总结。二、英语总结(生词:2)1.spawn(1)spawn:来自于词根expandere。(2)expandere:ex-(“out”)+pandere(“tospread”)spawn原来的意思是“spreadingoutoffish
- 《CPython Internals》阅读笔记:p221-p231
codists
笔记
《CPythonInternals》学习第12天,p221-p231总结,总计11页。一、技术总结无。二、英语总结(生词:2)1.atatimeidiom.separately(单独地)inthespecifiedgroups(一次)。示例:(1)Icanonlydoonethingatatim(我一次只能做一件事)。(2)Wecarriedtheboxestwoatatimeupthestair
- 《CPython Internals》阅读笔记:p152-p176
codists
读书笔记python
《CPythonInternals》学习第10天,p152-p176总结,总计25页。一、技术总结1.addinganitemtoalistmy_list=[]my_list.append(obj)上面的代码涉及两个指令:LOAD_FAST,LIST_APPEND。整章看下来这有这点算是可以记的了,其它的只感觉作者在零零碎碎的罗列内容。二、英语总结(生词:1)无。关于英语的注解同步更新汇总到htt
- 《CPython Internals》阅读笔记:p1-p19
codists
笔记
《CPythonInternals》学习第1天,p1-p19总结,总计19页。一、技术总结无。二、英语总结(生词:2)1.humblevshumbled(1)humble:humus(“earth”)adj.字面意思是“ontheground”,后面引申为“lowlyinkind,state,condition(卑微)”,“notproudthatyouareimportant(谦卑)”。(2)h
- 《CPython Internals》阅读笔记:p329-p335
codists
读书笔记python
《CPythonInternals》学习第16天,p329-p335总结,总计7页。一、技术总结1.debuggingp331,Therearetwotypesofdebugger,consoleandvisual——作者将debugger分为两类:(1)console:lldb(MAC系统使用),GDB(Linux系统使用))。(2)visual:VisualStudioDebugger,CLi
- java杨辉三角
3213213333332132
java基础
package com.algorithm;
/**
* @Description 杨辉三角
* @author FuJianyong
* 2015-1-22上午10:10:59
*/
public class YangHui {
public static void main(String[] args) {
//初始化二维数组长度
int[][] y
- 《大话重构》之大布局的辛酸历史
白糖_
重构
《大话重构》中提到“大布局你伤不起”,如果企图重构一个陈旧的大型系统是有非常大的风险,重构不是想象中那么简单。我目前所在公司正好对产品做了一次“大布局重构”,下面我就分享这个“大布局”项目经验给大家。
背景
公司专注于企业级管理产品软件,企业有大中小之分,在2000年初公司用JSP/Servlet开发了一套针对中
- 电驴链接在线视频播放源码
dubinwei
源码电驴播放器视频ed2k
本项目是个搜索电驴(ed2k)链接的应用,借助于磁力视频播放器(官网:
http://loveandroid.duapp.com/ 开放平台),可以实现在线播放视频,也可以用迅雷或者其他下载工具下载。
项目源码:
http://git.oschina.net/svo/Emule,动态更新。也可从附件中下载。
项目源码依赖于两个库项目,库项目一链接:
http://git.oschina.
- Javascript中函数的toString()方法
周凡杨
JavaScriptjstoStringfunctionobject
简述
The toString() method returns a string representing the source code of the function.
简译之,Javascript的toString()方法返回一个代表函数源代码的字符串。
句法
function.
- struts处理自定义异常
g21121
struts
很多时候我们会用到自定义异常来表示特定的错误情况,自定义异常比较简单,只要分清是运行时异常还是非运行时异常即可,运行时异常不需要捕获,继承自RuntimeException,是由容器自己抛出,例如空指针异常。
非运行时异常继承自Exception,在抛出后需要捕获,例如文件未找到异常。
此处我们用的是非运行时异常,首先定义一个异常LoginException:
/**
* 类描述:登录相
- Linux中find常见用法示例
510888780
linux
Linux中find常见用法示例
·find path -option [ -print ] [ -exec -ok command ] {} \;
find命令的参数;
- SpringMVC的各种参数绑定方式
Harry642
springMVC绑定表单
1. 基本数据类型(以int为例,其他类似):
Controller代码:
@RequestMapping("saysth.do")
public void test(int count) {
}
表单代码:
<form action="saysth.do" method="post&q
- Java 获取Oracle ROWID
aijuans
javaoracle
A ROWID is an identification tag unique for each row of an Oracle Database table. The ROWID can be thought of as a virtual column, containing the ID for each row.
The oracle.sql.ROWID class i
- java获取方法的参数名
antlove
javajdkparametermethodreflect
reflect.ClassInformationUtil.java
package reflect;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.Modifier;
import javassist.bytecode.CodeAtt
- JAVA正则表达式匹配 查找 替换 提取操作
百合不是茶
java正则表达式替换提取查找
正则表达式的查找;主要是用到String类中的split();
String str;
str.split();方法中传入按照什么规则截取,返回一个String数组
常见的截取规则:
str.split("\\.")按照.来截取
str.
- Java中equals()与hashCode()方法详解
bijian1013
javasetequals()hashCode()
一.equals()方法详解
equals()方法在object类中定义如下:
public boolean equals(Object obj) {
return (this == obj);
}
很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们知道,String 、Math、I
- 精通Oracle10编程SQL(4)使用SQL语句
bijian1013
oracle数据库plsql
--工资级别表
create table SALGRADE
(
GRADE NUMBER(10),
LOSAL NUMBER(10,2),
HISAL NUMBER(10,2)
)
insert into SALGRADE values(1,0,100);
insert into SALGRADE values(2,100,200);
inser
- 【Nginx二】Nginx作为静态文件HTTP服务器
bit1129
HTTP服务器
Nginx作为静态文件HTTP服务器
在本地系统中创建/data/www目录,存放html文件(包括index.html)
创建/data/images目录,存放imags图片
在主配置文件中添加http指令
http {
server {
listen 80;
server_name
- kafka获得最新partition offset
blackproof
kafkapartitionoffset最新
kafka获得partition下标,需要用到kafka的simpleconsumer
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.
- centos 7安装docker两种方式
ronin47
第一种是采用yum 方式
yum install -y docker
 
- java-60-在O(1)时间删除链表结点
bylijinnan
java
public class DeleteNode_O1_Time {
/**
* Q 60 在O(1)时间删除链表结点
* 给定链表的头指针和一个结点指针(!!),在O(1)时间删除该结点
*
* Assume the list is:
* head->...->nodeToDelete->mNode->nNode->..
- nginx利用proxy_cache来缓存文件
cfyme
cache
user zhangy users;
worker_processes 10;
error_log /var/vlogs/nginx_error.log crit;
pid /var/vlogs/nginx.pid;
#Specifies the value for ma
- [JWFD开源工作流]JWFD嵌入式语法分析器负号的使用问题
comsci
嵌入式
假如我们需要用JWFD的语法分析模块定义一个带负号的方程式,直接在方程式之前添加负号是不正确的,而必须这样做:
string str01 = "a=3.14;b=2.71;c=0;c-((a*a)+(b*b))"
定义一个0整数c,然后用这个整数c去
- 如何集成支付宝官方文档
dai_lm
android
官方文档下载地址
https://b.alipay.com/order/productDetail.htm?productId=2012120700377310&tabId=4#ps-tabinfo-hash
集成的必要条件
1. 需要有自己的Server接收支付宝的消息
2. 需要先制作app,然后提交支付宝审核,通过后才能集成
调试的时候估计会真的扣款,请注意
- 应该在什么时候使用Hadoop
datamachine
hadoop
原帖地址:http://blog.chinaunix.net/uid-301743-id-3925358.html
存档,某些观点与我不谋而合,过度技术化不可取,且hadoop并非万能。
--------------------------------------------万能的分割线--------------------------------
有人问我,“你在大数据和Hado
- 在GridView中对于有外键的字段使用关联模型进行搜索和排序
dcj3sjt126com
yii
在GridView中使用关联模型进行搜索和排序
首先我们有两个模型它们直接有关联:
class Author extends CActiveRecord {
...
}
class Post extends CActiveRecord {
...
function relations() {
return array(
'
- 使用NSString 的格式化大全
dcj3sjt126com
Objective-C
格式定义The format specifiers supported by the NSString formatting methods and CFString formatting functions follow the IEEE printf specification; the specifiers are summarized in Table 1. Note that you c
- 使用activeX插件对象object滚动有重影
蕃薯耀
activeX插件滚动有重影
使用activeX插件对象object滚动有重影 <object style="width:0;" id="abc" classid="CLSID:D3E3970F-2927-9680-BBB4-5D0889909DF6" codebase="activex/OAX339.CAB#
- SpringMVC4零配置
hanqunfeng
springmvc4
基于Servlet3.0规范和SpringMVC4注解式配置方式,实现零xml配置,弄了个小demo,供交流讨论。
项目说明如下:
1.db.sql是项目中用到的表,数据库使用的是oracle11g
2.该项目使用mvn进行管理,私服为自搭建nexus,项目只用到一个第三方 jar,就是oracle的驱动;
3.默认项目为零配置启动,如果需要更改启动方式,请
- 《开源框架那点事儿16》:缓存相关代码的演变
j2eetop
开源框架
问题引入
上次我参与某个大型项目的优化工作,由于系统要求有比较高的TPS,因此就免不了要使用缓冲。
该项目中用的缓冲比较多,有MemCache,有Redis,有的还需要提供二级缓冲,也就是说应用服务器这层也可以设置一些缓冲。
当然去看相关实现代代码的时候,大致是下面的样子。
[java]
view plain
copy
print
?
public vo
- AngularJS浅析
kvhur
JavaScript
概念
AngularJS is a structural framework for dynamic web apps.
了解更多详情请见原文链接:http://www.gbtags.com/gb/share/5726.htm
Directive
扩展html,给html添加声明语句,以便实现自己的需求。对于页面中html元素以ng为前缀的属性名称,ng是angular的命名空间
- 架构师之jdk的bug排查(一)---------------split的点号陷阱
nannan408
split
1.前言.
jdk1.6的lang包的split方法是有bug的,它不能有效识别A.b.c这种类型,导致截取长度始终是0.而对于其他字符,则无此问题.不知道官方有没有修复这个bug.
2.代码
String[] paths = "object.object2.prop11".split("'");
System.ou
- 如何对10亿数据量级的mongoDB作高效的全表扫描
quentinXXZ
mongodb
本文链接:
http://quentinXXZ.iteye.com/blog/2149440
一、正常情况下,不应该有这种需求
首先,大家应该有个概念,标题中的这个问题,在大多情况下是一个伪命题,不应该被提出来。要知道,对于一般较大数据量的数据库,全表查询,这种操作一般情况下是不应该出现的,在做正常查询的时候,如果是范围查询,你至少应该要加上limit。
说一下,
- C语言算法之水仙花数
qiufeihu
c算法
/**
* 水仙花数
*/
#include <stdio.h>
#define N 10
int main()
{
int x,y,z;
for(x=1;x<=N;x++)
for(y=0;y<=N;y++)
for(z=0;z<=N;z++)
if(x*100+y*10+z == x*x*x
- JSP指令
wyzuomumu
jsp
jsp指令的一般语法格式: <%@ 指令名 属性 =”值 ” %>
常用的三种指令: page,include,taglib
page指令语法形式: <%@ page 属性 1=”值 1” 属性 2=”值 2”%>
include指令语法形式: <%@include file=”relative url”%> (jsp可以通过 include