<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[年少轻狂，幸福时光]]></title><description><![CDATA[--事物的难度远远低于对事物的恐惧]]></description><link>https://blog.youkuaiyun.com/lms1008611</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; lms1008611]]></copyright><item><title><![CDATA[定义算法的框架 - 模板方法模式]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/107706656</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/107706656</guid><author>lms1008611</author><pubDate>Fri, 31 Jul 2020 10:51:36 +0800</pubDate><description><![CDATA[现代软件专业分工之后的第一个结果是“框架与应用程序的划分”，“组件协作”模式通过晚期绑定，来实现框架与应用程序之间的松耦合，是二者之间协作时常用的模式。

“组件协作” 模式通常包含
    1、模板方法模式
    2、观察者模式
    3、策略模式

这篇文章中我们首先来了解模板方法模式，其他两个模式在后续的文章中了解熟悉。

只要写过面向对象的程序，用过一些框架，都会使用过模板方法模式，比方QT中实现线程，那么我们一般会编写一个继承QThread的子类，然后在子类中重写...]]></description><category></category></item><item><title><![CDATA[Mysql中sql语句的处理顺序]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/107684747</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/107684747</guid><author>lms1008611</author><pubDate>Thu, 30 Jul 2020 11:47:23 +0800</pubDate><description><![CDATA[与C/C++等大多数语言不同的是，C/C++的处理逻辑是顺序处理，即处理顺序与我们编码的顺序几乎一致，而sql语言的处理却不是按编码顺序执行的，而总是从from开始处理。下边做个sql语句编写与处理的顺序对比

编写顺序：select dinstinct ... from ... join ... on ... where .. group by ... having ... order by ... limit ...

处理顺序：from ... on ... join ... where ... ..]]></description><category></category></item><item><title><![CDATA[第四载、FAT12文件系统剖析2]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/105875016</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/105875016</guid><author>lms1008611</author><pubDate>Fri, 08 May 2020 10:50:49 +0800</pubDate><description><![CDATA[在上一章节《FAT12文件系统剖析1》中，我们把a.img启动软盘使用FreeDos系统格式化为FAT12文件系统的组织方式，并且向a.img软盘写入两个文件，同时通过FreeDos操作系统也查看了a.img软盘中的文件。之所以这么做，是因为主引导程序不可以超过512字节，所以主引导程序需要在基本的初始化工作完成后加载启动介质(这里是软盘a.img)中的启动程序到内存，然后跳转到对应内存处执行。
...]]></description><category></category></item><item><title><![CDATA[第三载、FAT12文件系统剖析1]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/105800809</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/105800809</guid><author>lms1008611</author><pubDate>Mon, 27 Apr 2020 23:41:26 +0800</pubDate><description><![CDATA[在上一篇文章中，我们完成了一个简单的主引导程序的编写及运行，但有限制的是：主引导程序不能超过512字节！然而操作系统的程序，明显不止512字节，为了突破这个限制，主引导可以采用如下改造策略：
    1、完成最基本的初始化工作
    2、从存储介质加载程序到内存中
    3、将控制权交给新加载的程序执行在这里，主引导程序主要做简单初始化、加载程序到内存，跳到加载的程序处...]]></description><category></category></item><item><title><![CDATA[第二载、第一个操作系统程序，"Hello OS" 尝鲜]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/105778225</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/105778225</guid><author>lms1008611</author><pubDate>Sun, 26 Apr 2020 23:34:28 +0800</pubDate><description><![CDATA[学编程逃不过的真香定律：一个程序永远是打印一行"Hello Word"，那么这章节，我们也来编写一个可独立运行于x86架构的程序(注意，这里是脱离操作系统的)。

在上一篇我们说了，BIOS会加载启动介质中的主引导程序，主引导程序是一个由汇编语言完成的软件，并且存储在启动介质的前512字节处，入口地址为0x7C00，以0x55AA结束。主引导程序的入口地址0x7C00类比到C语言中，就是main函...]]></description><category></category></item><item><title><![CDATA[第一载、初识操作系统]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/105719064</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/105719064</guid><author>lms1008611</author><pubDate>Thu, 23 Apr 2020 23:34:58 +0800</pubDate><description><![CDATA[易经有云：“伏羲一划开天地，太极生两仪，两仪生四象，四象生八卦”，而八卦的种种组合，得到六十四卦，世间万物都可以用这六十四卦来解释。

  软件开发与易经描述的卦象，有异曲同工之处，现今种类繁多的编程语言、开发框架，好比六十四卦，追根溯源，终究会回归到最初的太极图；软件开发而言，这些开发语言、框架，也就最终都会回归到操作系统。所以有了操作系统连载篇章，记录自己学习操作系统的历程。

...]]></description><category></category></item><item><title><![CDATA[第七载：makefile中的条件判断]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/101169371</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/101169371</guid><author>lms1008611</author><pubDate>Sun, 22 Sep 2019 19:47:16 +0800</pubDate><description><![CDATA[makefile跟编程语言一样，也支持条件判断，方式大同小异，makefile条件判断语句的语法如下：
虽然有集中形式，但是推荐使用第一种，其比较符合我们的编程习惯(尤其从事C/C++派系的工作人员)，需要注意的是，ifxxx前边不能为tab键(因为不是命令)，()中也不允许有空格，否则会报错，这里ifxxx是泛指集中判断类型，具体的如下：

可以支持 ifeq ... else ... ...]]></description><category></category></item><item><title><![CDATA[第六载：makefile变量的高级主题]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/101149928</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/101149928</guid><author>lms1008611</author><pubDate>Sun, 22 Sep 2019 14:41:08 +0800</pubDate><description><![CDATA[在makefile中，我们已经知道变量的基本赋值方法、使用等，但是在makefile中，变量还有一些高级的属性，掌握这些属性，可以使编写的makefile更加高效，现在就来了解下makefile中变量的高级属性

 一、变量值的替换

 - makefile支持使用指定字符(串)替换变量值中的后缀字符(串)
 - 语法格式为：$(var:a=b) 或者 $...]]></description><category></category></item><item><title><![CDATA[第五载：预定义变量的使用]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/101094936</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/101094936</guid><author>lms1008611</author><pubDate>Sat, 21 Sep 2019 09:08:30 +0800</pubDate><description><![CDATA[在makefile中，存在一些预定义的变量，我们可以直接使用他们，预定义的变量可分为自动变量与特殊变量

 1、 自动变量
 $@ 表示目标
 $^  表示目标的所有依赖
 $&lt; 表示目标的第一个依赖


all : first  second third
    @echo "\$$@ =&gt; $@"
    @ec...]]></description><category></category></item><item><title><![CDATA[第四载：makefile中变量的赋值方式]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/101084595</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/101084595</guid><author>lms1008611</author><pubDate>Sat, 21 Sep 2019 00:39:09 +0800</pubDate><description><![CDATA[makefile类似于脚本程序，当然也支持程序里边变量的概念，makefile中的变量只是文本数据(字符串)，没有C语言中的数字等，并且大小写敏感。
 makefile中的变量有4种赋值方式：
 - 简单赋值（ := ）(最常用)
 - 递归赋值（ = ）
 - 条件赋值（ ?= ）
 - 追加赋值（ += ）

 对于变量的使用，与C语言不同的是，需要...]]></description><category></category></item><item><title><![CDATA[第三载：makefile中的伪目标]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/101048373</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/101048373</guid><author>lms1008611</author><pubDate>Fri, 20 Sep 2019 08:43:51 +0800</pubDate><description><![CDATA[在前边的两个章节中，我们提到了makefile中的目标，并且知道这个目标存在且依赖没有更新，make就不再编译程序。
一般在默认的情况下
 - make 认为目标对应着一个文件(可执行程序、so库等等)
 - 比较目标文件和依赖的新旧关系，决定是否执行命令
 - make以文件处理作为第一优先级


clean :
    rm *.o hello.out

在上边的一个...]]></description><category></category></item><item><title><![CDATA[第二载：makefile的结构]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/101010185</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/101010185</guid><author>lms1008611</author><pubDate>Thu, 19 Sep 2019 09:02:29 +0800</pubDate><description><![CDATA[在上一篇中，我们只是简单的介绍了make跟makefile的基本概念，并且实现了一个简单的makefile，但是那个makefile仅仅是做一些打印工作，并没有什么实际性用途。在编写真正可用的makefile前，我们先来了解下makefile的结构。
 前边也提到，makefile的意义在于：
 1、makefile用于定义源文件间的依赖关系
 2、makefile说明如...]]></description><category></category></item><item><title><![CDATA[第一载：初识make与makefile]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/101002830</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/101002830</guid><author>lms1008611</author><pubDate>Thu, 19 Sep 2019 00:32:19 +0800</pubDate><description><![CDATA[我们写程序完成后，都需要进行编译才能运行，在一些集成的IDE(如vs2010、QT等)，都提供有一键编译的功能，整个编译过程(预处理、编译、链接)，IDE已经帮我们屏蔽了。但是在嵌入式或Linux平台下的开发，基本都是通过make跟makefile来管理整个工程项目，即源码与源码之间如何关联、依赖等等。除此之外，学习make跟makefile，可以使得开发人员对于程序的编译过程有更深层次的...]]></description><category></category></item><item><title><![CDATA[排序算法之 - 归并排序]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/90147370</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/90147370</guid><author>lms1008611</author><pubDate>Sun, 12 May 2019 23:52:06 +0800</pubDate><description><![CDATA[这一章节所讲的归并排序,跟希尔排序一样,也是一种效率很高的排序方法,也同样采用了分而治之的方法.
归并排序的基本思想为:先把无序序列一分为二,然后分别对两边的序列进行排序,最后再整合两边已经排好的序列.下边已一张图来展示归并排序的思想(图是借用网友的,见做的非常简洁易懂,便引用之)

从途中我们看到,二分后的两边序列,又进行二分归并处理,直到两边的序列不能二分为止.这就是采用的递归思想,出...]]></description><category></category></item><item><title><![CDATA[排序算法之 - 希尔排序(基于选择排序,插入排序)]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/90141881</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/90141881</guid><author>lms1008611</author><pubDate>Sun, 12 May 2019 23:24:19 +0800</pubDate><description><![CDATA[之前说的选择,插入,冒泡三种基本排序,时间复杂度都为O平方,直到希尔排序的出现,打破了O平方的魔咒.希尔排序的基本思想我理解是属于分而治之,把一个无序序列划分为若干个子序列,再分别对这写子序列使用三种基本排序方法进行排序.
下边直接看示意图:
要排的序列为 int array[] = {12,32,2,4,6,54,34,76,89,32,14};排序为升序排序第一次划分:假设间隔d = ...]]></description><category></category></item><item><title><![CDATA[排序算法之 - 冒泡排序]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/90138805</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/90138805</guid><author>lms1008611</author><pubDate>Sun, 12 May 2019 12:16:04 +0800</pubDate><description><![CDATA[与选择排序,插入排序一样,冒泡排序也是常规的排序法之一,冒泡排序的思想主要放在"冒泡"二字.
 这个冒泡排序算法有点想水中的泡泡往上冒一样,水中的泡泡月往上变得越大,冒泡排序思想跟这个是一样的.
 冒泡排序思想:取最后一个元素,往前遍历并与遍历的元素比较,符合交换规则(或大或小),那么交换位置,接着往前遍历,知道遍历到已经排好序的序列为止,那么此时这个元素就是极大/极小值,也就...]]></description><category></category></item><item><title><![CDATA[排序算法之 - 插入排序]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/90138387</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/90138387</guid><author>lms1008611</author><pubDate>Sun, 12 May 2019 11:48:19 +0800</pubDate><description><![CDATA[与选择排序,冒泡排序一样,插入排序也是常规的排序法之一,
插入排序的思想主要放在"插入"二字,主要就是从待排序列中取第一个待排元素,然后与其前面已排序列的元素比较,比较成功(或大或小),那么就把这个已排元素往后挪一个位置,空出来的位置就是插入的位置,依次循环.下边来看个示意图:
 要排的序列为 int array[] = {12,32,2,4,6,54,34,76,89,32,14};排序...]]></description><category></category></item><item><title><![CDATA[排序算法之 - 选择排序]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/90115839</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/90115839</guid><author>lms1008611</author><pubDate>Sat, 11 May 2019 22:41:52 +0800</pubDate><description><![CDATA[所谓排序,就是把一系列同类型的元素按照一定规则顺序排好.
选择排序也是其中的方法之一,选择排序的思想主要放在"选择"二字,主要就是从待排序的序列中寻找最大/最小值,然后放到已经排好序的下一个交换位置,下边来看个示意图:
 要排的序列为 int array[] = {12,32,2,4,6,54,34,76,89,32,14};
 (红色代表已排序列,黑色代表待排序列,绿色代表...]]></description><category></category></item><item><title><![CDATA[确保对象的唯一性 - 单例模式]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/89817632</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/89817632</guid><author>lms1008611</author><pubDate>Sat, 04 May 2019 21:53:35 +0800</pubDate><description><![CDATA[单例模式在我们的日常开发中用的非常多，单例模式最大的特点就是只能生成一个类对象。
 比方配置文件的类信息，就可以使用单例模式实现，因为配置文件是固定的，不论在代码的哪个位置获取配置项信息，得到的都应该是相同的信息。

 既然只能生成一个类对象，那么我们就得考虑下如何实现这个只生成一个对象，在C++中我们知道，当定义或new一个对象时，就会调用构造函数，构造函数的执行成功，才宣誓...]]></description><category></category></item><item><title><![CDATA[算法随笔-替换字符串中的子串]]></title><link>https://blog.youkuaiyun.com/lms1008611/article/details/89817349</link><guid>https://blog.youkuaiyun.com/lms1008611/article/details/89817349</guid><author>lms1008611</author><pubDate>Sat, 04 May 2019 20:29:07 +0800</pubDate><description><![CDATA[在我们的项目里，经常会将字符串中的指定的内容替换为我们需要的内容，这里我们就来实现这这个小算法。
具体需求则为：将字符串中的指定子串替换为设置的字符串，并返回替换的总数，实现比较简单，主要是指针的运算，下边直接代码展示：


#include &lt;iostream&gt;
#include &lt;string.h&gt;
#include &lt;stdio.h&gt;

int S...]]></description><category></category></item></channel></rss>