标签

 教程 

相关的文章:

这是一个包含前端性能优化、自动化测试、数据科学家学习SQL查询等教程的列表页,提供了关于如何优化前端性能、进行自动化测试以及学习SQL查询的教程。

dotNET跨平台 -

轻松实现.NET应用自动更新:AutoUpdater.NET教程

在软件开发中,应用程序的自动更新功能是一个重要的特性,它能让用户在不手动干预的情况下获取最新的软件版本。这不仅提高了用户体验,还有助于开发者及时修复潜在的问题、增加新功能,并确保软件的安全性和稳定性。对于.NET开发者来说,实现自动更新功能并不总是那么简单。幸运的是,有一个名为AutoUpdater.NET的库可以大大简化这个过程。在本篇教程中,我们将介绍如何使用AutoUpdater.NET为....

在软件开发中,自动更新功能对于提高用户体验和确保软件安全性和稳定性非常重要。AutoUpdater.NET是一个可以简化.NET应用程序自动更新功能的库。安装AutoUpdater.NET库后,需要配置更新检查的频率、更新URL、更新文件的位置和格式等。然后,创建一个XML格式的更新文件,指示可用的更新版本和相关信息。最后,在应用程序启动时调用ConfigureAutoUpdater方法以启动自动更新功能。

相关推荐 去reddit讨论

UsubeniFantasy -

前端性能优化教程——理解关键路径

“关键渲染路径”是指网页在浏览器中开始显示前必须经历的一系列步骤。浏览器要显示网页,不仅需要获取 HTML 文档,还需要所有对显示该文档至关重要的资源。 在之前的HTML 性能基础部分,我们已经讨论了如何把 HTML 文档送达浏览器。本部分将深入探讨,浏览器在接收到 HTML 文档之后,为了显示...

相关推荐 去reddit讨论

UsubeniFantasy -

前端性能优化教程——理解关键路径

“关键渲染路径”是指网页在浏览器中开始显示前必须经历的一系列步骤。浏览器要显示网页,不仅需要获取 HTML 文档,还需要所有对显示该文档至关重要的资源。 在之前的HTML 性能基础部分,我们已经讨论了如何把 HTML 文档送达浏览器。本部分将深入探讨,浏览器在接收到 HTML…

关键渲染路径是浏览器在显示网页前必须经历的一系列步骤,包括构建DOM和CSSOM、执行JavaScript代码、创建渲染树、样式和布局处理、生成像素点等。优化关键渲染路径可减少HTML加载时间和渲染阻塞资源的影响。最大内容绘制是关键内容渲染路径的重点。

相关推荐 去reddit讨论

UsubeniFantasy -

前端性能优化教程——优化资源加载

在上一讲中,我们探讨了关键渲染路径的一些理论基础,包括渲染阻塞和解析阻塞资源是如何使网页的首次渲染延迟的。现在,既然你对这些理论有了一定的了解,接下来我们将教你一些技巧,用以优化关键渲染路径。 在网页加载过程中,会引用 HTML 里的多种资源,这些资源通过 CSS…

本文介绍了优化关键渲染路径的技巧,包括优化CSS和JavaScript,使用预加载扫描器和嵌入关键CSS,以及最小化和使用async和defer属性来优化JavaScript。

相关推荐 去reddit讨论

UsubeniFantasy -

相关推荐 去reddit讨论

解道jdon.com -

数据科学家学习100个SQL查询教程

点击标题 适合非计算机专业的其他领域专家通过数据获得见解。目标受众 Rachel 拥有细胞生物学硕士学位,现在在一家研究医院从事细胞分析工作。 她在本科生生物统计学课程中学习了一些 R 语言,并完成了有关 Unix shell 的 Carpentries 课程。 Rachel 正在考虑成为一名数据科学家,并想了解数据是如何存储和管理的。 她的工作日程不可预测且变化很大,因此她需要能够一次学习一点。 先决条件 基本 Unix 命令行:cd, ls,*通配符 基本表格数据分析:过滤行、在组内聚合 学习成果 解释数据库和数据库管理器之间的区别。 编写 SQL 来选择、过滤、排序、分组和聚合数据。 定

该文章介绍了非计算机专业的专家如何通过数据获得见解,以细胞生物学专家Rachel为例,介绍了学习数据科学的先决条件和学习成果,包括Unix命令行、表格数据分析、SQL查询等内容。文章还介绍了数据库和数据库管理器的区别,以及不同类型的数据库管理系统和SQL方言。

相关推荐 去reddit讨论

UsubeniFantasy -

前端测试教程——前端测试的策略

> 原文传送门 What to test and your approach 决定测试内容,而非测试本身是什么,对于所有团队而言是个关键议题。测试是实现最终目标的一种方式,而确定对代码库中哪些部分进行优先测试则是一项挑战。 决定测试的优先顺序应当基于你的代码库及团队目标。但需要注意的是,尽管撰...

相关推荐 去reddit讨论

UsubeniFantasy -

前端测试教程——前端测试的策略

原文传送门 What to test and your approach…

决定测试内容是关键议题。根据代码库和团队目标确定测试优先顺序。考虑应用程序的主要使用场景,确定需要测试的部分。建立测试以稳定危险、老旧或编写不良的代码。测试类型应根据特定要求确定。测试策略应专注于实际应用场景。测试驱动开发适用于复杂代码库。黑盒测试更关注组件的使用方式。

相关推荐 去reddit讨论

Raye's Journey -

pipedream免费自动化工作流使用教程

日常的 n8n 其实经常要崩,看通知我都看烦了( IFTTT 虽然好用,但还是稍显简陋,免费版最多支持两个,于是搜索了下还有一个免费的平台叫 pipedream(貌似可以同时运行 5 个工作流,只是限制了每天调用 100 次数,不过这也够了) 整体体验下来,pipedream 还是缺失了还能多功能的,比如 n8n 经常会用到的: 导出工作流为 json 保存 批量处理多个 item(n8n 是可以支持针对一个数组里的每个 item 都运行一遍工作流节点的) 搭建一个工作流略微繁琐,但是很 geek,对程序员还比较友好 创建一个 rss 工作流# 这里就纯粹靠自己摸索出来的经验了,不一定是最优解: rss 的节点,只需要提供一个 url,自动解析其中的数据 对数据去重,这里需要写点代码,比较繁琐,放到后面专门讲 条件判断,针对去重后的数据判断是否有值,如果没有直接返回 发送 tg 消息 数据存储及去重# pipedream 提供了一个专门用于存储数据的页面,可以可视化地查看存储的数据,这一点比 n8n 要好 推荐每个工作流都有一个数据存储位置,你可以将其理解为一个简单的 kv 缓存 接下来解释下我这里去重的代码,本质上和 n8n 里的很相似 我们要编写的代码位于 run 函数中,其他的不用动 steps.merge_rss_feeds.$return_value 是自动解析 rss 节点返回的 json 数据 let lastItemId = await this.myDataStore.get("guid"); 去 kv 中取出最近一次的记录,是个异步操作,需要加 await getId 函数就是获得每个节点的 guid newItems 存储要发送的最新 item,是通过循环比对获得的 await this.myDataStore.set("guid",getId(firstItem)) 覆盖最近一次的记录 不过要注意的是,pipedream 似乎不支持批量发送,即如果 newItems 有多个,也只能发送 Copyexport default defineComponent({ props: { myDataStore: { type: "data_store" }, }, async run({ steps, $ }) { let items = steps.merge_rss_feeds.$return_value let lastItemId = await this.myDataStore.get("guid"); let firstItem = items[0] let newItems = []; function getId(item) { return item.guid; } if (lastItemId) { for (const item of items) { if (getId(item) === lastItemId) { break; } newItems.push(item) } } else { newItems = [firstItem] } await this.myDataStore.set("guid",getId(firstItem)) return newItems.reverse() // 先发送老的消息,再发送最新的 }, }) 解决 pipedream 无法批量发送消息# 原本只是为了解决无法批量发送消息的问题,我想到直接用自定义代码的方式来循环发送就好了,于是写出了如下代码: Copyimport { axios } from "@pipedream/platform" export default defineComponent({ props: { telegram_bot_api: { type: "app", app: "telegram_bot_api", }, chat_id: { type: "string", label: "Chatid", default: "@RayeJourney", }, }, async run({steps, $}) { const items = steps.data_stores.$return_value const results = []; // 用于存储每个消息发送操作的结果 for (const item of items) { // 构造要发送的消息内容 const message = `📝 ${item.title} #blog\n\n${item.url}`; // 发送消息 const result = await axios($, { url: `https://api.telegram.org/bot${this.telegram_bot_api.$auth.token}/sendMessage`, method: 'POST', headers: { 'Content-Type': 'application/json', }, data: { chat_id: `${this.chatid}`, text: message, parse_mode: 'HTML', // 如果消息内容包含 HTML,可以设置这个参数 }, }); // 将每次发送操作的结果添加到结果数组中 results.push(result.data); } // 返回所有发送操作的结果 return results; }, }) 这也是低代码平台常见的解决方案了,通过在代码中自定义的方式来增加新的 field,比如这里就可以给当前节点增加选择 tg 机器人,以及一个填写 chat_id 的 field Copytelegram_bot_api: { type: "app", app: "telegram_bot_api", }, chat_id: { type: "string", label: "Chatid", default: "@RayeJourney", }, 写到这里,我突然意识到可以直接把所有步骤合并到一起了…,索性干脆合并到一起写得了,简单易懂还不需要折腾那么多,最终代码如下: 每次只需要改动几个点: 几个必选项是需要填的 message_template 需要修改下,我这里是把 item 当做 feed,然后 replace 替换的,所以代码中也需要做下修改 Copyimport { axios } from "@pipedream/platform" export default defineComponent({ props: { my_data_store: { type: "data_store", label: "MyDataStore" }, my_data_key: { type: "string", label: "MyDataKey", default: "xlog" }, telegram_bot_api: { type: "app", app: "telegram_bot_api", }, chat_id: { type: "string", label: "Chatid", default: "@RayeJourney", }, message_template: { // 由于 message 需要动态填充,改为 message_template type: "string", label: "Message", default: "📝 ${item.title} #blog\n\n${item.link}" } }, async run({steps, $}) { const items = steps.merge_rss_feeds.$return_value // 直接获取rss拉到的信息,最新的在最前面 // 获取db let lastItem = await this.my_data_store.get(`${this.my_data_key}`) // 确保使用正确的数据存储访问方式 const results = []; // 移动到 run 方法的顶部 let newItem = []; // 存储要发送的消息 const getId = (item) => { return item.link; }; const sendMsg = async (item) => { // 确保 sendMsg 是异步的 // 动态构造消息内容 const message = this.message_template.replace('${item.title}', item.title).replace('${item.link}', item.link); try { const result = await axios($, { url: `https://api.telegram.org/bot${this.telegram_bot_api.$auth.token}/sendMessage`, method: 'POST', headers: { 'Content-Type': 'application/json', }, data: { chat_id: this.chat_id, // 直接使用 this.chat_id text: message, parse_mode: 'HTML', }, }); results.push(result.data); // 添加结果到 results 数组 } catch (error) { console.error("Error sending message:", error); // 处理错误,例如添加错误信息到 results results.push({error: "Failed to send message", details: error.toString()}); } }; // 确保遍历的逻辑正确处理最新和最旧的项 for(const item of items){ // 不能优先处理最老的,一定要从最新的开始,因为会把旧的也加进来.. if(lastItem && getId(item) === getId(lastItem)){ break; // 如果找到了上次处理的最后一个项,则停止处理 } newItem.push(item) } for(const item of newItem.reverse()){ await sendMsg(item); // 等待发送消息 } // 更新数据存储中的 lastItem 为本次处理的最新项 if (items.length > 0) { await this.my_data_store.set(this.my_data_key, items[0]); // 假设 items[0] 是最新的项 } // 返回所有发送操作的结果 return results; }, }) 最终的部署举例# 如果你恰巧是通过 rsshub 获取的链接,然后想推送到 tg,那么就很简单了(话说都已经用 rsshub,为啥不直接用 rss to tg 呢🤣) 以 xlog 的博客推送举例,现在只需要三个部分: 触发时间,两个小时检查一次足矣 拉取 rss 信息,比如我的 https://rayepeng.net/feed 然后添加一个 code 节点,将上文的代码粘贴过去 点一下刷新 field 然后上方就出现了这些框框,自行编辑 第一次启动工作流 第一次启动工作里的时候,由于此时还没有任何数据,如果你直接运行的话会导致大量历史消息全部发送出去 于是,建议这样 在 db 中,手动粘贴下这个值(因为批量发送的时候会对比,如果和 db 里的一样就不会再发送了) 好了,现在就大功告成了,不得不说运行速度还是比 n8n 要快多了(

本文介绍了免费平台pipedream,可替代n8n进行工作流搭建和管理。作者分享了在pipedream中实现常用功能的方法,如导出工作流、批量处理item、条件判断等。还介绍了数据存储和去重的实现,解决了批量发送消息的问题。最后给出了完整的代码示例和部署示例。

相关推荐 去reddit讨论

UsubeniFantasy -

前端测试教程——自动化测试的类型

原文传送门 Types of automated testing…

本文介绍了自动化测试的不同类型,包括单元测试、组件测试、集成测试、冒烟测试、回归测试、视觉测试、端到端测试和API测试。每种测试类型都有其适用的场景和目的。此外,还提到了代码覆盖率的重要性和如何使用测试覆盖率来指导测试工作。

相关推荐 去reddit讨论

热榜 Top10

...
Dify.AI
...
ShowMeBug
...
白鲸技术栈
...
观测云
...
LigaAI
...
eolink
...
天勤数据

推荐或自荐