自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

软件设计是一门技术,更是一门艺术。值得付出全部的智慧,创造力,和激情。

  • 博客(56)
  • 资源 (4)
  • 收藏
  • 关注

原创 C 语言的完美封装

你定义的结构体类型一定要写到头文件中吗?不是。为什么?

2022-01-17 21:47:18 1293

原创 C语言编程技巧-使用多线程提速

多线程提速 ,轻松提升 4-5倍运行效率,都不用换算法...

2021-12-30 23:54:25 1158

原创 C语言编程技巧-实现一个hash表

解决频繁查找时候 速度慢的痛点,使用C语言写一个hash表模块。可以根据自己的实际情况扩展。

2021-12-29 22:54:37 937

原创 C语言编程技巧--自己写一个动态数组

C语言分割字符串痛点解决

2021-12-25 13:13:58 970

原创 mvc_mvp和mvvm

理解MVC、MVP和 MVVM一、简介这是一个逐渐演化的过程。最开始是MVC,后来发展到MVP,最后是MVVM。https://gitee.com/zlgopen/awtk-mvvm/blob/master/docs/8.intro.md 参考了这里的介绍。二、MVCMVC 模式是 (Model-View-Ctrl) 。Model 其实指的是业务流程。不仅仅是数据。用小霸王游戏机来理解的话,这个Model就是我们插的卡。View 就是显示。用小霸王游戏机来理解的话,View就是

2021-11-11 21:06:15 84

原创 C语言单继承实现和使用

C语言单继承实现和使用在研究给awtk添加一种输入法的时候,发现一个有意思的技巧。仿佛是C 语言中的继承的实现。AWTK中给出了输入法引擎的接口,方便用户添加自己的输入法。其内部架构如图所示。我现在想要加一个自己的输入法。但是每种输入法差别比较大,只是一个engine的对象可能没有办法满足需求。比如九宫格和韩文输入法之间的差别。如图,输入法的基本操作就是open/close/input ,打开,关闭,输入操作。但是因为具体情况不同,需要不同的数据结构来处理问题。我以前的

2021-09-23 20:36:28 299

原创 scons使用(带小例子和makefile对比)

scons使用一、简介scons 和 make 都是 都是用来管理项目编译的。scons 通过 SConscript 文件管理编译。make通过makefile管理编译scons 一般这样管理 项目编译。在顶层的 SConstruct 文件中, 使用函数 DefaultEnvironment 。CPPPATH=[’./’];TOOLS_PREFIX=‘arm-linux-’Environment(CCFLAGS = CCFLAGS,CC=TOOLS_PREFIX+‘gcc’,

2021-09-08 20:21:09 1670

原创 推荐一个好用的文档管理服务器-showdoc

一个好用的文档管理服务器-showdoc一、服务器安装先看使用效果。文档记录的作用对我们技术人来说是十分重要的。好的文档记录能让我们面对之前出现过的类似问题时候,事半功倍。不至于捡芝麻丢西瓜,一直在同一个地方打转。showdoc是一个可以本地搭建的文档管理服务器。对技术团队十分有用。 #下载脚本并赋予权限 wget https://www.showdoc.com.cn/script/showdoc;chmod +x showdoc; #默认安装中文版。如果想安装英文版,

2021-08-19 22:52:00 1722

原创 好用的C库-cmockery单元测试

cmockery简单使用一、介绍cmockery是用来给C语言函数做单元测试使用的。代码我是很推崇面向API编程的。写功能的时候,尽可能先把问题拆分成几个接口。接口命名好之后,再实现。所以,我想弄个单元测试的库。督促自己面向API编程。其次,可以积累测试用例,有利于程序的稳定性。随后,我可能要实现一下自动生成单元测试文件的功能。二、例子我测试了一下之前写的几个排序函数,居然还测试出问题了,已经在博客更新修复了。#include<stdio.h>#include"cm

2021-08-07 14:47:30 559

原创 python基础-装饰器

python理解装饰器一、装饰器是干嘛用的?装饰嘛,就像人化妆一样。在不影响人体功能的前提下,点缀点缀,让你仿佛换个人。差不多就是这区别。二、python中如何实现?使用 @xxx 的方法来实现。@xxx 其实会做两件事:执行xxx函数。xxx函数的返回值,是一个函数对象,会替换掉要装饰的函数。比如这段代码:def print_a(func): print("A"); return func;@print_adef print_x():

2021-07-27 23:08:26 246 1

原创 刻意练习-哈夫曼编码简单压缩一个文件

一、文件是如何被压缩的?现在假设有这样一个文件,文件内容如下:damainnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnaaaaaaaaaaaaaaaaaaaaaaaaaayikunnnnnnnnnnnnnnnaaaaaaaaaa现在这个文件总共是100个字节现在文件里面的内容是一个字符占用一个字节(bytes),8个bit。如果我有办法能够用更少的bit来表示这个文件中的内容,就能够实现文件的压缩。**所以,我先放弃ascii 编码,使用

2021-07-24 10:27:48 252

原创 刻意练习-理解哈夫曼树构建哈夫曼表C语言

理解哈夫曼树构建哈夫曼表一、哈夫曼树的作用哈夫曼树是一个二叉树,是可以将一些字节重新编码 ,而且能够使用最少的空间。所以也叫最优二叉树。比如这段字符串damainnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnaaaaaaaaaaaaaaaaaaaaaaaaaayikunnnnnnnnnnnnnnnaaaaaaaaaa这是100个字节。但是如果你构造一个表如下:haffuman_map haffuman_table[]={ {'n',0b0}, {

2021-07-24 10:24:07 520 1

原创 python基础-生成器

如何理解python的生成器?一、怎样理解生成器呢?刚开始的时候,看到这样的格式python 代码def generator_test(): for i in range(5): yield i; 总是容易把它看成是一个函数来理解。就是这种思维方法,让人难以理解它的运作。那应该如何理解呢?我看了看这个generator单词的翻译。然后,我尝试把generator 理解成一个发电机。然后我就发现很好理解了。'''定义一个发电机的结构。发电机的运

2021-07-21 23:06:41 196 7

原创 如何给函数命名?解救单词量匮乏

一、问题由于单词量的匮乏,发现写代码的时候,似乎只会使用get,set,send,find,start,make等简单单词。这些单词很多时候能表达的意义非常有限。比如,从一个栈的数据结构中,取出一个元素。取出之后,这个元素就不在这个数据结构中了。此时如果使用get_element,能表达这个意思吗?可能使用pop_element更合适。比如,我想获取栈中的第N个元素的值,我要继续使用get吗?写成get_element_value?获取值是可以使用get的。同样都是获取,怎么写能够让代码更可读?我

2021-07-13 19:33:27 295

原创 心学与技术-大学之道和尽心知性

心学与技术-大学之道和尽心知性一、大学之道大学之道,在明明德,在亲民,在止于至善。大学,相对于小学,指的是针对成年人的学问。道是大路,意思是,成年人应该这样做学问。明明德。明德,就是天理。明明德,就是让天理在心中明白开来。亲民,是要入世,和别人接触。在和别人接触的过程中磨练。止于至善。明明德,亲民做到极致,便是至善。正心诚意,格物致知,修身齐家治国平天下。正心,本心被私欲阻断,心失其位,则不正。存天理,去私欲。为正心。诚意,是立志之后,人在遇到困难的时候,不会被私欲控制,而是坚守

2021-07-13 19:08:30 211 1

原创 心学与技术-心即理

心学与技术-心即理一、为什么说心即理?心即理,是说,心和理是一体的。比如,你今天出门看到一个乞丐,楚楚可怜,你心生恻隐之心,给了他几个铜板。你的这个行为,便是遵守了良知。是正确的,是天理。比如,你今天出门看到一个乞丐,楚楚可怜,你舍不得自己的铜板,就假装没看见,过去了。这行为,就没有遵守良知。不是天理。你问了自己的私欲而没有帮助别人。考虑一下这种情况,你今天和女朋友出门看到一个乞丐,楚楚可怜,你舍不得自己的铜板,想要假装没看到。但是女朋友说,看他很可怜。你碍于面子,给了乞丐几个铜板。你这样算是符

2021-07-13 19:03:45 101

原创 刻意练习-堆排序C语言

一、堆排序先了解什么是堆。这里的堆,其实是一个完全二叉树。有两个性质大顶堆的父节点比子节点要大。小顶堆的父节点比子节点要小。父节点和子节点之间的关系是.父节点的下标是k,子节点就是2k+1/2k+2。假设要排序一个数组{1,2,4,3,5}按照层序遍历,则现在这个数组在数中的位置是:现在这个堆还不是一个大顶堆。所以要做如下调整。得到大顶堆之后,根节点就是整个堆上最最最大的元素。所以可以做如下操作:将最大的元素换到屁股后面,这样,最大的元素就找到了它的位置。然后

2021-07-07 21:41:50 148 4

原创 心学与技术-不一样的内心境界

心学与技术-不一样的内心境界一、圣人之道,吾性自足。是非之心,人皆有之。我们都有判别是非的能力,而且和圣人判断能力没有两样。 正是这存在于心中的良知,帮我们度过百死千难,帮人类即使在乱世中也寻得心中安稳。心之无所不知,如水之无所不至。跟随自己的良知,决而行之。就仿佛是顺着沟渠流动的水一样。无所不至,无所不能。追随良知,尽人事而听天命。人心如水,让心细致的流进每一个致良知的细节中,不仅仅能发挥出惊人的力量,更是让人充满掌控感。 之前感觉到烦恼,烦躁,不想做的事情,忽然也解决的可以乐在其中了。这是一个

2021-07-06 20:58:10 113

原创 刻意练习-归并排序

一、归并排序和递归这篇已经使用递归实现快速排序。感觉也很爽。所以再实现一下归并排序让我更爽。递归先要弄清楚第N步和N-1步的关系。然后想明白终止条件。归并排序思想是什么样呢?比如我要排序 {2,1,8,7,4,3,6,5} 这个数列。我可以先把数列拆分成两部分,然后让这两部分分别有序。然后我们合并两个有序的数列,组成完整的有序数列。所以在这里,第N-1步就是两个数列已经各自有序了。第N步就是把这两个数列合并。 具体的N-1步如何有序,就看N-2步了,依次类推。直到数列只有一个

2021-06-29 17:23:17 76

原创 刻意练习-快速排序

一、递归和快速排序之前这篇已经使用递归解决汉诺塔问题,感觉十分的爽。所以趁热打铁练习一下快速排序。递归解决问题的关键是了解解决问题过程中N和N-1步的关系。并且假设N-1步已经完成了。快速排序刚好满足。快速排序思路简单如下:图可以看出。快速排序是不断的将数列,按照某个中间值为界限,将大的放在中间值右边,小的放在中间值左边。这张图是为了表达这个意思。实际上可能不是这样移动的。但是思想表达清楚了。这种套娃式的解决方法,使用递归是没毛病的。二、抽象我首先要找到那个

2021-06-29 15:41:17 101

原创 刻意练习-递归解决汉诺塔问题

一、递归和汉诺塔递归是要先找到解决问题的步骤,从第1步做什么,第2步做什么,一直推断到N-1步做什么,第N步做什么。然后把注意力放在第N-1步和第N步之间。并且假设N-1步已经解决OK了。比如求和1-100.如果使用递归来完成。int sum(int max_num){ //如果这个数值是0,就直接返回0. if(max_num == 0) { return 0; } //假设之前的求和已经OK了。我用当前值加上之前的和就行。

2021-06-26 12:49:29 415

原创 刻意练习-希尔排序

一、介绍希尔排序,是插入排序的改进版。是为了减少插入排序中对数值的移动次数。比如,这个数列需要插入一次就完成排序。但是这个序列就要插入好多次。如图,1,2,3,4,都要前移,而且都是最远距离。说明一个问题,插入排序在基本有序的情况下,做的插入操作更少,效率更高。 希尔排序就是为了让数列基本有序。希尔排序让每个值先跳着插,让整个数列基本有序。最后再调用插入排序。先跳5/2=2个插入:变成这样:此时已经是基本有序了。然后跳2/2=1个插,就是基本的插入排序。

2021-06-24 20:14:27 185 4

原创 刻意练习-插入排序

一、理解插入排序比如有一串数字,1,2,5,6,3,4 ,需要将这几个数字排序。插入排序指的是这样做而后将4取出。最终得到这个。二、抽象不建议直接从网上找个现成的程序背会。练习编程 就是锻炼自己抽象的能力。解析一下这张图,将3取出,放到5的前面。第一,要有一个数组,或者链表。以数组为例。你先要找到3这个 成员。(人脑可能一下就找到了,但是计算机要怎么找到,代码要怎么写?)第二,你要记录下这个成员的值。第三,你要找到插入的位置。第四、你

2021-06-22 20:16:15 126 1

原创 心学与技术-刻意练习达到知行合一

刻意练习达到知行合一一、更好的学习成年人的知识记忆能力很弱。所以,必须将知识点转换成方法记忆或者经验记忆,才能更好地学习。参考 https://blog.csdn.net/renyongjian1994/article/details/118054146对于编程而言,这个过程需要刻意练习。刻意练习,需要先有一个心理表征,或者说一个思维模型。二、编程的心理表征问自己一个问题,如果现在直接让你手写一个堆排序,能写出来吗?如果不能写出来,是因为欠缺了什么?其实使用代码解决问

2021-06-22 20:06:53 196

原创 心学与技术-知行合一的练习

软件需要知行合一的练习一、什么是知行合一?知行合一,意思就是知行是一体的。知之真切笃实处,即是行。行之明觉精察处,即是知。以设计模式为例:当你玩游戏的时候,你开始思考游戏里面的某个机制,比如吸血,比如免伤的被动。可能是怎么设计的。使用了什么模式?当你在工作中,正在写代码,忽然觉得,不应该这样写,违反了xxx设计原则,应该使用xxx设计模式会更好。如果达到这种状态,我认为,我是处于知行合一的状态了。 我理解设计模式,并且可以不写代码去推演,写代码的时候,明觉精察,察觉到使用这种设计模式

2021-06-19 15:12:00 199

原创 心学与技术-软件的意义

软件的意义一、心学心学,属于儒家思想。教人,正心诚意,格物致知。修身齐家治国平天下。做事先要正心。如何就算正心?—> 存天理,灭私欲。我们所在的世界,太多的私欲驱动。其实就算是这里的博客,最吸引人的都是如何进大厂,如何有更多年薪,如何面试的主题。如果为了这些而去学习技术。在心学看来,这就是不正之心。心学教人“致良知”。应当以良知驱动我们做事。 在古人看来,“为天地立心,为生民立命,为往圣继绝学,为万世开太平”。是我们应当做的。王阳明曾经因此学习兵法。他认为想要做圣贤,如果遇到国被侵犯,只

2021-06-19 15:07:57 640

原创 js中setTimeout给调用的函数传递对象参数

一、怎样传参?在输入框失去焦点的时候,自动返回到焦点。我使用"setfocus("+obj.id+")",本来只是想传递一个id过去,但是实际上,setfocus中收到的已经是这个对象了。<!DOCTYPE html><html><script type="text/javascript">function setfocus(obj) { obj.focus();}function doOnBlur(obj){ setTimeo

2021-06-16 22:29:39 356

原创 不想和别的模块耦合的时候可以使用两个头文件

一、背景近期在想办法重构一块 LCD 代码。想要构建一个组件,充当MVC模型中的C的角色。之前M(模式)和V(显示)是耦合的。不好读,不好维护,bug多等问题。不过在重构过程中,很不容易发现C模块的细节是不是也和M或者C耦合了。 理论上,我只希望使用API和其它模块交互。 比如定义的结构体名称,是不是在不应该出现的地方出现了。尤其是和别的同事合作,我要一个个检查代码,还有很多其它工作,不能在这里花费太多时间。所以决定借助编译器来帮忙。使用两个头文件。本次是要写LCD显示管

2021-06-16 22:07:00 164

原创 架构整洁之道(六)-设计一个好维护的软件

一、背景知识简单复习一下前面的知识点。软件架构设计十分重要。否则随着时间推移软件会变得无法维护。怎么就算好?能够降低维护成本,并且能长期维持低成本。这就要程序员每次改代码少做决策,少修改代码。这就要求现在的代码解耦合+易复用。其实只要解耦合,往往就容易复用。所以,好的软件架构要做好三件事,解耦,解耦,还是特么的解耦。解耦合的过程中,往往要使用函数指针。函数指针应该在约定好的情况下,小心使用。因为整个面向对象编程对架构最重要的,就是限制函数指针的使用。二、设

2021-06-10 20:31:03 142

原创 架构整洁之道(五)-模块化

一、模块化原则我本来想写基本的设计原则的,但是发现:接口隔离原则 和 依赖倒置原则,我认为在C语言编码中,如果已经成功的划分了模块的边界,而且要尽可能的解耦合,是要自然而然要做的事情。所以,改成写模块化。模块化原则模块化原则展开说,就是:要编写复杂的软件,而且又不至于一败涂地的唯一方法,就是用定义清晰的接口把若干模块组合起来。如此一来,多数问题只会出现在局部,那么还有希望对局部的修改,不会影响到全部。怎样划分模块看你要怎么解决问题。模块化-是要求面向API编程。模块之间,使

2021-06-10 18:59:22 400

原创 架构整洁之道(四)-三种编程范式

架构整洁之道(四)-三种编程范式一、三种编程范式简介结构化编程对程序的直接转移做了限制。面向对象编程对程序的间接转移做了限制。函数式编程对变量的赋值做了限制。怎么理解?请往下看。三种编程范式都是为了解决某些问题而出现的。合理利用,能够让代码更好维护。二、结构化编程编程范式什么是结构化编程?结构化程序设计(英语:Structured programming),一种编程典范。它采用子程序、程序码区块(英语:block structures)、fo

2021-06-07 21:46:32 600

原创 架构整洁之道(三)-解耦合与复用

一、为什么要解耦合前面说到,好的架构是要花费最少的人力成本来构建和维护软件。对应到写代码上,有两个关键点。维护的时候,每次修改尽可能少的代码。维护的时候,每次修改或者添加功能,工程师要少做决策。而要少改代码,少做决策,对应的两个解决方法。复用。如果之前写的东西总是能复用,那维护的时候要写的代码就变少了。解耦合。因为每次改动,工程师思考的都是在一小块范围内。工程师要考虑的就更少,就不用那么多决策。而如果不符合正交性,到处要改,我们就要花费更多的时间考虑这个,考虑那个。最后纠结了

2021-06-04 21:16:43 746

原创 架构整洁之道(二)-好的软件架构如何构造

代码整洁之道(二)- 好的软件架构如何构造一、怎样将软件架构思想应用到代码中?上篇说到,好的软件架构,是要花费最小的人力,实现软件的构建和维护。那对应到代码中是什么样呢?个人理解,就是需求变动的时候,需要改动的代码最少。但是需求就是在不断的变,要改动的代码怎么能少呢?需求的变化不是我们工程师能决定的。但是修改的代码量却是可以减少的。使用合理的方法应对变化,是核心。对于个人而言,如何就能算花费的能量最少了?看《意志力》一书讲了,人在不断做决策的过程中,会消耗大量能量

2021-06-03 20:22:57 176

原创 架构整洁之道(一)-良好架构的作用

架构整洁之道(一)-良好架构的作用一、软件架构的目标软件架构的终极目标使用最小的人力成本实现软件的构建和维护。衡量一个架构好不好,其实就是看维护代码需要的成本很低,并且长时间维持比较低的状态。否则,就是不好的架构。技术债务为了容易解决问题,使用短期的方法。而这种方法在长期对软件产生不好的影响。也就是欠下的技术债务。最终总是要偿还的。不好的架构将使得技术债务不断地被积累。不好的软件架构的问题。当你中途加入一个团队,发现他们的代码是一个大型的耦合的系统。你又不了解每一个

2021-06-01 20:59:56 297 1

原创 Linux下C语言管理多个信号并发

linux C语言使用IO复用处理信号一、为什么要使用IO复用的方式管理信号?考虑这样一个场景,事实上经常会遇到这种场景。设备中存在一个守护进程A。设备中存在一个用户进程,B。B在某些情况下需要重启日志服务。如果要B自己来处理这个需求,必须使用系统调用。system();函数。使用system函数重启了日志服务之后,日志服务进程的父进程就是B。此时,B因为其它的原因,需要重新启动,重新加载参数。此时,B死亡前,可能没法处理日志服务。这种做法是十分不合理的。一个服务的父进

2021-05-29 15:20:01 229

原创 整理C语言结构体数组初始化

C语言结构体数组初始化一、使用场景在C编码中,经常需要对结构体数组进行初始化。使用这种方法,能够使得代码更加的清晰,易读。例如:需要根据返回码,一个status code 做不同的操作。int process_by_status_code(int status_code){ if(status_code == 180) { //do process 1 } else if(status_code == 183) { //

2021-05-23 19:01:37 4533

原创 开闭原则

一、开放封闭原则介绍OCP:Open Closed Principle 缩写,开放封闭原则。设计良好的软件,应该易于扩展,同时抗拒被修改。下面使用C语言说明这个原则二、怎样理解开放封闭原则我觉得关键就是抽象。加一层抽象。假如你要使用某个功能遵守开放封闭原则之后这个意思就是,使用一个功能的时候,不要直接写死相关逻辑。而是把具体实现弄成可以扩展的,以后添加功能具体实现4的时候,一定不会影响其它的功能。三、实际案例假设需要解析一段SIP 报文的 Mess

2021-05-10 14:47:24 80

原创 单一职责原则

文章目录单一职责原则-SRP一、怎样理解单一职责原则1.概念2.演化二、案例1.案例问题说明2.案例问题解决三、无脑遵守SRP会有什么问题?问题:解答:四、参考文献单一职责原则-SRP一、怎样理解单一职责原则1.概念​ SRP :Single responsibility principle 的缩写。一个函数,或者一个模块,应该只负责一类行为。​ 需要注意的是,每个函数应该只做一件事,并且把这件事做好。这是SRP 在实现底层细节的时候的一个体现。SRP是一种思想,需要用心体验。大到整个软件,小到

2021-05-08 11:26:43 435

原创 sed命令操作文件简单实用

sed命令操作文件简单实用参数:-i :直接修改读取的文件内容,而不是输出到终端。a :追加d :删除i :插入s :替换一般格式:sed -i '/匹配对应的行/增删改命令 参数' $file_name'' 中是操作代码块// 两个斜杠中间是正则匹配。tips:1、针对某一行的操作,都可以使用 ‘,’ 进行分割,表示从第x-y 行。2、在 sed 操作块中使用shell变量,用‘“”’单引号加双引号引用。如,'"$line"'3、对文件进行的这几个操作,其实都是有规律的。

2020-11-16 12:00:48 334

原创 awk常用方法整理

awk在linux shell中的常见用法一、awk 导入文件到数组二、awk 操作某字符串,类似python 中 split 的操作。三、awk 的正则匹配。四、awk调用shell命令一、awk 导入文件到数组类似 python 中 readlines();awk '{print $0}' filename执行结果:arr=($(awk '{print $0}' filename));执行结果:遍历数组for i in ${arr[*]}do echo $i;done

2020-11-16 09:29:00 388

showdoc上传.7z

小工具,可以右键上传选中的markdown文件

2021-08-19

cmockery_unittest.7z

cmockery的简单使用。

2021-08-07

mpc_mpfr_gmp.7z

linux升级GCC的时候,依赖的三个库,mpc,mpfr,gmp.在别的地方下载都太慢了。上传到这里可以快一些

2020-12-06

smtp_socket_test

为了练习socket 操作,用C语言写了一个smtp邮件用户代理

2017-07-21

空空如也

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

TA关注的人

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