Nicksxs's Blog

What hurts more, the pain of hard work or the pain of regret?

开始研究学习下现在比较流行的工作流画布,用官方的话就是

Flexible AI workflow automation
for technical teams
根据中文教程的描述,它也可以认为是个低代码的画布工具,首先安装非常简单,咱们先玩玩本地的
前提是装有docker
然后就三个命令

1
2
3
docker pull n8nio/n8n
docker volume create n8n_data
docker run -it --rm --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n

就安装好了,本地端口就是5678
在浏览器打开 http://localhost:5678/ 就可以看到了,我模仿中文的教程来记录下简单的工作流搭建流程,抓取即刻的帖子
第一步我们先建第一个节点,这个类似于是开关,怎么触发这个工作流,

这里也能初步看出n8n的强大,可以通过各种方式来触发,我们就先选一个手动触发
然后我们还需要能获取http内容的,
我们就添加一个http组件,通过搜索http,可以找到http的请求工具

这里我们只需要填入地址
比如跟教程中的一样 https://m.okjike.com/users/6d3698d6-0970-49a6-a19d-f8d3cfa33a6f
然后就是要把请求的内容解析出来
搜索html,我们就可以找到解析html内容的工具

从网页中找到对应的选择器,记得勾选 return array,否则只会取第一个

执行下当前组件,就能看到内容已经被抓下来了
接下去要分割下,选择 Data transformation 的工具中的split out
然后就把前面的正文和时间和拖进去

最后就是导出文件了
搜索 xlsx,然后出现convert to file工具,然后把对应的字段拖进去

非常直观和方便的就完成了一个简单的工作流搭建,当然这个还没用上AI工具,大模型和MCP等,但是已经把它的很多特点都介绍了,各种工具真的非常好用和傻瓜化
没有复杂难搞的配置和调试,对于一些文字处理表格处理真的很方便
后续我们再来看下怎么跟大模型接起来,让它更加的强大。

在实际开发中,我们经常遇到需要在分组内进行排序并获取特定排名记录的需求。比如查找每个班级年龄最大的学生,每个部门薪资最高的员工等。这类问题在MySQL 8.0前后有着截然不同的解决方案。

传统解决方案(MySQL 8.0之前)

表结构

1
2
3
4
5
6
7
8
9
CREATE TABLE IF NOT EXISTS `students` (
`id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(64) NOT NULL COMMENT '姓名',
`age` int(11) NOT NULL COMMENT '年纪',
`class` int(11) NOT NULL COMMENT '班级',
`created_at` datetime NOT NULL COMMENT '创建时间',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE current_timestamp() COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='学生表';

业务场景

假设我们有如下学生数据,我想找到每个班年纪最大的学生,可以用一些联表或者子查询方法

idnameageclass
1学生1101
2学生2102
3学生3111
4学生3112

子查询联表

在MySQL 8.0之前,我们需要使用相对复杂的子查询配合JOIN来实现:

1
2
3
4
5
6
7
8
SELECT ta.* 
FROM students ta
JOIN (
SELECT class, MAX(age) as max_age
FROM students
GROUP BY class
) as tb
ON ta.class = tb.class AND ta.age = tb.max_age;

分析:

  1. 子查询阶段SELECT class, MAX(age) as max_age FROM students GROUP BY class

    • 按班级分组,找出每个班级的最大年龄
    • 结果类似:{class: 1, max_age: 20}, {class: 2, max_age: 21}
  2. JOIN阶段:将原表与子查询结果关联

    • 关联条件:ta.class = tb.class AND ta.age = tb.max_age
    • 最终获得每个班级年龄最大的学生完整信息

局限性:

  • 查询逻辑相对复杂,可读性不佳
  • 如果存在同班级同年龄的多个学生,会返回多条记录
  • 性能上需要进行两次表扫描和一次JOIN操作

现代解决方案(MySQL 8.0+)

使用窗口函数优化

MySQL 8.0引入了窗口函数,让这类问题的解决变得更加优雅:

1
2
3
4
5
6
SELECT * FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY class ORDER BY age DESC) as row_num
FROM students
) t
WHERE row_num = 1;

核心概念解析:

  1. PARTITION BY class:按班级进行分区

    • 可以理解为逻辑上的分组,但不会像GROUP BY那样聚合数据
    • 每个分区内部可以独立进行排序和编号
  2. ORDER BY age DESC:在每个分区内按年龄降序排序

    • 年龄最大的学生排在第一位
  3. **ROW_NUMBER()**:为每个分区内的行分配唯一序号

    • 从1开始递增,即使有相同值也会分配不同序号
    • 这就解决了传统方法中重复值的问题
  4. 外层WHERE row_num = 1:筛选每个分区的第一条记录

其他窗口函数选择

除了ROW_NUMBER(),还可以根据业务需求选择其他窗口函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 使用RANK():相同值会有相同排名,但会跳跃序号
SELECT * FROM (
SELECT *,
RANK() OVER (PARTITION BY class ORDER BY age DESC) as rank_num
FROM students
) t
WHERE rank_num = 1;

-- 使用DENSE_RANK():相同值有相同排名,但不跳跃序号
SELECT * FROM (
SELECT *,
DENSE_RANK() OVER (PARTITION BY class ORDER BY age DESC) as dense_rank_num
FROM students
) t
WHERE dense_rank_num = 1;

性能对比与优势

窗口函数的优势:

  1. 代码简洁性:逻辑更直观,维护成本更低
  2. 性能优化:只需一次表扫描,避免了JOIN操作
  3. 功能丰富:提供多种排名函数应对不同场景
  4. 处理重复值ROW_NUMBER()确保每个分组只返回一条记录

适用场景扩展:

  • Top-N查询:每个分组的前N条记录
  • 数据去重:基于特定字段的去重逻辑
  • 百分位计算:使用PERCENT_RANK()等函数
  • 移动平均:结合ROWS BETWEEN进行滑动窗口计算

MySQL 8.0的窗口函数为分组排序查询提供了更现代化的解决方案。相比传统的子查询+JOIN方式,窗口函数不仅在语法上更加简洁直观,在性能上也有显著提升。对于需要在分组内进行复杂数据分析的场景,窗口函数已经成为不可或缺的利器。

允许我小小地标题党一下,后半句是真实情况,最近重启电脑就自动升级了chrome,发现很多必须的扩展程序都不能用了,之前是可以通过设置开启,这次升级到 138.0.7204.158 版本就直接不允许开启了
这个很久之前chrome也做了提示,主要是扩展程序的manifest版本要从v2升级成v3,但是这个升级分两方面说,一方面是升级难度,可以参考这个核对文档, 需要

  • 迁移到 Service Worker
  • 更新 API 调用
  • 替换屏蔽 Web 请求监听器
  • 提高扩展程序的安全性
    这些项的修改,修改升级难度不小,如果使用了很多api的话是比较麻烦的
    另一方面是很多扩展都不是自己做的开发,开发者都不一定在维护,但是很多都是非常深度使用的
    这边有个例子就是Proxy SwitchyOmega 2 平时会用来做代理切换,原本的仓库已经没人维护了,并且chrome扩展商店也没有更新,
    这里介绍两种方法,
    第一种是找到这个应用所在目录

    首先找到应用的id,然后需要到chrome的扩展目录
    mac是在这里 ~/Library/Application Support/Google/Chrome/Default/Extensions
    windows是在 C:\Users\<用户名>\AppData\Local\Google\Chrome\User Data\Default\Extensions
    找到以后就找上面扩展的id就是扩展的文件目录,把它拷出来以后,然后找到扩展目录里的 manifest.json 文件,把版本改成3
    然后再通过扩展路径直接打开,比如这个扩展就是 chrome-extension://padekgcemlokbadohgkifijomclgjgif/options.html
    这个选项页,为啥要这么打开是因为这个扩展的配置比较麻烦,就是现在可以搜到替代应用,但是要重配一遍也是挺头疼的
    第二种是有点釜底抽薪的
    可以在chrome的flag配置中修改
    网上说的可能已经就删掉了,我这个版本的目前还可以用这个配置项来修改
    chrome://flags/#allow-legacy-mv2-extensions
    可以通过开启这个来让manifest版本是2的扩展能够被启用,但是这个肯定也是个临时方案,大家该把配置导出备份的尽早备份,同时也尽早寻找替代的升级了manifest 3的扩展程序

herd是在使用过了valet之后,又一款laravel出品的好用的工具,之前使用valet可以把laravel应用的本地域名解析和https加密等都处理好,是个非常不错的工具。
但是在我的使用场景里还有一个比较头疼的问题就是多版本php的切换,虽然php在大型网站,非常复杂的业务系统使用会有一些不足,弱类型会导致复杂逻辑的后续维护重构变得比较困难
只是对于个人使用来说,仍然是个非常不错的工具语言
同时laravel也是个很不错(除了有些过度封装)的框架,但是因为之前我自己写的工具大部分是基于php7.4的,laravel是比较古老的laravel 5.6版本,目前很多新的包都要求php版本是8.x,laravel也要10+了,一方面是我原先依赖的工具包没有对应的更新,另一方面是php7.4切换其他版本会有icu4c依赖版本的问题,挺麻烦
这次研究了下herd,它是可以做php版本切换的,

像这边我装了7.4和8.2版本,并且最难的是它吧依赖也一并打包了,所以就不用管icu4c这种依赖版本的问题,省心省力
还可以针对site来设置不同的php版本,这个是非常方便的
只是它也不是完全没有问题的,在使用的时候发现一个比较奇葩的问题,就是默认运行时会有这个报错
preg_match(): Allocation of JIT memory failed
而它需要的解决方式在herd环境中变得无效,因为这里给出的错误提示是要把php的配置中的 pcre.jit 设置成 0
我们可以通过在版本号上右键,看到对应版本php的ini配置文件所在位置

但是打开后发现这个设置已经存在
后来搜了一圈才发现了一个很奇葩的环境变量
比如是php7.4就需要设置这个
HERD_PHP_74_INI_SCAN_DIR="/Users/dasun/Library/Application Support/Herd/config/php/74/"
来源是在这个issue里,还是个挺麻烦的问题
另外就是herd其实是卖收费版本的,相对来说存在一些限制,比如php的extension是不支持便捷的自定义安装的,如果有需要可能需要一些奇技淫巧,参考这里,但是至少还是帮我解决了问题了

er图在我们学习数据库的时候是有比较着重的介绍和学习过的,在实际工作中,如果有想对规范的研发流程,那么在技术方案分析设计阶段也需要对系统中涉及到的数据模型用ER图来表示以方便大家理解数据模型的设计和它们之间的关系
从维基百科上摘的一个说明和介绍

ER模型,全称为实体联系模型、实体关系模型或实体联系模式图(ERM)(英语:Entity-relationship model)由美籍华人计算机科学家陈品山发明,是概念数据模型的高层描述所使用的数据模型或模式图。
常规上的理解ER图分为三个部分,
第一个是实体,也就是ER图的E,表示Entity
第二个是属性,表示Entity中带有的属性,比如以学生表为例,它有姓名,性别,年龄,年纪等等属性
第三个核心的是关系,也就是ER图例的R,表示Relationship,比如学生表跟班级表是怎么样的关系,一般情况下一个学生一定属于一个班级,那么学生和班级的关系就是多对一的关系
对于画ER图,比较推荐使用Draw.io来画,开源免费且功能强大
它左边菜单栏就自带了ER图的组件

我们就可以直接拖动组件来画出ER图

这样就能画出简单的ER图了,并且连1对1,1对多这种关系都有现成的连线组件了,真的是治愈强迫症,如果自己画这个N对N的线,老是会觉得画得不一致而感觉画的不好看
而且还有一个很强大的功能,比如我们在画ER图的时候已经把表结构设计好了,那么就能直接从表结构生成ER图

可以在这里导入表结构sql,就能生成对应的实体图了,如果有外键关联还会生成对应的连接,当然手动加一下也很方便了

0%