煎饼果子 - 技术之路
type: channel
link: https://blog.moej.cn/category/coding/
items: Vue.js 中的参数传递
items: 使用Cloudflare Workers反代国外网站
items: Oracle/MySQL重点面试题
items: 利用OpenCV实现对车流量的统计
items: 利用OpenCV对图像和视频进行载入和访问
items: 学做图书管理系统--使用pyodbc和PyQt5连接前台GUI和后台SQL Server数据库
items: 学做图书管理系统--使用SQL Server创建并插入数据，建立触发器和存储过程
items: 学做图书管理系统--利用Python的PyQt5编写简单的GUI图形界面
items: [转]计算机四级网络工程师思维导图--计算机网络部分
items: [转]计算机四级网络工程师思维导图--操作系统部分

Vue.js 中的参数传递
type: item
date: 2021-07-08T19:12:00+08:00
description: 最近在复习（学习）Vue.js 相关的知识，其中路由Router和参数传递是一个十分重要且较难的知识。于是花时间整理了一下下，希望对自己有用~1. 通过 name 传递参数export default new Router({ routes: [ { path: '/', name: 'index', component: index },{ path: '/page', name: 'page', component: page } ] });我们常把页面的路由配置在 /src/router 文件夹下的 index.js 文件中，如上为配置的内容。这其中的 name 属性是可以作为参数传递的，在模版中直接只用 {{$route.name}} 接收，即可以在模版中显示。2. 通过 < router-link > 中的 to 传递参数使用 < router-link to=" /page "> page < /router-link > 可以实现页面的跳转，这里面 to 是可以带上参数跳转的，我们需要在给 to 进行绑定，即 :to(v-bind:to)<router-link :to="{name:'page',params:{data:'我是App.vue传至page.vue的参数'}}" >page</router-link>这其中需要注意的是要给 to 加上绑定，后面跟的是对象形式的字符串。其中的 name 是我们在路由配置文件（上图图二）中配置的 name 两者要对应。params 即是我们要传的参数，它可以是多个值。随后在对应的模版页面中（这里为 page.vue）进行接收。{{$route.params.data}} 3. 在业务逻辑中实现页面跳转并传参当在业务逻辑中需要实现页面跳转经常能够使用到编程式导航：this.$router.go(1)，进入下一级this.$router.back(-1)，返回上一级，通俗的说就是前进与后退。this.$router.push(’/page’)，跳转到 page.vue那么我们应该如何传递参数呢？例如，我们在判断完某个条件后需要跳转到 page 页并且需要传递 age 和 address 两个参数过去，我们的操作方法是：App.vue page 我们在需要的地方加上点击事件：toPage(){ this.$router.push({ name: 'page', params: { age: 22, address: 'China' } }) }随后在 methods 中写入该事件，需要注意的是这里面的 name 同样是要与在配置路由时配置的 name 属性保持一致。params 是我们传入的参数，可以是常量也可以是变量。page.vue在 page.vue 中接收参数，可以在生命周期的 mounted() 接收并且放入 data ，再在模版上显示出来。 {{myage}}-{{myaddress}} 4. 利用 url 传参在项目开发过程中常常通过 url 进行参数传递，在 vue-cli 中该如何操作呢？在配置路由处以冒号形式，在 url 后方加上参数（/src/router/index.js）{ path: '/page/:pageId/:pageTitle', name: 'page', component: page }在<router-link></router-link> 的 to 属性中加入参数（App.vue） <router-link to="/" >index</router-link> <router-link to="/page/1/标题" >page</router-link> <router-view/> 在 page.vue 中接收参数 id: {{$route.params.pageId}} 标题： {{$route.params.pageTitle}} 5. 父组件与子组件之间传参项目中组件是经常被使用到的，那么父组件与子组件之间的联动是非常重要的。父传子先建立一个组件并且使用，在 components 文件夹下新建 component.vue 文件作为组件。 我的组件 {{msg}}-{{content}} 随后在 page.vue 中引入该组件，在 中 import 且引用，随后在模版中使用，如下： <children></children> 要传递参数，可以在 <children> </children>标签中加入要传入的参数，并且在组件（component.vue）中使用 props 接收再使用插值在模版中显示。同时我们也可以给要传的参数绑定起来，如下第二种写法，在参数前加上冒号（v-bind）这样我们就能在 data 中编辑我们的…

使用Cloudflare Workers反代国外网站
type: item
date: 2021-03-01T20:45:00+08:00
description: 众所周知，Cloudflare是一个好东西，其免费的CDN加速和Workers功能，令许多事方便了。这里，我们将使用Cloudflare Workers，反向代理部分国外网站，实现加速或免FQ访问。[card title="Cloudflare Workers简介" color="success"]Cloudflare Workers是一种可以运行JavaScript脚本的边缘节点，可以实现无服务器直接运行JavaScript代码。[/card]步骤1.登录你的Cloudflare账号，并进入到Workers界面(若从未使用过Workers，则需要先设置自定义workers域名，这里略去，格式为xxx.yourname.workers.dev)：2.新建一个Worker，修改此Worker名称，并将下列JavaScript代码粘贴到代码框中，并保存。[quote color="danger"]注意：你需要将upstream和upstream_mobile修改为你需要反代的网站域名。[/quote]// Website you intended to retrieve for users. const upstream = 'example.com' // Custom pathname for the upstream website. const upstream_path = '/' // Website you intended to retrieve for users using mobile devices. const upstream_mobile = 'example.com' // Countries and regions where you wish to suspend your service. const blocked_region = ['KP', 'SY', 'PK', 'CU'] // IP addresses which you wish to block from using your service. const blocked_ip_address = ['0.0.0.0', '127.0.0.1'] // Whether to use HTTPS protocol for upstream address. const https = true // Whether to disable cache. const disable_cache = false // Replace texts. const replace_dict = { '$upstream': '$custom_domain' } addEventListener('fetch', event => { event.respondWith(fetchAndApply(event.request)); }) async function fetchAndApply(request) { const region = request.headers.get('cf-ipcountry').toUpperCase(); const ip_address = request.headers.get('cf-connecting-ip'); const user_agent = request.headers.get('user-agent'); let response = null; let url = new URL(request.url); let url_hostname = url.hostname; if (https == true) { url.protocol = 'https:'; } else { url.protocol = 'http:'; } if (await device_status(user_agent)) { var upstream_domain = upstream; } else { var upstream_domain = upstream_mobile; } url.host = upstream_domain; if (url.pathname == '/') { url.pathname = upstream_path; } else { url.pathname = upstream_path + url.pathname; } if (blocked_region.includes(region)) { response = new Response('Access denied: WorkersProxy is not available in your r…

Oracle/MySQL重点面试题
type: item
date: 2021-02-02T22:42:00+08:00
description: 1. Oracle和MySQL的区别？1、Oracle是大型数据库，而MySQL是中小型数据库。但是MySQL是开源的，但是Oracle是收费的，而且比较贵。2、Oracle的内存占有量非常大，而mysql非常小3、MySQL支持主键自增长，指定主键为auto increment，插入时会自动增长。Oracle主键一般使用序列。4、MySQL字符串可以使用双引号包起来，而Oracle只可以单引号5、MySQL分页用limit关键字，而Oracle使用rownum字段表明位置，而且只能使用小于，不能使用大于。6、Oracle在处理长字符串的时候,长度是小于等于4000个字节,如果要插入更长的字符串,考虑用CLOB类型,插入修改记录前要做进行修改和 长度的判断,如果为空,如果长度超出返回操作处理.（CLOB类型是内置类型，它一般都作为某一行中的一列,有些数据库也有别名）7、MySQL中0、1判断真假，Oracle中true false8、MySQL中命令默认commit,但是Oracle需要手动提交9、MySQL在windows环境下大小写不敏感 在unix,linux环境下区分大小写，Oracle不区分2. Oracle的行转列行转列 pivot 列转换 unpivot pivot（聚合函数 for 列名 in（类型））3. sql的执行顺序开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果4. oracle实现分组查询roup by 要分组的列名 对数据集合处理的函数，可以处理多行数据--5个分组函数--count --计数函数，用于数量的统计--sum 求和函数，对数据进行求和--avg 求评平均，对一组数据求平均值--min ,求最小值--max ,求最大值5. 左连接怎么使用的select * from table_1 left join table_2 on table_1.id = table_2.id6. 索引怎么用，在一张表上创建很多索引可以吗，为什么？create index 索引名 on 表名（列名） tablespace 表空间名可以。因为.......(待补充)7. 如果想查某个时间段的数据，该怎么查？select * from table_1 where date between 时间段1 AND 时间段28. 数据库怎么优化查询？1.尽量少用in操作符2.尽量用not exists或者外连接替代not in操作3.尽量不使用<>或者!=运算符4.在设计表的时候，把索引列设置为not null5.尽量不使用通配符%或者_作为查询字符串的第一个字符6.where字句避免在索引列上计算使用7.用>=代替>8.利用SGA共享池，避开parse阶段9.where后面的条件，表连接的语句在前，可以过滤掉最大数量记录的条件居后10.使用表的别名，并将之作为每列的前缀11.显式或者隐式运算的字段不能索引12.用Union all 代替union13.通过改变Oracle的SGA的大小9. 索引的实现方式btree索引 hash索引 R-tree索引 full-text 全文索引10. MySQL的索引是是用什么数据结构，并介绍内部如何实现？btree结构:又叫多路平衡搜索数,一颗m叉的btree特性如下1.树中每个节点最多包含m个孩子2.除跟节点与叶子节点外,每个节点 只是有[ceil(m/2)]个孩子3.若个节点不是 叶子节点,则至少有两个孩子4.所有的叶子节点都在同一层5.每个非叶子节点由n个key与n+1个指针组成,其中[ceil(m/2)-1]<=n<=m-111. 索引会对更新造成影响吗，为什么会。因为虽然索引大大提高了查询效率,同时也降低了更新表的速度12. 视图索引的创建create unique index index_name on test(id);13. 视图为什么比一般的语句好用？因为是一种虚拟存在的表，不在数据中实际存在。可以简化查询14. MySQL存储引擎有哪些，默认用哪个myisam和innodb 默认innodb15. 创建存储过程create procedure 存储过程名(参数列表)BEGIN 存储过程体(一组合法的sql语句)END16. 给出一个内查询的例子select xxx from table_1 where id in (select id from table_2 where name = 'jack');17. 数据库查询优化同8.18. 介绍一下innodb 和MyIsam，他们的区别INNODB存储引擎是mysql的默认存储引擎,提供了具有提交,回滚,崩溃…

利用OpenCV实现对车流量的统计
type: item
date: 2020-07-14T00:07:00+08:00
description: 闲话少絮。开始正题——OpenCV的车流量统计。调试平台OpenCV 4.2VS 2019汽车识别原理——背景/前景分割算法如今，检测和提取车辆时候，常用的方法有MOG2算法和KNN算法。MOG算法是以高斯混合模型（GMM）为基础的背景/前景分割算法。它是以2004年和2006年Z.Zivkovic的两篇文章为基础的。这个算法的一个特点是它为每一个像素选择一个合适数目的高斯分布。其主要原理为：在一个固定位置和角度固定的视频或图像中，提取分割图像或视频中运动的成分。此算法使用背景建模的方式，将整张图片或一帧视频分为前景和后景。此算法运行时，会将动态的前景与静止的后景相减，得出结果即为徐提取的运动物体的图像。K最近邻算法（KNN）是属于机器学习的一种算法。其主要原理为：给定一个已训练数据集，对新的输入实例，在训练数据集中找到与该实例最邻近（注：衡量邻近的标准以具体选取的某个特征而言，例如下面示意图中使用的特征为欧式距离）的K个实例，这K个实例的多数属于某个类，则判定该输入实例同属此类。如下图所示：训练者取k值，计算以欧氏距离k为半径的圆内其他类别的个数，图中中心小红点以k为半径的圆内三角形个数最多，则判定中心小红点为三角形。整体结构整体流程框架图本程序的主要运行流程为：程序运行开始，首先从文件中获取上次保存的光流量检测矩形框数据（顶点坐标和矩形的长宽）；其后，分别初始化背景提取对象，使用MOG2和KNN两种算法。与此同时，建立一个鼠标回调函数，用于捕获鼠标左键（绘制矩形框）、中键（取消操作）和右键（保存矩形框数据到文件）的操作。此后，程序进入主循环状态。程序循环从视频中获取一帧的图像，先进行压缩处理，以提高后续运算速度。之后，将这一帧图片从RGB转为灰度图片。为了祛除灰度后可能出现的小毛刺杂点，再进行平滑滤波处理。此后，分别通过MOG2和KNN算法提取前景，并将提取后的视频显示出来。与此同时，获取每个矩形框中积分后的亮度和。最后，两个算法中，分别将实时得到的亮度和与所预设的阈值进行比较，当满足条件后，便认为一辆汽车通过矩形框，使得计数器加一。如此重复，统计整个视频中的车流量。主要参数int detectTHD此参数为预设的亮度阈值。确定是否有汽车经过检测框中，其需要联合上一帧积分亮度和本次积分亮度后综合做出决定。cv::Size newSize(frame.cols / 2, frame.rows / 2);此参数可以储存一帧视频缩小后的大小。cv::Mat showMat;此参数用于储存最终显示的图像矩阵。主要函数static void onMouse(int event, int x, int y, int flags, void\*)此函数主要用于检测鼠标左键、滑轮（中键）和右键的一些操作，用于绘制矩形检测框。cv::resize(frame, newframe, newSize);此函数主要用于缩小原视频比例，提高计算机运算速度。bgMOG2-\>apply(greyFrame, mog2RES, update_bg_model ? -1 : 0);以及bgKNN-\>apply(greyFrame, KNN, update_bg_model ? -1 : 0);apply函数主要用于两种算法的前景提取。此后，前景提取后的这帧视频保存于bgMOG2和bgKNN之中。cv::rectangle(showMat, myLanneRect.at(k), cv::Scalar(255, 255, 255), 3);此函数主要用于前景提取后在其上面绘制矩形框。cv::integral(subMat, sumMat, CV_32S);计算车道矩形框亮度积分图。cv::putText();此函数可以按照要求，在视频图像上显示文字和统计数字。测试结果功能测试进行车流量统计前，应当首先根据矩形框中出现车辆时，估算其亮度平均值作为亮度阈值，使其设定为一个较为合适的值，增强检测的灵敏性。由下图可知，当程序运行后，通过手动标记车道检测区域，得到2个矩形检测区。每次获得矩形中的积分亮度结果，当上从亮度结果大于阈值，且此次亮度结果小于阈值时，使车辆统计结果加一。算法处理时间由测试结果可知，相较于MOG2算法，KNN算法在运算处理上花费更多的时间，KNN算法时间约为MOG2时间的2倍。同时，算法处理总时间也相对较长，除了两个算法所带来的开销外，仍有其他附加代码所花费的时间。缩放图片前后比较程序中，可以使用cv::resize();函数进行图片的压缩，缩放图片对于检测速度有较大的影响。不使用缩放时，将视频中原始一帧的图像进行计算，经测试发现，处理速度很慢，显示的图片有明显的脱帧和卡顿现象，CPU占用率相当高，与压缩后（上图）相比，无论使用MOG2还是KN…

利用OpenCV对图像和视频进行载入和访问
type: item
date: 2020-02-28T12:12:00+08:00
description: 运行平台OpenCV 4.2VS 2019图像在内存中的存储和操作从图像数据性质推理图像在内存中的存储方式：图像数据是多通道：1/3/4通道； 像素数据类型：1位，uchar，short，int，float，double等；OpenCV中的C++ Mat类：class CV_EXPORTS Mat { public: // …大量方法… ... /*! includes several bit-fields: - the magic signature - continuity flag - depth - number of channels */ int flags; //! the array dimensionality, >= 2 int dims; //! the number of rows and columns or (-1, -1) when the array has more than 2 dimensions int rows, cols; //! pointer to the data uchar* data; // other members ... };图像在内存中的基本要素：①列数cols = 宽度，行数rows = 高度，通道数（彩色空间类型），位深度（数据类型：8位无符号8U，32位浮点32F等）； ②像素存储区（uchar* data;）创建Mat矩阵--通过构造函数：Mat img(Size(320,240), CV_8UC3);`宽度(320)，高度(240)，数据类型8U(8位无符号)，3通道创建Mat矩阵--通过create函数：Mat img; img .create(Size(320,240), CV_32FC3);//32位浮点型创建载入图像文件：Mat img = imread("lena.jpg", CV_LOAD_IMAGE_COLOR);像素数据在内存中的组织方式：PS:内存是顺序排列的字节阵列通过Mat方法访问图像像素3通道24位深度（表达每个通道占用8位）彩色图像像素的访问：cv::Vec3b pixlsValue; //==表达这是一个3字节像素数据节点; pixlsValue = img.at<cv::Vec3b>(y, x); //y表达行号；x表达列号；尖括号<...>中的内容是C++模板，指定图像矩阵的数据类型；像素值的修改方法：pixlsValue.val[0] = xxx; pixlsValue.val[1] = xxx; pixlsValue.val[2] = xxx;修改后的像素值返回到存储器：img.at<cv::Vec3b>(y, x) = pixlsValue；其中，y和x为像素坐标;通过C++指针方法访问图像像素图像行列数Rows和Cols，数据首地址 uchar* data，通道数chaN，每行总字节数byteR可通过矩阵类接口获得；每个像素的字节数byteN= 位深度/8；位深度24位彩色图像每个像素占用3字节；float类型单通道图像每个像素占用4字节；...每行总字节数byteR = 每像素字节数 * 列数 = byteN * Cols;第row行第col列像素向量的地址偏移量（相对像素数据首字节）：pixlAddr = row * byteR + col * byteN ；像素向量首字节地址为 (uchar *)&data [pixlAddr];如果是uchar型图像，则像素首地址为：uchar *pixlPTR = (uchar*) data [pixlAddr];如果是float型图像，则像素首地址为：float *pixlPTR = (float*) data [pixlAddr];对于3通道8位（位深度24位）彩色图像(RGB)，则3个彩色通道像素存储位置为：pixlPTR[0] = B 、pixlPTR[1] = G 、pixlPTR[2] = R；通过实验可以证明，使用C++指针访问像素，时间开销远低于调用cv::Mat.at()方法；图像像素访问例程#include "stdafx.h" #include <Windows> #include <opencv2/core.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/features2d.hpp> #ifdef _DEBUG #pragma comment(lib, "opencv_world420d.lib") #else #pragma comment(lib, "opencv_world420.lib") #endif int main…

学做图书管理系统--使用pyodbc和PyQt5连接前台GUI和后台SQL Server数据库
type: item
date: 2019-12-06T03:21:00+08:00
description: 在连接数据库之前，需要确保电脑上有以下环境和软件：（必备）任意一种数据库（这里选择SQL Server）（必备）Python 3，可以在Python的官网下载对应的版本（必备）任意一种代码编辑器或IDE（本教程使用的VS Code和SSMS两种，也可使用Python自带的IDLE或者Pycharm）（可选）使用Python包管理器Anaconda，或者使用Python自带的pip安装pyodbc首先，使用组合键Win + R调出运行窗口，输入cmd，打开命令行。在命令行（CMD）界面，如使用了Anaconda，则需要激活conda环境（如没有Anaconda，则可以跳过这一步）：activate当光标前面出现了(base) C:\Users\用户名>，则说明进入了conda的base环境。输入如下任意其中一种命令：pip install pyodbc #常规方法，pip安装 conda install pyodbc #如果安装了Anaconda，则可以使用conda命令当出现提示确认是否安装，输入y，则可以等待安装完成。安装SQL Server的ODBC驱动程序和命令行工具进入微软的此页面下载安装ODBC驱动程序进入微软的此页面下载安装命令行工具在命令行输入如下命令登录SQL Server：sqlcmd -S localhost -U sa -P your_password 1> #已登录成功

学做图书管理系统--使用SQL Server创建并插入数据，建立触发器和存储过程
type: item
date: 2019-10-31T00:20:00+08:00
description: 在连接数据库之前，需要确保电脑上有以下环境和软件：（必备）任意一种数据库（这里选择SQL Server）（必备）Python 3，可以在Python的官网下载对应的版本（必备）任意一种代码编辑器或IDE（本教程使用的VS Code和SSMS两种，也可使用Python自带的IDLE或者Pycharm）（可选）使用Python包管理器Anaconda，或者使用Python自带的pip安装SQL ServerSQL Server可以从微软的官方网站上面下载获取： 链接：https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads我们可以选择免费的Express版本下载即可：选择自定义安装：选择下载到D盘，安装：这里需要稍等片刻：下载后安装，选择全新的SQL Server安装：然后依次按照图片所示一步步进行下去：稍微等待一会儿....安装完成啦~安装SQL Server管理工具（SSMS）当我们安装了SSMS之后，便可以可视化地方便管理我们的数据库啦~ 其实，SSMS软件与Linux环境下管理MySQL数据库的phpMyAdmin功能挺类似的呐~首先，在SQL Server安装中心，选择第三项，安装SQL Server管理工具：跳转到网页页面，选择最新的版本下载：选择D盘安装，按照要求重启电脑：重启后，在开始菜单找到SQL Server Management Studio打开，并登陆就可以啦~创建一个数据库我们可以新建一个查询（数据库脚本）来创建一个数据库。 登录进入SSMS后，选择菜单栏中的新建查询：在SQL脚本中可以输入如下代码，例如我创建的存放数据的数据库和日志的数据库：CREATE DATABASE BookManageSys ON ( NAME = 'BookManageSys_Data', FILENAME = 'E:\Common_things\Programs\数据库SQL\BookManageSystem\BookManageSys.mdf', SIZE = 10 MB, MAXSIZE = 50 MB, FILEGROWTH = 5% ) LOG ON ( NAME = 'BookManageSys_Log', FILENAME = 'E:\Common_things\Programs\数据库SQL\BookManageSystem\BookManageSys_Log.ldf', SIZE = 2 MB, MAXSIZE = 5 MB, FILEGROWTH = 1 MB ) GO在T-SQL语法中，可以指定数据库的存放位置和其他约束和规则限制，只要在后面加上NAME和FILENAME参数即可。或者直接在数据库默认目录下创建：CREATE DATABASE BookManageSys GO然后在菜单栏点击执行，便可以创建一个数据库啦。创建表、插入数据到表中创建读者表、图书表和借阅表：create table TReader ( ReaderID char(8) NOT NULL PRIMARY KEY, Name char(8) NOT NULL, Sex bit not null, Born date not null, Spec char(12) not null, Num int not null default 0, Photo varbinary(MAX) ) create table TBook ( ISBN char(18) not null primary key, BookName char(40) not null, Author char(16) not null, Publisher char(30) not null, Price float not null, CNum int not null, Snum int not null, Summary varchar(200), Photo varbinary(MAX) ) create table TLend ( BookID char(10) not null primary key, ReaderID char(8) not null, ISBN char(18) not null, Ltime datetime not null )向三个表中插入一些数据：INSERT INTO TReader VALUES('131101','王林',1,'1996-2-10','计算机',4,null), ('131102','程明',1,'1997-2-1','计算机',2,null), ('131103','王燕',0,'1995-10-6','计算机',1,null), (…

学做图书管理系统--利用Python的PyQt5编写简单的GUI图形界面
type: item
date: 2019-10-31T00:19:00+08:00
description: 自己使用到的工具VS CodePyQt5依赖包Qt DesignerPython几种常见的GUI库TkinterTkinter是Python自带的量轻级的简单GUI库，使用也较为简单。但是Tkinter之适用于基础和小型程序的开发，界面的美观程度也相对有限。在网上找到了比较全面介绍Tkinter的使用教程：https://www.cnblogs.com/shwee/p/9427975.htmlhttps://www.runoob.com/python/python-gui-tkinter.htmlPyQt5PyQt5算是比较成熟的GUI库了，PyQt从著名的由C++编写的Qt库移植封装到Python而来。同时，利用PyQt5开发GUI比较美观，同时利用Qt Designer可以拖动一些控件，实现GUI可视化的快速开发，可通过pyuic5工具转化为.py文件。在这里，自己选择了PyQt5开发前端界面。安装PyQt5和Qt Designer安装过程较为简单，只需在命令行窗口输入两行命令（在国内可以使用清华大学tuna镜像站，下载依赖包更快）：pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple #安装PyQt5 pip install PyQt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple # 安装Qt Designer如图：PS：若使用Anaconda，会省去很多环境配置步骤，这里只需安装PyQt5-tools即可，命令同上。如果想使用Anaconda，这里有详尽的配置及使用方法：Anaconda详细安装及使用教程（带图文）安装成功后，Qt Designer会放在Python（或Anaconda）安装路径，即安装路径\Python37\Lib\site-packages\pyqt5-tools\Qt\bin或者安装路径\Anaconda3\Lib\site-packages\pyqt5-tools\Qt\bin中，找到designer.exe运行即可。PS：为了今后打开方便，可以创建一个快捷方式哦~Qt Designer界面如下：其中： 左栏为一些常用的一些控件，可以拖放到窗口里面；右栏为不同的控件的值的设定，选中对应的控件便可以编辑。关于Qt Designer的使用方法，可以自行找找度娘，使用方法很多啦~~这里放一个教程：PyQt5速成教程导出为.py文件当我们按照自己的需求，设计好了相关的界面后，便可以导入成.py文件啦~设计保存后，桌面上会有一个.ui文件，这个就是Qt Designer生成的XML格式的文件。这里，我们使用pyuic5这个插件转换文件格式。转到这个文件夹目录后，在命令行窗口输入如下格式命令：pyuic5 - o 目标文件名.py 源文件名.ui如我的这样做的：此时，会发现，文件夹多了一个转换后的同名.py文件：打开SetupUi.py文件，发现里面代码很长，但是已经自动生成了，这样少了很多敲代码的步骤呢~# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'SetupUi.ui' # # Created by: PyQt5 UI code generator 5.13.0 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_mainWindow(object): def setupUi(self, mainWindow): mainWindow.setObjectName("mainWindow") mainWindow.resize(561, 491) mainWindow.setAnimated(False) self.centralwidget = QtWidgets.QWidget(mainWindow) self.centralwidget.setObjectName("centralwidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget) self.verticalLayout.setObjectName("verticalLayout") self.tabWidget = QtWidgets.QTabWidget(self.centralwidget) self.tabWidget.setObjectName("tab…

[转]计算机四级网络工程师思维导图--计算机网络部分
type: item
date: 2019-09-07T16:53:00+08:00
description: 计算机四级网络工程师考试快开始了。 这里总结和整理了相关的常考重点的思维导图，挺实用的，希望对大家有用哦~此部分为计算机网络部分~PS:思维导图来自微信公众号“方大熊”，自己做了稍微的整理，希望大家喜欢呀~图片高清，但文字较小也很长，可以点击图片后放大学习哦~一、网络技术基础二、局域网基础三、Internet基础感谢你的耐心阅读呀(๑◡๑)，总结不易，收藏点个赞呗~你的支持就是我前进的动力呀~

[转]计算机四级网络工程师思维导图--操作系统部分
type: item
date: 2019-09-07T16:52:00+08:00
description: 计算机四级网络工程师考试快开始了。 这里总结和整理了相关的常考重点的思维导图，挺实用的，希望对大家有用哦~此部分为操作系统部分~PS:思维导图来自微信公众号“方大熊”，自己做了稍微的整理，希望大家喜欢呀~图片高清，但文字较小也很长，可以点击图片后放大学习哦~一、操作系统原理二、操作系统运行机制三、进程线程模型四、并发与同步五、内存管理六、文件管理七、I/O设备管理八、死锁感谢你的耐心阅读呀(๑◡๑)，总结不易，收藏点个赞呗~你的支持就是我前进的动力呀~