DylanC's Blog - 默认分类
type: channel
link: https://blog.cll66.cn/category/default/
description: 只是一个默认分类
items: WSL2遇到HyperV未安装问题
items: /etc/systemd/system和/lib/systemd/system的区别
items: 目前在用的电脑配置单
items: N5105软路由封装ESXi网卡驱动
items: Linux入门教程
items: Halo博客搭建指南
items: 正则表达式学习笔记
items: Debian安装配置MariaDB指南
items: 到底什么是面向对象编程和面向过程编程
items: 如何优雅的在Git上做Pull Request

WSL2遇到HyperV未安装问题
type: item
date: 2024-12-05T12:55:37+08:00
description: 注册表查看HyperV状态bcdedit /enum | findstr /i hypervisorlaunchtype 如果查询是OFF状态，修改状态到Auto就可以。bcdedit /set hypervisorlaunchtype Auto

/etc/systemd/system和/lib/systemd/system的区别
type: item
date: 2024-01-03T15:16:41+08:00
description: [/etc/systemd/system和/lib/systemd/system的区别 ]linux系统中有很多的system目录，在平常使用中或者大量的博客中，常看到的有/etc/systemd/system、/lib/systemd/system以及/usr/lib/systemd/system等，这三者有什么样的关系呢，本文将三者的关系详细说明，后续使用不再混淆。简介目录/lib/systemd/system以及/usr/lib/systemd/system其实指向的是同一目录，在/目录下ll可知：[root@localhost /]# ll total 28 lrwxrwxrwx. 1 root root 7 Jul 3 09:43 bin -> usr/bin dr-xr-xr-x. 5 root root 4096 Jul 19 12:04 boot drwxr-xr-x. 19 root root 3080 Jul 19 04:03 dev drwxr-xr-x. 76 root root 8192 Jul 19 20:07 etc drwxr-xr-x. 4 root root 39 Jul 19 04:37 home lrwxrwxrwx. 1 root root 7 Jul 3 09:43 lib -> usr/lib lrwxrwxrwx. 1 root root 9 Jul 3 09:43 lib64 -> usr/lib64 drwxr-xr-x. 2 root root 6 Apr 11 2018 media drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt drwxr-xr-x. 3 root root 23 Jul 3 20:33 opt dr-xr-xr-x. 118 root root 0 Jul 19 04:03 proc dr-xr-x---. 10 root root 4096 Jul 20 06:31 root drwxr-xr-x. 27 root root 760 Jul 19 16:00 run lrwxrwxrwx. 1 root root 8 Jul 3 09:43 sbin -> usr/sbin drwxr-xr-x. 2 root root 6 Apr 11 2018 srv dr-xr-xr-x. 13 root root 0 Jul 19 04:03 sys drwxrwxrwt. 10 root root 4096 Jul 20 03:37 tmp drwxr-xr-x. 13 root root 155 Jul 3 09:43 usr drwxr-xr-x. 21 root root 4096 Jul 19 13:34 var[/usr]/lib/systemd/system/ 该目录中包含的是软件包安装的单元,也就是说通过yum、dnf、rpm等软件包管理命令管理的systemd单元文件，都放置在该目录下。[/usr]/lib/systemd/system/ The expectation is that `/lib/systemd/system` is a directory that should only contain systemd unit files which were put there by the package manager (YUM/DNF/RPM/APT/etc)./etc/systemd/system/(系统管理员安装的单元, 优先级更高)Files in /etc/systemd/system are manually placed here by the operator of the system for ad-hoc software installations that are not in the form of a package. This would include tarball type software installations or home grown scripts.在一般的使用场景下，每一个 Unit（服务等） 都有一个配置文件，告诉 Systemd 怎么启动这个 Unit 。Systemd 默认从目录/etc/systemd/system/读取配置文件。但是，里面存放的大部分文件都是符号链接，指向目录/usr/lib/systemd/system/，真正的配置文件存放在这个目录。 systemctl enable命令用于在上面两个目录之间，建立符号链接关系。$ sudo systemctl enable clamd@scan.service # 等同于 $ …

目前在用的电脑配置单
type: item
date: 2023-02-10T16:25:00+08:00
description: 随缘更新AMD平台CPU R7-5800X主板 华硕重炮手B550M-WiFi内存 英睿达铂胜3600 8G*2散热 利民EX360 + C14X+C12CW-S*3电源 九州风神DQ850M机箱 追风者P500A总计：2570+499+550+109+63.25+443+459=4692.25INTEL平台CPU i5-13600KF主板 铭瑄Z790M终结者内存 金百达海力士6000Adie 16G*2散热 利民冰封魔境360 + C12CW-S*3电源 安钛克HCG850镀银线机箱 华硕冰立方总计：1785+1229+769+469+51+700+319=5323软路由准系统 畅网5800U 四网口i226-V内存 英睿达C9 3200 16G*2TP-Link2.5G交换机总计：1905+430+242=2577显示器宏夏 2K 170Hz K7E面板夏芝 1080P 280Hz总计：1399+689=2088硬盘SN750 500G860EVO 500GSXP8200PRO 2048GS550PRO 2048GJZ QiLin 1024GWD Purple 4096G总计 1100+828+526+549+460=3463显卡华硕 ROG 3080 猛禽 10G华硕ROG 5700XT 猛禽 8G总计 9936+858=10794总计28937.25

N5105软路由封装ESXi网卡驱动
type: item
date: 2022-04-21T03:54:00+08:00
description: 近期购入了多网口N5105软路由，选择了ESXi作为主控系统。对于ESXi vmkernel不支持的网卡，需要手动封装网卡驱动到ESXi镜像，再安装ESXi。1.准备环境以ESXi7.0U3d为例，封装intel的i225驱动需要两个文件：vmware官方提供的社区版网卡驱动，下载链接ESXi的Offline Bundle版本，下载链接 （需注册账号并登陆）2.powershell安装必要组件准备一台win10以上的系统，管理员身份打开powershell。键入以下命令安装VMware命令行模块：Install-Module -Name VMware.PowerCLI预期之内会提示信任库之类的问题，键入Y即可。⚠注意：！！！不要中断，这一步非常慢，10-20分钟不等，代理或科学上网可稍微提升下速度。键入一下命令信任模块：set-ExecutionPolicy RemoteSigned同理，输入Y即可。3.开始封装驱动将第一步下载好的ESXi镜像和网卡驱动放到同一个文件夹。打开powershell，以此键入以下命令(路径和文件名需替换下)：$esxiOfflineBundle = "C:\esxi\VMware-ESXi-7.0U3d-19482537-depot.zip" #指定Office Bundle版本的Esxi路径 $intelNicOfflineBundle = "C:\esxi\Net-Community-Driver_1.2.7.0-1vmw.700.1.0.15843807_19480755.zip" #指定网卡驱动路径 $esxiImageProfileName = "ESXi-7.0U3d-19482537-standard" $newImageProfileName = "ESXi-7.0U3d-19482537-Intel-i225" #配置文件名随意，最好和最后一部输出的ISO文件名保持一致 Add-EsxSoftwareDepot $esxiOfflineBundle Add-EsxSoftwareDepot $intelNicOfflineBundle New-EsxImageProfile -CloneProfile $esxiImageProfileName -Name $newImageProfileName -Vendor DylanC Add-EsxSoftwarePackage -ImageProfile $newImageProfileName -SoftwarePackage "net-community" Export-EsxImageProfile -ImageProfile $newImageProfileName -ExportToIso -FilePath "C:\esxi\ESXi-7.0U3d-19482537-Intel-i225.ISO" #输入文件的路径即名称确保以上每个命令都不会报错，黄色字体的警告可忽略，红色字体则表示报错，有报错则解决报错。成功之后，对应文件夹会生成封装好的ESXi iso镜像：同时，自测powershell6.x以上版本，会报各种各样的错误，致命错误为VMware.ImageBuilder module不支持当前powershell版本，可更换成5.x版本使用，powershell历史版本下载，到此下载。

Linux入门教程
type: item
date: 2021-09-10T01:45:00+08:00
description: Linux入门教程本文的首要目的是给予Linux初学者一个简单、易学的教程，以便在看完本文后对Linux系统有一个基础的认识（而非系统级的深入），可以对常见的软件和功能进行配置，甚至可以自己写一写一键脚本。本教程写于2021年下半年，采用的系统为Debian GNU/Linux 11 (bullseye)。0 前言吐槽CentOS解释使用Debian而不是CentOS的原因国内首批接触Linux系统的人主要集中在科研院校，大多数是延续了Unix-like的背景，在千禧年前后才有了真正意义上的Linux使用者：纯Linux平台开发、运行服务和应用，他们或直接或间接地推广了Linux系统。红帽（Red Hat, Inc.）在1994年就开始发布了同名的操作系统：Red Hat Linux（后改组为Red Hat Enterprise Linux，缩写为RHEL）。得益于红帽优秀的团队和商业支持，RHEL这一发行版迅速占领了国内市场。彼时的国内计算机市场远不如今日繁荣，在口口相传和红帽的推广中，RHEL成为了Linux入门的主流选项，即使后来号称用户友好的Ubuntu出现了，绝大多数尝鲜的人依然能看到众多网站里面只提供RHEL版本的教程。CentOS是根据RHEL的源码重新编译的，等于换商标版本的RHEL，软件层面上，两者无本质区别。但CentOS是反人类的，至少是反入门用户的。使用RHEL的基本为商业用户，可以付费获得红帽的技术支持，或者干脆有一个自己的维护团队；而CentOS作为一个社区自发形成的操作系统，拥有落后的软件源/包，繁琐的配置，和对个人用户而言根本没有必要的SElinux等。举个例子，很多入门者修改SSH端口的时候，发现所有的操作都没有问题，但是死活无法生效，最终发现是没有在SElinux里面放行。如果你想安装个软件，你就得考虑是从落后主流版本好几代的软件源/包里面安装，还是自己下载源码进行编译以获取主流的使用体验。对于入门者而言，CentOS的安全性和稳定性是个虚假的概念，毕竟让一个刚接触Linux的人去自己编译源码安装，无异于让小学生上战场，输了就说是小学生战斗力太弱。所以本文以Debian GNU/Linux（后续简称为Debian）来演示，也有着推广Debian的意思在里面，毕竟相比于Ubuntu往系统里面塞包括snap在内的一系列私货而言，Debain始终遵循着一个纯净的Linux的要求。而其他一些发行版，要么是专用性太强（如SUSE），要么是入门者不友好（如 Arch Linux），权衡之后，选择了写本文时，最新的Debian系统，即Debian GNU/Linux 11 (bullseye)。1 环境搭建1.1 系统选择与安装Debian的安装包有一系列的前缀或者后缀，例如在默认的下载地址https://www.debian.org/download中的是debian-11.0.0-amd64-netinst.iso。其中，11代表大版本是11，代号是bullseye，各版本代号都来源于电影《玩具总动员》中的角色名称；amd64是指系统为64位的，i386或者x86是32位的，amd64或者x86-64是64位的，32位系统已经被逐步弃用，目前仅在特定行业中使用；netinst是网络安装版本，只是个安装器，安装过程需要联网，而DVD后缀的是完整版（如：debian-11.0.0-amd64-DVD-1.iso），如果系统太大，会在DVD后面加数字，默认DVD-1是完整版本，其后数字的是软件源/包；带firmware前缀的是包含第三方非开源驱动的（如：firmware-11.1.0-amd64-DVD-1.iso），其中就包含intel和Realtek等公司的闭源网卡驱动。VPS全称为virtual private server（虚拟专用服务器），如果需要安装纯净版的Debian 11系统，推荐使用vicer的Linux一键重装脚本（如下）：bash <(wget --no-check-certificate -qO- 'https://raw.githubusercontent.com/MoeClub/Note/master/InstallNET.sh') -d 11 -v 64 -p "自定义root密码" -port "自定义ssh端口"1.2 常用的命令cat 用于查看文本文件的内容，如cat /etc/os-release 将显示系统信息，如下：PRETTY_NAME="Debian GNU/Linux 11 (bullseye)" NAME="Debian GNU/Linux" VERSION_ID="11" VERSION="11 (bullseye)" VERSION_CODENAME=b…

Halo博客搭建指南
type: item
date: 2021-09-09T01:28:00+08:00
description: Halo博客搭建指南快速开始Fat Jar下载最新的 Halo 运行包：curl -L https://github.com/halo-dev/halo/releases/download/v1.5.3/halo-1.5.3.jar --output halo.jar其他地址java -jar halo.jarDockerdocker run -it -d --name halo -p 8090:8090 -v ~/.halo:/root/.halo --restart=always halohub/halo:1.5.3详细部署文档请查阅：使用 Docker 部署 Halo使用 Docker 部署 Halo 和 MySQL使用 Docker Compose 部署 Halo项目部署环境检查目前运行 Halo 的最低依赖要求为 JRE 11，请务必确保在进行下面操作之前已经正确安装了 JRE。目前介绍两种 Linux 发行版的安装方式，均为 OpenJRE，不推荐 Oracle 版本。CentOSsudo yum install java-11-openjdk -y检查版本：java -version如果输出以下类似内容即代表成功openjdk version "11.0.10" 2021-01-19 LTS OpenJDK Runtime Environment 18.9 (build 11.0.10+9-LTS) OpenJDK 64-Bit Server VM 18.9 (build 11.0.10+9-LTS, mixed mode, sharing)Ubuntu/Debiansudo apt-get install openjdk-11-jre -y检查版本：java -version如果输出以下类似内容即代表成功openjdk version "11.0.10" 2021-01-19 OpenJDK Runtime Environment (build 11.0.10+9-Ubuntu-0ubuntu1.20.04) OpenJDK 64-Bit Server VM (build 11.0.10+9-Ubuntu-0ubuntu1.20.04, mixed mode)下载项目创建存放 运行包 的目录，这里以 ~/app 为例mkdir ~/app && cd ~/app下载运行包wget https://dl.halo.run/release/halo-1.5.3.jar -O halo.jar如果下载速度不理想，可以 在这里 选择其他下载地址。创建 工作目录mkdir ~/.halo && cd ~/.halo下载示例配置文件到 工作目录wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml 编辑配置文件，配置数据库或者端口等，如需配置请参考 配置参考vim application.yaml测试运行 Halocd ~/app && java -jar halo.jar如看到类似以下日志输出，则代表启动成功。run.halo.app.listener.StartedListener : Halo started at http://127.0.0.1:8090 run.halo.app.listener.StartedListener : Halo admin started at http://127.0.0.1:8090/admin run.halo.app.listener.StartedListener : Halo has started successfully!打开 http://ip:端口号 即可看到安装引导界面。运行包指 Halo 构建所产生的 Jar 包，后缀为 .jar。可能与其他网站应用有所区别的是，Halo 仅仅只有这一个文件。而且所有数据统一保存在下面所说的 工作目录。工作目录指 Halo 所依赖的工作目录，在 Halo 运行的时候会在系统当前用户目录下产生一个 .halo 的文件夹，绝对路径为 ~/.halo。由于这个工作目录是固定的，所以上面所说的 运行包不限制所存放的位置，里面通常包含下列目录或文件：db：存放 H2 Database 的物理文件，如果您使用 MySQL 数据库，那么不会存在这个目录。templates/themes：里面包含用户所下载的主题。static：相当于网站的根目录。logs：运行日志目录。upload：附件目录。application.yaml：配置文件。作为服务运行下载 Halo 官方的 halo.service 模板wget https://dl.ha…

正则表达式学习笔记
type: item
date: 2021-08-20T23:03:00+08:00
description: 正则表达式正则表达式入门介绍对于没接触过正则的同事，这里提供学习的网站 ，并建议认真学习两个课时，本文的重点在后面，并不详细抄袭网上一大堆的正则的语法。下面先给出一个简单的示例：^ 为匹配输入字符串的开始位置。[0-9]+匹配多个数字， [0-9] 匹配单个数字，+ 匹配一个或者多个。abc$匹配字母 abc 并以 abc 结尾，$ 为匹配输入字符串的结束位置。我们在写用户注册表单时，只允许用户名包含字符、数字、下划线和连接字符(-)，并设置用户名的长度，我们就可以使用以下正则表达式来设定。以上的正则表达式可以匹配 runoob、runoob1、run-oob、run_oob， 但不匹配 ru，因为它包含了小写的字母而且太短了，也不匹配 runoob$, 因为它包含特殊字符。语法所谓正则的语法，主要是记住一大堆的符号，包括特殊字符、限定符、定位符，通过普通字符（数字、字母等）和其他符号的结合，表达出待匹配的字符模式。注：不同语言的正则表达式语法似乎不尽相同，具体应用时还是要了解一下该语言的具体情况。验证工具写正则遇到困难时不妨用下面的工具验证试验，十分好用。验证网站re模块使用其他语言的大致相同，本文略略介绍一下python中re模块的使用。使用re的一般步骤是将正则表达式的字符串形式编译为Pattern实例使用Pattern实例处理文本并获得匹配结果（一个Match实例）此处常用的函数方法包括：match， search， split，findall，finditer, sub, subn使用Match实例获得信息，进行其他的操作。此处常用match 实例的string属性获得匹配时使用的文本，或者group方法等获得一个或多个分组截获的字符串。正则表达式进阶学完上述知识，有了一些经验后，很容易认为正则的功能大致如此，实际上还有很多可学的东西，虽然很可能在工作上不常用。窃以为，正则表达式的高级用法主要是1）捕获与分组 ，2）零宽断言（叫环视可能好理解）。分组就是对正则表达式进行用“()”分割后命名，默认的分组命名方式是：整个正则表达式为分组0，从左到右分组为1、2、3以此类推。也可以自己进行命名，语法如下：代码描述(exp)匹配exp，并捕获文本到自动命名的组内(?exp)匹配exp，并捕获文本到name的组里面，尖括号可以换成''(?:exp)匹配exp，不捕获匹配的文本，也不给此分组分配组号零宽断言从概念理解到实际应用上都是难点，但是是个好用的东西，如果你不知道，一定会妨碍你写正则。断言就是判断当前位置的前后是否匹配，但是不消耗任何字符（零宽），普通的断言，比如\d+(匹配一个或者多个数字)，它所匹配的内容是由长度的。代码描述(?=exp)正预测先行断言，断言自身出现的位置的后面可以匹配后面跟的表达式(?<=exp)正回顾后发断言，它断言自身出现的位置的前面可以匹配后面跟的表达式(?!exp)负预测先行断言，它断言自身出现的位置的后面不可以匹配后面跟的表达式(?<!exp)负回顾后发断言，它断言自身出现的位置的后面不可以匹配后面跟的表达式啰嗦一句，注意贪婪、非贪婪的使用，注意匹配的优先级等问题正则表达式练习练习网站如下：正则高尔夫编程胶囊给出一些例子如下WarmupfooAnchorsk$It never endsu\b #不让用$RangesBackrefs(...).*\1Abba^(?!.*(.)(.)\2\1)A man, a plan(.)(.).?\2\1.?$ #并不是最优 ^(.)[^p].*\1$ #最优Prime^(?!(xx+)\1+$) #正则匹配素数 ^(?!(..+)\1+$) #优解Four(.)(.\1){3}Powers^(?!(.(..)+)\1*$) #匹配幂常用正则表达式一、校验数字的表达式数字：^[0-9]*$ n位的数字：^\d{n}$ 至少n位的数字：^\d{n,}$ m-n位的数字：^\d{m,n}$ 零和非零开头的数字：^(0|[1-9][0-9]*)$ 非零开头的最多带两位小数的数字：^([1-9][0-9]*)+(\.[0-9]{1,2})?$ 带1-2位小数的正数或负数：^(\-)?\d+(\.\d{1,2})$ 正数、负数、和小数：^(\-|\+)?\d+(\.\d+)?$ 有两位小数的正实数：^[0-9]+(\.[0-9]{2})?$ 有1~3位小数的正实数：^[0-9]+(\.[0-9]{1,3})?$ 非零的正整数：^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$ 非零的负整数：^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$ 非负整数：^\d+$ 或 ^[1-9]\d*|0$ 非正整数：^…

Debian安装配置MariaDB指南
type: item
date: 2021-07-31T12:29:00+08:00
description: Debian安装配置Mariadb指南熟悉了MySQL后，感受一下Debian下的MairaDB的体验#安装MariaDB的服务端 apt install -y mariadb-server systemctl start mariadb systemctl enable mariadb systemctl status mariadb #初始化设置 mysql_secure_installation cd /etc/mysql/mariadb.conf.d vim 50-server.cnf #修改绑定ip为0.0.0.0 #bind-address systemctl restart mariadb mysql -u root -p #赋权给宿主机访问 use mysql; grant all privileges on *.* to 'root'@'%' identified by "2465" with grant option; flush privileges; select user from user;

到底什么是面向对象编程和面向过程编程
type: item
date: 2021-07-14T17:55:00+08:00
description: 一、先来两小段通俗解释面向过程（Procedure Oriented 简称PO ：如C语言）：从名字可以看出它是注重过程的。当解决一个问题的时候，面向过程会把事情拆分成： 一个个函数和数据（用于方法的参数） 。然后按照一定的顺序，执行完这些方法（每个方法看作一个过程），等方法执行完了，事情就搞定了。面向对象（Object Oriented简称OO ：如C++，JAVA等语言）：看名字它是注重对象的。当解决一个问题的时候，面向对象会把事物抽象成对象的概念，就是说这个问题里面有哪些对象，然后给对象赋一些属性和方法，然后让每个对象去执行自己的方法，问题得到解决。二、用3个例子说明两者的区别例子一：问题： 洗衣机里面放有脏衣服，怎么洗干净？面向过程的解决方法：1、执行加洗衣粉方法；2、执行加水方法；3、执行洗衣服方法；4、执行清洗方法；5、 执行烘干方法；以上就是将解决这个问题的过程拆成一个个方法（是没有对象去调用的），通过一个个方法的执行来解决问题。面向对象的解决方法：1、我先弄出两个对象：“洗衣机”对象和“人”对象2、针对对象“洗衣机”加入一些属性和方法：“洗衣服方法”“清洗方法”、“烘干方法”3、针对对象“人”加入属性和方法：“加洗衣粉方法”、“加水方法”4、然后执行人.加洗衣粉人.加水洗衣机.洗衣服洗衣机.清洗洗衣机.烘干解决同一个问题 ，面向对象编程就是先抽象出对象，然后用对象执行方法的方式解决问题。例子二 ： 打麻将例子 你 我 他面向过程： 打麻将 （你，我，他）---------解决问题 拆成一个动作，把数据丢进去面向对象： 我.打麻将（你，他） or 你.打麻将（我，他） or 他.打麻将(我，你)---------解决问题 抽象出对象，对象执行动作 。例子三：最后在用一个网上常见的五子棋例子来说明一下：面向过程的设计思路就是首先分析问题的步骤：1、开始游戏，2、黑子先走，3、绘制画面，4、判断输赢，5、轮到白子，6、绘制画面，7、判断输赢，8、返回步骤2，9、输出最后结果。把上面每个步骤用不同的方法来实现。面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为1、黑白双方，这两方的行为是一模一样的，2、棋盘系统，负责绘制画面，3、规则系统，负责判定诸如犯规、输赢等。第一类对象（玩家对象）负责接受用户输入，并告知第二类对象（棋盘对象）棋子布局的变化，棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化，同时利用第三类对象（规则系统）来对棋局进行判定。可以明显地看出，面向对象是以功能来划分问题，而不是步骤。同样是绘制棋局，这样的行为在面向过程的设计中分散在了多个步骤中，很可能出现不同的绘制版本，因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中，绘图只可能在棋盘对象中出现，从而保证了绘图的统一。三：面向过程与面向对象的优缺点：用面向过程的方法写出来的程序是一份蛋炒饭，而用面向对象写出来的程序是一份盖浇饭。蛋炒饭制作的细节不说了，最后的一道工序肯定是把米饭和鸡蛋混在一起炒匀。盖浇饭呢，则是把米饭和盖菜分别做好，你如果要一份红烧肉盖饭呢，就给你浇一份红烧肉；如果要一份青椒土豆盖浇饭，就给浇一份青椒土豆丝。蛋炒饭的好处就是入味均匀，吃起来香。如果恰巧你不爱吃鸡蛋，只爱吃青菜的话，那么唯一的办法就是全部倒掉，重新做一份青菜炒饭了。盖浇饭就没这么多麻烦，你只需要把上面的盖菜拨掉，更换一份盖菜就可以了。盖浇饭的缺点是入味不均，可能没有蛋炒饭那么香。到底是蛋炒饭好还是盖浇饭好呢？其实这类问题都很难回答，非要比个上下高低的话，就必须设定一个场景，否则只能说是各有所长。如果大家都不是美食家，没那么多讲究，那么从饭馆角度来讲的话，做盖浇饭显然比蛋炒饭更有优势，他可以组合出来任意多的组合，而且不会浪费。盖浇饭的好处就是‘’菜”“饭”分离，从而提高了制作盖浇饭的灵活性。饭不满意就换饭，菜不满意换菜。用软件工程的专业术语就是”可维护性“比较好，”饭” 和”菜”的耦合度比较低。蛋炒饭将”蛋”“饭”搅和在一起，想换”蛋”“饭”中任何一种都很困难，耦合度很高，以至于”可维护性”比较差。软件工程追求的目标之一就是可维护性，可维护性主要表现在3个方面：可理解性、可测试性和可修改性。面向对象的好处之一就是显著的改善了软件系统的可维护性。总结来说：面向过程优点：性能比面向对象高，因为类调用时需要实例化，开销比较大，比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发，性能是最重要的因素。缺点：没有面向对象易维护、易复用、易扩展面向对象优点：易维护、易复用、易扩展，由于面向对象有封装、继承、多态性的特性，可以设计出低耦合的系统，使系统 更加灵活、更加易于维护缺点：性能比面向过程低四、面向对象编程的特…

如何优雅的在Git上做Pull Request
type: item
date: 2021-05-04T21:10:00+08:00
description: How to Rebase a Pull RequestWhen many different people are working on a project simultaneously, pull requests can go stale quickly. A "stale" pull request is one that is no longer up to date with the main line of development, and it needs to be updated before it can be merged into the project. The most common reason why pull requests go stale is due to conflicts: if two pull requests both modify similar lines in the same file, and one pull request gets merged, the unmerged pull request will now have a conflict. Sometimes, a pull request can go stale without conflicts: perhaps changes in a different file in the codebase require corresponding changes in your pull request to conform to the new architecture, or perhaps the branch was created when someone had accidentally merged failing unit tests to the master branch. Regardless of the reason, if your pull request has gone stale, you will need to rebase your branch onto the latest version of the master branch before it can be merged.What is a rebase?To understand this, we need to understand a bit about how Git works. A Git repository is a tree structure, where the nodes of the tree are commits. Here's an example of a very simple repository: it has four commits on the master branch, and each commit has an ID (in this case, a, b, c, and d). You'll notice that d is currently the latest commit (or HEAD) of the master branch.Here, we have two branches: master and my-branch. You can see that master and my-branch both contain commits a and b, but then they start to diverge: master contains c and d, while my-branch contains e and f. b is said to be the "merge base" of my-branch in comparison to master -- or more commonly, just the "base". It makes sense: you can see that my-branch was based on a previous version of master.So let's say that my-branch has gone stale, and you want to bring it up to date with the latest version of master. To put it another way, my-branch needs to contain c and d. You could do a merge, but that caus…