git合并方法学习

用字符画描述git的合并方法 1. 合并(Merge) main 分支 A---B---C \ dev 分支 D---E---F 在 main 分支上执行 `git merge dev` 后: main 分支 A---B---C-----------G <- (G 是合并提交) \ / dev 分支 D---E---F 2. 变基(Rebase) main 分支 A---B---C \ dev 分支 D---E---F 在 dev 分支上执行 `git rebase main` 后,再在 main 分支上执行 `git merge dev`: main 分支 A---B---C---D'---E'---F' 3. 压缩合并(Squash and Merge) main 分支 A---B---C \ dev 分支 D---E---F 在 main 分支上执行 `git merge --squash dev` 后,再执行提交: main 分支 A---B---C-----------G' <- (G' 是一个新的提交,合并来自 D、E 和 F 的变更) 4. 拣选提交(Cherry-pick)(不是标准合并所有更改的方法) main 分支 A---B---C \ dev 分支 D---E---F 在 main 分支上对 dev 分支的每个提交执行 `git cherry-pick <提交哈希值>`: main 分支 A---B---C---D'---E'---F' <- (每个提交被逐一复制) 合并方法的对比表格 方法 特点 适用场景 结果 Merge 保留所有分支的历史 标准的合并操作,适用于大多数场景 创建一个新的合并提交 Rebase 使历史线性化 个人分支上的工作或清洁历史 不保留原始分支提交的顺序 Squash and Merge 将所有更改压缩为一个提交 当你想要简化复杂分支的历史时 一个新的单一提交 Cherry-pick 手动选择特定提交 只合并某些特定的更改 对选择的每个提交创建新的提交 请注意,这些方法中,Merge 和 Rebase 是最常用的策略来整合一个开发分支(如 dev)到主分支(如 main)。Squash and Merge 通常用于在合并之前压缩多个提交以保持清洁的历史。Cherry-pick 方法并不是一个真正的分支合并策略,它只是用于将选定的提交从一个分支复制到另一个分支,因此它不应用于将一个完整的功能分支合并到主分支的场景。

创建: 2024-03-26 | 字数: 599字 | 时长: 2分钟

祝大哥今年发大财日进斗金

好久没有更新了,借此机会更新一下,老早就看了天气预报今天会下雨,于是就做好了不出门的准备,一觉睡到十点多,一看窗外也没有下雨啊,但是还是照计划行事吧,开启懒狗模式,饿了点了个外卖,想起几天前就是315,又爆了什么猛料呢?梅菜扣肉,某奶茶……触目惊心,可是仔细一想,央视那些记者真是习得东亚小岛传统技能忍者术啊,那叫一个能忍,暗中调查一年,然后在第二年的315憋个大招?已经不知道用什么语言来表达了。说回点外卖,自从去年在北京住青旅找工作的那段时间,那时候在蓝鸟上看到一句话说“此时北上广的青旅里,挤满了找工作的年轻人。”我已经很少很少点外卖了,这次也是懒狗模式的缘故,美团送了个张30-10的券,点了个杨国福麻辣烫,上一次点外卖也是这家,而且内容也都类似(千张,莴苣片,油豆皮,青菜……),我从不或者很少选肉、肉丸子,因为自从我听了一句话叫做“好肉不做馅”就一直把这句话放在心里。 外卖到了,收到外卖员的电话了,打电话说外卖到了,我说好,出门去拿,打开门,他在门口,是一个看起来三十多不到四十的中年人,按照的点外卖经历,有时候,你接到电话,他其实才到楼下,等你想起来再去拿,其实外卖已经在门口,人早就走了。要么就是你收到电话是,外卖已经给你扔门口了,他也走远了,但今天不一样,他就在门口站着,我打开门接过外卖,说了声谢谢,就回屋了。其实到此为止也不至于我今天下午想这么多东西,以至于想写点东西。 下午,闲得蛋疼并不是卷的我,出门骑车去公司的路上,我收到一个电话,我一看浙江杭州号码,接过来,对面说“大哥好,我是给你送麻辣烫的那个外卖员,麻烦您能给我一个五星好评吗?帮我过一下新手的任务,祝大哥今年发大财日进斗金。”,我说好,其实我知道按照我的性格,当他说是过新手任务的时候,我就会决定帮他这个忙了。后面那句直接让我楞了一秒,我才憋出一句”你也一样“,虽然平时工作中,和外部一些初入职场的年轻人对接时,他们...

创建: 2024-03-17 | 字数: 937字 | 时长: 2分钟

ElasticSearch中熔断器

Elasticsearch Service 提供了多种官方的熔断器(circuit breaker),用于防止内存使用过高导致 ES 集群因为 OutOfMemoryError 而出现问题。Elasticsearch 设置有各种类型的子熔断器,负责特定请求处理的内存限制。此外,还有一个父熔断器,用于限制所有子熔断器上使用的内存总量。 Circuit breaker settings 断路器设置 Elasticsearch contains multiple circuit breakers used to prevent operations from causing an OutOfMemoryError. Each breaker specifies a limit for how much memory it can use. Additionally, there is a parent-level breaker that specifies the total amount of memory that can be used across all breakers. Elasticsearch 包含多个断路器,用于防止操作导致 OutOfMemoryError。每个断路器都指定了其可以使用的内存量的限制。此外,还有一个父级断路器,用于指定可在所有断路器中使用的内存总量。 Except where noted otherwise, these settings can be dynamically updated on a live cluster with the cluster-update-settings API. 除非另有说明,否则可以使用 cluster-update-settings API 在实时集群上动态更新这些设置。 For information about circuit breaker errors, see Circuit breaker errors. 有关断路器错误的信息,请参阅断路器错误。 下面提到的静态和动态的意思是,这个配置参数的属性 动态设置(Dynamic Settings): 可以使用集群更新设置API在运行中的集群上进行配置和更新。 在未启动或已关闭的节点上,也可以通过elasticsearch.yml文件进行本地配置。 静态设置(Static Settings): 只能在未启动或已关闭的节点上通过elasticsearch.yml文件进行配置。 必须在集群中的每个相关节点上进行设置。 主要用于配置静态的集群设置和节点设置。 静态设置的配置只在节点启动时生效,不会受到集群运行时的影响。 Parent circuit breaker父断路器 The parent-level breaker can be configured with the following settings: 可以使用以下设置配置父级断路器: indices.breaker.total.use_real_memory (Static) Determines whether the parent breaker should take real memory usage into account (true) or only consider the amount that is reserved by child circuit breakers (false). Defaults to true. (静态)确定父断路器是应考虑实际内存使用情况 (true) 还是仅考虑子断路器保留的内存量 (false)。默认值为 true。 indices.breaker.total.limit (Dynamic) Starting limit for overall parent breaker. Defaults to 70% of JVM heap if indices.breaker.total.use_real_memory is false. If indices.breaker.total.use_real_memory is true, defaults to 95% of the JVM heap. (动态)整体母断路器的起始限制。如果 JVM 为 false,则默认为 JVM 堆的 70%indices.brea...

创建: 2023-11-20 | 字数: 2523字 | 时长: 6分钟

Elasticsearch稳定性介绍

Elasticsearch 的团队致力于不断改进 Elasticsearch 和 Apache Lucene,以保护您的数据。与任何分布式系统一样,Elasticsearch 非常复杂,每个部分都可能遇到需要正确处理的边缘情况。我们将讨论在面对硬件和软件故障时,为改进 Elasticsearch 在健壮性和弹性方面所做的持续努力。 提升ElasticSearch的弹性:https://www.elastic.co/cn/videos/improving-elasticsearch-resiliency ElasticSearch和弹性:https://www.elastic.co/cn/elasticon/conf/2016/sf/elasticsearch-and-resiliency 参考资料:https://www.elastic.co/guide/en/elasticsearch/resiliency/current/index.html 本文不是ElasticSearch的Release docs,只关注与ElasticSearch在弹性/稳定性方面的进展。 V5.0.0 使用两阶段提交进行集群状态发布 Elasticsearch中的主节点会持续监控集群节点,并在某个节点无法及时响应其PING请求时将其从集群中移除。如果主节点剩下的节点过少,它将主动放弃主节点的角色,然后开始新的主节点选举过程。当网络分区导致主节点失去许多从节点时,在检测到节点丢失并且主节点下行之前,有一个很短的时间窗口。在这个时间窗口内,主节点可能会错误地接受和确认集群状态变更。为了避免这种情况,我们在集群状态发布中引入了一个新的阶段,其中提议的集群状态会发送给所有节点,但尚未提交。只有在足够多的节点主动确认更改后,更改才会被提交,并向节点发送提交消息#13062。A master node in Elasticsearch continuously monitors the cluster nodes and removes any node from the cluster that doesn’t respond to its pings in a timely fashion. If the master is left with too few nodes, it will step down and a new master election will start.When a network partition causes a master node to lose many followers, there is a short window in time until the node loss is detected...

创建: 2023-11-16 | 字数: 7371字 | 时长: 15分钟

随便写点什么吧

胡言乱语【1】 昨天去了西溪湿地公园,在网络上搜了下攻略发现,有收费区和免费区,而且景色还没什么两样,果断选择无成本的方案,免费的就是最贵的,结果就是人挤人,还有二货明明走在机动车道了,还不满足,还要并排着走(大有不服你来撞我的意思)。开车的人还不能鸣笛,只能找机会借对面的道绕过去,速度缓慢,走走停停,我心想要是开个油车手动挡走这条路简直就是地狱级。 胡言乱语【2】 碰见一个三口之家朝我走过来,爸爸手里拿着两片叶子,放在嘴边吹响了,小男孩说,看来爸爸在农村长大还是有用的(会吹叶子做的哨子),爸爸和妈妈都笑了,问他那你现在在哪里啊?然后我已经走远了。一位寒窗苦读艰苦奋斗的农村青年终于在城市站稳脚跟,周末带着老婆孩子去感受城市里的农村(湿地)。 胡言乱语【3】 杭州是新一线城市,武汉也是新一线城市,武汉房价比不过杭州,武行东湖也比不过杭州西湖,在历史气息这块我想还不能直接妄下结论,虽然没有像杭州那样留下一首忆江南的诗,但是近代史很多关键性的事件也是在武汉发生。 关于西溪湿地里高庄的历史 高庄又名西溪山庄,始建于清顺治十四年(1657)至康熙三年(1664年)之间,是清代文人高士奇在西溪的别墅。 高士奇,杭州人,其学识渊博,能诗文,擅书法,精考证,善鉴赏,被清人比作李白、宋濂一流人物,所藏书画甚富,康熙二十八年(1689),康熙南巡时,曾临幸西溪山庄,并赐“竹窗”二字和诗一首:“花源路几重,柴桑出沃土。烟翠竹窗幽,雪香梅岸古”。 传说康熙曾南巡到西溪,独与高士奇泛小舟至高庄观览良久,高士奇将康熙驻趾之亭取名为“宸览亭”亭柱上有楹联:“翠辇曾停红莲依旧,宸游不再斯事难逢。”居中的石碑上四个大字“高庄宸迹”,此处就是当年康熙皇帝留在西溪的胜景遗迹。 因为是在免费区,人更多了,大部分都是穿着古装在摆拍的,不得不佩服妹子的专业能力,还有道具的书,捧在手里,拿着小扇子。 而我只是看着水池边的白条,但凡有个网兜,...

创建: 2023-10-29 | 字数: 816字 | 时长: 2分钟

Docker Compose 运行 Elastic Stack 8.X

材料准备 如题,使用Docker Compose 运行Elastic Stack 8.X,五个月前还在前司做7.9版本的ELK迁移,如今已经是前司了,当时总共不到20TB,最近问前同事数据量已经到40TB了,而且根据她发我的截图来看,三千多个索引,副本分片却只有两千多,不操心了,事不关己高高挂起,反正现在负责ELK的是新来的陌生人。今天看已经发到8.10版本了,来装一个感受下新特性。 官方Docker Compose 官方安装指引文档 额外操作参考博客 version: "2.2" services: setup: image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} volumes: - certs:/usr/share/elasticsearch/config/certs user: "0" command: > bash -c ' if [ x${ELASTIC_PASSWORD} == x ]; then echo "Set the ELASTIC_PASSWORD environment variable in the .env file"; exit 1; elif [ x${KIBANA_PASSWORD} == x ]; then echo "Set the KIBANA_PASSWORD environment variable in the .env file"; exit 1; fi; if [ ! -f config/certs/ca.zip ]; then echo "Creating CA"; bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip; unzip config/certs/ca.zip -d config/certs; fi; if [ ! -f config/certs/certs.zip ]; then echo "Creating certs"; echo -ne \ "instances:\n"\ " - name: es01\n"\ " dns:\n"\ " - es01\n"\ " - localhost\n"\ " ip:\n"\ " - 127.0.0.1\n"\ " - name: es02\n"\ " dns:\n"\ " - es02\n"\ " - localhost\n"\ " ip:\n"\ " - 127.0.0.1\n"\ " - name: es03\n"\ " dns:\n"\ " - es03\n"\ " - localhost\n"\ " ip:\n"\ " - 127.0.0.1\n"\ > config/certs/instances.yml; bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key; unzip config/certs/certs.zip -d config/certs; fi; echo "Setting file permissions" chown -R root:root config/certs; find . -type d -exec chmod 750 \{\} \;; find . -type f -exec chmod 640 \{\} \;; echo "Waiting for Elasticsearch availability"; until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q "missing authentication credentials"; do sleep 30; done; echo "Setting kibana_system password"; until curl -s -X POST --cacert config/certs/ca/ca.crt -u "elastic:${ELASTIC_PASSWORD}" -H "Content-Type: application/json" https://es01:9200/_security/user/kibana_system/_password -d "{\"password\":\"${KIBANA_PASSWORD}\"}" | grep -q "^{}"; do sleep 10; done; echo "All done!"; ' healthcheck: test: ["CMD-SHELL", "[ -f config/certs/es01/es01.crt ]"] interval: 1s timeout: 5s retries: 120 es01: depends_on: setup: condition: service_healthy image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} volumes: - certs:/usr/share/elasticsearch/config/certs - esdata01:/usr/share/elasticsearch/data ports: - ${ES_PORT}:9200 environment: - node.name=es01 - cluster.name=${CLUSTER_NAME} - cluster.initial_master_nodes=es01,es02,es03 - discovery.seed_hosts=es02,es03 - ELASTIC_PASSWORD=${ELASTIC_PASSWORD} - bootstrap.memory_lock=true - xpack.security.enabled=true - xpack.security.http.ssl.enabled=true - xpack.security.http.ssl.key=certs/es01/es01.key - xpack.security.http.ssl.certificate=certs/es01/es01.crt - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.enabled=true - xpack.security.transport.ssl.key=certs/es01/es01.key - xpack.security.transport.ssl.certificate=certs/es01/es01.crt - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.verification_mode=certificate - xpack.license.self_generated.type=${LICENSE} mem_limit: ${MEM_LIMIT} ulimits: memlock: soft: -1 hard: -1 healthcheck: test: [ "CMD-SHELL", "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'", ] interval: 10s timeout: 10s retries: 120 es02: depends_on: - es01 image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} volumes: - certs:/usr/share/elasticsearch/config/certs - esdata02:/usr/share/elasticsearch/data environment: - node.name=es02 - cluster.name=${CLUSTER_NAME} - cluster.initial_master_nodes=es01,es02,es03 - discovery.seed_hosts=es01,es03 - bootstrap.memory_lock=true - xpack.security.enabled=true - xpack.security.http.ssl.enabled=true - xpack.security.http.ssl.key=certs/es02/es02.key - xpack.security.http.ssl.certificate=certs/es02/es02.crt - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.enabled=true - xpack.security.transport.ssl.key=certs/es02/es02.key - xpack.security.transport.ssl.certificate=certs/es02/es02.crt - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.verification_mode=certificate - xpack.license.self_generated.type=${LICENSE} mem_limit: ${MEM_LIMIT} ulimits: memlock: soft: -1 hard: -1 healthcheck: test: [ "CMD-SHELL", "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'", ] interval: 10s timeout: 10s retries: 120 es03: depends_on: - es02 image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} volumes: - certs:/usr/share/elasticsearch/config/certs - esdata03:/usr/share/elasticsearch/data environment: - node.name=es03 - cluster.name=${CLUSTER_NAME} - cluster.initial_master_nodes=es01,es02,es03 - discovery.seed_hosts=es01,es02 - bootstrap.memory_lock=true - xpack.security.enabled=true - xpack.security.http.ssl.enabled=true - xpack.security.http.ssl.key=certs/es03/es03.key - xpack.security.http.ssl.certificate=certs/es03/es03.crt - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.enabled=true - xpack.security.transport.ssl.key=certs/es03/es03.key - xpack.security.transport.ssl.certificate=certs/es03/es03.crt - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.verification_mode=certificate - xpack.license.self_generated.type=${LICENSE} mem_limit: ${MEM_LIMIT} ulimits: memlock: soft: -1 hard: -1 healthcheck: test: [ "CMD-SHELL", "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'", ] interval: 10s timeout: 10s retries: 120 kibana: depends_on: es01: condition: service_healthy es02: condition: service_healthy es03: condition: service_healthy image: docker.elastic.co/kibana/kibana:${STACK_VERSION} volumes: - certs:/usr/share/kibana/config/certs - kibanadata:/usr/share/kibana/data ports: - ${KIBANA_PORT}:5601 environment: - SERVERNAME=kibana - ELASTICSEARCH_HOSTS=https://es01:9200 - ELASTICSEARCH_USERNAME=kibana_system - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD} - ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt mem_limit: ${MEM_LIMIT} healthcheck: test: [ "CMD-SHELL", "curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'", ] interval: 10s timeout: 10s retries: 120 volumes: certs: driver: local esdata01: driver: local esdata02: driver: local esdata03: driver: local kibanadata: driver: local 步骤分析 来欣赏下官方文档里面都干了些啥吧 创建了一个卷用来存储各种证书 判断ElasticSear...

创建: 2023-09-28 | 字数: 2279字 | 时长: 5分钟

记一次Prometheus的离奇经历

前情提要 书接上回,为了获取客户的Prometheus的监控数据,我写了个脚本用来通过API获取监控数据,然后转换成Open metric格式以方便,传输和导入,代码如下。 import datetime import subprocess import requests import sys """ http://localhost:9090 """ prometheus_url = input("请输入Prometheus链接: ") username = input("请输入用户名: 如无认证,请回车跳过") password = input("请输入密码: 如无认证,请回车跳过") print("下面的两个变量只需填写一个或者不填使用默认值") step = input("请输入每两个数据点间隔(单位秒,建议为5的倍数): ") hours = input("请输入往前查询的小时数(单位小时,建议不填): ") auth = None metric_param = "e" # 将查询出所有带有elasticsearch的指标 if username != "" and password != "": auth = (username, password) # 检查用户输入是否为数字 def is_number(value): try: int(value) return True except ValueError: return False # 如果用户同时设置了hours和step,按用户的输入值查询 if hours != "" and step != "": hours = int(hours) step = int(step) print("将查询过去{}小时的数据,步长为{}秒".format(hours, step)) else: # 如果用户没有输入hours和step,使用默认值 if hours == "" and step == "": print("将使用默认值查询") hours = 30 step = 10 elif hours != "": hours = int(hours) # 根据用户输入的hours计算step step = int(60 * 60 / (11000 / hours)) + 1 print("将查询过去{}小时的数据,步长为{}秒".format(hours, step)) elif step != "": step = int(step) # 根据用户输入的step计算hours hours = int(11000 / (60 / step) / 60) print("将查询过去{}小时的数据,步长为{}秒".format(hours, step)) else: print("输入的小时数和步长必须为有效的数字。") sys.exit(1) end_time = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ") query_time = datetime.datetime.now() - datetime.timedelta(hours=hours) start_time = query_time.strftime("%Y-%m-%dT%H:%M:%SZ") series = requests.get('{}/api/v1/label/__name__/values'.format(prometheus_url), auth=auth) if series.status_code != 200: print("查询失败,请检查{}/api/v1/label/__...

创建: 2023-09-25 | 字数: 5507字 | 时长: 11分钟

获取客户 Prometheus 监控数据

业务背景 在排查问题时,想通过Grafana看板查看用户的监控,只能靠拍照,效率低,质量一般,设计一个方案能够方便的将问题出现前24小时的监控数据拿到,在本地导入,就能够在本地Grafana方便的查看。Prometheus 本身只提供了API查询的功能并没有导出数据功能,自带的Promtool也只提供验证规则文件和配置文件,调试等。 参考文章 Analyzing Prometheus data with external tools Prometheus backfilling 方案一:使用API导出转换成CSV 使用API查询,将查询到的数据转换成CSV,刚好Grafana有插件能够将CSV作为数据源,经过实验后并不是特别顺利,能够读取到CSV,但没有成功绘制出图像。 总结 经过实验后并不是特别顺利,能够读取到CSV但没有成功绘制出图像,看板中部分查询语句中包含看板变量,CSV数据源无法实现看板变量。 方案二:拷贝Prometheus数据文件 Prometheus 按照两个小时为一个时间窗口,将两小时内产生的数据存储在一个块(Block)中。每个块都是一个单独的目录,里面含该时间窗口内的所有样本数据(chunks),元数据文件(meta.json)以及索引文件(index)。其中索引文件会将指标名称和标签索引到样板数据的时间序列中。此期间如果通过 API 删除时间序列,删除记录会保存在单独的逻辑文件 tombstone 当中。 Prometheus 为了防止丢失暂存在内存中的还未被写入磁盘的监控数据,引入了WAL机制。WAL被分割成默认大小为128M的文件段(segment),之前版本默认大小是256M,文件段以数字命名,长度为8位的整形。WAL的写入单位是页(page),每页的大小为32KB,所以每个段大小必须是页的大小的整数倍。如果WAL一次性写入的页数超过一个段的空闲页数,就会创建一个新的文件段来保存这些页,从而确保一次性写入的页不会跨段存储。这些数据暂时没有持久化,TSDB通过WAL将数据保存到磁盘上(保存的数据没有压缩,占用内存较大),当出现宕机,启动多协程读取WAL...

创建: 2023-09-08 | 字数: 9674字 | 时长: 20分钟

折腾博客的意义

WordPress 没有像大城市里的Z时代青少年一样在初中高中就开始折腾各种网络安全,编程技术,折腾博客,我在大二时才有建一个网站的想法,买了阿里云的ECS,买了域名,装了宝塔,然后LNMP一键启动,WordPress无脑梭哈,还折腾了备案,但是除了写了几个测试的文章,后面续费云主机的动力都没有了,于是索性连域名也卖了,记得好像是十几块钱买的,还卖了9块钱。我的博客从网络世界消失了,对于我来说,我知道了原来网站是这么运行的,原来还有宝塔和WordPress这么牛逼的工具,原来备案TM的这么麻烦! Hexo 再后来技术上走向正规,经常查一些技术文章,看到别人写的博客,知道了Hexo,知道了Github Page,开始折腾静态博客,使用Hexo和使用人数最多的主题Next,再结合网络上的各种方案魔改,当时我想的就是“整挺好,以后就这样不换了”。Hexo是截止我写这篇文时用的最久的框架,相处久了,了解的多了,遇到麻烦的次数也就多了。 Vuepress 期间还折腾了文档站点,看到了别人的文档站点挺好的,我的一些文档也可以放进文档站点作为文档库啊,然后又开始了VuePress、Docusaurus,因为抱着一旦启用就不换的决心,每个方案都折腾了不少时间,最终我的Github仓库还残存着一个Docs的仓库,然后我发现文档这个东西就是个伪需求,就此作罢。 Hexo in Docker 一开始Hexo运行在Mac上,我不敢随便重置系统,后来对Docker的运用加深,开始折腾在Docker里运行Hexo,也还算顺利。Dockerfile存在Dropbox里,存在iCloud里,非常的安稳和踏实,但是后面的事告诉我事情没这么简单,Dockerfile中每次都拉取latest的node基础镜像,git clone也是每次都是最新的,导致版本不兼容时就会有报错,或者是警告,这个问题不是不能解决,指定版本就好了呀,是的。但我还是开始嫌弃Hexo了,甚至我都没有继续写下去的动...

创建: 2023-08-28 | 字数: 2029字 | 时长: 5分钟

Flask+Vue 前后端分离记录

如题,记录告警平台从原来的layui升级到Vue,并实现Flask+Vue前后端分离,记录前后端三种解决跨域的方式(有点像茴香豆的四种写法?没事,技多不压身) ...

创建: 2023-07-12 | 字数: 1177字 | 时长: 3分钟