首页 文章 精选 留言 我的

精选列表

搜索[磐石100],共10009篇文章
优秀的个人博客,低调大师

『坚如磐石的 PieCloudDB』:透明加密模块的设计与实现

导读:2月17日,由中国开源软件推进联盟PostgreSQL分会&中科院软件所&CSDN联合举办的“中国 PostgreSQL 数据库生态大会”盛大召开。拓数派(OpenPie)作为冉冉升起的新一代云原生分布式数据库厂商,受邀参加本届大会。 本文为演讲的文字版摘要,主要内容包括: 透明加密的设计思路 透明加密模块的架构 三级密钥的实现 密钥管理的实现 分享嘉宾:PieCloudDB 资深技术专家 王淏舟 回访视频: https://www.bilibili.com/video/BV1X54y1w76L/ PPT链接: https://openpie.com/download/PostgresConf_PieCloudDB_Database_Unbreakable.pdf 一、数据安全的重要性 今年来,关于数据安全的政策和热点新闻层出不穷。无论是政府、企业或是各个厂商都对数据安全给予了很高的重视。过往的案例表明,如果出现敏感数据的泄露或丢失,将给企业和用户带来巨大的损失。 对于云上用户来说,云上数据的安全更是其最关注的需求之一。 作为一款存算分离的云原生数据库产品,PieCloudDB 做到了三大区域的安全特性设计,全链路地保证用户数据安全,包括: 云原生安全 存储安全 计算安全 其中,针对云原生安全,PieCloudDB 实现了传输层加密和缓存数据加密。作为一款云原生的 eMPP(弹性大规模并行计算)数据库,数据会在不同节点间进行传输,因此对于传输过程的数据加密至关重要。在执行用户查询时,PieCloudDB 会生成相应的缓存数据,用以加速查询结果的生成。缓存数据中会包含一部分的用户数据,对缓存数据的加密将更好的保证用户的数据安全。 针对存储安全,元数据作为数据库的「心脏」,一旦出现丢失或损坏,将导致数据库的不可用。为此,PieCloudDB 实现了对于元数据的持久化存储。PieCloudDB 的用户数据被多副本加密存储,以保证用户数据的彻底安全。 针对计算安全,PieCloudDB 采用 eMPP 存算分离架构,并支持ACID,在集群单一节点或更多节点失效的情况下,不会造成用户数据的丢失或损坏。 本文将着重介绍 PieCloudDB 是如何通过透明加密模块实现云原生安全层的缓存数据加密,和存储安全层的用户数据加密存储的。 二、PieCloudDB 透明加密设计思路 PieCloudDB 打造的透明加密模块让数据从传统的明文存储转为加密存储,可以有效地防止数据被系统运维人员直接读出,保证存储在数据文件中的数据安全。透明加密是指密钥生成、密钥管理和加解密过程由数据库管理系统自动完成,用户无感知。也就是说,透明加密的加密和解密过程对用户来说就是透明的,用户读写数据非常方便,数据写入自动加密,读取自动解密。此外,PieCloudDB 的透明加密模块不依赖于公有云/私有云/系统自带的加密,真正实现了自主可控,同时满足数据安全审计和业务安全审计等用户合规需求。 PieCloudDB 透明加密模块的设计和实现过程中,研发团队充分考虑和总结了用户需求与技术挑战,让透明加密模块实现了以下几个特性: 用户侧,PieCloudDB 透明加密模块符合审计流程,做到用户无感知,能够与用户业务拟合,无需对业务进行改变。 研发侧, PieCloudDB 透明加密模块作为一个独立模块,与数据库存储模块结合,不影响内核迭代,方便后续扩展,无历史包袱。 三、PieCloudDB 透明加密的实现细节 PieCloudDB 透明加密模块采用目前主流的多级密钥机制和有效的密钥管理机制防范了数据泄露风险,确保了用户的数据安全。每个租户数据完全隔离,拥有独立的密钥体系。 密钥管理的实现 在 PieCloudDB 中,主密钥是由用户自主生成、保存与控制的,保存于用户的信任域中,PieCloudDB 的透明加密模块不会尝试访问主密钥,确保主密钥的安全。 此外,PieCloudDB 的最小加密单位为数据页,每个数据页都由单个密钥进行加密。加密密钥支持轮换,可以按一段时间、或某些条件进行新的密钥的轮换,来最大化保证数据安全。同时,在轮换时,需要避免中断服务,无需停机。 PieCloudDB 采用三级密钥机制,轮换上级密钥无需重新加解密数据,只需加解密密钥。同时,PieCloudDB 透明加密模块支持按页/按表轮换密钥,避免整个用户集群停机轮换密钥,最大限度的减少对用户业务的影响。 密钥保存是透明加密模块中非常重要的部分,一旦密钥丢失,数据将无法解密,从而彻底无法访问。PieCloudDB 透明加密模块的所有次级密钥均进行了持久化存储,保证密钥的安全,底层页级密钥与数据共存,数据多副本备份,防止页级密钥的丢失造成无法挽救的损失。此外,由于页级密钥可能会很大,页级密钥与数据的共存,也能避免在访问密钥时频繁访问持久化存储,减少查询的延迟。 PieCloudDB 多级密钥 在多级密钥的过程中,用户会在用户信任域中创建主密钥,并保存在信任域中。任何情况下,主密钥都会被保持在用户信任域中。当创建新的租户时,透明加密模块会创建新的租户密钥,将密钥送进信任域中,用主密钥进行加密,并将加密后的密钥存储在 PieCloudDB 的持久化存储区域中。 当用户创建表时,PieCloudDB 的透明加密模块会自动生成表密钥,由租户密钥进行加密,并存储在 PieCloudDB 的持久化存储区域中。 当有数据写入、需要创建一个新的数据页时,透明加密模块会创建一个新的页密钥,由表密钥进行加密,并将加密后的页密钥存储和数据一起存储在数据存储区域中。选择存储到数据存储区域而非持久化存储区域中,是为了减少持久化存储区域的访问密度,减少持久化存储区域的负载,降低用户查询延迟,提升性能。当对页进行删除时,会将对应的密钥一并删除。 透明加密的模块化实现 PieCloudDB 透明加密采用模块化的实现。优化器、执行器将不会感知到透明加密模块的存在。在持续并行开发优化器、执行器等数据内核模块时,无需考虑对透明加密模块的适配。当进行升级时,双方也不耦合,符合云原生解耦的特性。 此外,透明加密模块完美支持 PieCloudDB 的存储引擎「简墨」,最大化利用存储性能,减少加密导致的性能损失。根据实测数据,透明加密导致的性能损失对用户查询造成的性能影响微乎其微,可忽略不计。 根据用户需求,PieCloudDB 实现了可插拔加密算法库,针对不同的硬件,能够支持不同的加密算法,充分利用硬件加速。PieCloudDB 提供了多种类型的高强度加密算法,包括DES、AES、RC4等。同时,针对国内用户,增加了对国密标准的支持,符合审计流程和合规要求。此外,为了做到真正的自主可控,加密算法做到了可选。 PieCloudDB 透明加密模块与用户原有业务完全拟合。在透明加密后,不会对原有用户的查询\业务造成影响,用户无需对原有业务进行更改,做到开箱即用。外围组件也无需针对透明加密模块进行适配,例如使用ETL工具对数据进行导入时,数据会自动加密;导出接入ETL时,数据已经自动完成解密。不会发生 ETL 读到加密的数据导致任务的失败的情况,ETL 也不会感知到透明加密模块的存在。 透明加密的实现 透明加密组件架构 首先,我们来了解一下 PieCloudDB 透明加密组件的架构,当用户发起一个查询请求时, PieCloudDB 优化器会生成执行计划树,执行器将根据此计划树进行执行。当需要访问数据时,执行器将访问 PieCloudDB 存储引擎「简墨」提供的存储接口,通过存储接口访问数据,并对数据进行查询、插入等操作。PieCloudDB 在存储接口与数据访问中间添加了一层透明加密组件。组件位于存储接口的下面,从而做到了优化器和执行器对模块的无感知。 PieCloudDB 的透明加密组件包括三个模块:加密模块、密钥管理模块、和函数接口。为了实现加密算法库的可插拔,加密模块独立于密钥管理模块,使 PieCloudDB 能够针对不同的透明加密算法库提供不同的接口,并保证内部的加密流程的统一性。这样的设计也可以减少 bug 的产生、让整个开发流程更顺滑,使用户的行为也更加的统一。 透明加密组件架构 租户密钥的生成和读取 租户密钥的生成主要分为以下几个步骤。当租户创建请求,PieCloudDB 透明加密模块将使用强随机算法生成新的主密钥,存储在用户信任域中。主密钥会对其进行加密,生成租户密钥。整个加密过程是在用户的信任域中完成的。PieCloudDB 不会尝试访问主密钥。用户信任域返回加密的租户密钥后,会被存储在持久化存储区域中。 租户密钥的生成 当需要使用租户密钥时,PieCloudDB 透明加密模块会将加密后的密钥从持久化存储区域读出,送入用户信任域中,使用主密钥将加密后的密钥进行解密,并将解密后的密钥存储在密钥存储区中。此外,PieCloudDB 透明加密模块还在这里设置了定时器,在经过一定时间后,密钥会被自动销毁,避免对解密密钥的持有,减少密钥泄露风险。 租户密钥的读取 次级密钥的生成与读取 包括表密钥和页密钥在内的次级密钥的生成方式与租户密钥类似。当用户发起查询请求时,PieCloudDB 透明加密模块将使用强加密算法随机生成密钥,并用上级密钥进行加密,并存储到相对应的存储区域。 次级密钥的生成 当需要进行次级密钥的读取时,与租户密钥的读取过程类似,PieCloudDB 透明加密模块会将数据从对应的存储区域将加密后的密钥读取出,用上级密钥进行解密。 页级密钥的处理会有所不同,解密后的页级密钥会被存储在内存,而非存储区域中,避免对存储区域造成负担。定时器的存在,会让密钥在一段时间后彻底从内存中销毁。在此过程中,透明加密模块也会为密钥添加随机值,避免密钥从内存中被读取,减少泄露风险。任何密钥都不会被存储在磁盘或缓冲区域,避免密钥因为某种不可控因素而泄露。 次级密钥的读取 通过透明加密等安全模块,PieCloudDB 实现了文件级别的安全性保护,有效避免了数据的泄露,为用户打造了更加可靠的数据安全堡垒。

优秀的个人博客,低调大师

把Playwright录制的操作下载下来,让AI学透,RPA脚本稳如磐石

你可能遇到过这种情况:辛辛苦苦维护的自动化脚本,今天还能跑,明天就崩了。网页改了一下按钮的位置,CSS类名变了,你的选择器就成了一堆废纸。RPA(机器人流程自动化)脚本也一样,最怕的就是页面微调。更让人头疼的是,现在大家喜欢让AI帮忙写RPA,但AI没见过真实操作,只能靠你给的需求描述去“猜”。它生成的代码逻辑上说得通,但一遇到弹窗、loading动画、iframe切换,就原形毕露。为什么?因为AI缺少真实世界里的“手感”。于是我们想:能不能把人工操作浏览器的方式,原原本本地录制下来,下载到本地,再交给AI去学习?这样AI就能知道人类在遇到各种情况时是怎么处理的。我老李在过去几个月里反复折腾,终于摸清了一条可行路线:用Playwright录制操作脚本,把脚本文件下载下来,作为AI的学习素材,然后再让它生成更稳的RPA脚本。今天我把这条链路拆开,从为什么到怎么做,一次说清楚。

优秀的个人博客,低调大师

《HelloGitHub》第 100

兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、Java、Go、C/C++、Swift...让你在短时间内感受到开源的魅力,对编程产生兴趣! 以下为本期内容|每个月 28 号更新 C 项目 1、darktable:开源的摄影后期处理工具。这是一款免费且专业的摄影作品后期处理软件。它像一个虚拟的光桌和暗房,能够帮助摄影师存储数字底片、放大查看和检索照片。该软件可以显示照片的焦距和曝光度等信息,并支持编辑历史、地图模式和打印照片等功能。 2、gnucash:完全开源的财务软件。这是一款适用于个人和小型企业的开源财务软件,它采用复式记账法,提供了简洁的操作界面,并支持生成报表、对账、多国货币,以及获取股票实时价格等功能,适用于 Windows、Linux 和 macOS 平台。 C# 项目 3、git-credential-manager:通用的 Git 凭据管理器。这是一个基于 .NET 开发的 Git 凭证存储和管理工具。它开箱即用、无需额外操作,使用 git 命令时,工具会自动引导完成登录,后续无需再次登录,轻松解决对远程 Git 仓库进行操作时遇到的需要登录和认证失败等问题,支持 GitHub、Bitbucket 和 GitLab 等平台。 4、Lean:基于 C# 的量化交易引擎。这是一款采用 C# 编写的开源、经过实战考验的量化交易引擎。支持使用 Python3 或 C# 编写交易算法,兼容 Windows、Linux 和 macOS 平台,适用于量化交易策略研究、回测和实盘交易等场景。 5、space-station-14:开源游戏《14 号空间站》。该项目是经典游戏《Space Station 13》的开源重制版。在这款回合制多人角色扮演的游戏中,玩家可以选择各种角色,如工程师、船长和叛徒,并与其他玩家合作或竞争,在资源有限的环境中生存。 6、subtitleedit:开源的视频字幕编辑工具。这是一款适用于 Windows 的免费视频字幕编辑器。它开箱即用且功能强大,支持创建、调整、同步和翻录字幕,还提供了自动翻译、字幕格式转换和语音识别等功能。 C++ 项目 7、diff-pdf:直观比较两个 PDF 文件的工具。这是一款用 C++ 编写的 PDF 文件比较工具。它支持两种查看方式,将文件内容的差异输出到一个新的 PDF 文件,或直接在 GUI 中查看。 // 输出差异 diff-pdf --output-diff=diff.pdf a.pdf b.pdf // 直接查看 diff-pdf --view a.pdf b.pdf Go 项目 8、buildg:交互式的 Dockerfile 调试工具。该项是基于 BuildKit 的交互式调试 Dockerfile 的工具,支持设置断点、单步执行和非 root 模式,并且可以在 VSCode 等编辑器中使用。 9、devzat:程序员专属的 SSH 聊天室。这是一个通过 SSH 连接的聊天室,用户无需安装客户端,仅需一条 SSH 命令即可登录。它支持私人消息、多聊天室、图片和代码高亮等功能,还可以集成第三方服务、自托管 SSH 聊天室。 10、expr:Go 语言的表达式库。该项目是专为 Go 语言设计的表达式语言和求值引擎,支持丰富的算子和高级函数,具有安全、无副作用和静态类型检测等特点。表达式是一行由变量、运算符和函数组成的代码,它能够简化复杂的计算任务,多用于动态配置和业务规则引擎等场景。 func main() { // 表达式 code := `all(Tweets, {.Len <= 240})` program, err := expr.Compile(code, expr.Env(Env{})) if err != nil { panic(err) } env := Env{ Tweets: []Tweet{{42}, {98}, {69}}, } // 计算表达式 output, err := expr.Run(program, env) if err != nil { panic(err) } fmt.Println(output) } 11、gdu:快速查看磁盘使用情况的命令行工具。这是一个用 Go 语言编写的磁盘使用分析器,它能够快速扫描并展示文件和目录所占用的磁盘空间,支持 TUI(默认)、非交互和导出三种使用方式。 Java 项目 12、cryptomator:为你的云端文件"上锁"的工具。这是一款开源的云存储文件加密工具,支持 Dropbox、OneDrive 等主流云存储服务。它简单易用、跨平台、无需注册,采用 AES-256 加密上传至云存储的文件和目录,适用于需要备份数据至云端,又担心数据泄漏的场景。 13、JarEditor:直接编辑 JAR 文件的 IDEA 插件。这是一款 IntelliJ IDEA 插件,让你无需解压即可直接编辑 JAR 文件中的 class 和资源文件。它支持添加、删除、重命名 JAR 包内的文件和目录,并提供了搜索和复制 JAR 包内容等功能,兼容 SpringBoot 和 Kotlin 项目。 14、PojavLauncher:Minecraft 游戏的 Android 启动器。该项目可以让你在 Android 上玩 Minecraft(我的世界),提供了离线和多人联机模式。它支持几乎所有版本的 Minercraft,还可以安装 Forge、Fabric 和 OptiFine 等模组和加载器。 JavaScript 项目 15、grapesjs:免费的可视化 Web 页面构建平台。该项目通过直观的可视化界面,让用户能够通过拖拽的方式,快速设计和构建网站的 HTML 模板。它所见即所得、移动端适配,适用于官网、新闻和 CMS 等类型的网站。 16、react-content-loader:轻松创建骨架屏的 React 组件。该项目是用于创建页面加载时的占位图 React 组件,它体积小、易定制,提供了多种预设样式和示例代码,拿来即用极易上手,支持 React、Vue 和 Angular 等主流框架。 import { Code } from 'react-content-loader' const MyCodeLoader = () => <Code /> 17、Sink:基于 Cloudflare 带访问统计的短链平台。该项目是运行在 Cloudflare 上的短链接服务,支持网址缩短、访问分析和链接有效期等功能。 18、typebot.io:自托管的聊天机器人构建器。该项目通过可视化的拖拽界面,让用户能够轻松创建高级聊天机器人,并将其嵌入网站中。它提供了 30 多种聊天构建块,支持自托管、分析工具、自定义域名和品牌定制等功能,适用于在线客服和销售支持等场景。 19、typed.js:极易上手的 JavaScript 打字动画库。该项目是专门用于创建打字动画效果的 JavaScript 库,它简单易用且 SEO 友好,支持删除效果、设置打字速度和循环次数等功能。 var typed = new Typed('.element', { strings: ["First sentence.", "Second sentence."], typeSpeed: 30 }); Kotlin 项目 20、WiFiAnalyzer:用于分析 WiFi 信号的 Android 应用。该项目是用 Kotlin 写的 WiFi 分析工具,它提供了直观的图表展示 WiFi 网络情况,支持识别周围的 WiFi、测量信号强度和查看频道拥挤程度等功能。 Python 项目 21、buzz:音频转录与翻译工具。该项目是基于 Whisper 的音频转录和翻译工具,它开箱即用且操作简单,支持语音转文字、音频翻译、多种语言和离线使用,适用于 macOS、Windows 和 Linux 平台。 22、helium:简化浏览器自动化的 Python 库。该项目是基于 Selenium 的轻量级 Python 库,它通过提供更高级和易用的 API,让用 Python 编写浏览器自动化脚本变得更加简单和方便,支持 Chrome 和 Firefox 浏览器。 23、jurigged:Python 的热重载工具。这是一个专为 Python 提供热重载功能的库,它支持在程序运行时修改和更新 Python 代码,无需重启程序。 # Loop over a function jurigged --loop function_name script.py jurigged --loop module_name:function_name script.py # Only stop on exceptions jurigged --xloop function_name script.py 24、python-sortedcontainers:更好用的 Python 排序集合库。该项目提供了 SortedList、SortedDict 和 SortedSet 三种数据结构,完全兼容 List、Dict、Set 内置数据类型的 API。尽管采用纯 Python 编写,其速度却可以媲美使用 C 扩展实现的 Python 库。 from sortedcontainers import SortedList sl = SortedList(['e', 'a', 'c', 'd', 'b']) # sl: SortedList(['a', 'b', 'c', 'd', 'e']) sl *= 10_000_000 sl.count('c') # 10000000 sl[-3:] # ['e', 'e', 'e'] from sortedcontainers import SortedDict sd = SortedDict({'c': -3, 'a': 1, 'b': 2}) # sd: SortedDict({'a': 1, 'b': 2, 'c': -3}) sd.popitem(index=-1) # ('c', -3) from sortedcontainers import SortedSet ss = SortedSet('abracadabra') # ss: SortedSet(['a', 'b', 'c', 'd', 'r']) ss.bisect_left('c') # 2 25、radon:Python 代码质量分析工具。这是一款强大的 Python 代码度量工具,它能够计算多种代码指标,包括 McCabe 复杂度、Halstead 指标和可维护性指数,适用于 Python 代码质量评估和持续集成等场景。 $ radon cc sympy/solvers/solvers.py -a -nc sympy/solvers/solvers.py F 346:0 solve - F F 1093:0 _solve - F F 1434:0 _solve_system - F F 2647:0 unrad - F F 110:0 checksol - F F 2238:0 _tsolve - F F 2482:0 _invert - F F 1862:0 solve_linear_system - E F 1781:0 minsolve_linear_system - D F 1636:0 solve_linear - D F 2382:0 nsolve - C 11 blocks (classes, functions, methods) analyzed. Average complexity: F (61.0) Rust 项目 26、komorebi:Windows 的平铺窗口管理器。这是一款专为 Windows 设计的桌面窗口管理工具,支持自动平铺窗口、管理多个虚拟桌面和多显示器等功能,适用于 Windows 10 及更高版本。 27、min-sized-rust:优化 Rust 二进制文件大小的方法。Rust 构建时默认不会优化二进制文件的大小,该项目介绍了如何在保证 Rust 程序功能完整的同时,减少二进制文件体积的工具和技巧,适用于嵌入式和物联网等对程序体积敏感的场景。 28、readyset:Rust 开发的 SQL 数据库缓存引擎。该项目是采用 Rust 开发的 Postgres 和 MySQL 数据库缓存层,支持自动维护缓存、缓存复杂的 SQL 查询结果和保持数据实时同步等功能。使用时无需改动代码即可集成到现有的应用和数据库之间,显著提升查询性能。 Swift 项目 29、ATV-Bilibili-demo:开源的 Apple TV 哔哩哔哩客户端。该项目是专为苹果电视(tvOS)设计的哔哩哔哩客户端,它可以用来观看 B 站上的视频、直播和弹幕,支持登录、投屏、搜索和历史记录等功能,就是安装有点麻烦。 30、PlayCover:在 Mac 上运行 iOS 游戏和应用的工具。该项目是专为 Apple Silicon Mac 设备(M 系列芯片)设计,用于运行 iOS 应用和游戏的工具。它通过模拟 iPad 环境和键盘映射功能,让用户可以在 Mac 电脑上玩 iOS 游戏,需自行下载 IPA 文件,适用于 macOS 12.0 或更高版本。 其它 31、dart_simple_live:简单易用的看直播工具。该项目可以让你在一个 APP 上看各种主流直播平台,并提供了 Android、iOS、macOS 和 Android TV 等客户端。 32、github-readme-terminal:用复古终端 GIF 展示 GitHub 个人资料。该项目可以根据你的 GitHub 个人数据,生成复古风格的电脑启动 GIF 动画,展示你的 GitHub 个人资料。 33、hugo-book:书籍风格的 Hugo 主题。这是一个开源的 Hugo 主题,能够帮助用户轻松创建类似书籍的文档网站。它拥有简洁的设计、适配移动端、支持多语言,适用于技术文档、在线教程和书籍等场景。 34、OMOTE:开源的通用遥控器。该项目是用 ESP32 制作的通用遥控器,它拥有 2.8 英寸电容触摸屏、2000 毫安电池和实体按键,支持红外、WiFi 和蓝牙连接方式,能够控制各种家电。 35、pintree:Chrome 书签变成导航站。该项目可以通过简单的几步,将 Chrome 浏览器的书签,转换成一个美观且易用的导航页面。由于生成的是静态网站,因此无法自动同步新增的书签。 36、Scoop:Windows 命令行安装软件的利器。该项目是类似于 Homebrew 的 Windows 命令行安装工具。它可以从命令行安装应用程序,具有消除权限弹窗、隐藏 GUI 向导、自动处理依赖和防止污染 PATH 环境变量等特点。 scoop install sudo sudo scoop install 7zip git openssh --global scoop install aria2 curl grep sed less touch scoop install python ruby go perl 开源书籍 37、introduction-to-git-and-github-ebook:《Git 和 GitHub 入门指南》。这是一本介绍 Git 和 GitHub 基础知识的开源书籍,内容包括安装 Git、GitHub CLI、分支管理和工作流程等实用知识。 38、machine-learning-for-trading:《Machine Learning for Algorithmic Trading》配套代码。这是一本关于如何将机器学习应用于交易策略的书籍,该项目是书籍的配套代码和资源,包含 150 多个代码示例,涵盖了数据采集、模型训练和策略评估等方面。 机器学习 39、gpt-computer-assistant:极简的 GPT-4o 客户端。该项目是适用于 Windows、macOS 和 Ubuntu 的 GPT-4o 客户端,它拥有极简的用户界面,支持执行多种任务,包括读取屏幕、打开应用、系统音频和文本输入等。 40、mem0:增强 LLM 上下文连续性的 Python 库。该项目能为多种主流的大型语言模型提供记忆层,它支持保存用户与 LLM 交互时的会话和上下文,并能实时动态更新和调整,从而增强 AI 的个性化,适用于学习助手、医疗助理和虚拟伴侣等需要长期记忆的个性化 LLM 应用。 from mem0 import Memory m = Memory() # Add result = m.add("Likes to play cricket on weekends", user_id="alice", metadata={"category": "hobbies"}) # Search related_memories = m.search(query="What are Alice's hobbies?", user_id="alice") # Update result = m.update(memory_id="m1", data="Likes to play tennis on weekends") 41、Retrieval-based-Voice-Conversion-WebUI:开箱即用的 AI 变声器。该项目是基于 VITS 的变声框架,仅需少量语音数据和普通的显卡,就能快速训练出高质量的语音转换模型。它提供了简单易用的 Web 和 GUI 界面,支持实时变声、人声和伴奏分离等功能。 最后 感谢参与分享开源项目的小伙伴们,欢迎更多的开源爱好者来 HelloGitHub 自荐/推荐开源项目。如果你发现了 GitHub 上有趣的项目,就点击这里分享给大家伙吧! 本期有你感兴趣的开源项目吗?如果有的话就留言告诉我吧~如果还没看过瘾,可以点击阅读往期内容。 感谢您的阅读,如果觉得本期内容还不错的话 求赞、求分享 ❤️

优秀的个人博客,低调大师

Android 中文 API (100) —— ScrollView

正文 一、结构 public classScrollView extendsFrameLayout java.lang.Object android.view.View android.view.ViewGroup android.widget.FrameLayout android.widget.ScrollView 二、概述 一种可供用户滚动的层次结构布局容器,允许显示比实际多的内容。ScrollView是一种FrameLayout,意味需要在其上放置有自己滚动内容的子元素。子元素可以是一个复杂的对象的布局管理器。通常用的子元素是垂直方向的LinearLayout,显示在最上层的垂直方向可以让用户滚动的箭头。 TextView类也有自己的滚动功能,所以不需要使用ScrollView,但是只有两个结合使用,才能保证显示较多内容时候的效率。但只有两者结合使用才可以实现在一个较大的容器中一个文本视图效果。 ScrollView只支持垂直方向的滚动。 三、构造函数 publicScrollView(Contextcontext) 创建一个默认属性的ScrollView实例。 publicScrollView(Contextcontext,AttributeSetattrs) 创建一个带有attrs属性的ScrollView实例。 publicScrollView(Contextcontext,AttributeSetattrs, int defStyle) 创建一个带有attrs属性,并且指定其默认样式的ScrollView实例。 四、公共方法 public voidaddView(Viewchild) 添加子视图。如果事先没有给子视图设置layout参数,会采用当前ViewGroup的默认参数来设置子视图。 参数 child所添加的子视图 public voidaddView(Viewchild, int index) 添加子视图。如果事先没有给子视图设置layout参数,会采用当前ViewGroup的默认参数来设置子视图。 参数 child所添加的子视图 index添加子视图的位置 public voidaddView(Viewchild, int index,ViewGroup.LayoutParamsparams) 根据指定的layout参数添加子视图 参数 child所添加的子视图 index添加子视图的位置 params为子视图设置的layout参数 public voidaddView(Viewchild,ViewGroup.LayoutParamsparams) 根据指定的layout参数添加子视图。 参数 child所添加的子视图 params为子视图设置的layout参数 public booleanarrowScroll(int direction) 响应点击上下箭头时对滚动条滚动的处理。 参数 direction按下的箭头所对应的方向 返回值 如果我们处理(消耗)了此事件返回true,否则返回false。 public voidcomputeScroll() 被父视图调用,用于必要时候对其子视图的值(mScrollX和mScrollY)进行更新。典型的情况如:父视图中某个子视图使用一个Scroller对象来实现滚动操作,会使得此方法被调用。 public booleandispatchKeyEvent(KeyEventevent) 发送一个key事件给当前焦点路径的下一个视图。此焦点路径从视图树的顶层执行直到当前焦点视图。如果此视图为焦点视图,将为自己发送。否则,会为当前焦点路径的下一个节点发送。此方法也会激起一个key监听器。 参数 event发送的key事件 返回值 事件被处理返回true,否则返回false。 public voiddraw(Canvas canvas) 手动绘制视图(及其子视图)到指定的画布(Canvas)。这个视图必须在调用这个函数之前做好了整体布局。当实现一个视图时,不需要继承这个方法;相反,你应该实现onDraw(Canvas)方法。 参数 canvas绘制视图的画布 public booleanexecuteKeyEvent(KeyEventevent) 当接收到key事件时,用户可以调用此函数来使滚动视图执行滚动,类似于处理由视图体系发送的事件。 参数 event需要执行key的事件 返回值 事件被处理返回true,否则返回false。 public voidfling(int velocityY) 滚动视图的滑动(fling)手势。(译者注:如何监听android的屏幕滑动停止事件) 参数 velocityYY方向的初始速率。正值表示手指/光标向屏幕下方滑动,而内容将向上滚动。 public booleanfullScroll(int direction) 对响应“home/end”短按时响应滚动处理。此方法将视图滚动到顶部或者底部,并且将焦点置于新的可视区域的最顶部/最底部组件。若没有适合的组件做焦点,当前的ScrollView会收回焦点。 参数 direction滚动方向:FOCUS_UP表示视图向上滚动;FOCUS_DOWN表示视图向下滚动 返回值 若key事件被消耗(consumed)返回true,其他情况返回false。 public intgetMaxScrollAmount() 返回值 当前滚动视图响应箭头事件能够滚动的最大数。 public booleanisFillViewport() 指示当前ScrollView的内容是否被拉伸以填充视图可视范围(译者注:viewport可视范围,参见决定Scrollviewer里面Control的可视范围)。 返回值 内容填充视图返回true,否则返回false。 public booleanisSmoothScrollingEnabled() 返回值 按箭头方向滚动时,是否显示滚动的平滑效果。 public booleanonInterceptTouchEvent(MotionEventev) 实现此方法是为了拦截所有触摸屏幕时的运动事件。可以像处理发送给子视图的事件一样去监视这些事件,并且获取当前手势在任意点的ownership 使用此方法时候需要注意,因为它与View.onTouchEvent(MotionEvent)有相当复杂的交互,并且前提需要正确执行View.onTouchEvent(MotionEvent)。事件将按照如下顺序接收到: 1.收到down事件 2.Down事件或者由视图组的一个子视图处理,或者被用户自己的onTouchEvent()方法处理;此处理意味你应该执行onTouchEvent()时返回true,这样才能继续看到剩下的手势(取代找一个父视图处理)。如果onTouchEvent()返回true时,你不会收到onInterceptTouchEvent()的任何事件并且所有对触摸的处理必须在onTouchEvent()中发生。 3.如果此方法返回false,接下来的事件(up to and including the final up)将最先被传递当此,然后是目标的onTouchEvent()。 4.如果返回true,将不会收到以下任何事件:目标view将收到同样的事件但是会伴随ACTION_CANCEL,并且所有的更进一步的事件将会传递到你自己的onTouchEvent()方法中而不会再在这里出现。 参数 ev体系向下发送的动作事件 返回值 如果将运动事件从子视图中截获并且通过onTouchEvent()发送到当前ViewGroup,返回true。当前目标将会收到ACTION_CANCEL事件,并且不再会有其他消息传递到此。 (译者注:onInterceptTouchEvent和onTouchEvent调用时序) public booleanonTouchEvent(MotionEventev) 执行此方法为了处理触摸屏幕的运动事件。 参数 ev运动事件 返回值 事件被处理返回true,其它返回false。 public booleanpageScroll(int direction) 响应短按“page up/ down”时候对滚动的处理。此方法将向上或者向下滚动一屏,并且将焦点置于新可视区域的最上/最下。如果没有适合的component作为焦点,当前scrollView将收回焦点。 参数 direction滚动方向:FOCUS_UP表示向上翻一页,FOCUS_DOWN表示向下翻一页。 返回值 此key事件被消耗(cosumed)返回true,其他返回false。 public voidrequestChildFocus(Viewchild,Viewfocused) 当父视图的一个子视图的要获得焦点时,调用此方法。 参数 child要获得焦点的父视图的子视图。此视图包含了焦点视图。如果没有特殊徐要求,此视图实际上就是焦点视图。 focused子视图的子孙视图并且此子孙视图是真正的焦点视图 public booleanrequestChildRectangleOnScreen(Viewchild,Rectrectangle, boolean immediate) 当组里的某个子视图需要被定位在屏幕的某个矩形范围时,调用此方法。重载此方法的ViewGroup可确认以下几点: *子项目将是组里的直系子项 *矩形将在子项目的坐标体系中 重载此方法的ViewGroup应该支持以下几点: *若矩形已经是可见的,则没有东西会改变 *为使矩形区域全部可见,视图将可以被滚动显示 参数 child 发出请求的子视图 rectangle子项目坐标系内的矩形,即此子项目希望在屏幕上的定位 immediate设为true,则禁止动画和平滑移动滚动条 返回值 进行了滚动操作的这个组(group),是否处理此操作。 public voidrequestLayout() 当有改变引起当前视图重新布局时,调用此函数。它将规划一个视图树的layout路径。 public voidscrollTo(int x, int y) 设置当前视图滚动到的位置。此函数会引起对onScrollChanged(int, int, int, int)函数的调用并且会让视图更新。 当前版本取消了在子视图中的滚动。 参数 x滚动到的X位置 y滚动到的Y位置 public voidsetFillViewport(boolean fillViewport) 设置当前滚动视图是否将内容高度拉伸以填充视图可视范围(译者注:viewport可视范围,参见决定Scrollviewer里面Control的可视范围)。 参数 fillViewport设置为true表示拉伸内容高度来适应视口边界;其他设为false。 public voidsetOverScrollMode(int mode) 为视图设置over-scroll模式。有效的over-scroll模式有OVER_SCROLL_ALWAYS(缺省值),OVER_SCROLL_IF_CONTENT_SCROLLS(只允许当视图内容大过容器时,进行over-scrolling)和OVER_SCROLL_NEVER。只有当视图可以滚动时,此项设置才起作用。 (译者注:这个函数是2.3 r1中新增的,API Level 9。关于over-scroll这里译为弹性滚动,即,参见帖子:类似iPhone的弹性ListView滚动) 参数 mode The new over-scroll mode for this view. public voidsetSmoothScrollingEnabled(boolean smoothScrollingEnabled) 用来设置箭头滚动是否可以引发视图滚动。 参数 smoothScrollingEnabled设置箭头滚动是否可以引起内容的滚动的bool值 public final voidsmoothScrollBy(int dx, int dy) 类似于scrollBy(int, int),但是滚动时候是平缓的而不是立即滚动到某处。 参数 dx在X方向滚动的像素数 dy在Y方向滚动的像素数 public final voidsmoothScrollTo(int x, int y) 类似于scrollTo(int, int),但是滚动时候是平缓的而不是立即滚动到某处。 参数 x要滚动到位置的X坐标 y要滚动到位置的Y坐标 五、受保护方法 protected intcomputeScrollDeltaToGetChildRectOnScreen(Rectrect) 计算X方向滚动的总合,以便在屏幕上显示子视图的完整矩形(或者,若矩形宽度超过屏幕宽度,至少要填满第一个屏幕大小)。 参数 rect矩形 返回值 滚动差值 protected intcomputeVerticalScrollOffset() 计算垂直方向滚动条的滑块的偏移。此值用来计算滚动条轨迹的滑块的位置。 范围可以以任意单位表示,但是必须与computeVerticalScrollRange()和computeVerticalScrollExtent()的单位一致。 缺省的偏移是在当前视图滚动的偏移。 返回值 滚动条的滑块垂直方向的偏移。 protected intcomputeVerticalScrollRange() 滚动视图的可滚动范围是所有子元素的高度。 返回值 由垂直方向滚动条代表的所有垂直范围,缺省的范围是当前视图的画图高度。 protected floatgetBottomFadingEdgeStrength() 返回滚动底部的能见度。能见度的值的范围是0.0(没有消失)到1.0(完全消失)之间。缺省的执行返回值为0.0或者1.0,而不是他们中间的某个值。滚动时子类需要重载这个方法来提供一个平缓的渐隐的实现。 返回值 滚动底部能见度,值的范围在浮点数0.0f到1.0f之间。 protected floatgetTopFadingEdgeStrength() 返回滚动顶部的能见度。能见度的值的范围是0.0(没有消失)到1.0(完全消失)之间。缺省的执行返回值为0.0或者1.0,而不是他们中间的某个值。滚动时子类需要重载这个方法来提供一个平缓的渐隐的实现。 返回值 滚动顶部能见度,值的范围在浮点数0.0f到1.0f之间。 protected voidmeasureChild(Viewchild, int parentWidthMeasureSpec, int parentHeightMeasureSpec) 要求当前视图的一个子视图测量自己,同时兼顾到当前视图的MeasureSpec的要求和它的空白。子视图必须有MarginLayoutParams。比较复杂的工作是在getChildMeasureSpec中完成的。 参数 child 需要自己测量的子视图 parentWidthMeasureSpec 当前视图要求的宽度 parentHeightMeasureSpec 当前视图要求的宽度 protected voidmeasureChildWithMargins(Viewchild, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) 要求当前视图的一个子视图测量自己,同时兼顾到当前视图的MeasureSpec的要求和它的空白和边界。子视图必须有MarginLayoutParams。比较复杂的工作是在getChildMeasureSpec中完成的。 参数 child 需要测量的子视图 parentWidthMeasureSpec当前视图要求的宽度 widthUsed水平方向上由父视图使用的空白(也可能是视图的其他子视图使用的) parentHeightMeasureSpec当前视图要求的宽度 heightUsed垂直方向上由父视图使用的空白(也可能是视图的其他子视图使用的) protected voidonLayout(boolean changed, int l, int t, int r, int b) 当前视图需要为子视图分配大小和位置时候调用,子类继承必须要重载此方法并调用自己子视图的layout函数。 参数 changed当前视图的新的大小或者位置 l相对父视图,左边界位置 t相对父视图,上边界位置 r相对父视图,右边界位置 b相对父视图,下边界位置 protected voidonMeasure(int widthMeasureSpec, int heightMeasureSpec) 测量视图以确定其内容宽度和高度。此方法被measure(int, int)调用。需要被子类重写以提供对其内容准确高效的测量。 约定:当重写此方法时,你必须调用setMeasuredDimension(int, int)来保存当前视图view的宽度和高度。不成功调用此方法将会导致一个IllegalStateException异常,是由measure(int, int)抛出。所以调用父类的onMeasure(int, int)方法是必须的。 父类的实现是以背景大小为默认大小,除非MeasureSpec(测量细则)允许更大的背景。子类可以重写onMeasure(int,int)以对其内容提供更佳的尺寸。 如果此方法被重写,那么子类的责任是确认测量高度和测量宽度要大于视图view的最小宽度和最小高度(getSuggestedMinimumHeight()和getSuggestedMinimumWidth()),使用这两个方法可以取得最小宽度和最小高度。 参数 widthMeasureSpec受主窗口支配的水平空间要求。这个需求通过View.MeasureSpec.进行编码。 heightMeasureSpec受主窗口支配的垂直空间要求。这个需求通过View.MeasureSpec.进行编码。 protected voidonOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) 被overScrollBy(int, int, int, int, int, int, int, int, boolean)调用,来对一个over-scroll操作的结果进行响应。(译者注:这个函数是2.3 r1中新增的,API Level 9) 参数 scrollX新的X滚动像素值 scrollY新的Y滚动像素值 clampedX 当scrollX被over-scroll的边界限制时,值为true clampedY 当scrollY被over-scroll的边界限制时,值为true protected booleanonRequestFocusInDescendants(int direction,RectpreviouslyFocusedRect) 当在滚动视图的子视图中查找焦点视图时,需要注意不要将焦点设置在滚动出屏幕外的控件上。此方法会比执行缺省的ViewGroup代价高,否则此行为也会设置为缺省 参数 direction指定下列常量之一:FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT previouslyFocusedRect能够给出一个较好的提示的矩形(当前视图的坐标系统)表示焦点从哪里得来。如果没有提示为null。 返回值 是否取得了焦点 protected voidonSizeChanged(int w, int h, int oldw, int oldh) 布局期间当视图的大小发生改变时调用。如果只是添加到视图,调用时显示的是旧值0。(译者注:也就是添加到视图时,oldw和oldh返回的是0)。 参数 w视图当前宽度 h视图当前高度 oldw视图改变前的宽度 oldh视图改变前的高度 本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/582392,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册