跳到主要内容

常用 SQL 语句

· 阅读需 3 分钟
素明诚
Full stack development

数据查询语言(DQL)​

SQL 语句类型用途注意事项
SELECTDQL查询表中的数据使用合适的索引优化查询效率

数据操作语言 (DML)​

SQL 语句类型用途注意事项
INSERTDML插入新的数据记录到表中确认数据的完整性和准确性
UPDATEDML修改表中的数据记录尽量使用主键进行更新,避免全表扫描
DELETEDML从表中删除数据记录使用事务处理,确保不会误删除重要数据

3. 数据定义语言 (DDL)​

SQL 语句类型用途注意事项
CREATE TABLEDDL创建新的表设计时考虑未来可能的扩展
ALTER TABLEDDL修改现有的表结构在低峰时段进行,以减少对业务的影响
DROP TABLEDDL删除表确保已备份重要数据
CREATE INDEXDDL在表的一列或多列上创建索引创建索引可以提高查询效率,但可能降低更新速度
DROP INDEXDDL删除索引考虑索引的使用情况,避免删除重要索引
CREATE DATABASEDDL创建新的数据库确保数据库配置符合需求
DROP DATABASEDDL删除数据库预先备份所有重要数据

4.数据控制语言(DCL)​

SQL 语句类型用途注意事项
GRANTDCL给用户赋予权限确保只授予必要的最小权限
REVOKEDCL移除用户的权限定期审查权限,确保安全性

5.事务控制语言(TCL)​

SQL 语句类型用途注意事项
BEGIN TRANSACTIONTCL开始一个新的事务确保事务中的操作逻辑一致
COMMITTCL提交事务,保存所有修改避免长事务,以减少锁定资源的时间
ROLLBACKTCL回滚事务,撤销所有修改适时回滚,防止错误扩散

通用 SQL 语句​

SQL 语句用途注意事项
JOIN在查询中关联两个或多个表使用适当的 JOIN 类型,优化关联查询的性能
GROUP BY在查询中按某列或条件分组数据配合聚合函数使用,合理索引可以优化查询速度
ORDER BY对查询结果进行排序尽量在有索引的列上进行排序
WHERE在查询中根据条件过滤数据使用索引优化过滤,减少全表扫描
HAVING在 GROUP BY 查询中根据条件过滤分组通常与聚合函数一起使用,注意性能影响

Nextjs SSR SSG ISR 理解

· 阅读需 4 分钟
素明诚
Full stack development

Next.js 提供了几种预渲染技术,包括服务器端渲染(SSR)、静态站点生成(SSG)和增量静态再生(ISR)。这些技术是现代 web 开发中提高性能、SEO 和用户体验的关键。

服务器端渲染(SSR) - Server Side Rendering​

定义​

SSR 是一种预渲染技术,其中页面的 HTML 是每次请求时在服务器上生成的。这意味着每当用户请求页面时,服务器都会实时生成 HTML,包括所有预先获取的数据。

说明​

服务器端渲染特别适合于内容经常变动的应用。由于内容在服务器上即时生成,因此用户总是看到最新的页面数据。这种方式对搜索引擎优化(SEO)也非常有利,因为搜索引擎抓取器抓取的是已经预渲染好的页面。

示例​

在 Next.js 中使用 getServerSideProps 函数来获取数据,并在请求时实时渲染页面。

// pages/index.js
export async function getServerSideProps(context) {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
​
return { props: { data } };
}
​
function HomePage({ data }) {
return <div>Welcome to the page! Data: {data.content}</div>;
}
​
export default HomePage;

应用场景​

  • 实时新闻网站
  • 股票市场数据页面
  • 社交媒体的动态更新页面

静态站点生成(SSG) - Static Site Generation​

定义​

SSG 是指在构建时生成所有必需页面的 HTML 的过程。构建完成后,每个页面都是一个静态文件,可以直接从 CDN 服务。

说明​

静态站点生成适用于内容变化不频繁的页面,这种方式可以极大地提高网站的加载速度,因为静态文件可以从最接近用户的服务器快速提供。

示例​

使用 getStaticProps 来预先获取数据,并在构建时生成静态页面。

// pages/about.js
export async function getStaticProps() {
const res = await fetch('https://api.example.com/info');
const info = await res.json();
​
return { props: { info } };
}
​
function AboutPage({ info }) {
return <div>About us: {info.description}</div>;
}
​
export default AboutPage;

应用场景​

  • 博客
  • 文档网站
  • 企业营销网站

增量静态再生(ISR) - Incremental Static Regeneration​

定义​

ISR 是 Next.js 特有的一种混合渲染模式,它允许开发者为每个页面设置一个“再生”时间,用于定期更新静态内容。

说明​

这种方法结合了 SSG 的性能优势和 SSR 的灵活性,页面在用户访问时不会立即生成,但可以在背景中定期更新,以确保内容的新鲜度。

示例​

在 getStaticProps 中使用 revalidate 选项,来设定页面的再生时间。

// pages/products.js
export async function getStaticProps() {
const res = await fetch('https://api.example.com/products');
const products = await res.json();
​
return {
props: { products },
revalidate: 3600, // 页面每小时重新生成一次
};
}
​
function ProductsPage({ products }) {
return <div>{products.map(product => <div key={product.id}>{product.name}</div>)}</div>;
}
​
export default ProductsPage;

应用场景​

  • 电子商务网站上的产品列表
  • 需要定期更新但不需要秒级更新的新闻文章

对比​

特性 / 技术SSRSSGISR
生成时机每次请求时构建时构建时,定期再生
内容更新实时构建后不更新定期更新
性能中等,依赖服务器性能极高,直接从 CDN 服务高,静态文件,定期更新
适用场景动态内容网站静态内容网站静态和动态混合内容网站
SEO 优势高高高
开发复杂度高低中

这三种技术各有优势和特定的适用场景,选择合适的渲染方法可以极大提升应用的性能和用户体验。

如果您喜欢这篇文章,不妨给它点个赞并收藏,感谢您的支持!

JS 属性描述符Property Descriptors

· 阅读需 2 分钟
素明诚
Full stack development

属性描述符作用​

writable​

作用:控制属性值是否可以被修改。

重要性:在某些情况下,你可能希望对象的某个属性一旦创建后就保持不变,比如常量或配置项。通过将writable设为false,可以确保属性值不会被意外修改,增加了代码的稳定性和可预测性。

enumerable​

作用:控制属性是否可以在 for...in 循环或通过Object.keys()方法遍历到。

重要性:有时候你可能不希望某些内部属性或方法被枚举。例如,对象可能有一些内部状态或辅助函数,这些不应该暴露给对象外部的使用者。通过将enumerable设为false,可以控制对象属性的可见性和访问性,提升了对象的封装性。

configurable​

作用:控制属性是否可以被删除或改变其属性描述符。

重要性:一旦一个属性被定义为不可配置(configurable: false),那么它就不能被删除,其enumerable、configurable和writable特性也不能再被修改。这对于定义那些不应该被改变的核心属性特别有用,保证了对象接口的稳定性和安全性。

存取描述符​

get一个给属性提供 getter 的方法,当访问该属性时会调用此方法。该方法返回值被用作属性的值。

set一个给属性提供 setter 的方法,当属性值被修改时会调用此方法,并传入新的值。

使用 Object.defineProperty()修改属性描述符​

可以使用Object.defineProperty()方法来定义或修改对象属性并指定其属性描述符

const obj = {};
​
Object.defineProperty(obj, 'property1', {
value: 42,
writable: false,
enumerable: true,
configurable: true
});
​
console.log(obj.property1); // 42
// obj.property1的值现在不能被修改,因为writable为false

数据存储的基本单位

· 阅读需 2 分钟
素明诚
Full stack development

使用 Markdown 表格模拟的示例,更直观地理解这些单位之间的关系​

  • 位(bit): 是计算机内存中的最小数据单位。每个位的值只能是 0 或 1。
  • 字节(Byte): 1 字节 = 8 位。字节是计算机处理数据的基本单位之一,通常用来表示一个字符,例如,'A' 或 '0'。
  • 千字节(KB,Kilobyte): 1KB = 1024 字节。在数据存储中,KB 通常用来衡量文件大小或者数据传输的量。
  • 位(b): 与“位(bit)”相同,只是表示方法不同,都是指计算机数据的最小单位。

假设每个格子代表一个位(bit/b),那么 8 个格子组成一个字节(Byte)。这里是一个简化的视图

| bit  | bit  | bit  | bit  | bit  | bit  | bit  | bit  |
|------|------|------|------|------|------|------|------|
| 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | <- 一个字节(Byte)的示例

这个例子中,一个字节(Byte)由 8 个位(bit)组成,每个位的值可以是 0 或 1。因此,一个字节可以表示 2^8=256 种不同的状态,从 00000000 到 11111111。

进一步扩展,如果我们将这样的 1024 个字节串联起来,就构成了 1 千字节(KB)。因为直接在表格中展示 1024 个字节(即 8,192 个位)非常不实际,所以这里用文字描述

常见字符大小​

类型示例编码格式大致占用字节数
英语字符AASCII1 字节
汉字中UTF-83 字节
Emoji 表情UTF-84 字节

如果您喜欢这篇文章,不妨给它点个赞并收藏,感谢您的支持!

认证和授权的区别

· 阅读需 2 分钟
素明诚
Full stack development

认证(Authentication)​

认证是指验证用户或系统的身份。这是一个确认“你是谁”的过程,确保用户或系统是他们声称的那个人或那个实体。常见的认证方式包括用户名和密码、数字证书、双因素认证(2FA)等。简单来说,认证过程就是确定用户的身份。

授权(Authorization)​

授权发生在认证之后,是指一旦用户的身份得到确认,系统决定用户可以访问的资源或可以执行的操作的过程。授权回答的问题是“你能做什么”或“你有权限访问哪些资源”。例如,一个系统可能允许某些用户访问敏感信息,而禁止其他用户访问。

认证与授权的区别​

目的不同,认证的目的是验证用户身份,而授权的目的是确定用户能做什么。

时机不同,认证通常是用户交互的首个步骤,只有通过认证后,系统才会考虑授权问题。

方法不同,认证方法关注于证明身份(如密码、指纹、令牌),授权方法关注于权限检查(如访问控制列表、角色、策略)。

在开发中​

认证和授权通常需要分开处理。这是因为它们分别涉及到安全机制的不同方面。通常,应用程序会首先通过认证流程确认用户身份,然后根据授权策略来确定用户可以访问的资源或执行的操作。

认证,可能涉及到登录表单、会话管理、用户数据库以及可能的第三方认证服务(如 OAuth、OpenID Connect)。

授权,通常需要实现访问控制逻辑,可能包括角色基础的访问控制(RBAC)、属性基础的访问控制(ABAC)或更复杂的策略决策点(PDP)。

Oh My Zsh 常用插件推荐

· 阅读需 2 分钟
素明诚
Full stack development

通过 plugins 添加插件​

74e30ce277a2eb5ced6f07e223493902### 1.z

  • 作用,z 插件允许你快速跳转到最常访问的目录,基于“frecent”使用频率和最近使用时间算法。
  • 用法,在终端中键入 z 关键词,插件将会将你带到匹配关键词的最常访问目录。

a7772fe25cd7ba3e73e963dd867d8fcf### 2.autojump

  • 作用,和 z 类似,autojump 提供一种更快方式来导航你的文件系统,也是基于你的历史导航记录。
  • 用法,使用 j 关键词 来跳转到一个目录,这个目录包含了关键词并且是你经常访问的。

3.command-not-found​

  • 作用,当你尝试运行一个未安装的命令时,command-not-found 会提示你如何安装这个命令。
  • 用法,自动触发,当你输入一个未识别的命令时会看到安装建议。

4.common-aliases​

  • 作用,提供一系列常见的别名来简化命令行操作。
  • 用法,例如 ll 为 ls -l,la 为 ls -a 等。

8eef63887ce892788353316e35833b05### 5.npm

  • 作用,为常用的 npm 命令提供别名和简化操作。
  • 用法,例如 npmgs 查看全局安装的 npm 包,npmi 用于安装依赖等。

6.git-extras​

  • 作用,添加一些额外的 git 工具,扩展 git 的功能。
  • 用法,提供诸如 git-undo、git-setup、git-changelog 等命令。
  • 作用,允许你直接从命令行发起网络搜索。
  • 用法,键入 google 关键词、bing 关键词 等。当然,这个是针对图形化版本的,命令行就算了

8.sudo​

  • 作用,允许你通过按两次 Esc 键将 sudo 前缀添加到最近的命令。
  • 用法,在你输入命令后发现需要权限提升时,双击 Esc。

9.python​

  • 作用,为 Python 开发者提供快速别名和功能。
  • 用法,包括用于激活虚拟环境的 pyworkon 等。

10.pip​

  • 作用,提供 pip 命令的别名和快速使用功能。
  • 用法,例如 pipi 安装包,pipu 升级包等。

11.vi-mode​

  • 作用,在 Zsh 中启用 Vim 键盘快捷键。
  • 用法,启用后,你可以在命令行中使用 Vim 风格的键位操作。

12.kubectl​

  • 作用,为 Kubernetes 的 kubectl 命令提供别名和自动补全功能。
  • 用法,例如 k 代替 kubectl,kgp 为 kubectl get pods 等。

如果您喜欢这篇文章,不妨给它点个赞并收藏,感谢您的支持!

如何进行版本控制

· 阅读需 2 分钟
素明诚
Full stack development

语义化版本控制(SemVer)​

语义化版本控制(Semantic Versioning,简称 SemVer)提供了一套明确的规则来分配和增加版本号,格式遵循 MAJOR.MINOR.PATCH 的模式,例如 2.5.3,其中

  • MAJOR 引入了不向后兼容的重大变更。
  • MINOR 添加了新功能,但向后兼容。
  • PATCH 进行了向后兼容的缺陷修复。

以微信版本号示例​

假设微信当前的版本号为 7.0.0

  • 主版本(MAJOR)更新至 8.0.0
    假如微信推出了一次重大更新,彻底改变了用户界面和用户体验,同时不再支持旧版插件。这样的改变就需要将主版本号提升,因为它导致了向下不兼容。
  • 次版本(MINOR)更新至 7.1.0
    如果微信增加了视频会议等新功能,而这些新增功能不影响旧版本功能的使用,也不破坏现有 API 的兼容性,那么就应当提升次版本号,以标识这是一次功能性的扩展。
  • 修订版本(PATCH)更新至 7.0.1
    针对微信修复了某个特定的 bug,比如修正了消息同步的问题,并且这个修复不影响任何现有功能或 API,那么就适合提升修订版本号,表示这是一次小修小补。

注意事项​

  • 一致性 保持版本命名的一致性至关重要。团队应该遵循既定的规则来分配版本号,以确保每个版本号都能准确反映软件的状态。
  • 预发布和构建元数据 在某些情况下,可能需要发布候选版本(如 2.5.3-rc.1)或添加构建元数据(如 2.5.3+20210916)。这些额外的标识符可以提供更多关于版本特性或构建信息的细节,但它们应该在不影响主要版本号排序的前提下使用。

如果您喜欢这篇文章,不妨给它点个赞并收藏,感谢您的支持!

Ubuntu nano 启动鼠标滚动

· 阅读需 1 分钟
素明诚
Full stack development

nano 设置鼠标滚动​

在某些版本的 nano 和在某些终端中,你可以启用鼠标支持,使得可以使用鼠标来移动光标和滚动文本。要尝试启用鼠标支持,你可以启动 nano 时加上 -m 或 --mouse 选项:

nano -m filename

或者,你可以在 ~/.nanorc 文件(如果没有,就创建一个)中添加以下设置来永久启用鼠标支持:

set mouse

这个设置会允许你使用鼠标点击位置来移动光标,但是否能滚动取决于终端和 nano 的版本。

使用 micro​

https://github.com/zyedidia/micro.git## 使用

一开始我只是想让 nano 开启默认的鼠标滚轮,后来发现了 micro 这款编辑器,推荐一下

micro 是一个现代的、易于使用的终端基文本编辑器,自带全面的鼠标支持

sudo apt install micro  # 在 Debian/Ubuntu 上安装

然后,使用 micro 打开文件

micro filename

24d016039b834699cc6b316d685eb49f

使用 ctrl + E 进入命令模式

quit  // 退出

如果您喜欢这篇文章,不妨给它点个赞并收藏,感谢您的支持!

Ubuntu 安装 Zsh 配置 Oh My Zsh 主题和插件

· 阅读需 2 分钟
素明诚
Full stack development

安装 Zsh​

打开你的 Ubuntu 终端

更新你的包列表

sudo apt update

安装 Zsh

sudo apt install zsh

安装完成后,你可以通过运行

zsh

来切换到 Zsh shell,或者你可以将其设置为默认的 shell

chsh -s $(which zsh)

这将改变默认的 shell。注销并重新登录或者关闭并重新打开 Ubuntu 终端,以使这个更改生效。

安装 Oh My Zsh​

Oh My Zsh 是一个流行的开源框架,用于管理你的 Zsh 配置。它提供了很多有用的功能,如主题支持、插件和别名等。

通过运行以下命令安装 Oh My Zsh

sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

这个脚本会自动安装 Oh My Zsh 并将其设置为默认的 shell。

安装完成后,你可以打开 ~/.zshrc 文件来配置 Oh My Zsh 的主题和插件

nano ~/.zshrc

在这个配置文件中,你可以修改 ZSH_THEME 变量来更改主题,或者在 plugins=(git) 那一行添加或删除插件。

配置 Oh My Zsh 主题和插件​

你可以选择一个你喜欢的主题,将其名称赋值给 ZSH_THEME 变量。例如,如果你想要使用 agnoster 主题,修改这一行

ZSH_THEME="agnoster"

Oh My Zsh 提供了大量插件,可以增强你的 shell 体验。你可以通过修改 ~/.zshrc 文件中的 plugins 数组来启用这些插件。例如,要启用 git、z 和 autojump 插件,修改这一行

plugins=(git z autojump)

安装完成后,你可以通过关闭并重新打开终端或运行 source ~/.zshrc 来应用更改。

Ubuntu 设置 sudo -s 无密码

· 阅读需 1 分钟
素明诚
Full stack development

配置无密码 sudo​

使用 visudo 编辑 sudo 配置

sudo visudo

visudo 命令会安全地打开 /etc/sudoers 文件进行编辑,并检查保存时的语法错误。

在 visudo 编辑器中,找到适当的位置并添加规则。这里有几个示例

为单个用户免密码使用 sudo(替换 username 为您的用户名)

username ALL=(ALL) NOPASSWD:ALL

为一个用户组免密码使用 sudo(替换 groupname 为您的组名,并确保组名前有 %)

%groupname ALL=(ALL) NOPASSWD:ALL

允许所有用户免密码使用 sudo

ALL ALL=(ALL) NOPASSWD:ALL

按 Ctrl+O 保存更改,然后按 Ctrl+X 退出 nano 编辑器。

关闭终端会话并重新打开,以测试无密码 sudo 是否生效。

注意事项​

  • 日常使用确保您对需要此权限的用户或组有充分的信任。
  • 我一般在 win 子系统里面直接配置无密码,这样节省时间

如果您喜欢这篇文章,不妨给它点个赞并收藏,感谢您的支持!