跳到主要内容

常用 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),那么它就不能被删除,其enumerableconfigurablewritable特性也不能再被修改。这对于定义那些不应该被改变的核心属性特别有用,保证了对象接口的稳定性和安全性。

存取描述符

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

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

8eef63887ce892788353316e35833b05### 5.npm

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

6.git-extras

  • 作用,添加一些额外的 git 工具,扩展 git 的功能。
  • 用法,提供诸如 git-undogit-setupgit-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 代替 kubectlkgpkubectl 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 数组来启用这些插件。例如,要启用 gitzautojump 插件,修改这一行

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 子系统里面直接配置无密码,这样节省时间

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