Counter: {{ counter }}
@@ -30,7 +42,9 @@
Vue.createApp(Counter).mount('#counter')
```
+
### 通过以 v- 开头的attribute提供特殊的功能
+
```html
@@ -55,6 +69,7 @@
```
### 通过 v-on 指令,添加一个事件监听器
+
```html
{{ message }}
@@ -85,8 +100,8 @@
```
-
### 通过 v-model 指令,实现表单输入和应用状态之间的双向绑定
+
```html
{{ message }}
@@ -109,6 +124,7 @@
```
### 通过 v-if 指令,实现条件
+
```html
现在你看到我了
@@ -130,6 +146,7 @@
```
### 通过 v-for 指令,实现循环
+
```html
@@ -159,6 +176,7 @@
```
### 组件化应用构建一
+
```html
@@ -187,6 +205,7 @@
```
### 组件化应用构建二
+
```html
@@ -230,4 +249,4 @@
app.mount('#todo-list-app')
-```
\ No newline at end of file
+```
diff --git a/language/frontend/webrtc.md b/language/frontend/webrtc.md
index 40805eb..b637681 100644
--- a/language/frontend/webrtc.md
+++ b/language/frontend/webrtc.md
@@ -1,7 +1,14 @@
+---
+created_date: 2021-12-15
+---
+
+[TOC]
+
## 链接
+
- WebRTC演示网站 https://appr.tc/
-- 源码 https://github.com/webrtc
-- 第三方教程 http://www.vue5.com/webrtc/webrtc.html
+- 源码 https://github.com/webrtc
+- 第三方教程 http://www.vue5.com/webrtc/webrtc.html
- 官网
- - https://webrtc.org/
- - https://webrtc.org.cn/
\ No newline at end of file
+ - https://webrtc.org/
+ - https://webrtc.org.cn/
diff --git a/language/golang/RELEASE.md b/language/golang/RELEASE.md
index f528384..53e2ce2 100644
--- a/language/golang/RELEASE.md
+++ b/language/golang/RELEASE.md
@@ -1,25 +1,32 @@
+---
+created_date: 2020-11-16
+---
+
+[TOC]
+
## Go
+
- 官网 https://golang.org/
1. 起源:Google工程师20%时间的产物
2. 定位:系统开发语言。
-4. 特点:静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。
+3. 特点:静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。
- 时间线
+
1. 2007年:雏形设计。
2. 2009年11月:正式宣布推出,成为开放源代码项目。
3. 2012年3月:Go1.0 第一个稳定版。
4. 2015年8月:Go1.5 Go语言的运行时和工具链全部从C语言改用Go语言实现.
5. 2018年8月:Go.1.11 启用了module模块概念。
-
- Algol
- - CPL
- - BCPL
- - B
- - C
- - C++
- - Java
- - C#
- - Algol W
- - Pascal
\ No newline at end of file
+ - CPL
+ - BCPL
+ - B
+ - C
+ - C++
+ - Java
+ - C#
+ - Algol W
+ - Pascal
diff --git a/language/golang/go-dev.md b/language/golang/go-dev.md
index 4654661..6c05335 100644
--- a/language/golang/go-dev.md
+++ b/language/golang/go-dev.md
@@ -1,22 +1,35 @@
+---
+created_date: 2020-11-21
+---
+
+[TOC]
+
## Go插件
+
1. 代码质量检查
- ```bash
- golint .\main.go
- ```
+
+ ```bash
+ golint .\main.go
+ ```
2. 代码提示
- - 参考 https://mp.weixin.qq.com/s?__biz=MzAxNzY0NDE3NA==&mid=2247484866&idx=1&sn=6872f1d6dc1064a39a7772166bea7790&chksm=9be32a23ac94a3350b1d2a721469371fc4d7d162c667feb9344b7a9531d86e1d139769a72a2a&scene=27#wechat_redirect
- - gopls 2021年
+
+ - 参考 https://mp.weixin.qq.com/s?\_\_biz=MzAxNzY0NDE3NA==&mid=2247484866&idx=1&sn=6872f1d6dc1064a39a7772166bea7790&chksm=9be32a23ac94a3350b1d2a721469371fc4d7d162c667feb9344b7a9531d86e1d139769a72a2a&scene=27#wechat_redirect
+ - gopls 2021年
3. 文档 godoc
- ```bash
- # godoc
- go get -v -u golang.org/x/tools/cmd/godo
- # 生成本地文档服务器
- godoc -http=:6060
- ```
+
+ ```bash
+ # godoc
+ go get -v -u golang.org/x/tools/cmd/godo
+ # 生成本地文档服务器
+ godoc -http=:6060
+ ```
+
## CLI操作
+
### go编译
+
```bash
# 1. 编译当前目录并输出指定可执行文件
go build -o 输出指定文件
@@ -42,7 +55,9 @@ go generate
```
### gofmt
+
- 官方提供的代码格式化工具
+
```bash
# -w 直接将结果输出到源文件
# -l 列出被格式化的文件
@@ -56,7 +71,8 @@ gofmt -l -w ./
```
### 其它
+
```bash
# 删除mod下载下来的文件
go clean -modcache
-```
\ No newline at end of file
+```
diff --git a/language/golang/go-env.md b/language/golang/go-env.md
index 197a0e8..f080063 100644
--- a/language/golang/go-env.md
+++ b/language/golang/go-env.md
@@ -1,8 +1,16 @@
+---
+created_date: 2020-11-19
+---
+
+[TOC]
+
## Go安装
+
- https://golang.org/dl
- https://golang.google.cn/dl/
### linux安装
+
```bash
cd /opt
wget https://go.dev/dl/go1.23.4.linux-386.tar.gz
@@ -22,26 +30,28 @@ go version
```
- GOROOT
- - 是 Go 的安装目录,存放 Go 的编译器、工具链和标准库。
- - 确保 GOROOT 指向你安装的 Go 版本的路径,特别是如果你可能在同一机器上使用多个 Go 版本。
+ - 是 Go 的安装目录,存放 Go 的编译器、工具链和标准库。
+ - 确保 GOROOT 指向你安装的 Go 版本的路径,特别是如果你可能在同一机器上使用多个 Go 版本。
- GOPATH
- - Go 的工作区路径,存储开发项目和依赖包。
- - Go 1.16 或更高版本时,GOPATH 可以选择不设置,因为 Go Module 模式下,项目目录可以独立于 GOPATH。
+ - Go 的工作区路径,存储开发项目和依赖包。
+ - Go 1.16 或更高版本时,GOPATH 可以选择不设置,因为 Go Module 模式下,项目目录可以独立于 GOPATH。
- PATH,添加 Go 的二进制文件路径:
- - /usr/local/go/bin:Go 编译器和工具链的可执行文件路径。
- - /usr/local/go/gopath/bin:Go 项目中安装的依赖包的可执行文件路径。
+ - /usr/local/go/bin:Go 编译器和工具链的可执行文件路径。
+ - /usr/local/go/gopath/bin:Go 项目中安装的依赖包的可执行文件路径。
- GO111MODULE
- - Go 1.14 及以后的版本默认开启了 Go Module 模式。
- - auto:在有 go.mod 文件时启用模块模式,否则禁用。
+ - Go 1.14 及以后的版本默认开启了 Go Module 模式。
+ - auto:在有 go.mod 文件时启用模块模式,否则禁用。
- GO15VENDOREXPERIMENT
- - 允许在项目中使用 vendor 文件夹存储依赖包。
- - 对于 Go 1.5 和 1.6 有意义,但在 Go 1.7+ 后默认启用。
+ - 允许在项目中使用 vendor 文件夹存储依赖包。
+ - 对于 Go 1.5 和 1.6 有意义,但在 Go 1.7+ 后默认启用。
### windows安装
-默认安装目录 C:\Go
-默认go path目录 C:\Users\Administrator\go
+
+默认安装目录 C:\\Go
+默认go path目录 C:\\Users\\Administrator\\go
### mac安装
+
```bash
brew install go
@@ -49,26 +59,33 @@ echo 'export GOPATH=/Users/gary/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN' >> ~/.zshrc
```
+
source ~/.zshrc
+
### 基于vscode的开发环境
+
- https://blog.csdn.net/snans/article/details/106939925
+
1. 安装插件Go
-ctrl+shift+x 打开插件扩展列表
-下载go插件
+ ctrl+shift+x 打开插件扩展列表
+ 下载go插件
2. 配置代理
+
- https://goproxy.io/zh/docs/getting-started.html
- 1. windows环境变量 GOPROXY=https://goproxy.io
+ 1. windows环境变量 GOPROXY=https://goproxy.io
3. 下载go tools
-ctrl+shift+p 打开命令面板
-搜索 Go:install/update Tools, 点击全选ok
+ ctrl+shift+p 打开命令面板
+ 搜索 Go:install/update Tools, 点击全选ok
4. 重启vscode
## Go指令
+
- 临时环境变量
- Go version >= 1.13,直接用go env -w 设置
+
```bash
go env -w GOPROXY=https://goproxy.io,direct # 或 go env -w GOPROXY=https://goproxy.cn
go env -w GO111MODULE=on
@@ -83,4 +100,4 @@ go env -w GOPROXY=direct
# 查看 GOPROXY 变量
go env | grep GOPROXY
go env | findstr GOPROXY # Windows环境
-```
\ No newline at end of file
+```
diff --git a/language/golang/go-feature.md b/language/golang/go-feature.md
index b954979..62255d5 100644
--- a/language/golang/go-feature.md
+++ b/language/golang/go-feature.md
@@ -1,32 +1,42 @@
-- 参考
- - https://zhuanlan.zhihu.com/p/49049392
+---
+created_date: 2020-11-16
+---
+
+[TOC]
+
+- 参考
+ - https://zhuanlan.zhihu.com/p/49049392
# Go
+
- 将并发机制纳入Go的关键字
- 编译为二进制但又带有垃圾回收机制和运行时反射能力
## 特性1
+
1. 自动垃圾回收
2. 函数多返回值
3. 异常处理
-传统OOP使用try()catch{}模块捕获异常,Go引入三个关键字defer、panic和recover
+ 传统OOP使用try()catch{}模块捕获异常,Go引入三个关键字defer、panic和recover
-3. 匿名函数和闭包
+4. 匿名函数和闭包
-4. 类型和接口
+5. 类型和接口
-5. 高并发
+6. 高并发
-6. 支持反射
+7. 支持反射
-7. 语言交互性
-重用了大部分的C模块,Cgo允许开发者混合编写C语言代码
-import "C"
+8. 语言交互性
+ 重用了大部分的C模块,Cgo允许开发者混合编写C语言代码
+ import "C"
## 特性2
-1. Go语言追求显式的表达,避免隐含。
- 1. 禁止参数默认值
-2. 强类型语言
\ No newline at end of file
+1. Go语言追求显式的表达,避免隐含。
+
+ 1. 禁止参数默认值
+
+2. 强类型语言
diff --git a/language/golang/go-gramma.md b/language/golang/go-gramma.md
index 2433697..58f4341 100644
--- a/language/golang/go-gramma.md
+++ b/language/golang/go-gramma.md
@@ -1,25 +1,36 @@
+---
+created_date: 2020-11-16
+---
+
+[TOC]
## 数据类型
+
### 声明与赋值
+
- 变量的声明与赋值。
- ```go
- var var_name string = "gary"
- var var_name1,var_name2 string = "gary1","gary2"
- // 多个不同类型变量的声明
- var (
- var_name2 string
- var_name2 int
- )
- // 函数内可简写为。
- func test(){
- var_name := "gary" // 一种动态声明方式,左侧的变量不能是已经被声明过的,否则会导致编译错误,此方式只能在函数体中出现。
- }
- ```
+ ```go
+ var var_name string = "gary"
+ var var_name1,var_name2 string = "gary1","gary2"
+ // 多个不同类型变量的声明
+ var (
+ var_name2 string
+ var_name2 int
+ )
+ // 函数内可简写为。
+ func test(){
+ var_name := "gary" // 一种动态声明方式,左侧的变量不能是已经被声明过的,否则会导致编译错误,此方式只能在函数体中出现。
+ }
+ ```
+
### 基本类型
+
1. 基本类型
+
- 布尔型、数字类型、字符串类型、数组
2. 数组
+
```go
// 声明
var var_arr_name1 [var_size] var_type
@@ -27,7 +38,8 @@
var var_arr_name2 = [5]float32{10.0, 50.0}
```
-3. 常量
+3. 常量
+
```go
// 常量的值必须是编译运行前确定的
// 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型
@@ -45,18 +57,22 @@
```
### 引用类型
+
- 引用类型
- - 切片、字典(map)、通道(channel)、接口(interface)
+
+ - 切片、字典(map)、通道(channel)、接口(interface)
- 指针类型
- ```go
- num1_var := 255
- var num2_var *int = &num1_var
- fmt.Printf("Type of num2_var is %T\n", num2_var)
- fmt.Println("Address of num2_var is", num2_var)
- ```
-
+
+ ```go
+ num1_var := 255
+ var num2_var *int = &num1_var
+ fmt.Printf("Type of num2_var is %T\n", num2_var)
+ fmt.Println("Address of num2_var is", num2_var)
+ ```
+
1. 切片:动态数组
+
```go
// 声明与初始化切片
var var_slice_name []var_type = make([]var_type, var_length, var_capacity)
@@ -70,6 +86,7 @@
```
2. 无序集合map
+
```go
/* 声明变量,默认 map = nil */
var var_map_name map[key_type]value_type
@@ -87,6 +104,7 @@
### type关键字
1. 结构体 struct
+
```go
// 定义结构体
type Struct_var_type struct {
@@ -105,6 +123,7 @@
```
2. 接口 interface
+
```go
type interface_name interface {
method_name1(slice []string) string
@@ -119,11 +138,15 @@
```
3. 函数类型
+
- 声明
+
```go
type func_name func(name string) string
```
+
- 示范
+
```go
//定义函数类型 Doing
type Doing func(thing string) string
@@ -144,18 +167,24 @@
fmt.Println(result)
}
```
+
4. 根据已有数据类型,定义新类型
+
```go
type typename string
func (n typename) len() int {
return len(n)
}
```
+
### 通道
+
1. 通道 channel
- 传递数据的一钟数据结构。
+
- 可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。
- - 操作符 <- 用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。
+
+ - 操作符 \<- 用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。
- 通道的创建
```go
@@ -163,22 +192,28 @@
ch := make(chan int)
// 创建int类型的通道并设置缓冲区
ch := make(chan int, 100)
- ```
+ ```
## 语法特性
+
### 基本特性
+
1. 在函数内,变量声明而不使用,编译时则会报错。
2. 结构体变量名:大写表示外部可以访问。
3. 支持类型转换
+
```go
var1_name := 22
var2_name := float32(var1_name)
fmt.Printf("Type of var2_name is %T\n", var2_name)
```
+
### 函数
+
1. 关于函数的大括号
+
```go
func main()
{ // 错误,{ 不能在单独的行上
@@ -187,6 +222,7 @@ func main()
```
2. 函数可以直接返回多个值
+
```go
func swap(x, y string) (string, string) {
return y, x
@@ -194,13 +230,17 @@ func swap(x, y string) (string, string) {
```
3. 匿名函数
+
```go
func(){
fmt.Println("hello")
}
```
+
### 接口
+
- 在golang里,接口内函数的实现不需要关键字,是被隐式实现的
+
```go
type Mammal interface {
Say()
@@ -217,14 +257,17 @@ func(){
```
### 循环
+
1. 循环 只有for循坏:break,continue,goto
2. for 循环不需要()
+
```go
for i := 0; i < 10; i++{}
```
3. 循环数组、切片、map,返回元素的索引和索引对应的值。
+
```go
for k, v := range kvs{
if v == 1 {continue} // 跳过当前循环的剩余语句,然后继续进行下一轮循环
@@ -234,7 +277,9 @@ MyBreak: fmt.Println("my break")
```
### 条件语句
+
1. if
+
```go
func judge(num int) int {
if num > 100 {
@@ -245,8 +290,10 @@ func judge(num int) int {
return -1
}
}
-```
-2. switch
+```
+
+2. switch
+
```go
func main() {
// 使用方式一
@@ -280,8 +327,8 @@ func main() {
```
### 并发
+
1. Go 并发,通过go关键字开启一个 goroutine 协程
```go
go function_name ( var_value )
```
-
diff --git a/language/golang/go-package-3.md b/language/golang/go-package-3.md
index 7503236..7e2ae8d 100644
--- a/language/golang/go-package-3.md
+++ b/language/golang/go-package-3.md
@@ -1,36 +1,51 @@
+---
+created_date: 2021-08-12
+---
+
+[TOC]
+
# 非内置包
-1. 读取配置与热加载 github.com/spf13/viper github.com/fsnotify/fsnotify
-2. 数据库ORM github.com/jinzhu/gorm github.com/go-sql-driver/mysql gorm.io/gorm(v2 要求go1.14版本)
+
+1. 读取配置与热加载 github.com/spf13/viper github.com/fsnotify/fsnotify
+2. 数据库ORM github.com/jinzhu/gorm github.com/go-sql-driver/mysql gorm.io/gorm(v2 要求go1.14版本)
3. ldap认证 github.com/go-ldap/ldap/v3 学习文档https://godoc.org/gopkg.in/ldap.v3
4. web框架 github.com/gin-gonic/gin
5. Token github.com/dgrijalva/jwt-go
-6. 文档 github.com/swaggo/gin-swagger github.com/swaggo/files github.com/swaggo/swag(生成doc)
+6. 文档 github.com/swaggo/gin-swagger github.com/swaggo/files github.com/swaggo/swag(生成doc)
7. 日志 github.com/sirupsen/logrus
8. 命令行程序 https://github.com/spf13/cobra
9. 热重启(修改完代码后保存,就能自动重启运行) github.com/cosmtrek/air
## ORM包
+
### gorm
+
- 关联查询
-db.Model(&user).Association("company").Find(&company)
+ db.Model(&user).Association("company").Find(&company)
- 预加载
-https://gorm.io/zh_CN/docs/preload.html
+ https://gorm.io/zh_CN/docs/preload.html
+
2. db.Preload 使用了子查询加载关联数据。
3. db.Joins 使用 inner join 加载关联数据。
-3. 预加载全部 db.Preload(clause.Associations).Find(&users) 或者开启自动预加载 db.Set("gorm:auto_preload", true).Find(&users)
+4. 预加载全部 db.Preload(clause.Associations).Find(&users) 或者开启自动预加载 db.Set("gorm:auto_preload", true).Find(&users)
- 软删除硬删除
+
1. 查找所有包含deleted的 model.DB.Unscoped().Find(&api)
2. 删除所有的包含deleted的 model.DB.Unscoped().Delete(&API{})
-## 生成接口文档的包
+## 生成接口文档的包
+
- swagger
+
### go-swagger
+
1. 功能
- - 文档即注解
- - 文档即测试
+ - 文档即注解
+ - 文档即测试
2. windows下简单安装
+
```bash
# https://github.com/go-swagger/go-swagger/blob/master/docs/install.md
go clone github.com/go-swagger/go-swagger
@@ -46,17 +61,22 @@ swagger generate server -f ./swagger.json
swagger serve -F=swagger ./swagger.yaml (文档格式必须是yaml)
swagger serve ./swagger.yaml
```
+
### go集成gin+swagger自动生成文档
+
- 参考 https://github.com/swaggo/gin-swagger
+
1. swag 用于生成 docs 文件夹(swagger文档程序使用)
- go get github.com/swaggo/swag/cmd/swag
- swag init
+ go get github.com/swaggo/swag/cmd/swag
+ swag init
2. 集成进go代码里
- 1. 下载 gin-swagger
- go get github.com/swaggo/gin-swagger
- go get github.com/swaggo/files
- 2. 示范
+
+ 1. 下载 gin-swagger
+ go get github.com/swaggo/gin-swagger
+ go get github.com/swaggo/files
+ 2. 示范
+
```go
package main
@@ -96,8 +116,11 @@ func sayHello(c *gin.Context) {
```
## 命令行程序
+
cobra
+
- https://github.com/spf13/cobra
+
```go
package main
@@ -155,6 +178,7 @@ a count and a string.`,
}
```
+
```bash
go run . echo "hello"
go run . echo times -t=3 "hello"
diff --git a/language/golang/go-package-k8s.md b/language/golang/go-package-k8s.md
index 19f9e20..c66bd81 100644
--- a/language/golang/go-package-k8s.md
+++ b/language/golang/go-package-k8s.md
@@ -1,26 +1,38 @@
+---
+created_date: 2020-12-17
+---
+
+[TOC]
+
## k8s.io/apimachinery/pkg/api/resource
-1. 文档
-https://godoc.org/k8s.io/apimachinery/pkg/api/resource#pkg-index
-2. type Quantity
-https://physics.nist.gov/cuu/Units/binary.html
+1. 文档
+ https://godoc.org/k8s.io/apimachinery/pkg/api/resource#pkg-index
+2. type Quantity
+ https://physics.nist.gov/cuu/Units/binary.html
## 代码生成器
-- 参考
- 1. https://zhuanlan.zhihu.com/p/99148110
- 2. https://tangxusc.github.io/2019/05/code-generator%E4%BD%BF%E7%94%A8/
- 3. https://www.openshift.com/blog/kubernetes-deep-dive-code-generation-customresources
-1. conversion-gen
- - https://github.com/kubernetes/code-generator
- - 用于自动生成在内部和外部类型之间转换的函数的工具。
+
+- 参考
+ 1. https://zhuanlan.zhihu.com/p/99148110
+ 2. https://tangxusc.github.io/2019/05/code-generator%E4%BD%BF%E7%94%A8/
+ 3. https://www.openshift.com/blog/kubernetes-deep-dive-code-generation-customresources
+
+1. conversion-gen
+
+ - https://github.com/kubernetes/code-generator
+ - 用于自动生成在内部和外部类型之间转换的函数的工具。
+
2. deepcopy-gen
- - https://godoc.org/k8s.io/gengo/examples/deepcopy-gen
+
+ - https://godoc.org/k8s.io/gengo/examples/deepcopy-gen
3. defaulter-gen
## client-go
-- client-go有四类客户端
- RestClient、ClientSet、DynamicClient、DiscoveryClient。
- RestClient是最基础的客户端,它对Http进行了封装,支持JSON和protobuf格式数据。
- 其它三类客户端都是通过在REStClient基础上再次封装而得来。
\ No newline at end of file
+
+- client-go有四类客户端
+ RestClient、ClientSet、DynamicClient、DiscoveryClient。
+ RestClient是最基础的客户端,它对Http进行了封装,支持JSON和protobuf格式数据。
+ 其它三类客户端都是通过在REStClient基础上再次封装而得来。
diff --git a/language/golang/go-package.md b/language/golang/go-package.md
index 00c0139..0a22a99 100644
--- a/language/golang/go-package.md
+++ b/language/golang/go-package.md
@@ -1,17 +1,28 @@
+---
+created_date: 2020-11-16
+---
+
+[TOC]
+
# 包 Package
+
## 包管理 go.mod
+
- 参考 https://blog.csdn.net/weixin_39003229/article/details/97638573
- go.mod 是Golang1.11版本新引入的官方包管理工具, 用于解决之前没有地方记录依赖包具体版本的问题。
- 1. GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
- 2. GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。
- 3. GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。
+
+ 1. GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
+ 2. GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。
+ 3. GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。
- 依赖的第三方包存储位置
- - go.mod $GOPATH/pkg/mod/
- - 传统的 $GOPATH/src
+
+ - go.mod $GOPATH/pkg/mod/
+ - 传统的 $GOPATH/src
- go mod 指令
+
```bash
# 初始化modules
go mod init 自定义项目名
@@ -31,10 +42,10 @@ go mod why
go mod edit -replace example.com/greetings=../greetings
```
-
-
## 依赖包的import方式
+
- https://blog.csdn.net/stpeace/article/details/82901633
+
```go
import "fmt"
@@ -44,16 +55,21 @@ import F "fmt" // 设置fmt包的别名为F
```
## 内置包
+
1. fmt
- ```go
- fmt.Printf("%+v\n", anyType)
- ```
+
+ ```go
+ fmt.Printf("%+v\n", anyType)
+ ```
2. errors
- ```go
- errors.New("defined error")
- ```
+
+ ```go
+ errors.New("defined error")
+ ```
+
3. log
+
```go
log.SetPrefix("main: ")
// log.SetFlags(0)
@@ -61,38 +77,39 @@ import F "fmt" // 设置fmt包的别名为F
```
4. time
- ```go
- // 获取时间戳
- time.Now().UnixNano()
-
- // 生成随机数
- rand.Seed(time.Now().UnixNano()) // "math/rand"
- fmt.Println(rand.Intn(100))
- ```
-
-5. test
- ```bash
- # 参考 https://appliedgo.net/testmain/
- # 注意:当module名字为main时,在根目录下执行go test则会报错 /var/folders/8h/1m7cpf3935z6tgyxtqm7805h0000gn/T/go-build3557744028/b001/_testmain.go:13:2: cannot import "main"
- # 注意:一次只能单元测试一个目录内的文件,执行 go test -v ./*/*.go 则会报错 named files must all be in one directory;
- go test // go test ./
- # 默认会对当前目录内 文件名字为 *_test.go 的文件,名字以 Test开头的函数进行单元测试。
- ```
- ```go
- func Test_gary(t *testing.T) {
- name := "Gary"
- want := regexp.MustCompile(`\b` + name + `\b`)
- msg := "Gary"
- if !want.MatchString(msg) {
- t.Fatalf("msg string must contain %v", name)
- }
- }
- ```
-
-
-
-
-1. encoding/json
+
+ ```go
+ // 获取时间戳
+ time.Now().UnixNano()
+
+ // 生成随机数
+ rand.Seed(time.Now().UnixNano()) // "math/rand"
+ fmt.Println(rand.Intn(100))
+ ```
+
+5. test
+
+ ```bash
+ # 参考 https://appliedgo.net/testmain/
+ # 注意:当module名字为main时,在根目录下执行go test则会报错 /var/folders/8h/1m7cpf3935z6tgyxtqm7805h0000gn/T/go-build3557744028/b001/_testmain.go:13:2: cannot import "main"
+ # 注意:一次只能单元测试一个目录内的文件,执行 go test -v ./*/*.go 则会报错 named files must all be in one directory;
+ go test // go test ./
+ # 默认会对当前目录内 文件名字为 *_test.go 的文件,名字以 Test开头的函数进行单元测试。
+ ```
+
+ ```go
+ func Test_gary(t *testing.T) {
+ name := "Gary"
+ want := regexp.MustCompile(`\b` + name + `\b`)
+ msg := "Gary"
+ if !want.MatchString(msg) {
+ t.Fatalf("msg string must contain %v", name)
+ }
+ }
+ ```
+
+6. encoding/json
+
```go
data, _ := json.Marshal(变量)
fmt.Println(string(data))
@@ -106,9 +123,7 @@ fmt.Println(&out)
```
-
3. crypto
-https://golang.org/pkg/crypto/cipher/#example_NewCFBEncrypter
-
+ https://golang.org/pkg/crypto/cipher/#example_NewCFBEncrypter
4. reflect
diff --git a/language/golang/go.md b/language/golang/go.md
index 916ad1e..441001a 100644
--- a/language/golang/go.md
+++ b/language/golang/go.md
@@ -1,10 +1,18 @@
+---
+created_date: 2021-08-06
+---
+
+[TOC]
+
#### golang的栈内存分配机制
+
- 当创建一个goroutine时,Go运行时会分配一段8K字节的内存用于栈供goroutine运行使用,
+
1. 第一代 分段栈(Segmented Stacks)
- - 扩栈:通过morestack函数
- - 缩栈:通过lessstack缩栈。
- - 缺陷:栈缩时性能开销大
+ - 扩栈:通过morestack函数
+ - 缩栈:通过lessstack缩栈。
+ - 缺陷:栈缩时性能开销大
2. 第二代 连续栈(continuous stacks)
- - 扩栈:创建一个两倍于原stack大小的新stack,并将旧栈拷贝到其中。
- - 缩栈:垃圾回收的过程中实现
- - 缺陷:分配了更多的栈空间,但微不足道。
\ No newline at end of file
+ - 扩栈:创建一个两倍于原stack大小的新stack,并将旧栈拷贝到其中。
+ - 缩栈:垃圾回收的过程中实现
+ - 缺陷:分配了更多的栈空间,但微不足道。
diff --git a/language/java/grammar.md b/language/java/grammar.md
index 1795d76..00b8ef5 100644
--- a/language/java/grammar.md
+++ b/language/java/grammar.md
@@ -1,37 +1,49 @@
+---
+created_date: 2020-11-16
+---
+
[TOC]
-- 参考
- - https://www.matools.com/api/java8
- - https://docs.oracle.com/javase/8/docs/api/
+- 参考
+ - https://www.matools.com/api/java8
+ - https://docs.oracle.com/javase/8/docs/api/
## 数据结构
+
1. 常用数据类型:
- - 数字类型,String,Map,List。
+ - 数字类型,String,Map,List。
## 设计模式
+
1. 常用设计模式:
- - 工厂模式,观察者模式,装饰模式。
- - 单例(懒汉饿汉)
+ - 工厂模式,观察者模式,装饰模式。
+ - 单例(懒汉饿汉)
## 特性
+
- 封装(控制变量和方法,根据需求暴露接口)
- 继承(复用父类的方法,重写父类的方法)
- 多态(对象声明时指定对应的子类,就可以调用该子类的方法)
- - 一个引用(类型)在不同的情况下的多种状态。也可以理解为,多态是指通过指向父类的指针,来调用在不同子类中实现的方法。
- - 对多态的一个更广泛的定义,指的是可以处理多种类型数据的代码。
+ - 一个引用(类型)在不同的情况下的多种状态。也可以理解为,多态是指通过指向父类的指针,来调用在不同子类中实现的方法。
+ - 对多态的一个更广泛的定义,指的是可以处理多种类型数据的代码。
### Java反射机制
+
- 参考 https://zhuanlan.zhihu.com/p/196524168
+
- 需求:在代码运行之前,我们不确定将来会使用哪一种数据结构,只有在程序运行时才决定使用哪一个数据类。
+
- 解决:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
- 功能
- - 在运行时判断任意一个对象所属的类;
- - 在运行时构造任意一个类的对象;
- - 在运行时判断任意一个类所具有的成员变量和方法;
- - 在运行时调用任意一个对象的方法。
+
+ - 在运行时判断任意一个对象所属的类;
+ - 在运行时构造任意一个类的对象;
+ - 在运行时判断任意一个类所具有的成员变量和方法;
+ - 在运行时调用任意一个对象的方法。
- 运行时通过反射机制获取类
+
```java
Class clazz = Class.forName("包名.类名小写");
-```
\ No newline at end of file
+```
diff --git a/language/java/interview.md b/language/java/interview.md
index a0319a0..4025aab 100644
--- a/language/java/interview.md
+++ b/language/java/interview.md
@@ -1,18 +1,24 @@
+---
+created_date: 2020-12-18
+---
+
+[TOC]
+
## 大学实习时的面试总结
-1. 曾经:
-jsp + servlet(控制数据和业务逻辑) + javaBean
-jsp + servlet +
-DAO(vo(相当于javaBean),dao,impl(真实操作),proxy(可以进行额外操作:记录日志,方法前后),factory(可以进行单例模式的设置,可以根据值的传递实现不同的数据库操作))
-servlet调用factory获取proxy‘
-proxy实现dao接口,调用真实的操作对象impl
-impl 进行数据库的操作
+1. 曾经:
+ jsp + servlet(控制数据和业务逻辑) + javaBean
+ jsp + servlet +
+ DAO(vo(相当于javaBean),dao,impl(真实操作),proxy(可以进行额外操作:记录日志,方法前后),factory(可以进行单例模式的设置,可以根据值的传递实现不同的数据库操作))
+ servlet调用factory获取proxy‘
+ proxy实现dao接口,调用真实的操作对象impl
+ impl 进行数据库的操作
2. 现在:
-MVC
-model:pojo+dao(接口)+mapper(放数据库操作语句,与dao接口对应*.mapper文件)+service+ serviceImpl
-view:html
-controller
+ MVC
+ model:pojo+dao(接口)+mapper(放数据库操作语句,与dao接口对应\*.mapper文件)+service+ serviceImpl
+ view:html
+ controller
框架:SSM
spring:
@@ -23,4 +29,4 @@ SpringMVC:
管理控制层
MyBatis:
-数据库持久层,消除JDBC代码
\ No newline at end of file
+数据库持久层,消除JDBC代码
diff --git a/language/java/java.md b/language/java/java.md
index 4f4ee16..36a66ce 100644
--- a/language/java/java.md
+++ b/language/java/java.md
@@ -1,15 +1,26 @@
+---
+created_date: 2021-07-09
+---
+
+[TOC]
+
# Java
+
- 参考
- - https://www.onitroad.com/jc/archive/install-java-on-amazon-linux.html
- - https://www.oracle.com/java/technologies/downloads/#java17
+ - https://www.onitroad.com/jc/archive/install-java-on-amazon-linux.html
+ - https://www.oracle.com/java/technologies/downloads/#java17
+
## 安装openjdk
+
1. CentOS7源安装
+
```bash
yum install java-1.8.0-openjdk -y
# yum install java-1.8.0-openjdk* -y # 安装所有相关文件
```
2. Ubuntu16源安装
+
```bash
apt-get update -y
apt-get install openjdk-8-jdk -y
@@ -19,27 +30,28 @@ apt-get install openjdk-8-jdk -y
- java目录 /usr/lib/jvm/
3. 手动环境变量配置
-vi /etc/profile.d/java.sh
+ vi /etc/profile.d/java.sh
+
```conf
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.265.b01-0.54.amzn1.x86_64 # 名字会不一样
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar
export PATH=$PATH:$JAVA_HOME/bin
```
-
4. 设置新的软连接
-/usr/bin/java -> /etc/alternatives/java
-/etc/alternatives/java -> /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
+ /usr/bin/java -> /etc/alternatives/java
+ /etc/alternatives/java -> /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
ln -fs /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java /etc/alternatives/java
5. 卸载
- - 若是oracle-jdk
- apt-get remove oracle-java8-installer
- - 若是openjdk
- apt-get remove/purge openjdk*
+ - 若是oracle-jdk
+ apt-get remove oracle-java8-installer
+ - 若是openjdk
+ apt-get remove/purge openjdk\*
### aws ec2
+
```bash
# 安装jdk11
amazon-linux-extras install java-openjdk11
@@ -53,11 +65,14 @@ yum install tomcat
```
## JVM
+
- HotSpot VM
- JRockit VM
### 指令
+
- 参考 https://www.jdon.com/51214
+
```bash
# 0. 查看当前用户的Java进程信息
jps -mlv
@@ -75,24 +90,27 @@ jstat -gccapacity ${PID}
jstat -gcutil ${PID}
```
-
-
### 配置jvm的堆内存占据宿主机内存的百分比
+
- 基于 Java 8u131 或 Java 9
- - java XX:InitialRAMFraction=1 -XX:MaxRAMFraction=1 -XX:MinRAMFraction=1 -jar test.jar
+ - java XX:InitialRAMFraction=1 -XX:MaxRAMFraction=1 -XX:MinRAMFraction=1 -jar test.jar
- 基于 Java 10
- - 这三个参数是JDK8U191为适配Docker容器新增的
- - java MaxRAMPercentage=1 InitialRAMPercentage=1 MinRAMPercentage=1 -jar test.jar
+ - 这三个参数是JDK8U191为适配Docker容器新增的
+ - java MaxRAMPercentage=1 InitialRAMPercentage=1 MinRAMPercentage=1 -jar test.jar
### 常用 JVM 参数
-- -Xms:初始堆大小,默认为物理内存的1/64(<1GB);
- - 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制
+
+- -Xms:初始堆大小,默认为物理内存的1/64(\<1GB);
+
+ - 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制
- -Xmx:最大堆大小,默认为物理内存的1/4;
- - 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
+
+ - 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
- -Xmn:新生代的内存空间大小,注意:此处的大小是(eden+ 2 survivor space)。与jmap -heap中显示的New gen是不同的。
- - 整个堆大小 = 新生代大小 + 老生代大小 + 永久代大小。在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
+
+ - 整个堆大小 = 新生代大小 + 老生代大小 + 永久代大小。在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
- -XX:SurvivorRatio:新生代中Eden区域与Survivor区域的容量比值,默认值为8。两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10。
@@ -103,22 +121,27 @@ jstat -gcutil ${PID}
- -XX:MaxPermSize:设置永久代最大值。物理内存的1/4。
- -XX:ReservedCodeCacheSize
- - JIT编译的代码都放在Code Cache中,若Code Cache空间不足则JIT无法继续编译,编译执行改为解释执行,性能将会降低
+
+ - JIT编译的代码都放在Code Cache中,若Code Cache空间不足则JIT无法继续编译,编译执行改为解释执行,性能将会降低
### GC
+
#### 垃圾回收器
+
1. CMS(-XX:+UseConcMarkSweepGC)
- - 基于“标记—清除”算法实现
- - 一般新生代使用ParNew(复制回收),老年代的用CMS
+ - 基于“标记—清除”算法实现
+ - 一般新生代使用ParNew(复制回收),老年代的用CMS
2. G1(-XX:+UseG1GC)
- - G1 把堆划分成多个大小相等的独立区域(Region),新生代和老年代不再物理隔离。
- - 算法:标记—整理 (old,humongous) 和复制回收算法(survivor)。
- - 1.9之后是默认,1.7之后才有,1.8才算成熟。
- - 区域划分很散(2048块),不适合小内存使用
-####
+ - G1 把堆划分成多个大小相等的独立区域(Region),新生代和老年代不再物理隔离。
+ - 算法:标记—整理 (old,humongous) 和复制回收算法(survivor)。
+ - 1.9之后是默认,1.7之后才有,1.8才算成熟。
+ - 区域划分很散(2048块),不适合小内存使用
+
+####
+
- Java的堆内存逻辑上分成两块:新生代、老年代
- 根据垃圾收集回收的区域不同可分为: Young GC、Old GC、Full GC、Mixed GC
- 大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Young GC。
- -XX:PretenureSizeThreshold
- -XX:MaxTenuringThreshold
--
\ No newline at end of file
+-
diff --git a/language/java/maven.md b/language/java/maven.md
index 35d373f..883a692 100644
--- a/language/java/maven.md
+++ b/language/java/maven.md
@@ -1,24 +1,38 @@
+---
+created_date: 2021-07-09
+---
+
+[TOC]
+
# Maven
+
## 安装
+
1. 下载
+
```bash
# https://maven.apache.org/download.cgi
wget https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.zip
tar xzvf apache-maven-3.6.3-bin.tar.gz
```
+
2. 配置环境变量
-vi /etc/profile/maven.sh
+ vi /etc/profile/maven.sh
+
```conf
export M2_HOME=/opt/app/apache-maven-3.8.6
export PATH=$PATH:$M2_HOME/bin
```
+
```bash
source /etc/profile
mvn -v
```
3. 配置 本地仓库存储位置/中央仓库
-- conf/settings.xml
+
+- conf/settings.xml
+
```xml
本地仓库在磁盘中的路径
@@ -32,6 +46,7 @@ mvn -v
## 使用
1. 下载jar包
+
```bash
mvn dependency:get -DgroupId=junit -DartifactId=junit -Dversion=4.8.2
# 或
@@ -39,11 +54,13 @@ mvn -f pom.xml dependency:copy-dependencies
```
2. 浏览项目依赖
+
```bash
mvn dependency:resolve
```
3. 完整命令详解
+
```bash
mvn archetype:create 创建Maven项目
mvn compile 编译源代码
@@ -87,8 +104,9 @@ mvn dependency:sources 获取依赖源代码
```
4. 常用打包指令
+
```bash
mvn clean install package -Dmaven.test.skip=true #清理之前项目生成结果并构建然后将依赖包安装到本地仓库跳过测试
mvn clean deploy package -Dmaven.test.skip=true #构建并将依赖放入私有仓库
mvn --settings /data/settings.xml clean package -Dmaven.test.skip=true #指定maven配置文件构建
-```
\ No newline at end of file
+```
diff --git a/language/lua.md b/language/lua.md
index 2debc52..d0b0fea 100644
--- a/language/lua.md
+++ b/language/lua.md
@@ -1,6 +1,14 @@
+---
+created_date: 2020-11-30
+---
+
+[TOC]
+
1. 第一个lua程序
-vim HelloWorld.lua
+ vim HelloWorld.lua
+
```lua
print("Hello World!")
```
-lua HelloWorld.lua
\ No newline at end of file
+
+lua HelloWorld.lua
diff --git a/language/nodejs/GraphQL.md b/language/nodejs/GraphQL.md
index 29365b4..3adb0ef 100644
--- a/language/nodejs/GraphQL.md
+++ b/language/nodejs/GraphQL.md
@@ -1,28 +1,36 @@
-# GraohQL
-- 参考
- - https://github.com/graphql/graphiql
- - https://graphql.org/learn/
- - https://graphql.cn/
+---
+created_date: 2020-11-16
+---
-- 数据传输风格
- - RPC
- - REST
- - GraphQL
+[TOC]
+
+- GraohQL
-1. 前端可以 一次性取取完所有需要的数据(可以获取多个接口的数据,可以选择性地获取接口中的字段)
+## 链接
-2. 解决 前端产品快速迭代对API的更改。解决不同的客户端对数据的不同需求。
+- https://github.com/graphql/graphiql
+- https://graphql.org/learn/
+- https://graphql.cn/
-3. 使用强大的Type System来定义API的功能,所有的API中公开类型都是使用GraphQL
+## 简介
+
+- 数据传输风格
+ 1. RPC
+ 2. REST
+ 3. GraphQL
+- GraphQL的优势
+ 1. 前端可以一次性获取所有需要的数据(可以获取多个接口的数据,可以选择性地获取接口中的字段)
+ 2. 解决前端产品快速迭代对API的更改。解决不同的客户端对数据的不同需求。
## SDL
-- schema Definition Language(SDL)该模式充当客户端和服务器之间的契约,以定义客户机如何访问数据。
- - query
- - mutation
- - subscription
-### 查询
+- Schema Definition Language (SDL) 是 GraphQL 提供的一种语法,用于以声明式的方式定义 GraphQL API 的 schema。
+- SDL 使用一种人类可读的格式,描述数据类型、查询(query)、变更(mutations)、订阅(subscriptions)以及它们之间的关系
+
+### 示范一
+
```graphql
+# 查询操作
query {
# 刷选id等于5的数据
approvalForAlls(id: 5) {
@@ -42,4 +50,34 @@ query {
tokenId
}
}
-```
\ No newline at end of file
+```
+
+### 示范二
+
+```graphql
+# 定义类型
+type Transfer @entity(immutable: true) {
+ id: Bytes!
+ from: Bytes! # address
+ to: Bytes! # address
+ tokenId: BigInt! # uint256
+ blockNumber: BigInt!
+ blockTimestamp: BigInt!
+ transactionHash: Bytes!
+}
+type Query {
+ transfers(first: Int, skip: Int, where: TransferFilter): [Transfer!]!
+}
+```
+
+```graphql
+# 查询操作
+query {
+ transfers(where: { from: "0xsfsdfsdfsdfsdfff" }) {
+ id
+ from
+ to
+ tokenId
+ }
+}
+```
diff --git a/language/nodejs/grammar.md b/language/nodejs/grammar.md
index 6a4f380..7515776 100644
--- a/language/nodejs/grammar.md
+++ b/language/nodejs/grammar.md
@@ -1,6 +1,13 @@
+---
+created_date: 2022-07-05
+---
+
+[TOC]
+
# 语法
## 基本
+
```js
// 去掉所有空格
字符串.replace(/\s/g,"")
@@ -25,9 +32,10 @@ const myFunction = async (p1, p2) => {
event.target
```
-
## 数据结构
+
### 数组
+
```js
let array = new Array()
array=[1 ,2 ,3]
@@ -40,6 +48,7 @@ array。splice(index,索引) // 通过索引删除元素并返回此元素
```
### 字典
+
```js
new Map()
set()
@@ -48,7 +57,9 @@ delete()
```
## 常用函数
+
- forEach(),filter(), map(),reduce()
+
```js
array = ['a','b']
array.forEach((value, key )=>{
@@ -57,10 +68,12 @@ delete()
```
## 回调地狱
+
- 将回调函数处理成像“同步”处理的形式
-promise, async await
+ promise, async await
## 异常处理
+
```js
try {
console.log('我正在执行');
@@ -71,8 +84,8 @@ try {
}
```
-
## 休眠
+
```js
function sleep(ms) {
return new Promise(resolve => setTimeout(() => resolve(), ms));
@@ -85,26 +98,29 @@ function sleep(ms) {
```
## 其它
-事件驱动
-events.EventEmitter()
-util.inherits(对象名 , events.EventEmitter);
-readFile('路径',回调函数);
-.on
-.emit
+事件驱动\
+events.EventEmitter()\
+util.inherits(对象名 , events.EventEmitter);\
+readFile('路径',回调函数);
-IO操作
-fs
-流
-buffer
-管道操作 .pipe()
+.on\
+.emit
+IO操作\
+fs\
+流\
+buffer\
+管道操作 .pipe()
# 例子
+
## 创建第一个Node.js应用
+
1. 引入required模块:使用require指令来载入Node.js模块。
2. 创建服务.
3. 通过监听接收请求与响应请求。
+
```js nodejss
var http = require('http');
http.createServer(function (request, response) {
diff --git a/language/nodejs/nodejs.md b/language/nodejs/nodejs.md
index 8ac4bcf..5ba1866 100644
--- a/language/nodejs/nodejs.md
+++ b/language/nodejs/nodejs.md
@@ -1,53 +1,65 @@
+---
+created_date: 2021-08-23
+---
+
+[TOC]
+
# nodejs
+
- 单线程异步IO机制
- 为什么说nodejs是单线程的?
- - 因为nodejs只有主线程在执行代码,所有的网络请求(Socket)由主线程来执行代码,然后返回数据。涉及到代码外的操作(例如 请求第三方接口、数据库读取、文件读取),则非阻塞式交给线程池进行处理。
+ - 因为nodejs只有主线程在执行代码,所有的网络请求(Socket)由主线程来执行代码,然后返回数据。涉及到代码外的操作(例如 请求第三方接口、数据库读取、文件读取),则非阻塞式交给线程池进行处理。
## 优缺点
+
1. 为什么说node.js是单线程高性能适合IO密集型的程序?
- 1. 只有主线程在不断地循环等待使用CPU进行运算,所有的运算操作都要排队,一一要交给主线程。
- 2. 每一次IO操作,node.js都可以进行异步操作,交给一个新的线程去执行。
+ 1. 只有主线程在不断地循环等待使用CPU进行运算,所有的运算操作都要排队,一一要交给主线程。
+ 2. 每一次IO操作,node.js都可以进行异步操作,交给一个新的线程去执行。
2. 优点:
- - 高性能-避免了线程切换使用CPU所带来的各种开销。
- - 线程安全-变量只会被主线程读写。
- - IO异步。
+ - 高性能-避免了线程切换使用CPU所带来的各种开销。
+ - 线程安全-变量只会被主线程读写。
+ - IO异步。
3. 缺点
- - CPU密集型任务占用CPU时间长
+ - CPU密集型任务占用CPU时间长
4. 总而言之:IO操作是多线程的,CPU操作是单线程的。
## 闭包
-- 定义:一个函数作用域内 读取了 另一个函数作用域内 的变量。
+
+- 定义:一个函数作用域内 读取了 另一个函数作用域内 的变量。
- 发生:只有在嵌套函数内才会出现闭包现象。
+
1. 使用场景
- 1. 设计私有的方法和变量。
+ 1. 设计私有的方法和变量。
2. 缺点
- 1. 变量不被释放,会产生内存泄露问题。
+ 1. 变量不被释放,会产生内存泄露问题。
## Node应用管理器 pm2
-pm2 list
-
+pm2 list
## CJS vs EMS
### 模块的加载
+
- CommonJS Modules CJS模块系统,将每个文件都被视为一个单独的模块。
+
- ECMAScript Modules ESM模块系统,是打包 JavaScript 代码以供重用的官方标准格式。使用 import 和 export 导入导出模块。
- 配置
- - Node.js 默认将 JavaScript 代码视为 CommonJS 模块。
- - 可以通过.mjs 文件扩展名 或者 package.json 'type’字段,来默认将 JavaScript 代码视为 CommonJS 模块。
- ```json package.json
- {
- "type": "module",
- "dependencies": {
- "babel-core": "^6.26.3",
- "babel-preset-env": "^1.7.0",
- }
- }
- ```
+
+ - Node.js 默认将 JavaScript 代码视为 CommonJS 模块。
+ - 可以通过.mjs 文件扩展名 或者 package.json 'type’字段,来默认将 JavaScript 代码视为 CommonJS 模块。
+ ```json package.json
+ {
+ "type": "module",
+ "dependencies": {
+ "babel-core": "^6.26.3",
+ "babel-preset-env": "^1.7.0",
+ }
+ }
+ ```
```js
// es3:
@@ -68,10 +80,10 @@ import * as 变量名 from ‘ethers’;
### 其它
-- ESM 默认使用了严格模式,因此在 ES 模块中的``this``不再指向全局对象(而是 ``undefined``),且变量在声明前无法使用。
-
-- ESM 缺乏 __filename 和 __dirname
+- ESM 默认使用了严格模式,因此在 ES 模块中的`this`不再指向全局对象(而是 `undefined`),且变量在声明前无法使用。
+- ESM 缺乏 \_\_filename 和 \_\_dirname
## ts
-- nodejs环境下执行ts代码 https://github.com/TypeStrong/ts-node
\ No newline at end of file
+
+- nodejs环境下执行ts代码 https://github.com/TypeStrong/ts-node
diff --git a/language/nodejs/nvm-install.md b/language/nodejs/nvm-install.md
index 8cb7840..202353b 100644
--- a/language/nodejs/nvm-install.md
+++ b/language/nodejs/nvm-install.md
@@ -1,5 +1,13 @@
+---
+created_date: 2020-11-16
+---
+
+[TOC]
+
## 安装node版本管理器 nvm
+
### Linux安装nvm
+
```bash
# https://github.com/nvm-sh/nvm#installation
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
@@ -15,9 +23,11 @@ curl -o- https://gitlab.com/mirrorx/nvm/-/raw/master/install.sh | bash
```
### Windows安装nvm-windows/
+
https://github.com/coreybutler/nvm-windows/releases
### Mac安装nvm
+
```bash
# https://github.com/nvm-sh/nvm#installation
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.39.5/install.sh | bash
@@ -29,13 +39,15 @@ echo 'export NVM_DIR="$HOME/.nvm"
```
### 使用nvm
-```bash
+
+```bash
nvm install stable ## 安装最新稳定版 node
nvm alias default lts/gallium # 指定node的默认版本
```
## 软件包源
+
```
npm --- https://registry.npmjs.org/
@@ -53,18 +65,22 @@ deunpm --- http://registry.enpmjs.org/
```
## 包管理器 npm
+
1. npm install的执行过程
- 1. 发出npm install命令
- 2. npm 向 registry 查询模块压缩包的网址
- 3. 下载压缩包,存放在~/.npm(本地NPM缓存路径)目录
- 4. 解压压缩包到当前项目的node_modules目录
+
+ 1. 发出npm install命令
+ 2. npm 向 registry 查询模块压缩包的网址
+ 3. 下载压缩包,存放在~/.npm(本地NPM缓存路径)目录
+ 4. 解压压缩包到当前项目的node_modules目录
2. npm设置源
-npm set registry http://localhost:4873/
-3. npm 指定源然后安装包
-npm i --registry=https://registry.npm.taobao.org
+ npm set registry http://localhost:4873/
+
+3. npm 指定源然后安装包\
+ npm i --registry=https://registry.npm.taobao.org
+
+4. 指令
-3. 指令
```bash
# 查看全局安装过的包
npm list -g --depth 0
@@ -75,6 +91,7 @@ npx
```
## 包管理器 yarn
+
```bash
# 安装yarn
npm install yarn -g
@@ -83,16 +100,20 @@ yarn config set registry https://registry.npm.taobao.org/
```
## 源管理器
+
npm install -g nrm
nrm ls
nrm use taobao
nrm add 别名 源地址:添加源
## 私服verdaccio
+
- 参考
- - https://verdaccio.org/docs/en/installation
- - https://github.com/verdaccio/verdaccio
+ - https://verdaccio.org/docs/en/installation
+ - https://github.com/verdaccio/verdaccio
+
1. docker部署
+
```bash
V_PATH=/opt/verdaccio; docker run -d --name verdaccio \
-p 4873:4873 \
@@ -101,13 +122,15 @@ V_PATH=/opt/verdaccio; docker run -d --name verdaccio \
-v $V_PATH/plugins:/verdaccio/plugins \
verdaccio/verdaccio:5.x-next
```
+
2. 添加用户
-npm adduser --registry http://x.x.x.x:4873
-npm who am i --registry http://x.x.x.x:4873
-npm profile get --registry http://x.x.x.x:4873/
+ npm adduser --registry http://x.x.x.x:4873
+ npm who am i --registry http://x.x.x.x:4873
+ npm profile get --registry http://x.x.x.x:4873/
3. 发布私有包
-npm init -f
-vi index.js
+ npm init -f
+ vi index.js
+
```js
var user ={
name:"gary",
@@ -115,4 +138,5 @@ var user ={
}
module.exports=user;
```
+
npm publish --registry http://x.x.x.x:4873
diff --git a/language/nodejs/package.md b/language/nodejs/package.md
index c39a21a..5979fe9 100644
--- a/language/nodejs/package.md
+++ b/language/nodejs/package.md
@@ -1,4 +1,11 @@
+---
+created_date: 2020-11-16
+---
+
+[TOC]
+
## 内置包
+
```js
// base64加解密
var b = new Buffer.from('JavaScript');
@@ -19,44 +26,54 @@ fs.writeFileSync("./1.html", "data")
```
## 第三方包 package
+
1. Dataloader
- - 是由facebook推出,能大幅降低数据库的访问频次,经常在Graphql场景中使用。
- - 主要通过2个机制来降低数据库的访问频次:批处理 和 缓存。
+
+ - 是由facebook推出,能大幅降低数据库的访问频次,经常在Graphql场景中使用。
+ - 主要通过2个机制来降低数据库的访问频次:批处理 和 缓存。
2. Knex.js
- - https://knexjs.org/
- - npm install knex && npm install mysql
- - Knex.js是为Postgres,MSSQL,MySQL,MariaDB,SQLite3,Oracle和Amazon Redshift设计的“包含电池”SQL查询构建器,其设计灵活,便于携带并且使用起来非常有趣。它具有传统的节点样式回调以及用于清洁异步流控制的承诺接口,流接口,全功能查询和模式构建器,事务支持(带保存点),连接池 以及不同查询客户和方言之间的标准化响应。
+
+ - https://knexjs.org/
+ - npm install knex && npm install mysql
+ - Knex.js是为Postgres,MSSQL,MySQL,MariaDB,SQLite3,Oracle和Amazon Redshift设计的“包含电池”SQL查询构建器,其设计灵活,便于携带并且使用起来非常有趣。它具有传统的节点样式回调以及用于清洁异步流控制的承诺接口,流接口,全功能查询和模式构建器,事务支持(带保存点),连接池 以及不同查询客户和方言之间的标准化响应。
3. axios 接口请求包
- - npm install axios
- - https://github.com/axios/axios
+
+ - npm install axios
+ - https://github.com/axios/axios
4. exceljs
- - npm install exceljs
+
+ - npm install exceljs
5. ini 读取ini格式的配置
- - npm install ini
+
+ - npm install ini
6. nx 是一套功能强大、可扩展的开发工具,可帮助我们开发、测试、构建和扩展 Angular 应用程序,并完全集成支持 Jest、Cypress、ESLint、NgRx 等现代库。
7. winston 日志系统
### 区块链相关的
+
1. ethers.js
- - https://github.com/ethers-io/ethers.js
- - https://docs.ethers.io/v5/getting-started/#getting-started--contracts
- - 开发者是 Richard Moore,并由他来创建和维护库。Ethers.js 的目的是建立“一个完整、简单、小巧的库,取代 web3 和 ethereum.js
+
+ - https://github.com/ethers-io/ethers.js
+ - https://docs.ethers.io/v5/getting-started/#getting-started--contracts
+ - 开发者是 Richard Moore,并由他来创建和维护库。Ethers.js 的目的是建立“一个完整、简单、小巧的库,取代 web3 和 ethereum.js
2. web3.js
- - https://github.com/ChainSafe/web3.js
- - 是由以太坊基金会构建的开源 JavaScript 库
+
+ - https://github.com/ChainSafe/web3.js
+ - 是由以太坊基金会构建的开源 JavaScript 库
3. hardhat.js
- - https://github.com/nomiclabs/hardhat
+ - https://github.com/nomiclabs/hardhat
#### ethers.js
+
- Provider:是一个类,提供了一个抽象的到以太坊网络的连接。它提供对区块链及其状态的仅读取访问。
- Signer:是一个类,以某种方式直接或间接地有权访问私人密钥,该密钥可以签署消息和交易,以授权网络向以太坊账户收取执行操作的费用。
-- Contract:代表以太坊网络上特定合约的连接,应用程序可以像普通 JavaScript 对象一样使用它。
\ No newline at end of file
+- Contract:代表以太坊网络上特定合约的连接,应用程序可以像普通 JavaScript 对象一样使用它。
diff --git a/language/php/php-pfm.md b/language/php/php-pfm.md
index 368c481..b9acdbe 100644
--- a/language/php/php-pfm.md
+++ b/language/php/php-pfm.md
@@ -1,14 +1,24 @@
+---
+created_date: 2020-11-16
+---
+
+[TOC]
+
# php-fpm
+
- 参考文档 https://www.cnblogs.com/donghui521/p/10334776.html
+
## 一 概念
+
1. php-fpm:在整个网络请求的过程中php是一个cgi程序的角色,采用名为php-fpm的进程管理程序来对这些被请求的php程序进行管理。php-fpm工作原理类似于nginx。默认监听127.0.0.1:9000.
2. 协议
-cgi 通用网关协议,最早的协议,不高效。用于在http服务和CGI服务之间传输数据
-fastcgi 是一种常驻型CGI服务,相对httpd服务器而言是独立的,php就是这种
-scgi 和uwsgi 是新出的一种CGI协议,类似于fastcgi
+ cgi 通用网关协议,最早的协议,不高效。用于在http服务和CGI服务之间传输数据
+ fastcgi 是一种常驻型CGI服务,相对httpd服务器而言是独立的,php就是这种
+ scgi 和uwsgi 是新出的一种CGI协议,类似于fastcgi
3. 工作数据流
+
```
www.example.com
|
@@ -24,11 +34,15 @@ www.example.com
| php-fpm 处理完请求,返回给nginx
| nginx 将结果通过http返回给浏览器
```
+
## 二 yum安装php73-php-fpm
-1.
+
+1.
+
PHP在 5.3.3 之后已经把php-fpm并入到php的核心代码中了,所以php-fpm不需要单独的下载安装。
要想php支持php-fpm,只需要在编译php源码的时候带上 --enable-fpm。
-2. 安装重启
+2\. 安装重启
+
```bash
# 安装 EPEL 源
yum install epel-release -y
@@ -44,16 +58,21 @@ systemctl start php73-php-fpm
## 通过信号重启
kill -USR2 php-fpm的master进程号
```
+
3. 扩展包位置
-/opt/rh/rh-php72/root/usr/lib64/php/modules/
+ /opt/rh/rh-php72/root/usr/lib64/php/modules/
+
+4. /etc/opt/remi/php73/php.ini
+ vim php.ini
-3. /etc/opt/remi/php73/php.ini
-vim php.ini
```conf php.ini
php_flag[display_errors] = on # 是否以200状态输出错误日志
```
+
4. php-fpm.conf
+
## 三 nginx连接php-fpm配置
+
```conf
server {
listen 80;
@@ -67,8 +86,10 @@ server {
}
}
```
+
vim scgi_params 传递给php-fpm的参数
-```conf
+
+```conf
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #脚本文件请求的路径
fastcgi_param QUERY_STRING $query_string; #请求的参数;如?app=123
@@ -98,4 +119,4 @@ fastcgi_param SERVER_NAME $server_name; #服务器名,域名在server
# 在php可打印出上面的服务环境变量
# 如:echo $_SERVER['REMOTE_ADDR']
-```
\ No newline at end of file
+```
diff --git a/language/php/php.md b/language/php/php.md
index 5889b31..df0700c 100644
--- a/language/php/php.md
+++ b/language/php/php.md
@@ -1,6 +1,15 @@
+---
+created_date: 2020-11-16
+---
+
+[TOC]
+
## php依赖管理器composer
+
- Composer 不是一个包管理器。是的,它涉及 "packages" 和 "libraries",但它在每个项目的基础上进行管理,在你项目的某个目录中(例如 vendor)进行安装。默认情况下它不会在全局安装任何东西。因此,这仅仅是一个依赖管理。
+
1. 安装composer
+
```bash
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
@@ -10,13 +19,15 @@ composer config -g repo.packagist composer https://packagist.phpcomposer.com
# 更新 composer
composer selfupdate
```
+
2. 列出所有已经安装的包
-composer show -i
+ composer show -i
3. 查看全局安装的包名称和版本:
-composer global show
+ composer global show
## php demo
+
```php
acd/models.py
```
## pyinstaller
+
- 打包为可执行文件
+
```sh
# 安装 Python:确保已安装 Python(建议 3.7 或更高版本)。
pip install pyinstaller
@@ -62,16 +71,20 @@ pyinstaller -F main.py -n myapp
```
## tkinter
+
- 图形化界面库
- tkinter 是 Python 标准库
+
```sh
brew install python-tk@3.12
/opt/homebrew/bin/python3.12 -c "import _tkinter; print(_tkinter.TCL_VERSION)"
```
## pdb
+
- 运行时进行交互式调试
- Python 3.7+:可以用 breakpoint() 替代 pdb.set_trace(),无需导入 pdb。
+
```py
import pdb
def main():
@@ -82,16 +95,17 @@ def main():
if __name__ == "__main__":
main()
```
-1. 在终端运行生成的可执行文件,程序会在 pdb.set_trace() 处暂停,进入交互式调试模式。可以使用以下命令:
- 1. n(next):执行下一行代码,但不会进入函数内部(单步跳过)。
- 2. s(step):执行下一行代码,如果遇到函数调用,会进入函数内部(单步进入)。
- 3. c(continue):继续运行程序,直到遇到下一个断点或程序结束。
- 4. p variable:打印指定变量的值,例如 `p x` 显示变量 `x` 的当前值。
- 5. l(list):显示当前代码的上下文,默认显示 11 行(当前行居中)。可以加参数,例如 `l 10, 20` 显示第 10 到 20 行。
- 6. w(where)
+1. 在终端运行生成的可执行文件,程序会在 pdb.set_trace() 处暂停,进入交互式调试模式。可以使用以下命令:
+ 1. n(next):执行下一行代码,但不会进入函数内部(单步跳过)。
+ 2. s(step):执行下一行代码,如果遇到函数调用,会进入函数内部(单步进入)。
+ 3. c(continue):继续运行程序,直到遇到下一个断点或程序结束。
+ 4. p variable:打印指定变量的值,例如 `p x` 显示变量 `x` 的当前值。
+ 5. l(list):显示当前代码的上下文,默认显示 11 行(当前行居中)。可以加参数,例如 `l 10, 20` 显示第 10 到 20 行。
+ 6. w(where)
## pre-commit
+
```sh
pre-commit --version
@@ -122,7 +136,9 @@ repos:
```
## detect-secrets
+
- 安全检查
+
```sh
pip install detect-secrets
# 初始化 detect-secrets
@@ -139,6 +155,6 @@ detect-secrets scan > .secrets.baseline
args: [--baseline, .secrets.baseline]
```
-
## tomli
+
- Python 3.11+ 内置 tomllib(读写)。
diff --git a/language/python/python.md b/language/python/python.md
index feda0da..cae286d 100644
--- a/language/python/python.md
+++ b/language/python/python.md
@@ -1,14 +1,23 @@
+---
+created_date: 2020-11-16
+---
+
+[TOC]
+
## Python
+
- 目录结构
- - Lib
- - site-packages
- - Standard packages
- - Scripts
- - pip.exe
- - python.exe
+
+ - Lib
+ - site-packages
+ - Standard packages
+ - Scripts
+ - pip.exe
+ - python.exe
- 虚拟环境
- - 虚拟环境可以看作是原生Python的副本。
+
+ - 虚拟环境可以看作是原生Python的副本。
```bash
venv_name="python_1_venv"
@@ -17,6 +26,7 @@ source ~/devenv/${venv_name}/bin/activate
```
## 依赖包
+
```bash
# 1. 获取当前python环境中所有已经被安装了的依赖包
pip3 freeze > ./requirements.txt
@@ -37,13 +47,15 @@ pip install -r requirements.txt --force-reinstall --no-cache-dir
```
## 编程思想
-### 代码风格
+
+### 代码风格
+
1. PEP 8(Python Enhancement Proposal 8)是 Python 的官方代码风格指南,由 Guido van Rossum(Python 创始人)和 Barry Warsaw 于 2001 年 提出并正式发布。
2. 目的: 为 Python 开发者提供统一的代码风格标准,以提高代码的可读性和一致性。
-3. 核心目标:
- 1. 一致性:所有 Python 代码遵循相同风格,降低认知负担。
- 2. 可读性:代码不仅是给机器执行的,更是给人阅读的。
- 3. 可维护性:统一的风格便于团队协作和长期维护。
+3. 核心目标:
+ 1. 一致性:所有 Python 代码遵循相同风格,降低认知负担。
+ 2. 可读性:代码不仅是给机器执行的,更是给人阅读的。
+ 3. 可维护性:统一的风格便于团队协作和长期维护。
4. 后续受影响的产品: Black,Ruff
```sh
@@ -57,4 +69,8 @@ pip install ruff
ruff check . # Lint 检查
ruff check --fix # Lint 检查,并且进行自动修复
ruff format . # 格式化代码
-```
\ No newline at end of file
+```
+
+### Python语言服务器
+
+- Pylance
diff --git a/language/python/question.md b/language/python/question.md
index 27589b7..5045e53 100644
--- a/language/python/question.md
+++ b/language/python/question.md
@@ -1,74 +1,84 @@
+---
+created_date: 2025-04-08
+---
+
+[TOC]
+
# 中级
+
## GIL
1. GIL(全局解释器锁)是 CPython 中的一个互斥锁,限制同一时刻只有一个线程执行 Python 字节码.
2. 目的:防止多线程竞争导致的内存管理问题。
3. 副作用:影响多线程性能,但不影响多进程。
-
## decorator
+
1. 是一种强大的语法特性,它允许在不修改原函数代码的情况下,动态增强函数的功能。
+
2. 示例:
- ```py
- def my_decorator(func):
- def wrapper():
- print("Before function")
- func()
- print("After function")
- return wrapper
-
- @my_decorator
- def say_hello():
- print("Hello!")
-
- say_hello()
- # 输出:
- # Before function
- # Hello!
- # After function
- ```
-
- ```py
- import time
- def timer(func):
- def wrapper(*args, **kwargs):
- start = time.time()
- result = func(*args, **kwargs)
- end = time.time()
- print(f"{func.__name__} 执行耗时: {end - start:.4f}s")
- return result
- return wrapper
-
- @timer # 等价于 heavy_calculation = timer(heavy_calculation)
- def heavy_calculation():
- time.sleep(2)
-
- heavy_calculation() # 输出: heavy_calculation 执行耗时: 2.0002s
- ```
-
- ```py
- # 装饰器参数化,需嵌套三层函数
- def timer(unit="s"): # 外层接收装饰器参数
- def decorator(func): # 中层接收被装饰函数
- @wraps(func)
- def wrapper(*args, **kwargs): # 内层处理逻辑
- start = time.time()
- result = func(*args, **kwargs)
- end = time.time()
- if unit == "ms":
- print(f"耗时: {(end - start) * 1000:.2f}ms")
- else:
- print(f"耗时: {end - start:.2f}s")
- return result
- return wrapper
- return decorator
-
- @timer(unit="ms") # 使用参数化装饰器
- def quick_task():
- time.sleep(0.1)
- ```
+
+ ```py
+ def my_decorator(func):
+ def wrapper():
+ print("Before function")
+ func()
+ print("After function")
+ return wrapper
+
+ @my_decorator
+ def say_hello():
+ print("Hello!")
+
+ say_hello()
+ # 输出:
+ # Before function
+ # Hello!
+ # After function
+ ```
+
+ ```py
+ import time
+ def timer(func):
+ def wrapper(*args, **kwargs):
+ start = time.time()
+ result = func(*args, **kwargs)
+ end = time.time()
+ print(f"{func.__name__} 执行耗时: {end - start:.4f}s")
+ return result
+ return wrapper
+
+ @timer # 等价于 heavy_calculation = timer(heavy_calculation)
+ def heavy_calculation():
+ time.sleep(2)
+
+ heavy_calculation() # 输出: heavy_calculation 执行耗时: 2.0002s
+ ```
+
+ ```py
+ # 装饰器参数化,需嵌套三层函数
+ def timer(unit="s"): # 外层接收装饰器参数
+ def decorator(func): # 中层接收被装饰函数
+ @wraps(func)
+ def wrapper(*args, **kwargs): # 内层处理逻辑
+ start = time.time()
+ result = func(*args, **kwargs)
+ end = time.time()
+ if unit == "ms":
+ print(f"耗时: {(end - start) * 1000:.2f}ms")
+ else:
+ print(f"耗时: {end - start:.2f}s")
+ return result
+ return wrapper
+ return decorator
+
+ @timer(unit="ms") # 使用参数化装饰器
+ def quick_task():
+ time.sleep(0.1)
+ ```
## 单例
+
```
from threading import Lock
@@ -90,11 +100,14 @@ class ThreadSafeSingleton:
```
# 高级
+
## generator
+
1. 生成器(generator)是通过 yield 关键字实现的函数,逐个生成值而不是一次性返回所有值。
2. 优点: 节省内存,适合处理大数据。
## 多线程
+
1. 实现:使用 threading 模块实现多线程。
2. 劣势:由于 GIL 存在,CPU 密集型任务无法充分利用多核,适合 I/O 密集型任务。
diff --git a/language/ruby.md b/language/ruby.md
index 66d724f..e77e853 100644
--- a/language/ruby.md
+++ b/language/ruby.md
@@ -1,44 +1,59 @@
+---
+created_date: 2023-02-21
+---
+
+[TOC]
+
## 安装ruby
+
- 文档
- - https://www.runoob.com/ruby/ruby-installation-unix.html
- - https://rvm.io/
+ - https://www.runoob.com/ruby/ruby-installation-unix.html
+ - https://rvm.io/
1. 方式一 通过linux包管理器安装
- ```bash
- yum install ruby
- ```
+
+ ```bash
+ yum install ruby
+ ```
2. 方式二 通过RVM版本管理安装ruby
- ```bash
- gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
- curl -sSL https://get.rvm.io | bash -s stable
- source /etc/profile.d/rvm.sh
- # 或 source ~/.rvm/scripts/rvm
-
- rvm -v
- rvm list known # 列出本地已经安装的ruby版本
- rvm remove 2.5.7
- rvm list
- rvm install 3.2.1 # rvm install 2.6.4 --with-out-ext=fiddle
- rvm 2.5.7 --default
- ```
+
+ ```bash
+ gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
+ curl -sSL https://get.rvm.io | bash -s stable
+ source /etc/profile.d/rvm.sh
+ # 或 source ~/.rvm/scripts/rvm
+
+ rvm -v
+ rvm list known # 列出本地已经安装的ruby版本
+ rvm remove 2.5.7
+ rvm list
+ rvm install 3.2.1 # rvm install 2.6.4 --with-out-ext=fiddle
+ rvm 2.5.7 --default
+ ```
## ruby包管理器gem
+
- 安装ruby时会自动安装gem
+
```
gem install 包名
gem list --local
```
## ruby依赖包版本管理器bundler
+
```bash
# 安装ruby依赖包版本管理器bundler
gem install bundler
```
## 第一个ruby程序
+
- vim HelloWorld.rb
+
```ruby
puts "Hello world"
```
+
ruby HelloWorld.rb
diff --git a/language/rust/README.md b/language/rust/README.md
index 8b22279..79ee3aa 100644
--- a/language/rust/README.md
+++ b/language/rust/README.md
@@ -1,10 +1,18 @@
+---
+created_date: 2022-06-15
+---
+
+[TOC]
+
## Rust学习
-- ``rustup doc``文档的学习笔记
- 1. rustup 1.24.3 (ce5817a94 2021-05-31)
- 2. rustc 1.61.0 (fe5b13d68 2022-05-18)
- 3. cargo 1.61.0 (a028ae42f 2022-04-29)
+
+- `rustup doc`文档的学习笔记
+ 1. rustup 1.24.3 (ce5817a94 2021-05-31)
+ 2. rustc 1.61.0 (fe5b13d68 2022-05-18)
+ 3. cargo 1.61.0 (a028ae42f 2022-04-29)
## 目录
+
1. [Rust必看](./rust.md)
2. [基本语法](./grammar_1.md)
3. [进阶语法](./grammar_2.md)
@@ -13,4 +21,4 @@
6. [标准库](./standad.md)
7. [常用的宝箱](./crate.md)
8. [错误与解决](./error.md)
-9. [安全相关](./secure.md)
\ No newline at end of file
+9. [安全相关](./secure.md)
diff --git a/language/rust/cargo.md b/language/rust/cargo.md
index 1863ec0..8ba920c 100644
--- a/language/rust/cargo.md
+++ b/language/rust/cargo.md
@@ -1,9 +1,15 @@
+---
+created_date: 2022-05-26
+---
+
+[TOC]
## Cargo镜像源设置
```bash
vi $HOME/.cargo/config
```
+
```conf
[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
@@ -31,8 +37,8 @@ registry = "https://code.aliyun.com/rustcc/crates.io-index.git"
```
-
## Cargo.toml
+
- 官方文档 https://doc.rust-lang.org/cargo/reference/manifest.html
```conf
@@ -106,4 +112,4 @@ opt-level = 3 # 发布模式的默认优化等级是3.(cargo build --release
# strip 减小二进制体积, 编译好后进行操作 strip 二进制路径
# 不管是在Debug编译模式还是Release编译模式,编译好的二进制档都会带有调试信息。Unix-like环境下,通过Release编译模式编译出来的二进制档,可以再通过strip指令,将其中不必要的标头和调试信息移除。
-```
\ No newline at end of file
+```
diff --git a/language/rust/common.md b/language/rust/common.md
index d6a8cc8..62aef58 100644
--- a/language/rust/common.md
+++ b/language/rust/common.md
@@ -1,3 +1,9 @@
+---
+created_date: 2022-09-05
+---
+
+[TOC]
+
```rs
// 一个字节向量 Vec 转换为String
fn main1() {
@@ -20,7 +26,6 @@ fn main3(){
}
```
-
```rs
// 迭代器迭代
fn main(){
@@ -50,4 +55,4 @@ fn main(){
println!("{:?}", element);
}
}
-```
\ No newline at end of file
+```
diff --git a/language/rust/crate.md b/language/rust/crate.md
index 41e6c1b..a835d72 100644
--- a/language/rust/crate.md
+++ b/language/rust/crate.md
@@ -1,5 +1,11 @@
+---
+created_date: 2022-05-29
+---
+
[TOC]
+
## 常用的宝箱
+
- 文档搜索 https://docs.rs/${宝箱的名字}
```conf
@@ -71,6 +77,6 @@ tui = "0.19.0" # 用于构建丰富的终端用户界面或仪表板的库。依
```
-
### tempfile
- - tempfile() 依赖于操作系统、在文件句柄被关闭后删除临时文件。
\ No newline at end of file
+
+- tempfile() 依赖于操作系统、在文件句柄被关闭后删除临时文件。
diff --git a/language/rust/crate_examples.md b/language/rust/crate_examples.md
index 27aa8cb..1edcd6c 100644
--- a/language/rust/crate_examples.md
+++ b/language/rust/crate_examples.md
@@ -1,16 +1,25 @@
+---
+created_date: 2022-09-16
+---
+
+[TOC]
## rayon
+
- 对比标准库中的迭代函数
- - rayon并行迭代函数内的闭包不能改变外部状态。
- - rayon并行迭代函数会有些不同。
+
+ - rayon并行迭代函数内的闭包不能改变外部状态。
+ - rayon并行迭代函数会有些不同。
- 功能
- - Rayon并行迭代器负责确定如何将数据划分为并行任务。动态适应以达到最佳性能。
- - Rayon提供了join和scope函数,允许用户自己创建并行任务。提供了更大的灵活性。
- - 可以创建自定义线程池,而不是使用Rayon的默认全局线程池。获得了更多控制。
+
+ - Rayon并行迭代器负责确定如何将数据划分为并行任务。动态适应以达到最佳性能。
+ - Rayon提供了join和scope函数,允许用户自己创建并行任务。提供了更大的灵活性。
+ - 可以创建自定义线程池,而不是使用Rayon的默认全局线程池。获得了更多控制。
- 工作原理
- - 通过线程间 Work stealing 的方式达到并行。
+
+ - 通过线程间 Work stealing 的方式达到并行。
```rs
fn main() {
@@ -33,6 +42,7 @@ fn sum_of_squares(input: &[i32]) -> i32 {
```
## rocksdb
+
- 默认会创建rocksdb:low 和 rocksdb:high两个线程。
```rs
@@ -70,8 +80,8 @@ pub fn main() {
```
-
## rand
+
```rs
use rand::prelude::*;
@@ -112,16 +122,16 @@ fn main() {
```
-
## backoff
-- 可以用于同步和异步编程中
+- 可以用于同步和异步编程中
```toml
[dependencies]
backoff = "0.4.0"
reqwest = {version = "0.11", features = ["json", "blocking"]}
```
+
```rs
fn main() {
use backoff::{retry, Error, ExponentialBackoff};
@@ -143,6 +153,7 @@ fn main() {
```
## bytes
+
- Bytes
- BytesMut 容量会进行伸缩。
@@ -174,6 +185,7 @@ fn main2() {
```
## wrap
+
```rs
use warp::Filter;
@@ -190,6 +202,7 @@ async fn main() {
```
## ansi_term
+
```rs
use ansi_term::Colour::Red;
use ansi_term::Colour::Cyan;
@@ -206,6 +219,7 @@ fn main() {
```
## colored
+
```rs
use colored::*;
fn main() {
@@ -235,4 +249,4 @@ fn main() {
).blue()
)
}
-```
\ No newline at end of file
+```
diff --git a/language/rust/crate_tokio.md b/language/rust/crate_tokio.md
index 684eb24..acde567 100644
--- a/language/rust/crate_tokio.md
+++ b/language/rust/crate_tokio.md
@@ -1,41 +1,55 @@
+---
+created_date: 2022-06-27
+---
+
+[TOC]
+
## tokio概览
-- tokio
- - 提供了一个事件驱动型的非阻塞 I/O 异步运行时库(Runtime).
- - 提供了Rust标准库的一些异步版本。
+
+- tokio
+
+ - 提供了一个事件驱动型的非阻塞 I/O 异步运行时库(Runtime).
+ - 提供了Rust标准库的一些异步版本。
- tokio 基于Rust官方的 Future库 和 MIO库 基础上实现了用户态线程。
- tokio 底层维护着两个线程池
- - Fixed-size threadpool for executors,为tokio::spawn产生的任务服务
- - Bounded threadpool for blocking calls,为tokio::task::spawn_blocking产生的任务服务
+
+ - Fixed-size threadpool for executors,为tokio::spawn产生的任务服务
+ - Bounded threadpool for blocking calls,为tokio::task::spawn_blocking产生的任务服务
- tokio 每创建一个Runtime时,就在这个Runtime中创建好了一个Reactor、一个Scheduler、一个或多个 executor。
- - Waker 唤醒。每一个task运行时,都会将自己的Waker交给Reactor。
- - Reactor 接收事件通知。 “阻塞队列”中的每一个task,都需要等待Reactor收到对应的事件通知(比如IO完成的通知、睡眠完成的通知等)来唤醒它。当该任务被唤醒后,它将被放入“就绪队列”,等待调度器的调度。
- - Scheduler 调度器。将“就绪队列”task调度给Executer。
- - Executor 执行者。
+
+ - Waker 唤醒。每一个task运行时,都会将自己的Waker交给Reactor。
+ - Reactor 接收事件通知。 “阻塞队列”中的每一个task,都需要等待Reactor收到对应的事件通知(比如IO完成的通知、睡眠完成的通知等)来唤醒它。当该任务被唤醒后,它将被放入“就绪队列”,等待调度器的调度。
+ - Scheduler 调度器。将“就绪队列”task调度给Executer。
+ - Executor 执行者。
- 锁
- - 标准库中的锁定策略取决于操作系统的实现
- 1. Windows和macOS,读者和作家公平排队。
- 2. Linux,读者优先,作家会出现饥饿现象。
- - tokio中的锁定策略是读者和作家公平排队,与操作系统无关。
- - tokio的RwLock在挂起的时候,会让出执行权,标准库的不会。
+
+ - 标准库中的锁定策略取决于操作系统的实现
+ 1. Windows和macOS,读者和作家公平排队。
+ 2. Linux,读者优先,作家会出现饥饿现象。
+ - tokio中的锁定策略是读者和作家公平排队,与操作系统无关。
+ - tokio的RwLock在挂起的时候,会让出执行权,标准库的不会。
- Task
- - 每个task占用64 bytes
- - 每个task都必须实现了Send特性,因为task可能会在线程间转移。
- - 执行.await后,task会在线程间转移。
- - task内的数据必须存储在当前task内,当task发生线程间的转移时,会涉及到task内的数据拷贝。
- - task 的类型是 'static 的,因此任务内部的变量不能存在外部引用。
+
+ - 每个task占用64 bytes
+ - 每个task都必须实现了Send特性,因为task可能会在线程间转移。
+ - 执行.await后,task会在线程间转移。
+ - task内的数据必须存储在当前task内,当task发生线程间的转移时,会涉及到task内的数据拷贝。
+ - task 的类型是 'static 的,因此任务内部的变量不能存在外部引用。
## 相关链接
+
- 代码仓库 https://github.com/tokio-rs
- 用例示范 https://github.com/tokio-rs/tokio/tree/master/examples
- 官网 https://tokio.rs/
- 教程 https://tokio.rs/tokio
## runtime的创建
+
```rs
use tokio;
fn main1() {
@@ -78,6 +92,7 @@ async fn main() {}
```
## CPU-bound tasks
+
```rs
// 主题: CPU-bound tasks and blocking code
@@ -103,6 +118,7 @@ async fn main() {
```
## Asynchronous IO
+
```rs
// 主题: Asynchronous IO
@@ -206,9 +222,11 @@ async fn task_2() {
```
## join!()
-- join!()宏
- - 使多个future运行在同一个task上。
- - 等待所有的future执行完成。
+
+- join!()宏
+ - 使多个future运行在同一个task上。
+ - 等待所有的future执行完成。
+
```rs
async fn do_stuff_async() {
// async work
@@ -228,8 +246,8 @@ async fn main() {
}
```
-
## 线程间的消息传递
+
```rs
// 主题: 线程间的消息传递,4种方式
// use tokio::sync::broadcast; // 多个Sender,多个Receiver,每个Receiver都可以接收到每条消息。
@@ -265,6 +283,7 @@ async fn main() {
```
## tokio::select!
+
1. 允许同时等待多个异步计算操作,然后当其中一个操作完成时就退出等待。
2. 最多可以支持 64 个分支
3. 能返回一个值。
@@ -344,20 +363,25 @@ async fn main() {
}
}
```
+
## async IO
+
- 案例在myrust仓库内
## Frame
+
- 通过帧可以将字节流转换成帧组成的流。
- 每个帧就是一个数据单元,例如客户端发送的一次请求就是一个帧。
## 优雅关闭
+
- 关键点
- 1. 找出合适的关闭时机
- 2. 通知程序的每一个子部分开始关闭
- 3. 在主线程等待各个部分的关闭结果
+ 1. 找出合适的关闭时机
+ 2. 通知程序的每一个子部分开始关闭
+ 3. 在主线程等待各个部分的关闭结果
## async
+
```rs
// 通过tokio库创建future
async fn do_stuff(i: i32) -> String {
@@ -377,7 +401,9 @@ fn do_stuff(i: i32) -> impl Future