0%

QMetaObject::activate(this, &staticMetaObject, 20, nullptr) 这是QT程序中一条发射信号的指令,对不对

1
2
3
4
5
6
7
8
是的,QMetaObject::activate() 是一个用于在 Qt 程序中发射信号的函数。它接受一组参数,其中包括发送信号的对象指针、该对象的元对象(通过静态成员变量 staticMetaObject 访问)、信号的索引以及传递给槽函数的参数。

这个函数会查找与指定信号索引相关联的元对象,并调用相关的槽函数。如果信号和槽函数的参数不匹配,或者没有连接到任何槽函数,那么不会执行任何操作。

通过调用 QMetaObject::activate() 函数,可以手动触发信号的发送。这在某些情况下很有用,例如在需要自定义信号传输时,或者在使用多线程编程时需要跨线程触发信号。

请注意,在正常情况下,应该使用 emit 关键字来发射信号,而不是直接调用 QMetaObject::activate() 函数。emit 关键字可以更简洁地实现信号的发射,并且由于其内部实现了相应的机制,因此通常更可靠和安全。

提示工程

LangGraph
专注于构建具有记忆和上下文的多步对话智能代理,支持循环数据流处理,解决了传统聊天系统无法获取实时信息的问题。其设计哲学强调动态工作流管理,适合需要复杂决策链的应用(如多轮交互客服)。
LangChain
作为基础框架,提供模块化组件(如模型封装、提示模板、向量数据库集成),快速搭建 LLM 应用原型。但缺乏对长期对话状态的支持,需结合其他工具增强功能。
LangSmith
是DevOps 平台,专注于 LLM 应用的调试、测试和部署监控。支持追踪链路执行、分析性能瓶颈,适合生产环境优化。

MCP全称:模型上下文协议 ,Model Context Protocol,由Claude的母公司Anthropic推出的开源协议,旨在实现大型语言模型(LLM)与外部数据源和工具的集成,提供安全双向的连接。MCP通过统一的接口标准化了应用程序向LLM提供上下文的方式。

MCP的核心定位是为大型语言模型(LLM)与外部数据源、工具之间提供统一接口,实现标准化连接。其设计理念类似于“AI领域的USB-C接口”,通过协议标准化,打破数据孤岛,避免为每个数据源单独开发定制化连接器,从而降低开发成本和安全风险。

核心功能
作为 AI 大模型的标准化工具箱,允许大模型通过标准化协议与外部工具(如浏览器、文件系统、数据库、代码仓库等)自动化交互,无需手动复制粘贴信息。

MCP Server:作为 AI 与外部工具的中间层,专精于一类工作(如读写浏览器、操作 Git 仓库等),本质是运行在本地(Node.js/Python 程序)或服务器的程序。

交互方式:大模型通过操作系统的标准输入通道(stdio)调用 MCP Server,消息格式为特定 JSON 结构,MCP Server 通过代码或 API 访问外部工具完成任务。

MCP 与 Function Call 的区别
优势:整合了各家大模型不同的 Function Call 标准,形成统一协议,支持几乎所有大模型接入(如 Claude、Deepseek 等)。

MCP:是 Anthropic 提出的标准化通信协议,类比为 “AI 领域的 HTTP 协议” 或 “通用插座”“USB-C 标准”。它规定了上下文与请求的结构化传递方式,要求通信格式符合 JSON-RPC 2.0 标准,用于统一 LLM 与外部数据源、工具之间的交互规范,解决数据孤岛问题。

Function Call:是某些大模型(如 OpenAI 的 GPT-4)提供的特有接口特性,类似 “品牌专属充电协议”。它以特定格式让 LLM 产出函数调用请求,由宿主执行对应操作并返回结果。

Cline 是一款集成在 Visual Studio Code(以下简称 VS Code)中的开源 AI 编程助手

image.png


前端规范体现在项目的 .prettierrc.js.eslintrc.js.stylelintrc.js.editorconfig 文件中,项目的文件夹结构只要有项目模板或者最佳实践作为参考,都会按照已有的物料去组织逻辑去写业务代码。整体原则是减少需要主动去 review 和 check 的地方,尽量通过自动化解决大多数问题。


一.编程规约


(一) 命名规范


项目命名


全部采用小写方式,以中线分隔。

# 正例
data-management-system
# 反例
data_management-system/dataManagementSystem

目录命名

全部采用小写方式, 以中划线分隔,有复数结构时,要采用复数命名法, 缩写不用复数。

# 正例
src/styles/components/images/utils/layouts/demo-styles/
# 反例
src/styles/components/images/utils/layouts/demo_styles/


JS、CSS、LESS、HTML、PNG 文件命名:

全部采用小写方式, 以中划线分隔。


# 正例
render-dom.js/reset.css/company.png
# 反例
renderDom.js/UserManager.html

(二) HTML 规范 (Vue Template 同样适用)


缩进:缩进使用 2 个空格(一个 tab);嵌套的节点应该缩进。 引号:使用双引号(" ") 而不是单引号(’ ') 。

<!-- 正例 -->
<div class="box"></div>
<!-- 反例 -->
<div class='box'></div>


(三) CSS/LESS 规范


命名


类名使用小写、id用驼峰、变量用驼峰。名称反映元素目的和用途。

// 正例
.heavy {
  font-weight: 800;
}
.important { 
  color: red; 
}

// 反例
.fw-800 {
  font-weight: 800;
}
.red {
  color: red; 
}


选择器

避免使用标签名、使用直接子选择器

// 正例
.content > .title {
   font-size: 2rem;
 }

// 反例
.content .title {
  font-size: 2rem;
}

省略 0 后面的单位


// 正例
div {
  padding-bottom: 0; 
  margin: 0; 
}
// 反例
div {
  padding-bottom: 0px; 
  margin: 0em;
}


代码组织

将公共 less 文件放置在 style/less/common 文件夹,color.lesscommon.less。按以下顺序组织

@import "mixins/size.less"; 

@default-text-color: #333; 

.page {
  width: 960px; 
  margin: 0 auto; 
}

避免嵌套层级过多:


嵌套深度限制在 3 层。


(四) Javascript 规范

// 方法名、参数名、成员变量、局部变量都统一使用小驼峰 lowerCamelCase 风格
function getHttpMessage(inputUserId) {
  let localValue = inputUserId;
  return false
}

// 常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚, 不要嫌名字长
const MAX_STOCK_COUNT = 0;

// this 的转换命名
const _this = this;

JS 书写保持原则

  1. 提炼函数
  2. 合并重复的条件片段
  3. 把条件分支语句提炼成函数
  4. 少用三目运算符
  5. 合理使用循环
  6. 提前让函数退出代替嵌套条件分支;用return退出多重循环
  7. 传递对象参数代替过长的参数列表,尽量减少参数数量
const fn = (name, age) => {
  console.log('name=' + name);
  console.log('age=' + age);
}

// 优化之后

const fn = ( obj ) => {
  console.log('name=' + obj.name);
  console.log('age=' + obj.age);
}

方法命名必须是 动词 或者 动词+名词 形式


正例: saveShopCarData /openShopCarInfoDialog 反例: save / open / show / go 增删查改,详情统一使用如下 5 个单词,不得使用其他(目的是为了统一各个端)

add / update / delete / detail / get 
附: 函数方法常用的动词: 
get 获取/set 设置, 
add 增加/remove 删除, 
create 创建/destroy 销毁, 
start 启动/stop 停止, 
open 打开/close 关闭, 
read 读取/write 写入, 
load 载入/save 保存,
begin 开始/end 结束, 
backup 备份/restore 恢复,
import 导入/export 导出, 
split 分割/merge 合并,
inject 注入/extract 提取,
attach 附着/detach 脱离, 
bind 绑定/separate 分离, 
view 查看/browse 浏览, 
edit 编辑/modify 修改,
select 选取/mark 标记, 
copy 复制/paste 粘贴,
undo 撤销/redo 重做, 
insert 插入/delete 移除,
add 加入/append 添加, 
clean 清理/clear 清除,
index 索引/sort 排序,
find 查找/search 搜索, 
increase 增加/decrease 减少, 
play 播放/pause 暂停, 
launch 启动/run 运行, 
compile 编译/execute 执行, 
debug 调试/trace 跟踪, 
observe 观察/listen 监听,
build 构建/publish 发布,
input 输入/output 输出,
encode 编码/decode 解码, 
encrypt 加密/decrypt 解密, 
compress 压缩/decompress 解压缩, 
pack 打包/unpack 解包,
parse 解析/emit 生成,
connect 连接/disconnect 断开,
send 发送/receive 接收, 
download 下载/upload 上传, 
refresh 刷新/synchronize 同步,
update 更新/revert 复原, 
lock 锁定/unlock 解锁, 
check out 签出/check in 签入, 
submit 提交/commit 交付, 
push 推/pull 拉,
expand 展开/collapse 折叠, 
enter 进入/exit 退出,
abort 放弃/quit 离开, 
obsolete 废弃/depreciate 废旧, 
collect 收集/aggregate 聚集
// undefined 判断
if (typeof person === 'undefined') {
  doSomething();
}

// 字符串 统一使用单引号(''),不使用双引号("")。
// 这在创建 HTML 字符串非常有好处 vscode 配置 
// settings.json 或者 .eslintrc.js 或者 .prettierrc.json
let str = 'foo';
let testDiv = '<div id="test"></div>';


(五) Vue 规范

  1. 组件名为多个单词
  2. 组件文件名为 pascal-case 格式
  3. 基础组件文件名为 base 开头,使用完整单词而不是缩写。
  4. 和父组件紧密耦合的子组件应该以父组件名作为前缀命名


// components/base-input.vue

// components/todo-list.vue
// components/todo-list-item.vue

// 正例
export default {
  name: 'TodoItem'
};

// 反例
export default {
  name: 'Todo',
}
export default {
  name: 'todo-item',
}
  1. 在 Template 模版中使用组件,应使用 PascalCase 模式,并且使用自闭合组件。
<!-- 在单文件组件、字符串模板和 JSX 中 -->
<MyComponent />
<Row><table :column="data"/></Row>

<!-- 反例 -->
<my-component /> <row><table :column="data"/></row>


  1. Prop 定义应该尽量详细
  1. 必须使用 camelCase 驼峰命名
  2. 必须指定类型
  3. 必须加上注释,表明其含义
  4. 必须加上 required 或者 default,两者二选其一
  5. 如果有业务需要,必须加上 validator 验证
props: {
  // 组件状态,用于控制组件的颜色
  status: {
    type: String,
    required: true,
    validator: function (value) {
      return [
        'succ',
        'info',
        'error'
      ].indexOf(value) !== -1
    }
  },
  // 用户级别,用于显示皇冠个数
  userLevel: {
    type: String,
    required: true
  }
}
  1. 模板中使用简单的表达式

组件模板应该只包含简单的表达式,复杂的表达式则应该重构为计算属性或方法。复杂表达式会让你的模板变得不那么声明式。我们应该尽量描述应该出现的是什么,而非如何计算那个值。而且计算属性和方法使得代码可以重用。

<template>
  <p></p>
</template>
// 复杂表达式已经移入一个计算属性
computed: {
  normalizedFullName: function () {
    return this.fullName.split(' ').map(function (word) {
      return word[0].toUpperCase() + word.slice(1)
    }).join(' ')
  }
}


涉及的插件与配置文件

默认使用开发工具 VScode

Prettier

代码美化,自动格式化成规范格式

Stylelint

样式代码规范 .vscode/settings.json

eslint

vetur

配置文件 .editorconfig


# @see: http://editorconfig.org

root = true

[*] # 表示所有文件适用
charset = utf-8 # 设置文件字符集为 utf-8
end_of_line = lf # 控制换行类型(lf | cr | crlf)
insert_final_newline = true # 始终在文件末尾插入一个新行
indent_style = tab # 缩进风格(tab | space)
indent_size = 2 # 缩进大小
max_line_length = 130 # 最大行长度

[*.md] # 表示仅 md 文件适用以下规则
max_line_length = off # 关闭最大行长度限制
trim_trailing_whitespace = false # 关闭末尾空格修剪


参考资料

阿里代码规范(前端篇)

来源于js高阶函数,高阶函数是接受函数作为输入或者输出的函数,(柯里化方法属于高阶函数)
高阶组件接受组件作为参数,并输出新的组件

高阶组件的意义:

  • 属性代理(Props Proxy)
  • 反向继承(Inheritance Inversion)

范式:

  • HOC 使用组合非继承的方式来复制参数组件的行为
  • HOC 通过将原组件包装在容器组件中来组成新组件,而不是修改参数组件
  • HOC 是纯函数,没有副作用
  • HOC 不需要关心数据的使用方式,而包装组件也不需要关心数据的来源;容器组件和包装组件之间的契约完全由 props 来确定
1
2
3
4
5
export const HOC = (OriginComponent) => {
return <>

</>
}

通常我们使用的module,其概念更接近命名空间(namespace),module在自身作用域内运行,定义在一个module里的变量,函数,类等等在module外部不可见,使用export导出以便其他作用域import,从而访问module内部的变量

导出模块

  • 如上所述,通过export关键字导出声明(如变量、函数、类、类型别名或接口)原声明添加export,即可在其他作用域import
  • 重命名 export { MyClass as A }

外部模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@startmindmap
* 阴阳五行学
** 维度
*** 两仪
*** 四象
*** 八卦 乾 坎 艮 震 巽xùn 离 坤 兑
*** 术数

** 历史
*** 《周易》
* 道教神话体系
** 天人
** 神兽 神木 仙山 矿藏 神魔
** 干支纪年
*** 甲 乙 丙 丁 戊 己 庚 辛 壬 癸
*** 子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥
** 星宿 [[https://zhuanlan.zhihu.com/p/582989560 星图]] [[https://zhidao.baidu.com/question/451326733.html?fr=search&word=%D0%C7%CB%DE%B7%D6%D2%B0+%BB%F9%D3%DA&ie=gbk 分野]]
*** 东·青龙 角 亢 氐 房 心 尾 箕
*** 北·玄武 斗 牛 女 虚 危 室 壁
*** 西·白虎 奎 娄 胃 昴mǎo 毕 觜zī 参
*** 南·朱雀 井 鬼 柳 星 张 翼 轸
** 劫数
*** 三灾
** 临兵斗者皆阵列在前
* 修仙文学体系
** 境界
*** 练气 筑基 金丹 元婴 出窍 分神 合体 渡劫 大乘 《飘渺之旅》
*** 品阶 宗师
** 进阶套路


@endmindmap

图像的线性变换

基于图像矩阵与代数的点运算

  • a=1, b=0: 恒等
  • a<0: 黑白翻转
  • |a|>1: 增加对比度
  • |a|<1: 减小对比度
  • b>0: 增加亮度
  • b<0: 减小亮度

QQs :在.net程序中,处理因网络连接问题或者服务端故障造成的请求异常,应该捕获异常类型?
ChatGPT :

在处理因网络连接问题或者服务端故障造成的请求异常时,应该捕获相应的异常类型,以便能够进行正确的处理和响应。

在.Net中,常见的网络连接相关的异常包括SocketException、WebException、HttpRequestException等。这些异常通常都是由于网络连接问题或者服务端故障造成的。

在捕获这些异常时,可以根据具体的情况进行处理。例如,在SocketException中,可以根据不同的SocketError类型进行不同的处理,如SocketError.ConnectionReset、SocketError.ConnectionRefused等等。在WebException中,可以根据StatusCode、Response等内容进行判断和处理。

需要注意的是,捕获网络连接异常时,不应该过于通用,而是应该针对性地捕获相关的异常类型。过于通用的捕获会导致程序无法准确地判断和处理异常,从而可能造成不必要的后果。

QQs :开发异常处理逻辑时,如何模拟socket exception的异常场景?
ChatGPT :

要模拟socket exception的异常场景,可以使用一些技巧来使网络连接不可用或出现异常。

  1. 使用无效IP地址:使用一个无效的IP地址来模拟连接被拒绝的情况。可以使用“0.0.0.0”或“localhost”等无效的IP地址。

  2. 使用无效的端口号:使用一个未使用的端口号来模拟连接失败的情况。可以使用大于65535或小于0的端口号,或者使用已被占用的端口号。

  3. 断开网络连接:可以断开计算机连接网络的网线或关闭Wi-Fi,模拟网络连接失败的情况。

  4. 阻止网络流量:可以使用网络防火墙或代理服务器等工具来阻止网络流量,模拟无法连接到网络的情况。

  5. 模拟超时:可以使用延迟工具或人为地使服务器响应变慢,模拟连接超时或响应超时的情况。

需要注意的是,在进行模拟异常的时候,应该先测试代码是否可以正确处理常规情况下的流程,避免把程序带入模拟异常的陷阱中。同时,需要保证模拟异常的环境不能影响其他程序的正常运行。

QQs :举例的SocketException和WebException,能给出具体代码吗?
ChatGPT :

当Socket遇到连接重置或连接拒绝时,可以通过SocketException捕获异常并进行相应处理。例如:

1
2
3
4
5
6
7
8
9
10
11
try {
// Socket连接代码
} catch(SocketException ex) {
if(ex.SocketErrorCode == SocketError.ConnectionReset) {
// 处理连接重置异常
} else if(ex.SocketErrorCode == SocketError.ConnectionRefused) {
// 处理连接拒绝异常
} else {
// 处理其他Socket异常
}
}

当网络请求发生错误时,可以通过WebException捕获异常并进行相应处理。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
try {
// 发送网络请求代码
} catch(WebException ex) {
if(ex.Status == WebExceptionStatus.ProtocolError) {
var response = ex.Response as HttpWebResponse;
if(response != null) {
if(response.StatusCode == HttpStatusCode.NotFound) {
// 处理页面未找到异常
} else {
// 处理其他HTTP状态码异常
}
} else {
// 处理其他协议异常
}
} else if(ex.Status == WebExceptionStatus.ConnectFailure) {
// 处理连接失败异常
} else {
// 处理其他WebException异常
}
}

需要注意的是,在处理异常时,需要根据具体的异常类型、异常代码等信息进行判断和处理,从而保证能够处理所有可能出现的异常情况。