Design Patterns

Design Patterns UML类图 参考:设计模式之 UML 类图 UML例子 class Student { private String name; public String getName() { return name; } public void takeExam(Course course) { course.test(); } } class Course { private String courseName; public void test() { // take exam... } } 类名叫做 Student 和 Course + 代表 public 公共,- 代表 private 私有,# 代表 protected 成员变量类型写在前,参数名称写在后 函数传递参数,参数名写在前,类型写在后 函数返回值写在函数签名的后面 两个类之间若存在关系,可使用箭头进行关联,具体关联规则在下文介绍 箭头上的数字代表 1 个学生可以不参加课程,也可以无限制参加各种课程 1 代表一个,0..* 代表 0 个到无限个 类与类的关系 依赖 (Dependency) 对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。 ...

January 1, 2000

Docker

Docker Command 登录 docker login 查看信息 # version docker version docker info # 查看系统信息 docker system info # ps docker ps # 查看容器信息 docker inspect container_name/container_id # 查看容器运行日志 docker logs container_name/container_id # 查看尾部日志并跟踪 docker logs --tail 10 -f container_name/container_id # 查看容器端口映射 docker port container_name # 查看容器占用资源 docker stats 镜像 # search images docker search python # list images docker image ls # download image docker pull python:latest # commit image docker commit -m "comment" -a "author" container_id my_hub/my_image:tag # push image docker login docker tag my_image my_hub/my_image docker push my_hub/my_image # remove image docker rmi my_image:tag docker image prune # save image docker save -o my_image.tar my_hub/my_image # load image docker load --input my_image.tar Build docker image build ...

January 1, 2000

ELK-Elasticsearch

ELK-Elasticsearch Run on Docker docker pull docker.elastic.co/elasticsearch/elasticsearch:7.9.1 docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name elasticsearch docker.elastic.co/elasticsearch/elasticsearch:7.9.1 常用查询 # 查看集群健康 curl "http://localhost:9200/_cat/health?v" # 查看节点 curl "http://localhost:9200/_cat/nodes?v" # 查看index curl "http://localhost:9200/_cat/indices?v&s=index" # 查看index按大小排序 curl "http://localhost:9200/_cat/indices?v&s=store.size:desc" # 查看数据,按照field1和field2的值过滤 curl "http://localhost:9200/my-index/_search?q=field1:100&q=field2:abc" # 查看数据,返回field1和field2并按field1排序 curl "http://localhost:9200/my-index/_search?_source=field1,field2&sort=field1:desc" # POST curl -XPOST "http://localhost:9200/my-index/_search?" -H 'Content-Type: application/json' -d '{"size":3, "query": {"term":{"Name":"Tom"}}}' # 查看配置 curl "http://localhost:9200/_cluster/settings?include_defaults=true&pretty" # 查看统计 curl "http://localhost:9200/_nodes/stats?pretty" APIs cat APIs cat APIs Common # verbose,显示 header curl -XGET "http://{ip}:9200/_cat/master?v" # help,显示说明 # 在 Kibana 中可以输入命令后按 `cmd + /` 查询文档 curl -XGET "http://{ip}:9200/_cat/master?help" # 输出指定 headers curl -XGET "http://{ip}:9200/_cat/master?h=ip,port,name" # 排序 curl -XGET "http://{ip}:9200/_cat/indices?v&s=index curl -XGET "http://{ip}:9200/_cat/indices?v&s=index:asc" # 升序 curl -XGET "http://{ip}:9200/_cat/indices?v&s=index:desc" # 降序 curl -XGET "http://{ip}:9200/_cat/templates?v&s=order:desc,index_patterns" # 多级排序 # 输出格式:format=text|json|yaml|smile|cbors curl -XGET "http://{ip}:9200/_cat/indices?format=json&pretty" # 输出单位:bytes=b|kb|mb|gb|tb|pb, curl -XGET "http://{ip}:9200/_cat/indices?s=store.size:desc&bytes=b" APIs ...

January 1, 2000

ELK-Filebeat

ELK-Filebeat Run Filebeat on Docker docker pull docker.elastic.co/beats/filebeat:7.9.1 docker run -d \ --name=filebeat \ --user=root \ --volume="$(pwd)/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" \ --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" \ --volume="/var/run/docker.sock:/var/run/docker.sock:ro" \ --volume="/var/log:/var/log" \ # mount host log position docker.elastic.co/beats/filebeat:7.9.1 filebeat -e -strict.perms=false Filebeat Config # file input filebeat.inputs: - type: log enabled: true paths: - /var/log/test.log exclude_lines: ['^nohup'] # modules filebeat.config: modules: path: ${path.config}/modules.d/*.yml reload.enabled: false # logstash output output.logstash: hosts: ["localhost:5044"] # elasticsearch output output.elasticsearch: hosts: ["localhost:9200"] # 当ES在docker中运行时,要用host ip而不能写localhost,因为Filebeat和ES不在一个docker中 username: 'username' password: 'password'

January 1, 2000

ELK-Logstash

ELK-Logstash Run Logstash on Docker docker pull docker.elastic.co/logstash/logstash-oss:7.9.1 docker run --rm -it \ -p 5044:5044 \ -v /data/yzchen/elk/logstash/pipeline/:/usr/share/logstash/pipeline/ \ docker.elastic.co/logstash/logstash-oss:7.9.1 Logstash Config input { # Filebeat input beats { port => "5044" } # Redis input redis { host => "host_ip" port => port password => "password" data_type => "channel" key => "channel_pattern" } filter { # drop data if [type] != "raw" { drop { } } # parse json string json { source => "msgdata" } # drop field prune { blacklist_names => ["msgdata"] } # check if a field exists if ([foo]) { } # for numeric type if ("" in [foo]) { } # for other type # dissect dissect { mapping => { "line" => "%{month} %{day} %{time} %{id} %{?NET_CONNTRACK->}[%{type}]%{rest}" } } # select from array and dict mutate { update => {"new_field" => "%{[array_name][0][key_name]}"} } # qeury mysql and add filed jdbc_streaming { jdbc_driver_library => "/usr/share/logstash/mysql-connector-java-5.1.34.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://host:3306/database" jdbc_user => "username" jdbc_password => "secret" statement => "SELECT col FROM table WHERE name = :name" parameters => { "name" => "name"} target => "col" } # query elasticsearch and add filed # 注意这里的query语法是ES的Query string # 详见https://www.elastic.co/guide/en/elasticsearch/reference/7.12/query-dsl-query-string-query.html#query-string-syntax elasticsearch { hosts => ["host:9200"] index => "python-log-auth-*" query => 'type:auth AND name:"%{[name]}"' fields => { "device" => "device" } sort => "@timestamp:desc" } # ruby ruby { code => "event.set('date', (event.get('message')[0..-7].to_f + event.get('message')[-6..-1].to_f / 1000000).to_s)" } } output { # debug output stdout { codec => rubydebug } 监控 curl -XGET 'localhost:9600/_node/stats/<ps|jvm|process|events|pipelines|reloads>' References Logstash 最佳实践

January 1, 2000

Environment

安装 Python 包 你的 Python 包都装到哪了? 假设当前 Python 解释器的路径是 $path_prefix/bin/python,那么你启动 Python 交互环境或者用这个解释器运行脚本时,会默认寻找以下位置 $path_prefix/lib(标准库路径) $path_prefix/lib/pythonX.Y/site-packages(三方库路径,X.Y 是对应 Python 的主次版本号,如 3.7, 2.6) 当前工作目录(pwd命令的返回结果) 几个有用的函数 sys.executable:当前使用的 Python 解释器路径 sys.path:当前包的搜索路径列表 sys.prefix:当前使用的 $path_prefix 除此之外,还在以在命令行中运行 python -m site,会打印出当前 Python 的一些信息,包括搜索路径列表。 使用环境变量添加搜索路径 如果你的包的路径不存在上面列出的搜索路径列表里,可以把路径加到 PYTHONPATH 环境变量里 虚拟环境 虚拟环境就是为了隔离不同项目的依赖包,使他们安装到不同的路径下,以防止依赖冲突的问题。理解了 Python 是如何安装包的机制之后就不难理解虚拟环境(virtualenv, venv模块)的原理。其实,运行virtualenv myenv会复制一个新的 Python 解释器到myenv/bin下,并创建好myenv/lib,myenv/lib/pythonX.Y/site-packages等目录(venv模块不是用的复制,但结果基本一样)。执行source myenv/bin/activate以后会把myenv/bin塞到PATH前面,让这个复制出来的 Python 解释器最优先被搜索到。这样,后续安装包时,$path_prefix就会是myenv了,从而实现了安装路径的隔离。 运行 Python 脚本 运行一个子目录中某脚本的代码,应该用 python -m <module_name>。python -m 后面的参数是(以 . 分隔的)模块名,而不是路径名。 pip 运行 pip 有两种方式: pip ... python -m pip ... 第一种方式和第二种方式大同小异,区别是第一种方式使用的 Python 解释器是写在 pip 文件的 shebang 里的,一般情况下,如果你的 pip 路径是 $path_prefix/bin/pip,那么 Python 路径对应的就是 $path_prefix/bin/python。如果你用的是 Unix 系统则 cat $(which pip) 第一行就包含了 Python 解释器的路径。第二种方式则显式地指定了 Python 的位置。 ...

January 1, 2000

Git

Git 配置 git config --global user.name "your_username" git config --global user.email "your_email" # 查看所有配置 git config -l 初始化 # 初始化指定目录 git init git-demo # 初始化当前目录 git init 查看状态 git status git status -s # 简化版 # short format # ?? file # 文件未追踪 # A file # 文件已添加 # M file # 文件被修改 # M file # 文件被修改且已加入暂存区 标识 SHA1标识:f1dfde5930bb26b7e94738481aca2bad6fc74b39 可以使用缩写,只写前4+位 HEAD引用:指向当前分支的最新修订 HEAD^n:当HEAD或标识存在分支合并时,指向第n个父修订 HEAD~m:指向第m个祖先修订 HEAD^n~m:指向第n个父修订的第m个祖先修订 HEAD@{k}:指向倒数第k个历史操作指向的修订 分支引用:指向所指分支的最后一个修订 查看历史记录 查看提交记录 git log git log --graph git --no-pager log # 输出到stdout git log --oneline # 一行展示 # 查看最近3条记录,-3表示输出不查过3行 git log HEAD -3 # 查看离 e85fe7 最近3条记录 git log e85fe7 -3 # 单行显示 git log --abbrev-commit --pretty=oneline # 只显示提交备注 git log --pretty=format:'%s' # 配置alias git config --global alias.hist 'log --pretty=format:"%h %ad | %s%d [%an]" --date=short' git hist git config --global alias.graph 'log --graph' git graph git config --global alias.mist 'log --pretty=format:"%s"' git mist 查看提交 # 查看 e85fe7 的修订记录 git show e85fe7 # 查看倒数第2次记录 # HEAD: 当前修订,等于HEAD~0 # HEAD~1: 前一个修订 # HEAD~2: 前两个修订 git show HEAD~2 查看文件差异 # ckeck difference git diff git diff --name-only # 只显示文件名 git diff --stat # 显示统计信息 # 查看倒数第二次修订和当前修订中,file1文件的差异 git diff HEAD~1 HEAD file1 difftool 在 ~/.gitconfig 中写入一下配置 ...

January 1, 2000

Go Cookbook

References How to Write Go Code Effective Go Awesome Go Install 下载安装 rm -rf /usr/local/go && tar -C /usr/local -xzf go1.20.2.linux-amd64.tar.gz 添加环境变量 export GOPATH=/data/username/go # 修改 GOPATH,默认是 $HOME/go export GO111MODULE=on # 默认开启 go module export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin # 添加环境变量 查看环境变量 go env Go Modules 开启go modules go env -w GO111MODULE="auto" # 如果无法访问proxy.golang.org,需要修改proxy go env -w GOPROXY=https://goproxy.cn,direct # 公司proxy:https://goproxy.woa.com export GOPROXY="https://yizhenchen:vm4UIuF1@goproxy.woa.com,direct" export GOPRIVATE="" export GOSUMDB="sum.woa.com+643d7a06+Ac5f5VOC4N8NUXdmhbm8pZSXIWfhek5JSmWdWrq7pLX4" export no_proxy=$no_proxy",goproxy.woa.com" 使用 # 初始化包 go mod init example/user/hello # build and install go install example/user/hello # 自动检测依赖包 go mod tidy 配置境内源 ...

January 1, 2000

Go Language

Code Reference gotemplate.go: package main import ( "fmt" ) const c = "C" var v int = 5 type T struct{} func init() { // initialization of package } func main() { var a int Func1() // ... fmt.Println(a) } func (t T) Method1() { // ... } func Func1() { // exported function Func1 // ... } 变量与常量 Assignment // declare and init var s1 string = "hello" var s2 = "world" // 简写,有初始值时可省略类型 s3 := "hello world" // 简写 var i1, i2 int = 1, 2 // 同时声明多个变量 var i3, s4 = 1, "2" // 有初始值时可省略类型 var i4 = 4 i5 := 5 // := 结构不能在函数外使用 // declare without initiation var s0 string // s0 = "" var i0 int // i0 = 0 var b0 bool // b0 = false Constants const s string = "constant" const n = 500000000 // 数值常量可以是任意精度,没有类型 const d = 3e20 / n // 常量不能用 := 语法声明 Enum 常量还可以用作枚举: ...

January 1, 2000

Go Packages

Utils godetenv Github - godotenv Go 每日一库 - godotenv 读取同目录下 .env 文件 name=Tom age=18 example import "github.com/joho/godotenv" func main() { err := godotenv.Load() if err != nil { log.Fatal(err) } fmt.Println("name: ", os.Getenv("name")) fmt.Println("age: ", os.Getenv("age")) } // 也可以加载其他文件 // 如果多个文件出现同一个 key,先出现的优先后出现的不生效 godotenv.Load("common", "dev.env") 也可以加载 YAML 文件 name: awesome web version: 0.0.1 # os.Getenv("name") 一般有多个环境文件:.env.dev、.env.test、env.production,可以用以下代码切换 env := os.Getenv("APP_ENV") if env == "" { env = "dev" } err := godotenv.Load(".env." + env) if err != nil { log.Fatal(err) } err = godotenv.Load() if err != nil { log.Fatal(err) } fmt.Println("name: ", os.Getenv("name")) fmt.Println("version: ", os.Getenv("version")) fmt.Println("database: ", os.Getenv("database")) CLI flag 用于解析命令行参数 ...

January 1, 2000