首页 文章 精选 留言 我的

精选列表

搜索[编写],共10000篇文章
优秀的个人博客,低调大师

Salvo 0.23.3 发布, Rust 编写的简单且强大的后端框架

更新内容: 1. 改进中间件执行流程. 2. 改进依赖包结构 github: https://github.com/salvo-rs/salvo Salvo 是一个极其简单且功能强大的 Rust Web 后端框架. 仅仅需要基础 Rust 知识即可开发后端服务. 🎯 功能特色 基于 Hyper, Tokio 开发; 统一的中间件和句柄接口; 路由支持多层次嵌套, 在任何层都可以添加中间件; 集成 Multipart 表单处理; 支持 Websocket; 支持 Acme, 自动从 let's encrypt 获取 TLS 证书; 支持从多个本地目录映射成一个虚拟目录提供服务. ⚡️ 快速开始 你可以查看实例代码, 或者访问官网. 创建一个全新的项目: cargo new hello_salvo --bin 添加依赖项到 Cargo.toml [dependencies] salvo = "0.23" tokio = "1" 在 main.rs 中创建一个简单的函数句柄, 命名为hello_world, 这个函数只是简单地打印文本 "Hello World". use salvo::prelude::*; #[fn_handler] async fn hello_world(_req: &mut Request, _depot: &mut Depot, res: &mut Response) { res.render(Text::Plain("Hello World")); } 中间件 Salvo 中的中间件其实就是 Handler, 没有其他任何特别之处. 所以书写中间件并不需要像其他某些框架需要掌握泛型关联类型等知识. 只要你会写函数就会写中间件, 就是这么简单!!! use salvo::http::header::{self, HeaderValue}; use salvo::prelude::*; #[fn_handler] async fn add_header(res: &mut Response) { res.headers_mut() .insert(header::SERVER, HeaderValue::from_static("Salvo")); } 然后将它添加到路由中: Router::new().hoop(add_header).get(hello_world) 这就是一个简单的中间件, 它向 Response 的头部添加了 Header, 查看完整源码. 可链式书写的树状路由系统 正常情况下我们是这样写路由的: Router::with_path("articles").get(list_articles).post(create_article); Router::with_path("articles/<id>") .get(show_article) .patch(edit_article) .delete(delete_article); 往往查看文章和文章列表是不需要用户登录的, 但是创建, 编辑, 删除文章等需要用户登录认证权限才可以. Salvo 中支持嵌套的路由系统可以很好地满足这种需求. 我们可以把不需要用户登录的路由写到一起: Router::with_path("articles") .get(list_articles) .push(Router::with_path("<id>").get(show_article)); 然后把需要用户登录的路由写到一起, 并且使用相应的中间件验证用户是否登录: Router::with_path("articles") .hoop(auth_check) .post(list_articles) .push(Router::with_path("<id>").patch(edit_article).delete(delete_article)); 虽然这两个路由都有这同样的 path("articles"), 然而它们依然可以被同时添加到同一个父路由, 所以最后的路由长成了这个样子: Router::new() .push( Router::with_path("articles") .get(list_articles) .push(Router::with_path("<id>").get(show_article)), ) .push( Router::with_path("articles") .hoop(auth_check) .post(list_articles) .push(Router::with_path("<id>").patch(edit_article).delete(delete_article)), ); <id>匹配了路径中的一个片段, 正常情况下文章的 id 只是一个数字, 这是我们可以使用正则表达式限制 id 的匹配规则, r"<id:/\d+/>". 还可以通过 <*> 或者 <**> 匹配所有剩余的路径片段. 为了代码易读性性强些, 也可以添加适合的名字, 让路径语义更清晰, 比如: <**file_path>. 有些用于匹配路径的正则表达式需要经常被使用, 可以将它事先注册, 比如 GUID: PathFilter::register_part_regex( "guid", Regex::new("[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}").unwrap(), ); 这样在需要路径匹配时就变得更简洁: Router::with_path("<id:guid>").get(index) 查看完整源码 文件上传 可以通过 Request 中的 file 异步获取上传的文件: #[fn_handler] async fn upload(req: &mut Request, res: &mut Response) { let file = req.file("file").await; if let Some(file) = file { let dest = format!("temp/{}", file.name().unwrap_or_else(|| "file".into())); if let Err(e) = std::fs::copy(&file.path, Path::new(&dest)) { res.set_status_code(StatusCode::INTERNAL_SERVER_ERROR); } else { res.render("Ok"); } } else { res.set_status_code(StatusCode::BAD_REQUEST); } } 更多示例 您可以从 examples 文件夹下查看更多示例代码, 您可以通过以下命令运行这些示例: cargo run --bin --example-basic_auth 您可以使用任何你想运行的示例名称替代这里的 basic_auth. 这里有一个真实的项目使用了 Salvo:https://github.com/driftluo/myblog. 🚀 性能 Benchmark 测试结果可以从这里查看: https://web-frameworks-benchmark.netlify.app/result?l=rust https://www.techempower.com/benchmarks/#section=test&runid=785f3715-0f93-443c-8de0-10dca9424049 github: https://github.com/salvo-rs/salvo

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

redis-cli —— PHP 编写的简单的 Redis 客户端

redis-cli 是 PHP 写的简单 Redis 客户端,精简指令方便使用。 简单操作redis的命令行工具 简单不用每次查文档 查看更直观 安装方法 clone项目代码: git clonehttps://github.com/wizarot/redis-cli.git 进入文件件: cd redis-cli 切换到当前最新版本tag: git checkout v1.0.0 使用composer安装依赖包: composer update 使用方法 启动: ./redis-cli 输入redis连接: host port (可以启用auth输入密码,如果有需要自己去src/RedisCommand.php -> connRedis() 修改 ) help 或者 随意输入别的,显示帮助列表 exit 或者 ctrl+D 退出 需要php安装redis扩展。如果实在没有那考虑自己引入pRedis bundle然后改一下 connRedis()函数就能用了,不会提issue,我抽空处理 特性 用ls列出当前数据key和对应数据类型 select 切换数据库,默认在 0 库 ls ?/* 支持通配符搜索key ttl key 查看生存时间 ttl key second 设定生存时间 persist key 设定生存时间为永久 mv name new_name 将key改名 rm key 删除key config 获取redis 配置信息 get key 获取值和对应信息(主要功能) set key 设置值/新增也可以,操作流程有待优化,但是已经可用

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

Prometheus 2.21.0-rc.0 发布,Go 编写的服务监控系统

Prometheus 2.21.0-rc.0 发布了,此版本使用 Go 1.15 构建,该版本弃用了TLS 证书验证中的X.509 CommonName。 新特性 Eureka SD:新的服务发现 Hetzner SD:新服务发现 Kubernetes SD:支持 Kubernetes EndpointSlices Scrape:新增scrape-config 目标限制 Bug fix PromQL:删除两个即时向量之间的布尔比较中的指标名称 Rules:检测规则文件中的其他字段 Rules:禁止在记录规则的“标签”部分覆盖指标名称 Rules:每次重新加载时都要保留评估时间戳 Scrape:重新加载时请勿停止 scrape TSDB:修复chunks.HeadReadWriter: maxt of the files are not seterror TSDB:自动删除块,以防止在删除过程中出现紧急情况/崩溃时损坏 Triton SD:修复当 triton_sd_config 为 nil 时的 panic UI:修复 react UI bug Web:即使连接过时也要停止 CMUX 和 GRPC 服务器,以防止服务器在 SIGTERM 上停止 更新说明:https://github.com/prometheus/prometheus/releases/tag/v2.21.0-rc.0

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

Eclipse Theia 1.0 发布,TypeScript 编写的云端和桌面 IDE 框架

Eclipse 基金会于近日推出 Eclipse Theia 1.0 稳定版,并宣称其为Visual Studio Code 的真正开源替代方案(a True Open Source Alternative to Visual Studio Code)。Theia 完全由非营利性且供应商中立的Eclipse 基金会主导,并由多元化社区进行开发,不会因单一供应商的决定而损害多元化社区的利益。 从上图的官网介绍可以看出,Theia 整合了云端 IDE 和桌面 IDE,这是一个可扩展的平台,包括开发者、组织机构和供应商在内的任何人都能够基于 Theia 使用最新的 Web 技术开发功能完备的多语言云端和桌面IDE。 当作为云端 IDE 时,Theia 会在两个独立的进程中运行,它们分别被称为前端和后端(对应的就是本地浏览器和远程服务器),彼此之间通过 WebSockets 的 JSON-RPC 消息或 HTTP 的 REST API 进行通信。而作为桌面 IDE,前端和后端均在本地运行。 官方提到Theia 可以作为 Visual Studio Code 的替代方案,因此其界面也和 Visual Studio Code 极为相似。更重要的是,Theia 原生支持 Visual Studio Code 扩展协议,也就是说我们可以在 Theia 上安装和重用 Visual Studio Code 扩展。 Theia 灵活的架构让它成为了一个可扩展、可调整的平台,使用者可以根据特定的用例以非常细粒度的方式对其进行深度定制,而无需为项目提交补丁或分叉项目。下图是 Arm 基于 Theia 进行定制开发的项目: Visual Studio Code 作为一个桌面终端应用,微软为各个平台提供了可用的二进制包,但希望替代它的Theia 却没有在官网提供下载链接。原因在于Theia 并不是一个最终产品,这也是为什么标题把它称作「IDE 框架」。你可以根据自己的需求基于Theia 构建和自定义一款属于你的 IDE。例如,假设你需要一个完全支持量子计算语言和对应工作流的 IDE,那就可以在Theia 的基础上增加扩展或移除不必要的模块,进而构建出一个功能完备的 IDE。或许这就是Theia 强调自己「真正开源」的原因。 本地体验 Theia 可以尝试这个用Electron 打包的桌面应用yangster-electron 在线体验 Eclipse Theia:https://gitpod.io/#https://github.com/eclipse-theia/theia

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

Prometheus 2.16.0-rc.1 发布,Go 编写的服务监控系统

Prometheus 2.16.0-rc.1 发布了,Prometheus 是一个 Go 语言开发的开源的服务监控系统和时间序列数据库。该版本引入了一些新特性,比如记录其他组件、增强功能和修复 bug,这些都是为了提高可用性。 更新内容如下: FEATURE React UI:在 /graph 上支持本地时区#6692 PromQL:添加 absent_over_time 查询功能#6490 将查询的可选日志记录添加到自己的文件中#6520 BUGFIX React UI:在旧版浏览器上的 fetch() 上发送 cookie#6553 React UI:对堆叠图采用 grafana flot 修复#6603 React UI:图形页面浏览器的历史记录已损坏,因此后退按钮可以按预期工作#6659 TSDB:确保已记录 compactionsSkipped 指标,如果从 head 返回一个错误,则记录正确的错误#6616 …… 更新说明:https://github.com/prometheus/prometheus/releases/tag/v2.16.0-rc.1

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

Prometheus 2.14.0-rc.0 发布,Go 编写的服务监控系统

Prometheus 2.14.0-rc.0 发布了,Prometheus 是一个 Go 语言开发的开源的服务监控系统和时间序列数据库。该版本引入了一些新特性,比如记录其他组件、增强功能和修复 bug,这些都是为了提高可用性。 更新内容如下: [SECURITY/BUGFIX] UI: 确保转义来自 API 的警告#6279 [FEATURE] API: 添加了/api/v1/status/runtimeinfo和/api/v1/status/buildinfo端点以供 React UI 使用#6243 [FEATURE] React UI: 实现新的基于 React 的实验性 UI#5694以及更多 可以在/new下找到 尚未实现所有页面 [FEATURE] Status: 基数统计信息已添加到“运行时和构建信息”页面#6125 [ENHANCEMENT/BUGFIX] 远程写入:修复压缩后远程写入的延迟#6021 [ENHANCEMENT] UI: 警报可以按状态过滤#5758 [BUGFIX] API: 未启用时,生命周期端点将返回 403#6057 [BUGFIX] Build: 修复 Solaris 构建#6149 [BUGFIX] Promtool: 在检查带有警报的规则文件时,删除错误的重复规则警告#6270 [BUGFIX] 远程写入:恢复在远程写入中使用重复数据删除记录器#6113 [BUGFIX] 远程写入:无法发送样本时不要重新分片#6111 [BUGFIX] Service discovery: 错误不再登录上下文取消#6116,#6133 [BUGFIX] UI: 正确处理 API 的空响应#6071 更新说明:https://github.com/prometheus/prometheus/releases/tag/v2.14.0-rc.0

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

Prometheus 2.13.0-rc.0 发布,Go 编写的服务监控系统

服务监控系统 Prometheus 2.13.0-rc.0 发布了,Prometheus 是一个 Go 语言开发的开源的服务监控系统和时间序列数据库。该版本引入了一些新特性,比如记录其他组件、增强功能和修复 bug,这些都是为了提高可用性。 更新内容如下: [变更] 指标:将 prometheus_sd_configs_failed_total 重命名为 prometheus_sd_failed_configs,并更改为仪表#5254 [增强] 服务发现:为 kubernetes 添加新的节点地址类型#5902 [增强] UI:如果查询返回了一些警告,则显示警告#5964 [增强] 远程写:减少系列缓存的内存使用量#5849 [增强] 远程读取:使用远程读取流传输以减少内存使用量#5703 [增强] 指标:添加了将远程最大/最小/所需分片写入队列管理器的指标#5787 [增强] Promtool:在标签查询期间显示警告#5924 [增强] Promtool:改进了解析错误规则时的错误消息#5965 [增强] Promtool:更多提示规则#5515 [BUGFIX] Promtool:修复了由于标签重复而导致记录不一致的问题#6026 [BUGFIX] UI:从不健康的目标访问时,修复了服务发现视图#5915 [BUGFIX] 指标格式:输入短时 OpenMetrics 解析器崩溃#5939 [BUGFIX] UI:避免截断 Y 轴值#6014 更新说明及下载地址

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

我们在编写python代码时应该注意那几件事 !

前言在编程过程中,多了解语言周边的一些知识,以及一些技巧,可以让你加速成为一个优秀的程序员。 对于Python程序员,你需要注意一下本文所提到的这些事情。 你也可以看看Zen of Python(Python之禅),这里面提到了一些注意事项,并配以示例,可以帮助你快速提高。 1. 漂亮胜于丑陋实现一个功能:读取一列数据,只返回偶数并除以2。下面的代码,哪个更好一些呢? halve_evens_only = lambda nums: map(lambda i: i/2, filter(lambda i: not i%2, nums)) VS def halve_evens_only(nums): return [i/2 for i in nums if not i % 2] 2. 记住Python中非常简单的事情 # 交换两个变量 a, b = b, a # 切片(slice)操作符中的step参数。(切片操作符在python中的原型是[start:stop:step],即:[开始索引:结束索引:步长值]) a = [1,2,3,4,5] >>> a[::2] # 遍历列表中增量为2的数据 [1,3,5] # 特殊情况下,`x[::-1]`是实现x逆序的实用的方式 >>> a[::-1] [5,4,3,2,1] # 逆序并切片 >>> x[::-1] [5, 4, 3, 2, 1] >>> x[::-2] [5, 3, 1] 3. 不要使用可变对象作为默认值 def function(x, l=[]): #不要这样 def function(x, l=None): # 好的方式 if l is None: l = [] 这是因为当def声明被执行时,默认参数总是被评估。 使用iteritems而不是items 使用generators ,因此当通过非常大的列表进行迭代时,iteritems 更好一些。 d = {1: "1", 2: "2", 3: "3"} for key, val in d.items() # 当调用时构建完整的列表 for key, val in d.iteritems() # 当请求时只调用值 5. 使用isinstance ,而不是type # 不要这样做 if type(s) == type(""): ... if type(seq) == list or \ type(seq) == tuple: ... # 应该这样 if isinstance(s, basestring): ... if isinstance(seq, (list, tuple)): ... 注意我使用的是basestring 而不是str,因为如果一个unicode对象是字符串的话,可能会试图进行检查。例如: >>> a=u'aaaa' >>> print isinstance(a, basestring) True >>> print isinstance(a, str) False``` 这是因为在Python 3.0以下版本中,有两个字符串类型str 和unicode。 **6. 了解各种容器** Python有各种容器数据类型,在特定的情况下,相比内置容器(如list 和dict ),这是更好的选择。 我敢肯定,大部分人不使用它。我身边一些粗心大意的人,一些可能会用下面的方式来写代码。 freqs = {}for c in "abracadabra": try: freqs[c] += 1 except: freqs[c] = 1``` 也有人会说下面是一个更好的解决方案: freqs = {} for c in "abracadabra": freqs[c] = freqs.get(c, 0) + 1 更确切来说,应该使用collection 类型defaultdict。 from collections import defaultdict freqs = defaultdict(int) for c in "abracadabra": freqs[c] += 1 其他容器: namedtuple() # 工厂函数,用于创建带命名字段的元组子类 deque # 类似列表的容器,允许任意端快速附加和取出 Counter # dict子类,用于哈希对象计数 OrderedDict # dict子类,用于存储添加的命令记录 defaultdict # dict子类,用于调用工厂函数,以补充缺失的值 学习从来不是一个人的事情,要有个相互监督的伙伴,工作需要学习python或者有兴趣学习python的伙伴可以私信回复小编“学习”或者评论,留言,点赞 领取全套免费python学习资料、视频()装包 7. Python中创建类的魔术方法(magic methods) __eq__(self, other) # 定义 == 运算符的行为 __ne__(self, other) # 定义 != 运算符的行为 __lt__(self, other) # 定义 < 运算符的行为 __gt__(self, other) # 定义 > 运算符的行为 __le__(self, other) # 定义 <= 运算符的行为 __ge__(self, other) # 定义 >= 运算符的行为 8. 必要时使用Ellipsis(省略号“...”) Ellipsis 是用来对高维数据结构进行切片的。作为切片(:)插入,来扩展多维切片到所有的维度。例如: >>> from numpy import arange >>> a = arange(16).reshape(2,2,2,2) # 现在,有了一个4维矩阵2x2x2x2,如果选择4维矩阵中所有的首元素,你可以使用ellipsis符号。 >>> a[..., 0].flatten() array([ 0, 2, 4, 6, 8, 10, 12, 14]) # 这相当于 >>> a[:,:,:,0].flatten() array([ 0, 2, 4, 6, 8, 10, 12, 14])

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

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

用户登录
用户注册