From 9158ecac76bc7cd97e60ca86b1bb1b99a74cbed5 Mon Sep 17 00:00:00 2001 From: JQiue <861947542@qq.com> Date: Wed, 27 Mar 2024 17:57:17 +0800 Subject: [PATCH] 2024-03-27 17:57:17 --- docs/rust/performance.md | 10 +++ docs/sundry/coking.md | 52 +++++++++++++++ docs/sundry/digital-creative-skills.md | 44 ++++++++++++- docs/sundry/ffmpeg.md | 55 ++++++++++++++++ docs/sundry/meilisearch.md | 2 +- docs/sundry/node.md | 23 ++++++- docs/sundry/prisma.md | 90 ++++++++++++++++++++++++++ docs/webapi/network.md | 19 +++++- 8 files changed, 290 insertions(+), 5 deletions(-) create mode 100644 docs/sundry/coking.md create mode 100644 docs/sundry/ffmpeg.md create mode 100644 docs/sundry/prisma.md diff --git a/docs/rust/performance.md b/docs/rust/performance.md index 7ae15dac..4db6ed59 100644 --- a/docs/rust/performance.md +++ b/docs/rust/performance.md @@ -124,6 +124,16 @@ opt-level = "s" # 优化二进制大小,可以有多个选项,在平衡中 如果想分析 crate 占用大小,可以安装`cargo install cargo-bloat --no-default-features`,然后使用`cargo bloat --release --crates`进行构建就会分析每个依赖占用的大小 +### 使用 cargo-wizard 自动配置 Cargo 项目 + +Cargo 子命令 cargo-wizard,它简化了 Cargo 项目的配置,以实现最大的运行时性能、最快的编译时间或最小的二进制大小 + +```sh +cargo install cargo-wizard +``` + +项目中使用`cargo wizard`快速配置 + ## 参考资料 + [Rust 性能手册](https://blues-star.github.io/perf-book-zh/title-page.html) diff --git a/docs/sundry/coking.md b/docs/sundry/coking.md new file mode 100644 index 00000000..5b645aa6 --- /dev/null +++ b/docs/sundry/coking.md @@ -0,0 +1,52 @@ +--- +title: 厨艺 +category: 知识分享 +article: false +--- + +## 刀具 + +### 中式 + +推荐"十八子作专业版桑刀" + +### 西式 + +推荐"具良治 Global G-2" + +### 日式 + +推荐“具良治 Global G-81” + +### 斩骨刀 + +推荐“十八子作全尺寸款” + +### 水果刀 + +推荐“具良治 Global GS-36/GS-7” + +## 蛋 + +### 鸡蛋 + +煮鸡蛋: + +1. 鸡蛋一定要冷藏 +2. 煮鸡蛋时更推荐蒸,或者转小火,亦或者半煮半蒸 +3. 一定是水开再下锅 +4. 5 分钟是流心蛋,8 分钟是溏心蛋,11 分钟是全熟蛋 + +镜面鸡蛋羹: + +1. 蛋水比 1:2,1.5 克盐 +2. 使用陶瓷碗 +3. 冷水下锅,锅盖留缝 +4. 中大火预热,上汽后转小火,15 分钟后直接出锅 + +蜂窝鸡蛋羹: + +1. 蛋水比 1:1.2 +2. 使用金属碗 +3. 上汽后再放入鸡蛋 +4. 盖上锅盖,全程大火 10 分钟 diff --git a/docs/sundry/digital-creative-skills.md b/docs/sundry/digital-creative-skills.md index 6711a245..e824fea3 100644 --- a/docs/sundry/digital-creative-skills.md +++ b/docs/sundry/digital-creative-skills.md @@ -37,13 +37,19 @@ article: false + 色彩排序:也可以根据单元格的颜色进行排序,前提是必须上色 + 切片器:可以更加直观的筛选数据 + 条件格式:可以根据筛选条件来格式化单元格样式,必须选择所有列或行 -+ 根据生日计算年龄:公式“=DATEDIF([@生日], "2017/1/1", "y")” ++ 根据生日计算年龄:公式“=DATEDIF([@生日], "2017/1/1", "y")” + 水平垂直居中打印:文件-打印-页面设置-页边距 ### Word + 视图:视图 -> 大纲,可以查看 Word 中的所有细节,非常利于调试格式 +页码从第二张开始: + +1. 添加分节符到第一张 +2. 添加页码到第二节第一张 +3. 取消链接上一节 + ### PPT + 当你保存你的 ppt 时,用后缀`.pps`或`.ppsx`,那样的话,打开时会直接进入幻灯片播放模式。不仅节省时间,还看起来十分专业 @@ -74,7 +80,41 @@ article: false + 端点 + 折角 -## blender +### Adobe Premiere + +界面的各种功能区域: + ++ 项目面板 - 管理您的视频、音频、图像等素材文件 ++ 时间线 - 在这里编排和剪辑您的视频片段 ++ 预览窗口 - 可以实时预览您的编辑成果 ++ 工具箱 - 包含各种编辑和特效工具 + +先做什么: + +1. 新建序列,设置帧大小,像素长宽比,可以参考 HDV 预设进行修改,然后保存为自定义 +2. 导入素材到项目 + +将视频片段拖放到时间线上: + +1. 在项目面板中找到您想要用到的视频文件 +2. 单击并按住视频文件,将其拖拽到时间线的相应轨道上 +3. 松开鼠标,视频片段就会被添加到时间线上了 + +对视频进行裁剪和分割: + +1. 在时间线上找到您需要裁剪的视频片段 +2. 将播放头移动到想要裁剪的位置 +3. 点击"修剪"工具,然后拖动左右两侧的边缘进行裁剪 +4. 如果需要分割视频,可以在想要分割的位置点击"分割"工具,将视频分成两段 + +添加转场特效: + +1. 在时间线上找到两个相邻的视频片段 +2. 在它们之间的空白区域右键单击,选择"添加转场" +3. 在弹出的转场库中选择您喜欢的转场效果 +4. 拖动转场效果到两个片段之间,即可应用转场 + +## Blender ## 其他 diff --git a/docs/sundry/ffmpeg.md b/docs/sundry/ffmpeg.md new file mode 100644 index 00000000..604ed91a --- /dev/null +++ b/docs/sundry/ffmpeg.md @@ -0,0 +1,55 @@ +--- +title: FFmpeg +category: 知识分享 +article: false +--- + +## 转换视频格式 + +### 无损转换 + +无损转换保留原始文件的质量,不会降低视频和音频的质量,一般使用 FFmpeg 的 copy 模式进行无损转换 + +```sh +ffmpeg -i input.avi -c copy output.avi +``` + +该命令会直接复制输入文件的编解码器和容器格式,生成一个完全相同的输出文件 + +### 有损转换 + +有损转换会降低视频和音频的质量,但可以减小输出文件的大小。FFmpeg 支持使用各种编解码器进行有损转换,例如 H.264、VP9 等。一般使用 FFmpeg 的`-c:v`和`-c:a`选项指定视频和音频的编解码器 + +```sh +ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4 +``` + +该命令会使用 H.264 编码视频,AAC 编码音频,转换成 MP4 容器格式,可以通过调整编解码器的参数来平衡质量和文件大小 + +码率 (bitrate): + ++ 提高码率可以提高视频质量,但会增大文件大小 ++ 降低码率可以减小文件大小,但会降低质量 ++ 常用参数: -b:v 2000k 设置视频码率为 2Mbps + +分辨率 (resolution): + ++ 降低分辨率可以大幅减小文件大小,但会降低视觉质量 ++ 常用参数: -vf scale=1280:720 设置分辨率为 1280x720 + +帧率 (framerate): + ++ 降低帧率可以减小文件大小,但会使视频看起来更"卡顿" ++ 常用参数: -r 30 设置帧率为 30fps + +CRF (Constant Rate Factor): + ++ CRF 是一种基于质量的恒定码率模式,范围从 0 到 51,0 表示无损 ++ 较低的 CRF 值会得到更高质量但更大文件的视频 ++ 常用参数: -crf 28 设置 CRF 为 28 + +编码模式 (preset): + ++ FFmpeg 提供了一系列预设编码模式,从"ultrafast"到"veryslow"不等 ++ "ultrafast"模式编码速度快,但质量较低;"veryslow"模式质量高,但编码速度慢 ++ 常用参数: -preset medium 设置编码模式为 medium diff --git a/docs/sundry/meilisearch.md b/docs/sundry/meilisearch.md index ff254fb2..3e2ef139 100644 --- a/docs/sundry/meilisearch.md +++ b/docs/sundry/meilisearch.md @@ -59,7 +59,7 @@ export MEILI_MASTER_KEY="Master Key" docker run -t --rm \ --network=host \ -e MEILISEARCH_HOST_URL='http://localhost:7700' \ - -e MEILISEARCH_API_KEY='root' \ + -e MEILISEARCH_API_KEY=$MEILI_MASTER_KEY \ -v /root/crawl/meilisearch.json:/docs-scraper/config.json \ getmeili/docs-scraper:latest pipenv run ./docs_scraper config.json ``` diff --git a/docs/sundry/node.md b/docs/sundry/node.md index 1574d1ce..9f9f7ddb 100644 --- a/docs/sundry/node.md +++ b/docs/sundry/node.md @@ -309,7 +309,9 @@ package-lock.json 是在使用`npm install`时生成的文件,记录包的来 NPM 包的版本号借鉴了[https://semver.org/](https://semver.org/) -可以将自己写的包上传到官方仓库,供给其他人下载使用,首先拥有一个[NPM](https://www.npmjs.com) 官方账号是必须的,如果是第一次使用则用`npm adduser`注册一个账户,成功后就会以该账户进行登录,如果不是第一次则使用`npm login`登录账户,输入账户和密码进行登录,登陆成功后使用`npm publish`命令发布包 +### 发布 NPM 包 + +可以将自己写的包上传到官方仓库,供给其他人下载使用,首先拥有一个[NPM](https://www.npmjs.com) 官方账号是必须的,如果是第一次使用则用`npm adduser`注册一个账户,成功后就会以该账户进行登录,如果不是第一次则使用`npm login`登录账户,登陆成功后使用`npm publish`命令发布包 ::: tip 在发布前,最好检查一下源地址,必须是官方源地址 @@ -329,6 +331,25 @@ NPM 包的版本号借鉴了[https://semver.org/](https://semver.org/) + `npm version minor` - 升级小版本号 + `npm version patch` - 升级补丁版本号 +发布一个纯 ESM 包,需要做以下几件事: + +1. 添加`"type": "module"`到 package.json:node 会使用 esm 加载器运行,默认是 cjs +2. 使用`"exports": "./index.js"`替换`"main": "index.js"`:限制 esm 的导出范围,防止隐式导入 +3. 添加`"engines"`字段限制 node 运行版本号 +4. 删除`use strict`:esm 不需要这个严格声明 +5. 将代码中所有的 cjs 导入导出替换为 esm 导入导出 +6. 使用完整的相对文件路径引入文件,文件名和扩展名 +7. 使用`node:*`协议导入 node 内置模块:防止混淆,明确告诉 node 导入一个内置的模块 + +如果是 typescript 发布一个纯 esm 包,则和上大致相同: + +1. 如上 +2. 如上 +3. 如上 +4. 如上 +5. 删除`namespace`并使用`export` +6. 更改`tsconfig.json`中编译目标位 es,即`module: "es2020"` + ## NPX NPX 是自带的包命令执行工具,常用来执行可执行命令,使用`npx command`会自动在`node_modules`中正确的找到命令并执行 diff --git a/docs/sundry/prisma.md b/docs/sundry/prisma.md new file mode 100644 index 00000000..5a4d5d7d --- /dev/null +++ b/docs/sundry/prisma.md @@ -0,0 +1,90 @@ +--- +title: Prisma +category: 知识分享 +article: false +--- + +Prisma 是一款非常流行的开源 ORM 工具,它可以让开发者以更简单,安全和高效的方式与数据库进行交互。Prisma 提供了一种声明式的方式来定义数据模型,可以自动生成数据库迁移脚本。Prisma 客户端是一个类型安全的数据库访问层,可以用来查询、插入、更新和删除数据。Prisma 支持多种数据库,包括 PostgreSQL、MySQL、SQLite、SQL Server 和 MongoDB + +## 新的项目 + +### 定义数据源 + +```prisma +datasource db { + provider = "sqlite" + url = env("DATABASE_URL") +} +``` + +```env +DATABASE_URL="file:./dev.db" +``` + +### 数据迁移 + +```prisma +model Post { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + title String @db.VarChar(255) + content String? + published Boolean @default(false) + author User @relation(fields: [authorId], references: [id]) + authorId Int +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + user User @relation(fields: [userId], references: [id]) + userId Int @unique +} + +model User { + id Int @id @default(autoincrement()) + email String @unique + name String? + posts Post[] + profile Profile? +} +``` + +执行 cli 命令,它会做两件事: + +1. 从 scheme 创建新的 SQL 迁移文件 +2. 为数据库运行 SQL 迁移文件 + +```sh +npx prisma migrate dev --name init +``` + +### 生成客户端 + +## 已有项目 + +### 连接数据库 + +```prisma +datasource db { + provider = "sqlite" + url = env("DATABASE_URL") +} +``` + +```env +DATABASE_URL="file:./dev.db" +``` + +### 生成数据模型 + +`npx prisma db pull` + +此命令读取在数据库中定义的环境变量并连接到数据库。一旦建立连接,它就会内省数据库(即读取数据库模式)。然后,它将数据库架构从 SQL 转换为 Prisma 架构中的数据模型 + +## 操作数据库 + +## Prisma Studio + +Prisma Studio 是数据库中数据的可视化编辑器。 在终端中运行`npx prisma studio` diff --git a/docs/webapi/network.md b/docs/webapi/network.md index 217389ed..271ae91c 100644 --- a/docs/webapi/network.md +++ b/docs/webapi/network.md @@ -344,7 +344,24 @@ document.getElementById('close').addEventListener('click', function () { ## 文件上传 - +```js +async function uploadFile(file, startByte = 0) { + const fileName = file.name; + const fileSize = file.size; + const response = await fetch('/upload', { + method: 'POST', + headers: { + 'Content-Type': 'application/octet-stream', + }, + body: file + }); + if (response.ok) { + console.log('File uploaded successfully'); + } else { + console.error('Error uploading file:', response.status); + } +} +``` ## 跨源策略