『23年02月19日』

团检报告生成方案遇到的一些问题

之前做了一套团检报告生成方案 - 上篇博文。期间有遇到一些问题,今天有空归纳总结了一下,整套方案的运行效果还是很理想的,当然我们的业务访问量其实不大,不然有可能会暴露出更多的问题,特别是 puppeteer 是很耗内存资源的,在访问量大的情况下,可能要去重点优化 puppeteer 的使用效率问题,但以现在公司的业务基本不用太担心这个问题。

阅读更多

『23年02月12日』

HTML转pdf的一种实现方案

几经波折,由厦门辗转到了广州。由于换了新工作,繁忙了些,博客也断更了两个月,今天想把最近两个月做的一些工作整理一下。适当是对过去做一些总结,不管是技术也好,生活也好,既是对发生的事的一些思考,也是未来发展的基石。

刚到新岗位的第一项任务便是实现一个前端 html 转 pdf 的功能,背景是这样的:我司是做健康管理相关的业务的,就有体检报告生成的功能,之前的体检报告一直都是由后端用模版引擎去做渲染,然后再使用 IText去做 html 转 pdf 的实现,由于体检报告中有大量的 ECharts 图表,还需先将图表转成图片,再将图片转为 pdf,这样一来,一份四十几页的团检报告,总的生成时间需要十几分钟,还不方便调试(需前端调好 html 样式,再给后端生成 pdf,再去看最终生成效果)。

总结,主要有两个不好的点:

  • 生成效率差,需要十几分钟
  • 报告样式不好调

由于我之前使用过 puppeteer 做过自动化测试,是知道 puppeteer 具有这个功能的,原理也挺简单,莫过于就是自动化的去实现浏览器自带的打印功能。

阅读更多

『22年11月19日』

重学数据结构与算法 - 堆排序

之前学到二叉堆的时候,发现可以利用二叉堆来做排序算法。其基本原理就是利用其堆顶元素为数组的最大值或者最小值的特性,截取堆顶元素后再重新调整为最大或最小堆,最后按顺序截取的堆顶元素就是一个升序序列或将序序列。

堆化算法

移除堆顶元素,将堆的最后一个元素移动到堆顶,从堆顶开始调整堆,直到合适的位置。

算法思路

  1. 构建一个最大堆,堆顶元素为最大值;
  2. 交换堆顶元素和堆的最后一个元素,标记最后的元素为堆化截止点;
  3. 调整堆为最大堆,直到堆化截止点;
  4. 交换堆顶元素和上次的堆化截止点,重新调整截止点;
  5. 重复 2-3 步骤;
  6. 直到截止点为 1;

阅读更多

『22年10月23日』

重学数据结构与算法 - 图(Dijkstra's algorithm)

Dijkstra’s algorithm (迪杰斯特拉算法)是一个单源最短路径的算法,即从一个顶点出发到其它顶点的最短路径计算。

alt
图:来自小破站 up 主

最近发现一个挺有意思的 up 主,ID 是 - “笑笑的计算之心”,有想学习算法的同学可以关注下。小姐姐用了 Manim CE 制作了很多经典算法的动画演变过程。同时,也使用了很多《算法导论》里的伪代码,感觉质量还是蛮高的。

阅读更多

『22年10月05日』

重学数据结构与算法 - 图(上)

图是一组由边连接的节点(或顶点)。它有以下几种表示方法:

  1. 邻接矩阵;
  2. 邻接表;
  3. 关联矩阵;

邻接矩阵表示法

  • 可以使用二维数组来存储邻接矩阵,数组的下标表示节点,值表示两个节点直接有没边,有边则为 1,否则为 0
  • 如果图的边带有权重,则可以把 1 换为权重的值

邻接表表示法
记录每个节点,及其相邻节点的数据结构。可以用字典、对象来存储邻接表

以下,我们使用邻接表法来创建一个图。

阅读更多