自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Birate的博客

努力工作,分享学习的点滴

  • 博客(171)
  • 资源 (3)
  • 收藏
  • 关注

原创 设计模式简谈

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。主要是为了创建同类对象的接口, 同类对象。

2023-04-23 18:49:04 733 1

原创 Muduo 异步log的实现

这篇文章我们主要介绍下muduo的log的实现,我觉得挺有意思的。muduo的日志库是C++ stream 风格的, 不需要保持格式字符串和参数类型的一致性, 可以随用随写,而且是类型安全的。往文件中写日志的一个常见的问题时,万一程序崩溃,那么最后若干条日志就丢失了,因为日志库不能每条消息都flush硬盘,更不能每条日志都open/close文件,这样性能开销太大。推荐一个零声学院免费教程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,

2023-04-17 00:01:11 393

原创 Muduo源码剖析--整体架构

git: GitHub - chenshuo/muduo: Event-driven network library for multi-threaded Linux server in C++11git clone https://github.com/chenshuo/muduo.git安装依赖库:编译:如何在自己的程序中使用muduomuduo是静态链接的c++程序库, 使用muduo的时候,只需要设置好头文件的路径和库文件路径并链接相应的静态库文件(0lmuduo_net -lmuduo_base)

2023-04-09 15:23:26 879

原创 Unbuntu18.04 配置DPDK

网络适配器配置成桥接模式,为DPDK准备的,网络适配器3配置成NAT模式为ssh准备的。修改网卡的配置信息:在虚拟机关机状态下,修改虚拟机的.vmx文件, 修改ethernet0.virtualDev 从e1000到vmxnet3, 因为 vmware 的 vmxnet3 支持多队列网卡重启虚拟机, 查看网卡, 成功被被配置为vmxnet3,再看下eth1的网卡查看系统是否支持多队列网卡 :执行: cat /proc/interrupts因为我这里配置4个CPU, 所以会有4个队列。对应的中断号分别是56

2022-06-12 21:54:57 897

原创 Docker安装和使用

docker是一个用Go语言实现的开源项目,可以让我们方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到docker container,这样你的程序可以在任何环境都会有一致的表现,这里程序运行的依赖也就是容器就好比集装箱,容器所处的操作系统环境就好比货船或港口,程序的表现只和集装箱有关系(容器),和集装箱放在哪个货船或者哪个港口(操作系统)没有关系。因此我们可以看到docker可以屏蔽环境差异,也就是说,只要你的程序打包到了docker中,那么无论运行在什么环境下程序的行为都是一致的,程序

2022-06-12 21:50:34 612

原创 GoogleTest

文章目录1. 一个好的测试2. 环境准备3 断言后台服务器:后台开发视频1. 一个好的测试测试应该是独立的和可重复的。调试一个由于其他测试而成功或失败的测试是一件痛苦的事情。googletest通过在不同的对象上运行测试来隔离测试。当测试失败时,googletest允许您单独运行它以快速调试。测试应该很好地“组织”,并反映出测试代码的结构。googletest将相关测试分组到可以共享数据和子例程的测试套件中。这种通用模式很容易识别,并使测试易于维护。当人们切换项目并开始在新的代码库上工

2022-05-22 21:01:25 245 1

原创 Redis 集群和持久化(四)

文章目录1. RDB持久化a. RDB文件的创建和载入b. RDB文件结构c. 配置redis.confd. 缺点2. AOF持久化a. 追加b. 写入和同步c. AOF文件的载入和数据还原d. aof重写e. 配置3. 混合持久化配置应用数据安全策略4. Redis 主从复制a. 部分重同步的实现(增量复制)5. Redis 哨兵模式6. Redis cluster集群a. 节点b. 槽指派c. 在集群中执行命令d. 重新分片e. ASK错误f. 复制与故障转移1. RDB持久化后台服务器:后台开发

2022-05-22 20:31:47 229

原创 Redis 源码分析和存储原理 (三)

文章目录1 . SDS2. 链表3. 字典(dict)4. 跳表(skiplist)5. 整数集合6. 压缩列表(ziplist)1 . SDS推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习Redis 没有直接使用c语言传统的字符串表示,而是自己构建一套一种名为简单动态字符串的,简称SDS

2022-05-02 18:11:44 148

原创 CMake

CMake文章目录CMake1. 最简单的CMake2. 添加message信息3. 添加链接库4. 链接第三方库5. 变量与缓存6. 跨平台和编译器7. 分支和判断8. 变量和作用域我们使用的cmake版本为3.x 以上。首先我们熟悉基本的命令:cmake -B build // 在源码目录用 -B 直接创建 build 目录并生成 build/Makefilecmake --build build -j4

2022-04-30 14:41:26 3574

原创 Redis的线程模型和异步机制(二)

文章目录Redis 6.0引入多线程异步机制Redis pipeline技术Redis 事务ACID特性分析redis 发布订阅我们通常说,Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。为什么使用单线程:多线程并发开销大,访问共享资源时,要确保资源的正确性,需要额外的机制保证正确性,额外的操作增加了系统开销。在

2022-04-24 23:08:50 1144

原创 Redis 的概念和数据结构(一)

文章目录Redis的概念Redis的安装和编译启动Redis的存储结构string统计阅读数 累计加1listhashsetzsetRedis的概念在我们日常的数据库开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时

2022-04-16 23:38:45 122

原创 死锁的检测与实现

死锁的发生是由于线程间资源争夺引起的,这里不对线程的死锁的概念和原理解释。主要介绍死锁的检测和具体实现,检测我们可以使用一个有向图来表示, 线程 A 获取线程 B 已占用的锁,则为线程 A 指向线程 B。 如何为线程 B 已占用的锁?运行过程线程 B 获取成功的锁。检测的原理采用另一个线程定时对图进程检测是否有环的存在。数据结构定义:typedef enum { PROCESS, RESOURCE} Type; // 定义资源的类型typedef struct source_type_t { /

2022-04-10 11:33:33 1587 1

原创 自己动手实现一个进程间通信组件

文章目录背景原理代码实现背景我们知道linux的进程的间通信的组件有管道,消息队列,socket, 信号量,共享内存等。但是我们如果自己实现一套进程间通信的机制的话,要怎么做?了解android 开发的可能会知道,android里面有个binder机制,简单来说,就是一个进程往binder里面写数据,另一个进程从binder里面读出数据。所以我们也可以按照binder的思路来设计一个自己的进程间通信组件。原理我们的设计思路很简单,我们首先需要注册一个字符设备文件叫**/dev/channel*

2022-03-27 22:08:26 1105

原创 用户态文件系统 fuse

文章目录fuse文件系统调试fuse文件系统众所周知,文件系统一般都是存在于内核态开发的,内核涉及东西比较多和复杂,不太方便,所以就衍生出用户态的文件系统fuse。 FUSE (用户态文件系统)是一个实现在用户空间的文件系统框架,通过 FUSE内核模块的支持,使用者只需要根据 fuse 提供的接口实现具体的文件操作就可以实现一个文件系统。FUSE 由三个部分组成, FUSE 内核模块, FUSE 库以及一些挂在工具。 FUSE 内核模块实现了和 VFS 的对接,它看起来像一个普通的文件系统模块,另外

2022-03-13 22:46:43 599

原创 Nginx系列五: handler 模块

文章目录五 handler 模块1. 模块的基本结构1. 模块的结构2. 模块的配置指令3. 模块的上下文结构4. 模块定义2. handler 模块的基本结构3. handle模块的挂载1. 按处理阶段挂载2. 按需挂载4. handler的编写步骤5. handler 模块的编译和使用1. config 文件的编写2.编译3. 使用五 handler 模块基本上大家开发者最可能开发的就是三种类型的模块,即 handler, filter和 load-balancer。 Handler 模块就是接受

2022-01-27 23:37:10 372

原创 Nginx系列四: Nginx的配置指令和handler模块概述

文章目录1. 指令参数2. 指令上下文3. 模块描述nginx 的配置系统由一个主配置文件和其他一些辅助的配置文件构成。这些配置文件均是纯文本文件,全部位于 nginx 安装目录下的 conf 目录下 。配置文件中以#开始的行,或者是前面有若干空格或者 TAB,然后再跟#的行,都被认为是注释,也就是只对编辑查看文件的用户有意义,程序在读取这些注释行的时候,其实际的内容是被忽略的。由于除主配置文件 nginx.conf 以外的文件都是在某些情况下才使用的,而只有主配置文件是在任何情况下都被使用的。所以

2022-01-23 21:05:55 260

原创 Nginx系列三: Nginx 高级数据结构

文章目录1. ngx_queue_t2. ngx_array_t3. ngx_rbtree_t4. ngx_hash_t (待更新)Nginx的高级数据包括ngx_queue_t, ngx_array_t, ngx_list_t, ngx_rbtree_t, ngx_radix_tree_t, ngx_hash_t。1. ngx_queue_tngx_queue_t双向链表是Nginx提供的轻量级链表容器,与Nginx的内存池无关,因此这个链表不会负责分配内存来存放元素,这个数据结构仅仅把已经分配好的

2022-01-15 22:20:34 1948 1

原创 Nginx系列二: Nginx 的数据结构

文章目录1. nginx_int_t2. ngx_str_t3. ngx_buf_t4. ngx_list_t5. ngx_table_elt_t1. nginx_int_tNginx 使用ngx_int_t 封装有符号整型,使用nginx_unit_t封装无符号整型。typedef intptr_t ngx_int_t;typedef uintptr_t ngx_uint_t;typedef intptr_t ngx_flag_t;2. ngx_str

2022-01-10 23:48:32 438

原创 Nginx系列一:概念和配置

文章目录1. 功能介绍2.Nginx 特性3. Nginx 架构4. 代码结构5. 工作模式6. nginx 进程角色7. Nginx安装8. Nginx的快速入门1. 功能介绍基本的 HTTP 服务器功能邮件代理服务器功能TCP/UDP 代理服务器功能架构和可扩展性2.Nginx 特性NGINX 有什么不同? NGINX 使用可扩展的事件驱动架构,而不是更传统的过程驱动架构。这需要更低的内存占用,并且当并发连接扩大时,使内存使用更可预测。在传统的 Web 服务器体系结构中

2022-01-05 23:31:58 1283 1

原创 伙伴分配器(buddy allocator)和slab

文章目录伙伴分配器(buddy allocator)和slaba.原理b. 数据结构slab 分配器用户API数据结构伙伴分配器(buddy allocator)和slab当系统内核初始化完毕后,使用页分配器管理物理页,当使用的页分配器是伙伴分配器,伙伴分配器的特点是算法简单且高效。连续的物理页称为页块(page block)。阶(order)是伙伴分配器的一个专业术语,是页的数量单位,2n2^n2n个连续页称为n阶页块。物理内存被分成多个order:0 ~ 10,每个order中连续page的个数是2

2021-12-19 22:51:14 2000 2

原创 引导内存分配器原理

文章目录引导内存分配器原理a. bootmem分配器b.memblock分配器引导内存分配器原理参考视频链接 https://ke.qq.com/course/417774?flowToken=1040955a. bootmem分配器在启动过程期间,尽管内存管理尚未初始化,但内核仍然需要分配内存以创建各种数据结构。bootmem分配器用于在启动阶段早期分配内存。显然,对该分配器的需求集中于简单性方面,而不是性能和通用性。因此内核开发者决定实现一个最先适配( first-fit)分配器用于在启动阶

2021-12-12 16:57:50 571

原创 内存映射原理

文章目录内存映射原理a. 内存映射原理b.数据结构b.1 虚拟内存区域的数据结构c. 系统调用和mmap内存映射c.1 系统调用内存映射原理a. 内存映射原理​ 内存映射即在进程的虚拟地址空间中创建一个映射,分为两种:文件映射:文件支持的内存映射,把文件的一个区间映射到进程的虚拟地址空间,数据源是存储设备上的文件。匿名映射:没有文件支持的内存映射,把物理内存映射到进程的虚拟地址空间,没有数据源。创建内存映射时,在进程的用户虚拟地址空间中分配一个虚拟内存区域。内核采用延迟分配物理内存的策略,在

2021-12-05 22:28:02 2042

原创 UDP的可靠性传输

文章目录UDP和TCP的区别为什么要使用UDP传输可靠性数据如何使用UDP传输可靠性数据UDP和TCP的区别Tcp和udp都是属于TCP/IP协议(传输层协议)。TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。 一个TCP连接必须要经过三次握手,断开连接时需要四次挥手。TCP的可靠性主要体现在什么方面呢?1. 应用数据被分割成TCP认为最合适发送的数据块。这个和UDP完全不同,应用程序将产生的数

2021-11-24 23:54:52 2983

原创 进程控制块Task_struct

文章目录进程的定义进程的创建进程的退出Task_struct 结构Task_struct这里不讲进程的基本原理,重点描述下进程的数据结构(task_struct).进程的定义正在执行的程序正在计算机上执行的程序实例能分配给处理器并有处理器执行的实体一组指令序列的执行、一个当前状态个相关的系统自愿集在进程执行时,任意给定一个时间,进程都可以唯一地被表征为以下元素:标识符: 跟这个进程相关的唯一标识符,用来区别其他进程状态: 进程的几个状态(等待、运行、停止)优先级: 进程的优先级

2021-11-23 23:47:53 3872

原创 简谈epoll

文章目录I/O编程关注的问题阻塞io模型和⾮阻塞io模型I/O多路复用epoll的API主要函数epoll的两种触发方式epoll与select、poll的对比epoll更高效的原因I/O编程关注的问题epoll我们经常使用在网络编程I/O模型中,在此模型中我们主要关注的问题点是连接如何建立,连接何时断开,消息如何到达,消息是否发送完毕。 用户空间监测内核的消息得到这个结果。在上图的蓝色框中,我们主要的关注的是读写是否被阻塞,数据是否达到,到达了怎么通知给用户空间。推荐免费的直播课程: https

2021-11-20 22:27:58 4328 1

原创 MySql 系列三:缓存

文章目录MySql的主从复制为什么需要缓冲层?MySql缓冲层存储⽐较⼏项重要的数据总结为什么有同步的问题?尝试解决同步(⼀致性)写读解决数据同步问题⼀致性问题强⼀致性最终⼀致性数据同步⽅案问题是否解决?缓存穿透解决缓存击穿解决缓存雪崩解决MySql的主从复制流程:主库更新事件(update、 insert、 delete)通过io-thread写到binlog;从库请求读取binlog,通过io-thread写⼊(write)从库本地 relay log(中继⽇志);从库通过sql-thre

2021-11-01 22:22:33 327

原创 MySql 系列三:事务

文章目录事务目的组成特征事务控制语句ACID特性原子性(A)隔离性(I)持久性(D)一致性(C)事务并发异常脏读(READ UNCOMMITTED)不可重复读 (READ COMMITTED)幻读(REPEATABLE READ)隔离级别READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE不同隔离级别下并发异常锁锁类型共享锁(S)排他锁(X)意向共享锁(IS)意向排他锁(IX)锁的兼容性锁算法Record LockGap LockNext-Key

2021-10-30 12:19:56 67

原创 MySql 系列二:索引

文章目录索引主键索引唯一索引普通索引组合索引全文索引主键选择约束外键约束约束于索引的区别索引实现索引存储页B+树聚集索引辅助索引最左匹配原则覆盖索引索引失效索引原则SQL优化EXPLAIN索引索引分类:主键索引、唯一索引、普通索引、组合索引、以及全文索引;主键索引非空唯一索引,一个表只有一个主键索引;在 innodb 中,主键索引的B+树包含表数据信息;PRIMARY KEY(key)唯一索引不可以出现相同的值,可以有NULL值;UNIQUE(key)普通索引允许出现相同的索引内容;

2021-10-26 22:48:30 162

原创 MySql 系列一:基本知识

文章目录基础知识1. SQL2. 术语3. 数据库设计三范式(1) 范式一: 确保每列保持原子性;数据库表中的所有字段都是不可分解的原子值;(2) 范式二: 确保表中的每列都和主键相关,而不能只与主键的某一部分相关(组合索引);(3) 范式三: 确保每列都和主键直接相关,而不是间接相关;减少数据冗余;基础操作CRUD1. 创建数据库2. 删除数据库3. 选择数据库4. 创建表5. 删除表6. 清空数据库7. 增8. 删9. 改10. 查高级查询1 准备2. 基础查询3.条件查询4. 范围查询5. 判空查询

2021-10-24 14:14:16 1156

原创 gdb的常用命令

命令名称命令缩写说明runr运行程序continuec让暂停的程序继续运行breakb添加断点tbreaktb添加临时断点backtracebt查看当前线程的调用堆栈framef切换到当前调用线程的指定堆栈infoinfo查看断点、线程等信息enableenable启动某个断点disabledisable禁用某个断点deletedel删除断点listl显示源码printp打...

2021-10-17 17:19:45 123

原创 定时器系列3 - 时间轮

以钟表的背景来描述时间轮的运转,时间轮每走一格,就像表钟刻度走一下。++tick 60;每秒钟 ++tick 来描述秒针移动;对 让秒针永远在 [0, 59]间移动;对于时钟来说,它的时间精度(最⼩运⾏单元)是1秒;时间轮的设计1. 准备一个数组存储连接数据;那么数组长度设置为多少?参照时钟表盘的运转规律,可以将定时任务根据触发的紧急程度,分布到不同层级的时间轮中;假设时间精度为 10ms ;在第 1 层级每 10ms 移动⼀格;每移动⼀格执⾏该格⼦当中所有的定时任务;当第 1 层指针从 255

2021-10-10 23:46:06 438

原创 定时器系列2 -最小堆

概念满二叉树: 所有的层节点数都是该层所能容纳节点的最⼤数量(满足 2n2^n2n; n>=0n > =0n>=0) ;完全二叉树: 若⼆叉树的深度为 h ,除了 h 层外,其他层的节点数都是该层所能容纳节点的最⼤数量(满⾜ ),且 h 层都集中在最左侧;最小堆:是一颗完全二叉树;某一个节点的值总是小于等于它的子节点的值;堆中每个节点的子树都是最小堆;增加操作为了满⾜完全⼆叉树定义,往⼆叉树最⾼层沿着最左侧添加⼀个节点;然后考虑是否能上升操作;如果此时添加值为 4 的

2021-10-10 18:52:19 317

原创 定时器系列1-红黑树

对于服务端来说,驱动服务端逻辑的事件主要有两个,⼀个是⽹络事件,另⼀个是时间事件;在不同框架中,这两种事件有不同的实现⽅式;第⼀种,⽹络事件和时间事件在⼀个线程当中配合使⽤;例如nginx、 redis;// 第⼀种while (!quit) {int now = get_now_time();// 单位: msint timeout = get_nearest_timer() - now;if (timeout < 0) timeout = 0;int nevent = epoll_

2021-09-15 22:29:21 250

转载 红黑树的系列文章

最近看到一篇写的很详细的红黑树的系列文章:红黑树(一)之 原理和算法详细介绍红黑树(二)之 C语言的实现红黑树(三)之 Linux内核中红黑树的经典实现红黑树(四)之 C++的实现

2021-09-12 17:33:54 68

原创 Linux 检测内存泄漏

内存泄漏是指由于疏忽或错误造成程序未能释放已经不再使用的内存。 内存泄漏并非指内存在物理上的消失, 而是应用程序分配某段内存后, 由于设计错误, 导致在释放该段内存之前就失去了对该段内存的控制, 从而造成了内存的浪费。我们平时开发过程中不可避免的会遇到内存泄漏问题,经常使用下面几个工具。valgrindmtracedmallocccmallocmemwatchdebug_new这里我看到过一个新的一个排查内存泄漏的工具: AddressSanitizer(ASan), 该工具为 gcc

2021-08-22 23:37:41 317

原创 mysql、redis环境设置

文章目录1. 安装mysql1.1 安装mysql服务器端1.2 安装mysql客户端1.3 安装mysql模块1.4 验证是否成功1.5 补充命令1.6 ⽀持远端ip访问2. 安装redis2.1 下载redis2.2 编译安装redis2.3 启动redis1 直接启动2 以后台进程⽅式启动redis3 设置redis开机⾃启动2.4 redis-cli使⽤1. 默认⽆权限控制2. 服务停⽌3. 有权限控制时(加上-a 密码)4. Redis默认启动1. 安装mysql1.1 安装mysql服务器端

2021-08-16 22:54:41 522 1

原创 池式结构--内存池

文章目录内存管理伙伴算法slab算法内存池的实现1. 分配2. 释放3. 扩容内存管理我们经常在堆上进行内存的分配和释放时,就会产生内存碎片问题。内部碎片的产生:因为所有的内存分配必须起始于可被 4、8 或 16 整除(视 处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小的内存块分配给客户。假设当某个客户请求一个 43 字节的内存块时,因为没有适合大小的内存,所以它可能会获得 44字节、48字节等稍大一点的字节,因此由所需大小四舍五入而产生的多余空间就叫内部碎

2021-08-08 23:42:18 315

原创 协程的hook操作

文章目录1. hook 原理1.1 函数解析2. hook实现2.1 使用环境变量LD_PRELOAD2.2 源码入侵1. hook 原理hook机制本质上是一种函数的劫持技术,比如我们通常需要调用malloc函数来进行内存分配,那么能不能我们自己封装一个同名、同入参和同返回值的malloc函数来替代系统的malloc函数,在我们自己封装的malloc函数中实现一些特定的功能,而且也能回调系统的malloc,这就是hook机制。系统提供给我们的dlopen、dlsym族函数可以用来操作动态链接库,比如

2021-07-12 00:00:36 572

原创 池式结构-线程池

文章目录任务队列执行队列管理组件创建线程池线程运行任务回调函数在多线程的操作中,我们经常使用线程池来进行大量的计算、缓存磁盘、写log等。线程池主要由任务队列、执行队列和管理组件。三部分组成。如图,中间的框框就是我们的线程池,threadqueue负责从taskqueue取任务,当没有任务时,thread通过条件变量进行等待。处理完成之后,返回处理的结果。任务队列typedef struct job { void (*func)(struct job *arg); void *us

2021-07-04 21:58:36 215

原创 c++ 11的using

在c++11中我们可以使用using定义别名,例如:我们定义一个模板,使用usingtemplate<typename T>using vec = std::vector<int MyAlloc<int>>;//使用vec<int> coll; //等同于std::vector<int MyAlloc<int>> coll;我们使用#define 或者 typedef 试试;#define Vec<T>

2021-05-30 17:05:33 242

tensorflow新旧api对照.xlsx

tensorflow API新旧对照表,修改了tensorflow 2.0以前版本的api 和2.0版本的匹配问题。对照表很详细。

2019-12-26

RT-Thread开发实战

基于STM32的RT-Thread的开发实战,内核实现和应用开发

2018-09-29

Altium designer PCB画板速成教材

里面有详细的pcb规则,和一些注意事项。给入门学pcb有一个很好的资料。

2015-11-19

空空如也

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

TA关注的人

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