自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

轻飘飞扬

认真关注一件事很难~所以你不成功!

  • 博客(430)
  • 资源 (20)
  • 收藏
  • 关注

原创 GTK编程基础---入门篇(helloworld)

下面来介绍GTK编程入门,你的第一个程序hellowoeld。直接通过程序来讲解吧。/*File:helloworld.c *Date:2013-11-23 *Author:sjin *Mail:[email protected] *//*my first test program*/#include /* 这是一个回调函数。data 参数在本示例中被忽略。 * 后面有更多的回

2013-11-23 16:17:24 17249 1

转载 Ubuntu下安装GTK的三种方法

1 安装命令:sudo apt-get install gnome-core-devel sudo apt-get install libglib2.0-doc libgtk2.0-doc sudo apt-get install devhelp sudo apt-get install glade-gnome glade-common glade-doc  安装GTK环境只要

2013-11-17 15:34:13 18100 3

原创 走进C++程序世界----宏定义和内联函数及模板说明

1. 简单宏定义  简单的宏定义有如下格式: [#define指令(简单的宏)]  #define  标识符替换列表 替换列表是一系列的C语言记号,包括标识符、关键字、数、字符常量、字符串字面量、运算符和标点符号。当预处理器遇到一个宏定义时,会做一个 “标识符”代表“替换列表”的记录。在文件后面的内容中,不管标识符在任何位置出现,预处理器都会

2013-11-17 10:53:35 2612

原创 走进C++程序世界----类型转换运算符

C++的四个类型转换运算符已经有很久了,但一直没有弄清楚它们的用法,今天看到一本书上的解释,才大致地的了解了其具体的用法.看下面具体的代码:/* *cast_operator.cpp *cDate : 2013-11-16 *Author: sjin *Mail:[email protected] */#include using namespace std;/*C++中的

2013-11-16 17:28:18 2117

原创 ubuntu 一些常用的查找方法

1、查找头文件在那个源码包中。      比如查找X11/Xlib.h在那个源码包中,打开网页http://packages.ubuntu.com 中的Keyword中输入X11/Xlib.h之后,浏览器会显示下面的列表文件软件包/usr/include/IV-X11/Xlib.hivtools-dev/usr/include/X11/X

2013-11-14 08:59:04 1890

原创 走进C++程序世界------操作符运算、操作符重载、转换运算符、双目元算、+=,-+运算符,比较运算符及下标运算符

重载,在一个类定义中,可以编写几个同名的方法,但是只要它们的签名参数列表不同,Java就会将它们看做唯一的方法。简单的说,一个类中的方法与另一个方法同名,但是参数表不同,这种方法称之为重载方法下面关于操作符重载的具体实例(单目运算的自增及自减)/* *operator.cpp *cDate : 2013-9-28 *Author: sjin *Mail:413977243@qq

2013-10-28 22:37:04 2296

原创 走进C++程序世界------多重继承

多重继承   多重继承:从多个基类派生出来的新类。要从多个基类派生,在类声明中,基类之间用逗号隔开。如下:class Pegasus : public Horse,public Bird {}可以看下面的代码,说明了如何声明Pegasus,使其从Horse和Birds派生而来。/* *Multiple_interitance.cpp *Date : 2013-

2013-10-27 12:15:30 1985

转载 alsa 用户空间编程

/**alsa play test*ALSA用户空间编译,ALSA驱动的声卡在用户空间,不宜直接使用*文件接口中,而应使用alsa-lib*打开---->设置参数--->读写音频数据 ALSA全部使用alsa-lib中的API*交叉编译*export LD_LIBRARY_PATH=$PWD:$LD_LIBRARY_PATH*arm-linux-gcc -o alsa_play als

2013-10-19 17:07:07 2211

转载 ALSA编程细节分析---Linux 声音调节

[Loong]:之前写过基于ALSA的WAV播放录音程序,见http://blog.csdn.net/sepnic/archive/2011/01/14/6140824.aspx。现在本想好好整理一下ALSA的编程思想,但Google了一下,发现已经有同道做了类似的工作,故将其转载过来,并添加一些本人的疑问以及补充(将会继续补充,原文很多重要的ALSA参数没有提到)。原文:http://b

2013-10-19 17:05:30 7368

翻译 freeRdp ---- 音频输出通道扩展

1.1.1  EA简介The Remote Desktop Protocol: Audio OutputVirtual Channel Extension [MS-RDPEA]:远程桌面协议:音频输出虚拟通道扩展。远程桌面协议无缝地传输音频数据从服务器到客户端。这个协议的目的是将音频数据从服务器传输到客户端。例如,当服务器播放音频文件时,这个协议将音频数据传输到客户端,客户端再播放音频文件

2013-10-19 17:01:02 4784

翻译 freeRdp -----GDI加速扩展相关介绍

1.1.1  GDI简介Remote Desktop Protocol: Graphics Device Interface (GDI)Acceleration ExtensionsGDI加速扩展:Gdi加速扩展是为了减少带宽,通过编码动态的绘制操作来生成一个图像代替原始图像的编解码。1.1.2  GDI相关内容1、  CachesGDI定义了一些数量的缓存提供给客户端

2013-10-19 16:53:06 5182

原创 走进C++程序世界-----私有继承

私有继承:   在C++编程语言中,在声明一个派生类时将基类的继承方式指定为private的称为私有继承,用私有继承方式建立的派生类称为私有派生类(private derived class),其基类称为私有基类(private base class)。私有基类的公用成员和保护成员在私有派生类中的访问属性相当于派生类中的私有成员,即派生类的成员函数能访问它们,而在派生类外不能访

2013-10-19 12:24:36 2199

原创 走进C++程序世界-----继承和派生(2)

覆盖基类的函数    覆盖基类函数顾名思义就是在派生类中对基类的函数进行的重新定义。这里将会讲到下面的2个知识点:1、隐藏基类的方法2、调用基类的方法(隐式和显示调用基类的方法) /* *derive2.cpp *Date : 2013-9-24 *Author: sjin *Mail:[email protected] */#include #define N 0

2013-10-12 23:05:31 2084

原创 走进C++程序世界------继承和派生

继承和派生 继承是面向对象编程语言的最重要方面之一,正确的使用继承可编写出设计良好,容易于维护和扩展的应用程序。下面是在其他博客中的总结:******************************以下转载 http://blog.csdn.net/caijp1090/article/details/7484906******************1、继承:保持已有类的特性而

2013-09-24 23:05:57 2300

原创 走进C++程序世界-------类的定义和使用(数据成员和方法成员,析构函数,构造函数,内联实现)

类的成员简介 在C++中,可以通过声明一个类来穿件一种新的类型。类将一组变量(他们的类型通常不同)和一组相关的函数组合在一起。类可以有各种类型的变量组成,还可以包含其他类对象。成员变量称为数据成员它们是类中变量。   成员变量也叫数据成员,他们是类中的变量。成员变量是类的组成部分 。类还可以包含函数,它们被称为成员函数或者方法。成员函数和成员变量一样,是类的重要组成部分,它们决定了类的功能

2013-09-20 22:23:59 3892

原创 走进C++程序世界-------浅谈引用

什么引用:    引用是别名,创建引用时,将其初始化另外一个对象,引用(reference)是C++对C语言的重要扩充。引用的声明的方法:类型标示符 & 引用名 = 目标变量名;说明:   1、&在此不是求地址运算,而是其标识作用。    2、类型标示符是指目标变量的类型。    3、声明引用时必须对此进行初始化。    4、引用声明完毕后,相当于目标变量名优两个名称,即该

2013-09-19 09:43:19 2392 1

原创 GDB调试(正在运行的程序)

有时会遇到一种很特殊的调试需求,对当前正在运行的其它进程进行调试(正是我今天遇到的情形)。这种情况有可能发生在那些无法直接在调试器中运行的进程身上,例如有的进程 只能在系统启动时运行。另外如果需要对进程产生的子进程进行调试的话,也只能采用这种方式。GDB可以对正在执行的程序进行调度,它允许开发人员中断程序 并查看其状态,之后还能让这个程序正常地继续执行。一、多线程调试多线程调试可能

2013-09-17 17:07:50 11701

原创 获得Unix/Linux系统中的IP、MAC地址等信息

获得Unix/Linux系统中的IP、MAC地址等信息实际环境和特殊需求往往会将简单问题复杂化,比如计算机IP地址,对于一个连接中socket,可以直接获得本端和对端的IP、端口信息。但在一些特殊场合我们可能需要更多的信息,比如系统中有几块网卡,他们的Mac地址是多少,每块网卡分配了几个IP(一个网卡对应多个IP)等等。这些信息往往需要通过ifconfig指令来获得,对于程序员来说,在

2013-09-16 14:18:14 3608

原创 PHP自学之路-----javascript基础入门

Javascript概述:Javascript是基于对象和事件的脚本语言。特点;1、安全性(不允许直接访问本地硬盘),它可以做的就是信息的动态交互。2、跨平台性。 JavaScript与HTML的结合方式:想要将其他代码融入HTML,都是以标签的形式。 1、 Js代码存放在标签对。。。。2、 使用JavaScript标签引入Js文件。如: JavaScript语

2013-09-15 21:40:00 2301 1

原创 走进C++程序世界-----指针(动态申请空间和释放空间)

使用关键字NEW分配内存    在讲解分配内存之前,首先来理解下内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区这些也是初学者容易混淆的地方。我的博客中有一篇文章描述C语言中代码分配情况,点击链接     下面部分是转载于:http://blog.sina.com.cn/s/blog_7edcf63b0100yhk9.html     一. 在c中分为这几个存储

2013-09-14 11:44:18 10817 1

原创 走进C++程序世界-----函数相关(全局变量,默认参数,函数重载,内联函数)

全局变量在函数外面定义的变量的作用域为全局,在程序的任何函数中都可用。与全局变量同名的局部变量不会修改全局变量的值,但会隐藏它。如果函数中有一个与全局变量同 名的局部变量时,则在函数中使用该名称时,指得是局部变量而不是全局变量。这个也是面试中经常问到的?局部变量能否和全局变量重名?具体看下面的代码#include int x = 5;int y = 7;void myfunc

2013-09-12 22:15:17 2526 1

原创 走入C++程序世界-------第一个C++程序

下面就让我们走进C++的编程世界,目前介绍的都是在LINUX下的C++程序。废话少说,看下面经典的“hello world!"代码。#include /*io库*/#define N 1/*有些编译器允许main()的返回类型VOID,但是这种写法已不再是合法的C++程序 *请不要养成这种习惯。应该让main()返回int,像下面返回0就可以了。 * */int main(){

2013-09-11 22:32:58 2218

原创 网上支付平台PHP版本

今天看完了,传智博客PHP网上支付平台视频,对网络支付有个很深的了解,并没有想象的那么难,主要是使用第三方支付平台易宝进行。但是在测试中发现很多问题,一直没有解决,特意从网上找到完整详细的代码。有兴趣的同学可以自己下载看看!完整代码下载页http://download.csdn.net/detail/jsh13417/6230621 参考资料:传智博客PHP网上支付视频,

2013-09-07 22:51:16 3245

转载 asterisk常用调试监测命令

asterisk是开源的VOIP系统。是目前最流行的VOIP开源软件。在使用过程中  可以使用下述的命令,对系统进行监控调试。下文来自网络,非本人原创1. 运行调试常用命令./asterisk & 在后台启动asterisk./asterisk –vvvc 启动asterisk并尽量多的在控制台显示调试信息./asterisk –r 连接asterisk控制台

2013-09-04 22:55:51 7610

原创 Sip协议基本流程

1、SIP基本的呼叫流程详图 2、 Emmet:HTML/CSS代码快速编写神器3、asterisk 入门资料(安装、配置等等)   ASTERISK呼叫基本概念视频4 、MAN 技术 手册 LINUX5、RFC技术资料英文版 6、C语言一些学习基础资料

2013-09-04 09:26:25 6544

原创 线程的取消模式

posix的线程有两中取消模式,立即取消和延迟取消.立即取消是你调用pthread_cancel的时候,不管线程当前正在干什么,马上被结束掉.延迟取消是在你调用pthread_cancel以后,线程运行到一个取消点函数的时候才会结束.使用pthread_join函数挂起当前线程后,想取消挂起,因此试着用了 pthread_detach函数,必须把pthread_detach放在pthr

2013-09-03 15:20:29 2234

原创 pthread_once()使用(某个时间在整个程序中仅执行一次,不确定是那个线程)

在多线程环境中,有些事仅需要执行一次。通常当初始化应用程序时,可以比较容易地将其放在main函数中。但当你写一个库时,就不能在main里面初始化了,你可以用静态初始化,但使用一次初始化(pthread_once)会比较容易些。int pthread_once(pthread_once_t *once_control, void (*init_routine) (void));功能:本函

2013-09-02 17:11:47 18777

原创 PHP 自学之路-----XML编程(Xpath技术,simpleXml技术)基础入门

XPAth技术       XPath的设计的核心思想,可以通过xpath迅速简介的定位到你希望查找的节点。主要目的是描述节点相对其他节点的位置,可以取得所有符合条件的节点,成为[位置路径]。     Xapth主要用来在XML文档中查询信息的工具,通过使用路径表达式可以解析XML文件,读取XML文件中的数据下面以案例来介绍,XML 文件如下(simplexml.xml):

2013-08-31 14:33:29 2839

转载 向socket一次写多少数据合适?

以太网(IEEE 802.3)帧格式:1、前导码:7字节0x55,一串1、0间隔,用于信号同步2、帧起始定界符:1字节0xD5(10101011),表示一帧开始3、DA(目的MAC):6字节4、SA(源MAC):6字节5、类型/长度:2字节,0~1500保留为长度域值,1536~65535保留为类型域值(0x0600~0xFFFF)6、数据:46

2013-08-26 10:45:30 6279

转载 linux TCP 参数设置

此文为网络转载,对理解linux内核tcp参数设置有一定帮助,设置tcp参数一定要小心谨慎,轻易不要更改线上环境,我贴一下我们线上环境中,sysctl.conf的内容,见文章底部net.ipv4.tcp_tw_reuse    = 1net.ipv4.tcp_tw_recycle  = 1net.ipv4.tcp_fin_timeout = 30net.ipv4.tcp_keepa

2013-08-26 10:39:45 5505

原创 PHP 自学之路-----XML编程(Dom技术)

上一节,讲了Xml文件基本语法及元素,实体及Dtd约束技术,下面就正式进入PHP的Xml编程使用PHP技术对Xml文件进行操作常用的有以下三种技术:1、PHP dom2、PHP结合XPath操作Xml3、Simplexml技术首先来说明DomDom(Document object model)文档-对象-模型,核心思想是把一个Xml文件,看成一个对象模型,然后通过对象的

2013-08-25 00:26:12 3034

转载 视频码率,帧率和分辨率及H264介绍

视频码率,帧率和分辨率到底哪一个影响电影的清晰度码率:影响体积,与体积成正比:码率越大,体积越大;码率越小,体积越小。  码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。也就是取样率,单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件,但是文件体积与取样率是成正比的,所以几乎所有的编码格式重视的都是如何用最低的码率达到最少的失真,围绕这个核心衍

2013-08-24 11:06:09 26521

原创 TCP的超时与重传

1. TCP提供可靠连接的途径是通过接受方确认发送方的数据实现的,数据和确认都可能丢失,这就需要及时发现数据或者确认丢失而进行重传。重传最重要的是要确定超时间隔和重传频率。2. 对于每个连接,TCP管理4个定时器来完成数据的传输:重传定时器坚持定时器(persist):使窗口大小保持不断流动;保活定时器(keepalive):检测空闲连接的另一端何时崩溃;2MSL定时器:测量一

2013-08-24 11:04:34 15898

转载 TCP快速重传与快速恢复原理分析

超时重传是TCP协议保证数据可靠性的一个重要机制,其原理是在发送一个数据以后就开启一个计时器,在一定时间内如果没有得到发送数据报的ACK报文,那么就重新发送数据,知道发送成功为止。这是数据丢包的情况下给出的一种修补机制。一般来说,重传发生在超时之后,但是如果发送端接收到3个以上的重复ACK,就应该意识到,数据丢了,需要重新传递。这个机制不需要等到重传定时器溢出,所以叫做快速重传,而快速重传以后,因

2013-08-24 10:15:28 4063

转载 TCP/IP协议头部结构体

TCP/IP协议头部结构体(转)网络协议结构体定义 view plaincopy to clipboardprint?// i386 is little_endian.  #ifndef LITTLE_ENDIAN  #define LITTLE_ENDIAN   (1)   //BYTE ORDER  #else   #error Redefine L

2013-08-21 12:03:48 2442

原创 linux环境应用程序LOG日志打印(C语言)

下面是前段时间做项目用到的一个输出LOG日志的代码,每个文件最多记录10W行,超过10W行,将当前日志文件重命名,重新再打开。直接看代码吧,很简单!int InitTCpRtpLog(){ char log[256]; mkdir(TCP_RTP_LOG_PATH, 0755); snprintf(log, sizeof(log), "%s/%s"

2013-08-20 09:30:33 7463

原创 PHP自学之路---报表及绘图技术(jpgraph库使用,Linux安装及配置说明)

JpGraph库简介    专门提供图表的类库。它使得作图变成了一件非常简单的事情,你只需从数据库中取出相关数据,定义标题,图表类型,然后的事情就交给JpGraph,只需掌握为数不多的JpGraph内置函数(可以参照JpGraph附带例子学习),就可以画出非常炫目的图表!LINUX 下安装及配置说明1、在官网上下载最新的jpgraph库, http://jpgraph.net/ (jp

2013-08-18 10:47:05 4225

原创 PHP自学之路---报表及绘图技术

Ø  报表a)        什么是报表报表就是用表格、图表等格式来动态显示数据。b)        PHP绘图坐标系1、  坐标系介绍下图说明了PHP坐标系。坐标原点位于左上角,以像素为单位,像素是计算机屏幕上最小的显示单位,看下图: 2、  坐标体系--像素“像素”(Pixel)是由 Picture(图像)和 Element(元素)这两个单词

2013-08-14 23:01:39 3196

转载 TCP协议经典rfc主题总结

Richard Stevens的书虽好,但是他所要表达的是让你知其然。对于想精通tcp的同学来说,光知其然是远远不够的,你还需要更多的时间去了解其所以然,而翻阅rfc文档就是一种最好的方式,这样你就明白tcp为何这么设计了。这里总结了一下tcp核心主题对应的rfc文档,方便自己和大家查阅。:)rfc序列号主题内容描述793

2013-08-10 18:14:56 1847

原创 线程池创建及使用案例及调试函数assert()断言调试介绍

什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了。如果线程创建和销毁时间相比任务执行时间可以忽略不计,则没有必要使用线程池了。   下面是Linux系统下用C语言创建的一个线程池。线程池会维护一个任务链表(每个CThread_worker结构就是一个任务)。   p

2013-08-10 10:51:37 2148

redis设计与实现 第二版 高清 带标签 PDF文档.zip

本书详细描述了redis的功能点和内部实现,如果希望了解redis功能和深入研究redis实现细节,本书是一个很好的参考和借鉴,同时加入了目录结构,便于翻阅。 一共2个版本的PDF,都带有目录,可以选择自己舒服的版本阅读。

2019-07-22

强烈推荐 网络之路H3C数通技术23期汇总.zip

网络之路H3C数通技术23期汇总 QOS、组播、IPsec、vlan、HA、NAT等等详细基础知识

2019-07-13

linux VIM 配置文件

vimrc文件拷贝到用户家目录和root家目录下更名为.vimrc 两个TXT文件拷贝到/usr/share/vim/vim73/doc 目录下 两个VIM文件拷贝到/usr/share/vim/vim73/plugin目录下

2014-12-02

USBIP协议翻译

内核模块USBIP协议的linux侧,相关描述,是内核帮助文档的翻译。

2014-11-21

BMP图片编码x264文件

使用FFMpeg可以很方便的对音视频进行编码,并且写文件。 下面的代码是将5幅1280*720大小的图片进行编码,并且写到文件中

2014-11-15

VLC0.94版本

VLC 0.94版本windows安装程序,配合live555实现网页播放功能!

2014-11-11

live555项目Vs2010编译环境搭建及源码

Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目 它实现了对标准流媒体传输协议如RTP RTCP RTSP SIP等的支持 Live555实现了对多种音视频编码格式的音视频数据的流化 接收和处理等支持 包括MPEG H 263+ DV JPEG视频和多种音频编码 同时由于良好的设计 Live555非常容易扩展对其他格式的支持 目前 Live555已经被用于多款播放器的流媒体播放功能的实现 如VLC VideoLan MPlayer   该项目的源代码包括四个基本的库 各种测试代码以及IVE555 Media Server 四个基本的库分别是UsageEnvironment&TaskScheduler groupsock liveMedia BasicUsageEnvironment ">Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目 它实现了对标准流媒体传输协议如RTP RTCP RTSP SIP等的支持 Live555实现了对多种音视频编码格式的音视频数据的流化 接收和处理等支持 包括MPEG H 263+ DV JPEG视 [更多]

2014-09-06

ubuntu apt-get 软件源局域网或公网设置

打包的这些只是很少的一部分,比如,现在你要在客户机中#apt-get install vim那肯定是安装不了的,因为主机中根本就没有,如果想要安装怎么办,就在主机进行操作之前把软件给安装好apt-get install vim apt-get install ssh。这样就可以了,或者你可以把官方的软件源全部下载下来,那样体积会非常大。所以我只安装我自己需要的。

2014-06-25

linux C 内存池实现

C语言实现的内存池!j利用默认的内存管理函数new/delete或malloc/free在堆上分配和释放内存会有一些额外的开销。

2014-05-16

XSTUNT 源码 linux 环境及相应API说明

XSTUNT 源码 linux 环境及相应API说明 基于TCP的 NAT穿透技术源码!

2014-05-05

ubuntu dpkg制作安装包

介绍在unbuntu系统下如何制作deb安装包程序!

2014-03-31

基于TCP,UDP NAT穿透资料附源码

基于TCP,UDP NAT穿透资料附源码

2014-01-12

GTK基础编程

GTK2.0 基础编程教程,详细的实例进行学习。只要循序渐进的学习,没有什么不可能的

2013-11-17

易宝支付PHP代码

商家正式运行时,必须把自己的服务器部署在公网上的服务器上,这样支付成功后易宝支付的服务器才能支付结果及时返回给商家 为了商家技术工程师开发的方便,如果测试服务器在工程师自己的服务器上,可以把URL设定为localhost的方式,浏览器可以正式返回。

2013-09-07

XPath基础教程

XPath的设计的核心思想,可以通过xpath迅速简介的定位到你希望查找的节点。主要目的是描述节点相对其他节点的位置,可以取得所有符合条件的节点,成为[位置路径]。

2013-08-31

PJSIP 开源代码及文档

PJSIP是一个开源的SIP协议库,它实现了SIP、SDP、RTP、STUN、TURN和ICE。PJSIP作为基于SIP的一个多媒体通信框架提供了非常清晰的API,以及NAT穿越的功能。PJSIP具有非常好的移植性,几乎支持现今所有系统:从桌面系统、嵌入式系统到智能手机。

2013-01-30

华清嵌入式培训编写代码程序

本人在华清嵌入式培训机构4个月时间,所编写的所有代码,里面有各个文件夹,很方便大家阅读~

2012-12-17

数据结构笔记数据结构

Linux C 数据结构相关资料 很详细的

2012-12-12

jeffy-vim 很强的一个vim插件及配置

linux vi编辑器的自动补齐功能,能让你长的代码无需记住,自动显示;很多常用的命令,对代码阅读和写很有帮助

2012-11-30

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除