首页 文章 精选 留言 我的

精选列表

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

Bun v0.6.0 发布,Zig 编写的 JavaScript 运行时

根据官方说法,Bun 0.6.0 版本是迄今为止 Bun 最大的一个更新版本。 最新版本的 Bun 现在有一个内置的 JavaScript 和 TypeScript 捆绑器和简化器,可以用它来捆绑前端应用程序或将你的代码捆绑成一个独立的可执行文件。 Bun 0.6.0 也一直在忙着提高性能和修复 bug:writeFile()在 Linux 上的速度提高了 20%、对Node.js 兼容性和 Web API 兼容性进行了大量的 bug 修复、支持 TypeScript 5.0 语法,并对bun install进行了各种修复。 新的 JavaScript bundler & minifier 这个版本的重点是 Bun 的新 JavaScript Bundler(捆绑器),但捆绑器只是一个更大项目的开始。在接下来的几个月里,Bun 将发布Bun.App—— 一个 "超级 API",将 Bun 的 native-speed 捆绑器、HTTP 服务器和文件系统路由缝合成一个整体。 可以使用bun build CLI 命令或新的Bun.build() JavaScript API 来使用。 JavaScript Bun.build({ entrypoints: ["./src/index.tsx"], outdir: "./build", minify: true, // ... }); CLI bun build ./src/index.tsx --outdir ./build --minify 独立的可执行文件 现在你可以用bun build来创建独立的可执行文件。 bun build --compile ./foo.ts 这让你可以将你的应用程序作为一个可执行文件发布,而不需要用户安装 Bun。 你也可以将其缩小,以提高大型应用程序的启动性能: bun build --minify --compile ./three.ts [32ms] minify -123 KB (estimate) [50ms] bundle 456 modules [107ms] compile three 这是由 Bun 的新 JavaScript 捆绑器和简化器提供的。 import.meta.main 现在你可以使用import.meta.main来检查当前文件是否是启动 Bun 的入口点。这对 CLI 很有用,可以确定当前文件是否是启动应用程序的。 例如,如果你有一个名为index.ts的文件: index.ts console.log(import.meta.main); 然后你运行它: $ bun ./index.ts true 但如果你导入它: import "./index.ts"; 并运行它: $ bun ./other.ts false 对bun test的改进 bun test现在报告运行测试的时间 describe.skip已经实现 实现了expect().toBeEven()和expect().toBeOdd() 在 Linux 上实现更快的 fs.writeFile fs.writeFile 在 Linux 上处理大文件的速度提高了 20% 转译器改进 这个版本还引入了许多对转译器的改进。以下是其中的一些亮点: 解析器支持 TypeScript 5.0。 解析器支持导入属性。 一些 npm 包出现了 ReferenceError: Cannot access uninitialized variable 的错误,这是由于 Bun 的转译器中存在循环导入的错误。这一点已被修复。 支持// @jsx、// @jsxImportSource和// @jsxFragment注释 …… 更多详情可查看:https://bun.sh/blog/bun-v0.6.0

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

Gleam v0.27 发布,Rust 编写的函数式编程语言

Gleam 是一种类型安全且可扩展的编程语言,可用于 Erlang 虚拟机和 JavaScript 运行时。 最新发布的 0.27 包含以下变化: 支持在use表达式(useexpressions)中使用模式 Gleamv0.25引入了use表达式,该功能有助于避免 Gleam 程序中的“回调地狱 (callback hell)”。它非常强大,可用于模拟其他语言中的许多功能,例如提前返回、列表推导 (list comprehensions)、async/await、monadic do 语法等等! pub fn handle(req: Request) -> Response { // Return an error for non-post requests use <- when(req.method != Post, return: method_not_allowed) // Parse the request body or return an error use json <- require_json_body(req) // Open a database connection, closing it when we're done use conn <- database.with_connection case database.insert(conn, json) { Ok(record) -> created_response(record) Error(err) -> bad_request_response(err) } } 表达式的一个限制use是模式不能用于它们的赋值,只能用于裸变量。这意味着您不能用它们解构元组或其他数据结构。从这个版本开始,表达式中现在支持模式use,以满足所有解构需求。 use #(first, second) <- some_tuple_function() 引入panic关键字 case this_should_never_fail() { Ok(value) -> continue(value) // Oh no! Something went horribly wrong! Error(_) -> panic } 优化断言 Gleam 的assert关键字用于确保数据匹配给定的模式,如果不匹配则程序崩溃。这很有用,但是用于assert此功能意味无法拥有assert与布尔表达式一起使用的功能,而这在其他语言中很常见。 为了解决这个问题,模式匹配功能已移至let assert语法。现有assert关键字已被弃用,稍后将用于更传统的断言功能,成为基于改进测试 Gleam 代码的人体工程学的更大 Gleam 里程碑的一部分。 let assert Ok(value) = this_should_never_fail() 详情查看发布公告。

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

Gleam v0.26 发布,Rust 编写的函数式编程语言

Gleam 是一种类型安全且可扩展的编程语言,可用于 Erlang 虚拟机和 JavaScript 运行时。 最近发布的 0.26 版本引入了增量编译。该项特性改进了构建工具,仅在必要的情况下编译所需模块,而不是整个包,从而显著提升 Gleam 编译器性能。 下面是官方提供的性能测试数据,参照对象上一个版本的 Gleam。 Erlang Benchmark 1: v0.25 Time (mean ± σ): 18.443 s ± 0.949 s [User: 18.458 s, System: 2.995 s] Range (min … max): 17.102 s … 19.968 s 10 runs Benchmark 2: v0.26 Time (mean ± σ): 140.8 ms ± 3.9 ms [User: 92.5 ms, System: 46.4 ms] Range (min … max): 138.0 ms … 156.1 ms 20 runs Summary 'v0.26' ran 130.99 ± 7.67 times faster than 'v0.25' JavaScript Benchmark 1: v0.25 Time (mean ± σ): 1.861 s ± 0.026 s [User: 1.543 s, System: 0.299 s] Range (min … max): 1.833 s … 1.927 s 10 runs Benchmark 2: v0.26 Time (mean ± σ): 145.3 ms ± 2.9 ms [User: 92.9 ms, System: 50.8 ms] Range (min … max): 141.4 ms … 154.3 ms 20 runs Summary 'v0.26' ran 12.81 ± 0.31 times faster than 'v0.25' Gleam 团队表示,下一步将继续改进编译器 IR 的效率、实现更精确的缓存失效策略、以及多线程编译。 此版本另一项值得关注的变化是支持在 Deno 运行时上运行。团队表示,Deno 在许多方面与 Node.js 相似,但它更符合 Web 标准 API,具有更好的安全性和流畅的开发者体验。 name = "my_project" version = "1.0.0" [javascript] runtime = "deno" 详情查看发布公告。

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

Gleam v0.25 发布,Rust 编写的函数式编程语言

Gleam 是一种类型安全且可扩展的编程语言,可用于 Erlang 虚拟机和 JavaScript 运行时。 最近发布的 0.25 版本引入了一项期待已久的新特性:use表达式(useexpressions)。 官方介绍称,use表达式是一种语法糖,它将所有后续表达式转换为一个匿名函数,该函数作为附加参数传递给函数调用。 例如,假设有一个待调用的函数with_file,它会打开一个文件,将打开的文件传递给给定的函数,以便它可以读取或写入它,然后关闭文件。 // Define the function pub fn with_file(path, handler) { let file = open(path) handler(file) close(file) } // Use it pub fn main() { with_file("pokemon.txt", fn(file) { write(file, "Oddish\n") write(file, "Farfetch'd\n") }) } 通过使用use,此函数可以在没有额外缩进的情况下调用。下面使用use的示例会编译成与上面完全相同的代码。 pub fn main() { use file <- with_file("pokemon.txt") write(file, "Oddish\n") write(file, "Farfetch'd\n") } 而且它不仅限于单个参数,还可以使用任何参数的函数,包括不接受任何参数的函数。 发布公告 | Release Notes

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

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 设置值/新增也可以,操作流程有待优化,但是已经可用

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

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

Apache Tomcat

Apache Tomcat

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Sublime Text

Sublime Text

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