- 博客(350)
- 资源 (2)
- 收藏
- 关注
原创 谈代码注释
只要写代码,就会遇到代码注释的问题。在不同的公司,不同的项目组,不同的项目中,可能会有不同的注释标准。有些标准让我们感觉很受益,有些则让我们感觉很反感。而对于没有明确标准的项目,我们往往会遇到“百花齐放,百家争鸣”般的注释。我无法给出一个明确的标准,只是在此探讨下:什么样的注释不应该写,什么地方需要写注释。(转载请指明出于breaksoftware的csdn博客)“不”的原则...
2018-04-01 01:24:25 10306 11
原创 IT项目研发过程中的利器——用Top分析CPU利用率
1、5、15分钟值基本相等,说明系统稳定运行;哪个值和其他值对比出现偏离,说明产生了变化。1分钟偏离,说明系统在变忙碌(值大),或者变空闲(值小)。5分钟偏离,说明中期系统出现抖动。15分钟偏离,说明系统在变空闲(值大),或者变忙碌(值小)。一般只要出现非平稳状态,就要定位原因,否则就是隐患。
2024-02-05 17:51:45 982
原创 IT项目研发过程中的利器——C/C++项目调用图篇
当我们拿到一个比较大的项目源码时,往往需要总览代码的结构,理清脉络,发现核心点。如果没有前人给出的经验,我们该如何找到关键的函数和模块呢?这个时候我们就可以借助一些工具来生成“调用图”(Call Graph)。图中函数和模块的连线比较多,说明其被使用的很多,需要重点关注;图中函数和模块位于很多调用栈中,说明该函数是有关“脉络”的信息,也要重点关注。比如event_add被连接很多,说明被使用的地方很多,需要重点关注;
2024-02-01 20:46:50 617
原创 动态分析C语言代码生成函数调用关系的利器——perf
perf是一套linux操作系统上分析工具集,分析函数调用关系只是其一个子集功能。它并不像中介绍的需要在被分析程序的编译指令中插入新的选项(-pg),而是直接对原始编译结果进行分析。
2024-01-31 11:24:48 953
原创 动态分析C语言代码生成函数调用关系的利器——gprof
gprof是一个C语言程序性能分析工具。在编译期间,我们给编译指令增加-pg选项,就可以将检测代码插入到源码中。然后使用gprof启动编译程序,它会收集程序运行的流程以及其他相关数据。最后我们使用gprof2dot将这些数据转换成dot文件,使用graphviz进行图形化展示。以中的libevent为例。
2024-01-30 19:17:12 986
原创 一个通过下标查找数值的面试题解法
最近看到一道面试题,面试官说是算法题。我粗略看了下,努力在其中寻找数学公式,但是最后发现它算是一个数据结构相关的题目,没有算法层面的知识。这题大体意思是有序数组是由数组中的数字K,以及3K+1、2K+1构成,即这是一个迭代生成的问题。然后通过下标找到数组中的值。我们先看数组中相邻的两个数组(X, Y),假设Y = X+n。则通过X生成的数字是。
2024-01-30 19:16:42 308
原创 静态分析Golang语言生成函数调用关系的利器——go-callvis
不同于之前分析C语言项目的工具,go-callvis还是很方便使用。只要把两项工作做好就能顺利的使用。我的测试环境是Ubuntu 22 TLS版,默认的Golang是1.18。这会导致go-callvis安装失败。如果版本匹配,可以忽略下面Golang升级的步骤。安装新版本直接上1.21版本。配置环境变量在文件末尾另起新行填入以下内容载入环境修改当前环境修改之后进入的环境在文件末尾另起一行新增分析我们以gorush的源码为例。它是一套基于Gin实现的消息推送框架。安装go-cal
2024-01-28 16:37:39 1229 1
原创 使用软件工程理论给代码打分的利器——Analizo
Analizo是一款可以给C、C++、Java以及C#代码进行评分的开源软件。我们可以使用它来分析代码,并得到如下指标的评分这些评分是我们评价代码质量和可维护性的一种依据。比如Average Cyclomatic Complexity per Method (ACCM) metric,即平均圈复杂度。这是1976年由Thomas J. McCabe, Sr. 提出来的一种代码复杂度的衡量标准。它的算法也很简单,即其中e是边数量,n是节点数量。
2024-01-26 02:57:04 1223
原创 静态分析C语言生成函数调用关系的利器——GCC
在中我们介绍了如何使用GCC生成RTL文件,然后再借助cally和egypt来分析出调用关系的方法。GCC自身有命令可以生成代码内部的调用关系,即-fcallgraph-info参数。它会生成后缀是ci的VCG格式文件。然后我们使用graph-easy将其转换为dot格式,最后使用graphviz将其绘制出来。我们还是以libevent的为例。
2024-01-25 16:19:36 999
原创 静态分析C语言生成函数调用关系的利器——cally和egypt
我们看下test-time.c的部分源码。可以看到egypt的展现更加准确,因为它将time_cb和main进行了关联,而cally则没展现出来这层关系。called++;for (i = 0;i < 10;i < NEVENT;i++) {} else {我们看到上面图片并没有展现诸如event_add这类外部函数的底层调用栈。
2024-01-24 23:58:10 1009
原创 静态分析C语言生成函数调用关系的利器——cflow(二)
这类错误主要是符号类型错误,我们只要加入相关指令即可,修改如下执行完会报这个错:找不到event2这个文件夹下的event-config.h。经过寻找,这个文件并不存在。这说明该文件是在编译时生成的。
2024-01-24 04:22:26 828
原创 Windows11家庭版上安装Hyper-V并导入虚拟机的方法
一般我们新买的电脑默认自带的是Windows家庭版。这个版本是没有Hyper-V的。如果安装自带Hyper-V的版本,则需要另外购买。但是我们还是有办法在Windows11的家庭版上安装和启用Hyper-V的。
2024-01-22 18:40:13 697
原创 使用scipy处理图片——滚动图片
在一文中,我们介绍了numpy的roll方法,它只能让超出区域的元素回到被移动的区域中,如下图。而scipy的滚动图片方法则有更多有意思的模式。先看下原图。
2024-01-16 21:03:12 636
原创 使用numpy处理图片——滚动图片
滚动图片是指:图片尺寸不变的情况下,把图片内容做某个方向的移动。这样就会出现一种情况:被移走的区域显示为空白,或者被超出尺寸的区域填充。numpy的滚动数组的方法能够做到下图效果,即空白区域用超出尺寸的元素填充。下面代码中(100,300,0)和(0,1,2)表示0轴方向(向下)移动100个元素,1轴方向(向右)移动300个元素,2轴方向不变。
2024-01-16 20:20:16 372
原创 使用scipy处理图片——任意比例缩放
在一文中,我们每2个取1个像素来达到图像缩小的效果。这就要求缩小的比例只能是整数倍,而不能支持缩小到0.3倍或者放大到1.5倍这样的效果。为了支持任意倍数的缩放功能,我们需要使用scipy的zoom方法。先看下原图。
2024-01-15 20:59:37 574
原创 使用scipy处理图片——旋转任意角度
在中,我们使用numpy提供的方法,可以将矩阵旋转90度。而如果我们需要旋转任意角度,则需要自己撸很多代码。如果我们使用scipy库提供的方法,则会容易很多。需要注意的是,旋转导致原始的图片会“撑开”修改后的图片大小。当然我们也可以通过参数设置,让图片大小不变,但是会让部分图片显示不出来。
2024-01-15 00:19:26 653
原创 使用numpy处理图片——二值图像
在《一文中,我们将彩色图片转换成灰阶图片。本文将在这个基础上将灰阶图片转换成二值图像。二值图像就是只有黑白两种颜色的图像。像素最终显示黑还是白,需要有一个判断标准。如果图片太白了,或者太黑了,会让图片丢失很多信息。于是我们需要找到一个平衡。
2024-01-14 00:29:25 640
原创 使用numpy处理图片——分离通道
在中,我们剥离了RGB中的一个颜色,达到一种滤镜的效果。如果我们只保留一种元素,就可以做到PS中分离通道的效果。
2024-01-13 21:52:46 470 4
原创 使用numpy处理图片——缩放图片
缩放图片是让图片丢失部分像素,从而导致图片失真。一种比较简单的方法就是抽取法。比如如果我们要将照片在宽度上缩小50%,则可以在第二维度上每隔2个像素取一个像素来保存;类似的,如果我们希望在高度上缩小50%,则可以在第一维度上每隔2个像素取一个像素保存。以compressX = data[:,::2]为例。第一个“:”表示对所有第一维度(高度)上的数组都遍历到,“::2”是指对第二个维度上每隔2个像素取一个。宽度缩放(第二维度)高度缩放(第一维度)
2024-01-13 00:21:24 451
原创 使用numpy处理图片——图片拼接
在一文中,我们介绍了如何使用numpy将一张图片切割成4部分。本文我们将反其道而行之,将4张图片拼接成1张图片。基本的思路就是先用两张图以左右结构拼接成上部,另外两张图也以左右拼接成为下部。然后上下两部再拼接。当然也可以先上下拼接成左部和右部,然后再左右拼接。
2024-01-12 00:10:14 591
原创 使用numpy处理图片——图片切割
在和中,我们认识到对三维数组使用dsplit方法按第3维度(深度)方向切分的方法。本文我们将介绍如何进行第一和第二维度切分,来达到图片切割的效果。
2024-01-11 10:38:01 425
原创 使用numpy处理图片——模糊处理
在一文中,我们尝试了去掉一原色来产生滤镜效果。本文将使用更复杂的算法,来做图像模糊处理。基本思路还是和前文类似:先切分出各个原色的数组,然后对每个数组用算法进行重新计算,最后把它们堆叠到一起。区别在于,我们需要把各个原色的数组从3维变成2维。对2维数组进行计算,然后把3个2维数组堆叠出一个3维数组。data就是原始图片的3维数组。colorDim3List是一个数组,每个元素是一个3维数组。比如colorDim3List[0]就是红色(R)值构成的3维数组。
2024-01-11 09:41:26 1241
原创 使用numpy处理图片——滤镜
我们在用手机拍照片时,往往会对照片进行滤镜处理,从而让照片更加美观。本文我们将实现几种滤镜效果——去除所有像素中的某一种原色,形成只有红绿、红蓝和绿蓝原色的照片。为了突出色彩丰富性,我们借用梵高的《星空》为测试照片。在《一文中,我们介绍了RGBA色彩空间模型。本文我们将忽略Alpha通道,只考虑RGB模型。于是我们得到的数组将是height * width * 3,其中的3是RGB的值所在的维度长度。我们希望把上图中不同原色的数组进行切分,然后通过不用原色的组合获得新图片。
2024-01-10 19:42:08 572
原创 使用numpy处理图片——白色背景变全透明
第三个维度就是RGBA的信息:坐标0表示红色(R),坐标1表示绿色(G),坐标2表示蓝色(B),坐标3表示Alpha值。如果RGB的值都是255,则说明其是白色,那就直接修改其alpha的值为0,以让这个像素点全透明。在进行修改操作时,nditer迭代器并不会马上修改原来的数据,而是将修改后的值放在一个缓冲区数组中。如果是纯白底色,则将该像素的alpha值调整到0,以达到全透明的程度,否则不做调整。我们看到生成的图片比之前粗暴的将所有像素的alpha改成32的图上的字要清楚。
2024-01-10 15:32:40 377
原创 使用numpy处理图片——基础操作
numpy是一款非常优秀的处理多维数组的Python基础包。在现实中,我们最经常接触的多维数组相关的场景就是图像处理。本系列将通过若干篇对图像处理相关的探讨,来介绍numpy的使用方法,以获得直观的体验。本系列使用的照片使用的是RGBA色彩空间模型,即一个像素点,要通过R(Red红色)、G(Green绿色)、B(Blue蓝色)和A(Alpha通道)组成。前三种三原色比较好理解,即一个颜色可以通过红绿蓝三种颜色组成;
2024-01-09 18:21:56 632
原创 在当前bash(sh)中执行脚本和注册函数
在研究时,我们使用了source指令而没有使用sh或者bash来执行脚本,就是因为source指令可以让脚本在当前bash(sh)中执行;而sh或者bash则会新启动一个bash来执行。我们可以通过下面这个脚本做测试。
2024-01-09 00:45:19 1447
原创 管理Python虚拟环境的脚本
Python提供了很多代码库以方便开发人员使用。但是在多个项目同步开发中,不同项目所依赖的代码库的版本可能不一样。如果我们在同一个环境中维护着这些项目,将导致依赖库的版本错乱。为了解决这个问题,我们引入虚拟环境来做项目隔离。
2024-01-07 23:37:22 942
原创 0基础学习PyFlink——水位线(watermark)触发计算
在和中,我们发现如果窗口中元素个数没有把窗口填满,则不会触发计算。为了解决长期不计算的问题,我们引入了在和的方案。但是这个方案引入另外一个问题,就是每次处理数据可能不尽相同。这是因为它们使用了“处理时间”(Processing Time)来作为窗口划分的参考系,而每次程序处理时间会根据当前负载情况有很大的不同。这样我们对同一批数据做处理时,可能会得出不同的Window切分方案。于是我们引入方案。
2023-11-13 14:31:46 569
原创 0基础学习PyFlink——使用datagen生成流式数据
在研究Flink的水印(WaterMark)技术之前,我们可能需要Flink接收到流式数据,比如接入Kafka等。这就要求引入其他组件,增加了学习的难度。而Flink自身提供了datagen连接器,它可以用于生成流式数据,让问题内聚在Flink代码内部,从而降低学习探索的难度。本节我们就介绍如何使用datagen生成数据。我们可以使用option方法控制生成的一些规则,主要分为“字段级规则”和“表级规则”。顾名思义,字段级规则是指该规则作用于具体哪个字段,这就需要指明字段的名称——fields.col_n
2023-11-02 21:59:07 697
原创 0基础学习PyFlink——事件时间和运行时间的窗口
在一文中,我们使用的是运行时间(Tumbling而得到的结果也是不稳定的。这是因为每次运行时,CPU等系统资源的繁忙程度是不一样的,这就影响了最后的运行结果。为了让结果稳定,我们可以不依赖运行时间(ProcessingTime),而使用不依赖于运行环境,只依赖于数据的事件时间(EventTime)。一般,我们需要大数据处理的数据,往往存在一个字段用于标志该条数据的“顺序”。这个信息可以是单调递增的ID,也可以是不唯一的时间戳。我们可以将这类信息看做事件发生的时间。
2023-11-01 18:41:39 735
原创 0基础学习PyFlink——时间滑动窗口(Sliding Time Windows)
在我们介绍了不会有重复数据的时间滚动窗口。本节我们将介绍存在重复计算数据的时间滑动窗口。关于滑动窗口,可以先看下。下图就是个数滑动窗口示意图。我们看到个数滑动窗口也会因为窗口内数据不够而不被触发。但是时间滑动窗口则可以解决这个问题,我们只要把窗口改成时间类型即可。相应的代码我们参考,只要把TumblingProcessingTimeWindows改成SlidingProcessingTimeWindows,并增加一个偏移参数(Time.milliseconds(1))即可。
2023-11-01 01:45:16 661
原创 0基础学习PyFlink——时间滚动窗口(Tumbling Time Windows)
在一文中,我们发现如果窗口内元素个数没有达到窗口大小时,计算个数的函数是不会被调用的。如下图中红色部分那么有没有办法让上图中(B,2)和(D,5)也会被计算呢?这就可以使用本节介绍的时间滚动窗口。它不依赖于窗口中元素的个数,而是窗口的时间,即窗口时间到了,计算就会进行。我们稍微修改下的例子,让元素集中在“A”上。
2023-11-01 01:19:45 704 2
原创 0基础学习PyFlink——个数滚动窗口(Tumbling Count Windows)
之前的案例中,我们的Source都是确定内容的数据。而Flink是可以处理流式(Streaming)数据的,就是数据会源源不断输入。对于这种数据,我们称之为无界流,即没有“终止的界限”。但是程序在底层一定不能等着无止境的数据都传递结束再处理,因为“无止境”就意味着“终止的界限”触发计算的条件是不存在的。那么我们可以人为的给它设置一个“界”,这就是我们本节介绍的窗口。
2023-10-31 21:45:54 543
原创 0基础学习PyFlink——使用DataStream进行字数统计
在一文中,我们看到Hadoop在处理大数据时的MapReduce过程。本节介绍的DataStream API,则使用了类似的结构。
2023-10-31 15:49:46 689
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人