<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[fitzleopard的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/fitzleopard</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; fitzleopard]]></copyright><item><title><![CDATA[webpack教程02-webpack-dev-server是什么与webpack-dev-server命令行使用]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106794428</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106794428</guid><author>fitzleopard</author><pubDate>Tue, 16 Jun 2020 20:10:52 +0800</pubDate><description><![CDATA[本文首发于我的Github博客
本文是webpack教程的第二篇文章，会介绍:

webpack-dev-server的概念和作用
webpack-dev-server的基本命令行使用和一个坑点

本次相关代码在Github仓库 commit bbaea1bc

webpack-dev-server的概念与作用
概念
webpack-dev-server，顾名思义，这是一个server，也就是说，webpack-dev-server命令能够用来启动一个本地服务器，接受HTTP请求
作用
不使用webpack]]></description><category></category></item><item><title><![CDATA[CORS与CSRF]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106794413</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106794413</guid><author>fitzleopard</author><pubDate>Tue, 16 Jun 2020 20:09:44 +0800</pubDate><description><![CDATA[本文首发于我的Github博客
本篇文章介绍了CORS和CSRF的概念(作者前几天在和带佬们聊天的时候把两个概念搞混了，所以才想要了解)，简单来说:

CORS(Cross Origin Resource Sharing)跨域资源分享 是一种机制，通过在HTTP响应头中加入特定字段限制不同域的资源请求
CSRF(Cross Site Request Forgery)跨站请求伪造 是一种web攻击手段，通过向服务器发送伪造请求，进行恶意行为的攻击手段


CORS(Cross Origin Resource ]]></description><category></category></item><item><title><![CDATA[数据结构与算法复习-02-链表]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106794399</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106794399</guid><author>fitzleopard</author><pubDate>Tue, 16 Jun 2020 20:08:43 +0800</pubDate><description><![CDATA[本文首发于我的Github博客
本文是数据结构与算法复习的第二篇博文，复习

链表的概念
常见的链表类型和设计取舍
链表的反转操作


链表的概念
链表可以定义为:

空
拥有一个节点，该节点有两个属性

val，本节点的值
next，另一个链表



首先，这个定义是单链表的定义，但是双向链表也是类似的
其次，从这个定义可以看到，链表是可以递归定义的
常见的链表类型和设计取舍
比较常见的链表类型有

单链表
双向链表

所谓的设计取舍主要是考虑:

选择单链表还是双向链表？
是否需要卫士节点(sentin]]></description><category></category></item><item><title><![CDATA[数据结构与算法复习(01)-并查集]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106756768</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106756768</guid><author>fitzleopard</author><pubDate>Mon, 15 Jun 2020 09:52:54 +0800</pubDate><description><![CDATA[本文首发于我的Github博客
本文是数据结构预算法复习系列的第一篇博文，会介绍写作该系列博文的原因
本文复习了并查集的概念，基础的API，良好的实现(路径压缩与权重)，简单的应用和变式
相关代码

写作本篇博文的原因

生活所迫

懂的都懂，IT行业从业者(或者是考研保研)，跑不了的


数据结构与算法是大学生活里花费的时间很多的部分，复习一下，也算是对自己的大学生涯有个交代
三次元的生活真的无聊，找点代码写，嘿嘿(难道不能写工程项目吗？质问！)

并查集的概念与基础API
并查集的概念
假设拥有N个元素]]></description><category></category></item><item><title><![CDATA[webpack教程01-webpack是什么与webpack命令行使用]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106694817</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106694817</guid><author>fitzleopard</author><pubDate>Thu, 11 Jun 2020 18:49:09 +0800</pubDate><description><![CDATA[本文首发于我的Github博客
本文是webpack教程的第一篇文章，会介绍

创作这个系列教程的原因
webpack是什么

构建工具


webpack CLI(命令行交互)的基本使用

webpack &lt;入口文件&gt; -o &lt;目标文件&gt; --mode &lt;模式&gt;
webpack --config &lt;配置文件&gt;


webpack CLI与npm结合使用

scripts添加与npm run build



涉及到的代码有不使用webpack版本，使用web]]></description><category></category></item><item><title><![CDATA[star-history源码阅读笔记(01)-项目介绍,Github的stargazers接口与分页机制，获取star历史的思路]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106689640</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106689640</guid><author>fitzleopard</author><pubDate>Thu, 11 Jun 2020 15:18:03 +0800</pubDate><description><![CDATA[本文首发于我的Github博客
本文是star-history项目源码阅读的第一篇文章，会包含:

作者对项目的介绍，这个系列博文的目的
Github的stargazers接口
Github接口的分页策略
获取star历史的思路

本次对代码的分析基于Commit - first commit deecd92 timqian

项目的介绍与系列博文的目的
项目介绍
首先说明，本文作者并非项目作者，各种介绍和分析，如有不当，还请谅解。
star-history项目(体验地址)是一个用于统计github项目获得]]></description><category></category></item><item><title><![CDATA[goland提取方法与...interface{}类型的注意点]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106636979</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106636979</guid><author>fitzleopard</author><pubDate>Tue, 09 Jun 2020 11:08:52 +0800</pubDate><description><![CDATA[本文首发于我的Github博客
本文记录了作者在使用goland提供的提取方法(Extract Method)功能时，由于...interface{}的类型问题而遭遇到的bug和一点感悟，简单来说:

可变长的参数会被goland的Extract Method转化为切片(slice)，比如...interface{}会被转化为[]interface{}
由于interface{}的特殊性，需要额外注意


bug的产生
在代码中有如下片段
func f(payload ...interface{}) {
 ]]></description><category></category></item><item><title><![CDATA[常见的git工作流]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106600594</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106600594</guid><author>fitzleopard</author><pubDate>Sun, 07 Jun 2020 13:26:01 +0800</pubDate><description><![CDATA[本文首发于我的Github博客
本文介绍了作者了解到的三种常见的单仓库的git工作流，它们是:

Centralized工作流

仅使用master一个分支


Feature Branch工作流

使用一个master分支管理稳定版本
使用多个feature分支管理需求开发


Gitflow工作流

使用一个master分支管理发布版本历史
使用一个develop分支管理开发流程
使用多个feature分支管理需求开发
使用多个release分支管理版本发布
使用多个hotfix分支修复紧急bug


]]></description><category></category></item><item><title><![CDATA[defer+recover保护gin不panic]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106555980</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106555980</guid><author>fitzleopard</author><pubDate>Thu, 04 Jun 2020 18:53:49 +0800</pubDate><description><![CDATA[本文首发于我的Github博客
本文记录了作者保护gin构建的web app不panic的方式，简单来说：

主程中的panic本身是会被gin拦截的
协程中的panic需要使用defer和recover进行保护


情景
在我们用gin构建，运行web app并上线了之后，或许有一些请求会经过业务，在特定的情况下出发会触发golang中的panic
按照golang的设定，一旦panic，如果不在函数调用栈中存在recover，那么是一定会使得整个程序终止的
但是线上的服务是不能够因为一个两个的请求就直接]]></description><category></category></item><item><title><![CDATA[bash中的字符串处理操作]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106496532</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106496532</guid><author>fitzleopard</author><pubDate>Tue, 02 Jun 2020 15:05:26 +0800</pubDate><description><![CDATA[本文首发于我的Github博客
本文记录了作者使用bash过程中，为了解决去除前缀后缀的问题而了解到的bash的字符串操作，简单来说

string:position或者string:position:length进行子串提取
string#pattern进行最短匹配前缀去除，string##pattern进行最长匹配前缀去除
string%pattern进行最短匹配后缀去除，string%%pattern进行最长匹配后缀去除
string/pattern/string进行首个pattern替换，strin]]></description><category></category></item><item><title><![CDATA[JavaScript中箭头函数与普通函数]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106481505</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106481505</guid><author>fitzleopard</author><pubDate>Mon, 01 Jun 2020 20:48:13 +0800</pubDate><description><![CDATA[本文首发于我的Github博客
本文记录了作者在使用mongoose的过程中，因为箭头函数与普通函数的区别而引起的一个bug，以及因此而学会的有关箭头函数与普通函数的区别，简单来说：

箭头函数不能使用arguments参数，普通函数可以
箭头函数的this关键字是lexically bound，也就是this是和最近的外层普通函数所具有的this一致(如果没有这样的函数，就和文件本身代表的对象绑定)；普通函数的this是dynamically bound，视运行时环境而确定

其实还有什么new之类的，作]]></description><category></category></item><item><title><![CDATA[grep打印匹配行的未匹配内容]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106480812</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106480812</guid><author>fitzleopard</author><pubDate>Mon, 01 Jun 2020 20:10:38 +0800</pubDate><description><![CDATA[本文首发于我的Github博客
本文记录了作者使用grep和sed命令来实现，打印grep匹配行中的未匹配内容的功能的方法，简单来说：

先使用grep &lt;pattern&gt;提取出匹配行
再使用sed -e 's/&lt;pattern&gt;//g'将匹配内容消除，即可得到未匹配内容


场景与方案
使用grep时，我们可以用grep &lt;pattern&gt;来打印出匹配行，可以使用grep -o &lt;pattern&gt;来打印出匹配行中的匹配内容，但是如果希望能够实现“反选”，也就]]></description><category></category></item><item><title><![CDATA[bash实现trim字符串]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106480774</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106480774</guid><author>fitzleopard</author><pubDate>Mon, 01 Jun 2020 20:09:28 +0800</pubDate><description><![CDATA[本文首发于我的Github博客
本文记录了作者使用sed命令对bash中的字符串进行去头尾空格的操作的方法，简单来说

使用echo ' string ' | sed -e 's/^[[:space:]]*//'去除开头的空格
使用echo ' string ' | sed -e 's/[[:space:]]*$//'去除结尾的空格
将二者用管道结合，去除头尾空格echo ' string ' | sed -e 's/[[:space:]]*$//' | sed -e 's/^[[:space:]]*//']]></description><category></category></item><item><title><![CDATA[转义sed替换模式字符串]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106472202</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106472202</guid><author>fitzleopard</author><pubDate>Mon, 01 Jun 2020 14:45:51 +0800</pubDate><description><![CDATA[本文首发于我的Github博客
本文记录了作者在使用sed命令进行文本替换时，对于使用到的替换模式进行转义处理使用到的sed命令，简单来说：

使用sed -e 's/[]\/$*.^[]/\\&amp;/g'即可对输入字符串进行转义


场景
sed命令常常被用来对文本做处理，其中一个最经常用到的处理就是替换，替换的语法如下：
echo $STRING | sed -e 's/&lt;match_pattern&gt;/&lt;replace_pattern&gt;/g'

当然也可以有其他的变化，不过这]]></description><category></category></item><item><title><![CDATA[date命令的两种常用法]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106469274</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106469274</guid><author>fitzleopard</author><pubDate>Mon, 01 Jun 2020 11:33:47 +0800</pubDate><description><![CDATA[本文首发于我的Github博客
本文记录了作者在平时工作中经常用到的Linux命令date的两种常见使用方式，简单来说：

打印当前时间，date "+&lt;output_format&gt;"
将Unix时间戳转化为可读的日期+时间date -r &lt;unix-timestamp&gt; "+&lt;output_format&gt;"


打印当前时间
只需要使用date "+&lt;output_format&gt;"就可以打印当前时间，其中，output_format由正常字符和转义字符组成，]]></description><category></category></item><item><title><![CDATA[git-status中文乱码问题]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106432886</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106432886</guid><author>fitzleopard</author><pubDate>Fri, 29 May 2020 21:12:39 +0800</pubDate><description><![CDATA[本文首发于我的个人博客
本文记录了作者解决git status命令中出现中文名乱码问题的方法，简单来说

配置 core.quotepath 为 false 即可


场景
当我们的修改文件中出现中文文件名时，git status就会出现乱码
➜  project git:(master) ✗ git status -s
?? "\344\270\255\346\226\207\346\226\207\344\273\266"

这是由于Git默认会对ASCII以外的编码进行转义，只要将这个转义关掉，就可以]]></description><category></category></item><item><title><![CDATA[golang抽取接口，依赖注入(依赖倒置)解决包引用关系]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106406188</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106406188</guid><author>fitzleopard</author><pubDate>Thu, 28 May 2020 15:30:53 +0800</pubDate><description><![CDATA[本文首发于我的个人博客
本文记录了作者在golang开发中，通过抽取接口，依赖注入的方式，解决包与包之间的不合理引用关系。
总结来说：

面向接口编程，并且golang中接口函数的参数最好是标准库的类型

场景
目前项目中有一个业务逻辑包business_logic，两个工具库包pkg1和pkg2，其中

pkg1是旧库，API不宜改动，pkg2是新库，尚未正式使用
business_logic会使用pkg1和pkg2
pkg1内部要添加使用pkg2的逻辑

// pkg1/main.go
package ]]></description><category></category></item><item><title><![CDATA[编写自定义启动脚本时的注意项]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106391897</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106391897</guid><author>fitzleopard</author><pubDate>Wed, 27 May 2020 22:11:22 +0800</pubDate><description><![CDATA[本文首发于我的个人博客
这篇文章介绍了作者在使用和编写自定义启动脚本时感受到的一个需要注意的点，简单来说，就是：

一定要打印出事实上的最终启动命令


自定义启动脚本的使用场景
我们知道，启动一个程序需要固定的命令，比如说

C/C++/Go可以编译出一个可执行文件，./app来启动
Java通过JDKjava命令启动，java APP

但是，管理大型项目时，未必会是简单的./app这样就可以启动的，我们有可能会需要传入许多选项和参数：
./exec -option1 -option2 arg1

./]]></description><category></category></item><item><title><![CDATA[一个golang的RPC框架设计中的坑点]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106391873</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106391873</guid><author>fitzleopard</author><pubDate>Wed, 27 May 2020 22:10:09 +0800</pubDate><description><![CDATA[本文首发于我的个人博客
本文记录了作者在使用公司的RPC框架时，由于RPC框架本身的设计以及程序员的投机取巧而遇到的一个坑点。
简单来说，RPC框架没有能够做足够好的封装，程序员（不是作者，是前人）也没有按照RPC框架约定的方式进行API调用。

背景提要
我们知道，RPC调用是不同主机间的进程通信的方式，如果想要额外传递消息，我们往往需要修改RPC调用的接口，通过新增参数的方式来新增传递信息。
但是这样修改参数，修改接口的方式侵入性太强，需要进行上下游调用接口的适配，很麻烦。
当我们面对一些遍布在各个RP]]></description><category></category></item><item><title><![CDATA[Vue中为对象添加字段]]></title><link>https://blog.youkuaiyun.com/fitzleopard/article/details/106391844</link><guid>https://blog.youkuaiyun.com/fitzleopard/article/details/106391844</guid><author>fitzleopard</author><pubDate>Wed, 27 May 2020 22:08:48 +0800</pubDate><description><![CDATA[本文首发于我的个人博客
本文记录了作者使用Vue.js，并且在前端中为对象添加字段时遇到的坑点。

场景与问题
从后端拿到数据之后，可能为了渲染时的方便，想要在对象里添加一些字段，而后直接在渲染时引用
直观上实现这种功能可以直接使用原生的js语法，抽象出来，可以用如下的代码段表示(为了复制就可以演示，没有组件化)
但是如下代码是有问题的，obj.newField不能被渲染出来
&lt;!DOCTYPE html&gt;

&lt;html&gt;
    &lt;body&gt;
        &lt;d]]></description><category></category></item></channel></rss>