自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(142)
  • 问答 (1)
  • 收藏
  • 关注

原创 frp内网穿透——以连接到校园内网的服务器为例

有时候想摸鱼不去实验室,在宿舍就直接连接到实验室的GPU服务器。奈何服务器在校园网内部,外网无法直接直接访问。此时需要手动搭一个跳板机,来连接到内网的GPU服务器,这一过程怎么做到呢?我们可以使用frp内网穿透工具,frp是一个开源、简洁易用、高性能的内网穿透和反向代理软件。准备工作:首先你要有一台自己的电脑,实验室的服务器,以及一台具有的设备。公网IP的设备可以去租用各个厂商的云服务器,用最低配置即可(这里以阿里云为例,我当时在TB买的轻量应用服务器,比较便宜省心)。

2023-04-17 15:32:23 2568 2

原创 Mysql与Redis双写一致性问题

在更新完数据库以后,必然需要对缓存中的键值对进行修改。而这个过程涉及到了各种各样的不一致性。大致有以下四种双写策略:(1)先更新缓存,再更新数据库;(2)先更新数据库,再更新缓存;(3)先删除缓存,再更新数据库;(4)先更新数据库,再删除缓存;(1)先更新缓存,再更新数据库这种策略会涉及到几个问题:问题一:如果缓存更新成功,而数据库抽风了,因为各种原因更新失败,此时出现缓存与数据库的数据不一致;问题二:假设有两个线程A和B,都对数据库进行修改,但执行顺序如下:(1)A对缓存进行更新;(2)B

2022-02-19 12:22:51 2062 2

原创 Nginx的基本理解

Nginx出现的背景随着业务量和用户量的逐渐庞大,单机方式已经满足不了大公司对外提供服务的需求。因此会选择搭建一个包含若干台服务器的集群,对外提供服务。但集群在用户看来就是一个整体(相当于一台服务器)。所以,用户该如何正确的访问到集群中的某一台服务器,来处理自己当前的请求。这里就需要有一个API网关,作为服务对外暴露的一个接口。即所有请求都先发送到这个网关,网关再根据请求的类型转发到对应的服务器。同时,如果多台服务器提供一样的服务,该网关希望将请求平均分配到这些不同的服务器上进行处理,来保障某一个机器的负

2021-12-26 00:05:58 469 1

原创 Leetcode25 K 个一组翻转链表

思路:虽然是K个一组反转链表,但本质上还是反转链表。需要增加的就是一个循环,以及需要维护更多的节点位置。在这里我加入了一个什么都不放的头节点。可以看到维护了四个指针,分别是beforePre(bp),beforeCur(bc),afterLast(al),afterNxt(an)。这四个分别表示什么呢?根据题意,第一次反转我们需要把 1 和 2 两个节点进行反转。所以在这里,我们把 节点1 和节点2 串起来的当做是一个子链表。bp表示子链表前面的一个节点,bc表示子链表第一个节点,al表示子链表最后一.

2021-12-11 15:18:53 468

原创 进程之间的通信方式

(1)管道:在Linux基本命令的使用中,通常使用多个命令的组合来达到我们的需求。例如我们想查看一下正在运行中的python进程:ps -aux | grep python这里的“|”实际上就是管道的意思。“|”前面部分作为“|”后面部分的输入,但这很明显是单向传输的管道,被称为“匿名管道”。如果想实现双向传输,可以考虑使用两个管道进行拼接。管道的问题就是通信效率非常低下。假设有A和B两个进程,A进程将数据写入管道,B进程必须等待A进程将信息写完以后才能读出来,所以不适合非常频繁的通信。(2)消

2021-12-10 13:55:16 284

原创 通讯工具类 CountDownLatch CyclicBarrier Semaphore

CountDownLatchCountDownLatch可以看作是一个减法计数器。CountDown代表计数递减,Latch是“门闩”的意思。也有人把它称为“屏障”。假设某个线程在执行任务之前,需要等待其它线程完成一些前置任务,必须等所有的前置任务都完成,才能开始执行本线程的任务。看下面一段代码public class CountTest { public static void main(String[] args) throws InterruptedException {

2021-12-07 19:11:15 291

原创 聊一聊synchronize关键字

Java并发编程中,锁是一个绕不开的话题。锁都是基于对象的,Java中每一个对象都可以作为一个锁。值得注意的是,我们所说的类锁也是基于对象的,因为一个类唯一对应着一个Class对象。Synchronize关键字锁通常与 synchronize 关键字联系到一起,synchronize有三种使用方法:分别是(1)作用在实例方法上,锁为当前实例;(2)作用在静态方法上,锁为当前Class对象;(3)作用在代码块上,锁为括号里的对象。// 关键字在实例方法上,锁为当前实例public synchroniz

2021-12-06 19:08:17 688 1

原创 volatile关键字的作用

在说volatile关键字之前,首先要了解一下java内存模型JMM。JMM(Java Memory Model)JMM目的是为了屏蔽各种硬件和操作系统之间的内存访问差异,从而让JAVA程序在各种平台对内存的访问一致。JMM规定了所有的变量都存储在主存中,每个线程都有自己独立的工作空间,线程对变量的操作必须先从主存中读取到自己的工作内存中然后再进行操作,最后回写回主存。(值得注意的是,每一个线程对应由一个CPU来执行,CPU和主存之间的速度是有差异的,因此每个线程的工作内存有点相当于缓存cache的功

2021-12-03 15:45:15 462 1

原创 Leetcode146 LRU缓存机制 Map+双端链表版本

思想LRU的思想就是当缓存满了的时候,把最近最久没有使用过的数据从缓存中删除掉。因此需要一个双端队列来维护这种使用次序。当一个key-value新加入缓存,或者进行更改时,需要把该key-value移动到队列的首部(因为这个键值对是最近使用的)。双端队列的数据结构如下:class DLinkedNode { int key; int value; DLinkedNode pre; DLinkedNode next; p..

2021-12-02 19:55:02 2691

原创 字节码(.class)文件解读

字节码文件是什么我们在命令后使用 java 命令,就能将java源文件(.java)编译成对应的字节码文件(.class)。字节码文件是一种八位字节的二进制流文件,各个数据项按照一定顺序从前到后紧密排列。因此,这样的安排会使得字节码文件非常紧凑,可以被jvm快速的加载到内存中,并且占用较少的内存空间。java源文件在被编译器编译之后,每个类(或者接口)都单独占据一个字节码文件。类中所有信息都在字节码文件中有所描述,由于字节码文件非常灵活,它对类的描述能力甚至强于java源文件。字节码文件中的信息是一项

2021-12-02 14:50:02 7515 3

原创 JVM垃圾回收原理和算法

垃圾定位法要进行垃圾回收,第一步肯定是要判断出哪些对象属于垃圾,因此需要利用垃圾定位法来判断出垃圾对象。定位垃圾的方法主要有两种:(1)引用计数法;(2)可达性分析法。引用计数法:通过给对象增加引用计数器,记录当前对象被引用的次数,当引用次数为0时就会标记为垃圾;该方法在循环引用的情况下无法解决,会造成内存泄漏,如对象A引用对象B,对象B同时引用对象A(A->B, B->A)。可达性分析法:通过规定的一些GC根节点出发去查找,如果一个对象和根节点之间没有引用路径,或引用链不可达

2021-12-01 15:17:45 440 1

原创 Leetcode42 接雨水

解题思路:采用双指针的方法,维护两个指针left和right,同时维护两个变量leftMax和rightMax。其中left只从左向右移动,right从右向左移动。如果height[left]<height[right],此时计算下标为left处的储水值,计算方法为 min(leftMax, rightMax)-height[left]。也就是说判断一下left及其左侧最高的柱子,和right及其右侧最高的柱子,选取两者中较低的,减去left当前的高度,就能得到left位置存储雨水的值。然后将l.

2021-11-30 14:26:12 191

原创 Redis缓存穿透 击穿 雪崩及解决方案

缓存处理流程前台请求数据,先到缓存(Redis)中去取,如果有则直接返回数据;如果没有,则进一步到数据库中去获取数据。在高并发的场景之下,使用缓存可以快很多;但如果大量的请求越过缓存,请求数据库,那必然会给数据库带来很大的压力,会出现下面所说的缓存穿透、缓存击穿和缓存雪崩的问题。缓存穿透缓存穿透是指查询一个不存在的数据,由于缓存是不命中时被动写的。如果从数据库中查不到数据,则不会写入缓存,所以这将导致不存在的数据每次请求都要到DB中去查询,失去了缓存的意义。特别是在流量大的时候,可能数据库就挂掉了。

2021-11-29 14:28:26 1941 3

原创 Redis主从复制简述

概念主从复制,就是将Redis服务器中的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(Slave)。数据的复制只能从主节点复制到从节点(一般情况下实现读写分离,即主节点负责写操作,从节点负责读操作)。在默认情况下,每个Redis服务器都是主节点,一个主节点可以有0个或者多个从节点构成,但是每一个从节点只能有一个主节点。作用数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式;故障恢复:当主节点发生故障时,从节点可以暂时代替主节点提供服务,是一

2021-11-28 15:57:34 815

原创 Redis持久化之RDB和AOF

我们知道,Redis是基于内存的数据库,如果遇到断电的情况,那么数据将会丢失。因此,我们需要将Redis中的数据同步到磁盘上,以实现数据的持久化。实现持久化的方式分为两种:(1)RDB(Redis Database);(2)AOF(Append Only File)RDB(Redis Database)在指定的时间间隔后,如果更改了指定次数的数据,则将内存中的数据集快照写入到磁盘;在恢复过程中,直接读取快照文件,进行数据的恢复。在默认情况下,Redis将数据库快照保存在名为 dump.rdb的二进制文件

2021-11-28 13:37:30 823

原创 Redis中的事务

Redis中的事务本质是一组命令的集合。事务中的每条命令都会被序列化,执行过程中按顺序执行,不允许其他命令进行干扰。提炼一下即:(1)一次性(2)顺序性(3)排他性。值得注意的是:Redis事务没有隔离级别的概念;此外,Redis单条命令是保证原子性的,但是事务不保证原子性。Redis事务操作过程开启事务(multi)命令入队执行事务(exec)因此开启事务以后的所有命令,在加入队列时都没有被执行,而是直到提交时才会开始执行(exec),并一次性执行完毕。127.0.0.1:6379&gt

2021-11-26 20:52:45 257

原创 Redis五大基本数据类型

Redis中五大基本数据类型为String,List,Set,Hash和Zset(有序集合)。其中String类型是最为基础的,list可以用来做队列/栈,set保证集合内元素不重复,hash是的value部分也是若干个k-v的形式(一般用于存储对象),Zset与set的不同是维护了一个score,可以根据score进行排序。下面是一些常用的API:(Redis的命令无大小写之分,为了区分命令关键字与key value,下面的命令都用大写符号表示):String命令描述SET ke

2021-11-25 22:39:16 265

原创 MySQL面试题大全(索引、事务、锁、SQL语句及优化、数据库优化、其他常见面试题)

写在前面一份很好的MySQL面试题汇总,本文只起到文字备份作用,建议通过链接查看原文,图文并茂哦~作者:捏捏小肥脸链接:传送门来源:牛客网什么是MySQL? *百度百科上的解释:MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言–结构化查询语言(SQL)进行数据库管理。MySQL是开放源代码的,因此任何人都可以在General Public License的许可下下载并根据个性化的需要对其进行修改。MySQL常用的存储引擎有什么?它们有什么区别? ***

2021-11-18 10:33:46 398 2

原创 synchronized和Lock实现生产者消费者

synchronized实现生产者消费者:public class ProducerConsumer2 { public static void main(String[] args) { Data2 data = new Data2(); new Thread(()->{ for(int i = 0; i < 20; i++) { try { data.

2021-11-08 16:19:51 207

原创 浅谈JVM虚拟机

JVM是用来执行字节码文件(.class)的虚拟机,运作与操作系统之上。由于可以将jvm看作安装在操作系统上的软件,因此Java编写的程序可以在不同的操作系统上运行,因为编译后的字节码与平台就无关了,只需要在不同的操作系统上安装一个对应版本的 jvm 虚拟机。JVM大致分为如上图所示的三个部分:类加载子系统(ClassLoader);运行时数据区(包括方法去、堆、JVM栈、程序计数器 和 本地方法栈);执行引擎(JIT编译器:对热点数据进行二次编译,将字节码指令变成机器指令,将机器指令存放在方法

2021-10-23 11:17:46 769

原创 Dockerfile的编写

Dockerfile是用来构建docker镜像的文件,是一个命令参数脚本。DockerFile是面向开发的,发布项目的时候需要做镜像,就要编写dockerfile文件。如果对docker还不太了解的小伙伴,请先移步浅谈Docker。构建步骤:编写一个dockerfile文件docker build 构建一个镜像docker run 运行镜像docker push 发布镜像(DockerHub、阿里云从仓库等)DockerFile基础知识1、每个指令都必须是大写字母;2、执行顺序从上

2021-10-22 14:06:30 9436

原创 浅谈Docker

Docker简介Docker是2013年发行的一种容器技术。容器技术有什么用?我们知道,软件开发中最棘手的莫过于环境配置问题。很多时候,一个项目可以在我们的机器上跑了,但是其他人的机器由于环境配置、版本不兼容等问题,很难将项目移植到其他机器来运行。所以我们希望在将项目的打包的时候,能将当前的环境一并添加进去。在Docker这类容器技术出现之前,虚拟机技术就是一种带环境安装的解决方案。但是虚拟机自身比较笨重,因为他需要独占一部分的内存和硬盘空间。在虚拟机运行的时候,这些资源就不能被其他进程使用了。而且虚拟

2021-10-20 18:33:02 647

原创 Leetcode 最长不含重复字符的子字符串

解题思路:本题的目的是在给定的字符串中,找出一个不含相同字母的子串。因此首先想到滑动窗口,即给定一个left和一个right,维护一个不包含相同字母子串的窗口。使用一个集合set作为辅助,每次将right向右移动一次,如果right对应的字符没有出现在set中,则无需操作;反之,则清除掉set中所有元素,重新计算滑窗,并将left移动到此时right的位置。right每次向右移动,都让结果res取 max(res, right-left+1)。AC代码:class Solution { pub.

2021-08-21 11:06:43 128 2

原创 Leetcode 0~n-1中缺失的数字

剑指offer53题:首先想到的应该是遍历一遍即可,时间复杂度O(n)。但是,任何已经排好序的数组,如果要做查找功能,都可以用二分法。本题定义一个left=0,right=length-1。每次计算一个mid=(left+right)/2,如果mid==nums[mid],说明缺失的数字在右侧数组,让left=mid+1;若不等,则说明缺失的数字在左侧数组,让right=mid-1。AC代码如下:class Solution { public int missingNumber(int[

2021-08-15 15:25:09 109

原创 Leetcode复杂链表的复制

题目如下:可以看出题意是复制带有random指针的链表,该random指针可以指向链表中的任意节点或者null。如果不含有这个random指针,则复制会非常简单,就是每次开辟一个节点前后相连即可。但现在需要时刻保存链表中所有节点的引用信息,使得random指针可以任意的指向链表中的任意节点。所以这里使用了HashMap<Node, Node>的数据结构,key值存的是原始链表,value则是要去得到的复制后的链表。代码如下:/*// Definition for a Node.cla

2021-08-13 10:26:34 131

原创 Leetcode 用两个栈实现队列&包含min函数的栈

剑指offer09. 用两个栈实现队列思路:栈的特性是先进后出,队列是先进先出。用一个栈A作为存储。另外一个栈B作为辅助。元素入队是直接A.push即可,元素出队需要将栈A的栈底元素弹出,因此先将A中所有元素倒入B中,此时B的栈顶元素就是A的栈底元素(即想要出队的元素),弹出以后再将B中所有元素倒回A中即可。代码如下:class CQueue { Stack<Integer> s1 = new Stack<>(); Stack<Integer> s2

2021-08-12 16:41:09 158

原创 Java静态代理与动态代理

先粘贴一篇大佬的博文 「Java动态代理作用是什么」,本文是对其学习笔记。代理(Proxy)是一种设计模式,通过代理对象来访问目标对象,目的是在目标对象的基础上进行增强,例如增加一些额外的功能。Java中的代理主要分为静态代理和动态代理。静态代理为每一个类都编写一个对应的代理类,两个类都实现同样的接口。在创建一个代理对象的时候,需要向其构造器中塞入一个目标对象,然后在代理对象的方法内部调用目标对象的同名方法(并可以加入一些额外的功能)。如下图所示:可见 代理对象=目标对象+增强代码(即上图中的打

2021-08-09 16:28:39 208

原创 HTTPS加密机制

本文是对「一文读懂HTTPS加密机制」的提炼。HTTPS等价为HTTP+SSL。由于http协议是明文传输的,因此很容易被截获,所以是不安全的,需要采用加密机制。为何不能只用对称加密对称加密是加密和解密都用同一个密钥,服务器给浏览器发消息,首先用自身的密钥加密。但如果想要浏览器解密报文,必须把这个密钥也发送给浏览器,这样密钥很容易被截获,所以是不安全的。为何不能只用非对称加密非对称加密是指服务器有一个私钥和一个公钥,私钥始终自己保存,公钥发送给浏览器。如果用私钥加密,则用公钥解密;如果用公钥加密,

2021-08-08 22:00:11 203

原创 最简单的Java反射机制

Java中非常有特点的一个机制就是「反射」。反射可以理解为与正射相对立,正射就是我们知道一个类的作用,通过实例化一个实例对象,直接调用其方法。例如定义如下一个Orange类:public class Orange { private int price; public String name; public void setPrice(int price) { this.price = price; } public int getPric

2021-08-06 11:35:25 213

原创 Java中型参是否会改变实参

Java在进行参数传递的时候和c++不一样,并没有显式指定传递的是参数的值还是引用,所以通过下面一个程序可以直观得出一些结论:public class core { public static void main(String[] argv) { int a = 3; String b = "abc"; int[] c = {1,2,3,4,5}; Integer d = 3; A e = new A(5);

2021-08-05 10:23:35 233

原创 论文阅读《PointRend: Image Segmentation as Rendering》

CVPR20的实例分割文章,Kaiming老师出品。MotivationMask RCNN一类的实例分割模型得到的mask分辨率太低,因此导致了mask非常粗糙。为了解决这个问题,作者希望在Mask RCNN预测出粗糙的mask以后,对其进行refine。受图形学中rendering的启发,作者提出了PointRend模型。本质上属于一种新型的上采样方法,通过在mask边缘采样一系列hard的点,逐渐对边缘进行优化,最终得到分辨率高的mask。个人感觉与图形学中的渲染结合有点说故事的味道,完全可以抛开r

2021-05-15 18:31:57 875 2

原创 论文阅读《Look Closer to Segment Better: Boundary Patch Refinement for Instance Segmentation》

论文链接:https://arxiv.org/pdf/2104.05239.pdfMotivationCVPR21上一篇关于实例分割的文章。对于Mask RCNN来说,其最终得到的mask分辨率太低,因此还原到原尺寸的时候,一些boundary信息就显得非常粗糙,导致预测生成的mask效果不尽如人意。而且处于boundary的pixel本身数量相比于整张image来说很少,同时本身难以做分类。现有的一些方法试图提升boundary quality,但预测mask边界这个task本身的复杂度和segmen

2021-05-10 15:59:16 1664 2

原创 论文阅读《Beyond Self-attention: External Attention using Two Linear Layers for Visual Tasks》

论文链接:https://arxiv.org/pdf/2105.02358.pdfMotivationself-attention在各种视觉任务中大放异彩,相比于卷积这类局部感知的操作,self-attention可以获取更多的long-range dependency,从而学习到融合了全局特征的feature。但是self-attention自身存在两个缺点:(1)计算量太大,计算复杂度与pixel的平方相关;(2)没有考虑不同样本之间的潜在关联,只是单独处理每一个样本,在单个样本内去捕获这类long

2021-05-08 22:49:16 3705 7

原创 论文阅读《Swin Transformer: Hierarchical Vision Transformer using Shifted Windows》

论文链接:https://arxiv.org/abs/2103.14030代码地址: https://github.com/microsoft/Swin-Transformer开源15天,star超3k的作品。作者提出了一个基于transformer的backbone,可用于多种视觉任务。和以往ViT,DETR等结构不同的是,Swin Transformer通过shifted windows操作,实现了CNN里面的hierarchical的结构。这类hierarchical的结构更适用于不同的scale

2021-04-29 20:21:17 5455 1

原创 论文阅读《Symmetric Cross Entropy for Robust Learning with Noisy Labels》

论文链接:https://arxiv.org/abs/1908.06112ICCV19的一篇文章,跟Nosiy Label相关。noisy label指的是质量再高的数据集中,难免也会存在一些错误的标注,而这些错误标注会对DNN的训练带来影响。在本文中,作者揭示了传统用作分类的交叉熵CE损失函数的弊端:即在一些easy class会对nosiy label过拟合,同时一些hard class学习的也不够充分。因此作者根据KL散度的非对称性,提出了一种Symmetric cross entropy Lea

2021-04-27 13:21:51 4471 1

原创 论文阅读《STEm-Seg: Spatio-temporal Embeddings for Instance Segmentation in Videos》

论文链接:https://arxiv.org/abs/2003.08429STEmSeg是ECCV20上的一篇文章,做的是Video Instance Segmentation(VIS),提出了一种可以end-to-end的方法,大大简化了VIS的pipeline,同时在很多数据集上达到了SOTA。过去很多经典的方法都遵循top-down模式,即仿照MOT里的tracking-by-detection的范式。这类方法通常会利用多个模型,先做单张image的检测,再做帧之间的association,对于o

2021-04-25 16:56:39 1074 2

原创 SOLO训练代码解析

之前写过对SOLO demo的代码解析,今天来梳理一下training过程。首先是tools/train.py,这个文件是训练的开始,命令行运行的就是该文件:from mmdet.apis import set_random_seed, train_detectordef main(): args = parse_args() cfg = Config.fromfile(args.config) # set cudnn_benchmark if cfg.get('c

2021-04-16 01:05:41 1972 4

原创 动态卷积之CondConv和DynamicConv

现在的诸多task中,普遍需要capacity较大的模型,而随着模型参数的不断增加,计算成本也越来越高。对于一些对latency有较高要求的task,显然是一种挑战。在传统的CNN网络中,一旦训练完成,所有的kernal参数就固定了。对于任意的输入,所有的kernal都对他们同等对待。所以为了提高模型的performance,大多数方法堆叠卷积层或者增加卷积层的参数,这种做法显然会造成 computationally expensive。所以为了压缩模型,动态卷积就应运而生。动态卷积的出发点就是,当训练结

2021-04-13 11:54:11 6705 3

原创 「损失函数loss」检测分割跟踪常见的Loss合集

Cross Entropy Loss交叉熵损失函数是分类中非常经典的一种loss,其计算公式如下:LCE=−ylog(y′)−(1−y)log(1−y′)L_{CE}=-y log(y')-(1-y)log(1-y')LCE​=−ylog(y′)−(1−y)log(1−y′)其中y表示某个类别上的GT(值为0或1),y‘表示经过神经网络预测得到的对应类别的置信度(因为做过softmax处理,所以值在(0,1)之间)。当y=0时,上式中只有第二项,此时y‘越接近于0,则loss越小;当y=1时,上式只有

2021-04-11 17:10:38 3638 1

原创 论文阅读CondInst《Conditional Convolutions for Instance Segmentation》

论文链接:http://xxx.itp.ac.cn/pdf/2003.05664v3CondInst是ECCV20上的一篇关于实例分割的文章,个人感觉和YOLACT的思路有相似之处(CondInst最后的处理更加直接简洁)。作者将全卷积网络应用在实例分割的task上,通过采用动态生成的conditional convolution,解决了之前全卷积网络在实例分割上不work的问题。涉及的问题作者首先分析了经典的Mask RCNN的问题:(1)由于采用bbox先做框定,所以对于一些不规则的instanc

2021-04-10 19:23:16 3260 1

空空如也

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

TA关注的人

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