前言
童年的回忆, 闲暇之余玩一玩
在线游戏: 点击进入
按键说明
手机端默认触屏,电脑端按键说明如下
按键 | 对应的电脑键盘 |
---|---|
上 | W |
下 | S |
左 | A |
右 | D |
A | J |
B | K |
AA | Z |
BB | X |
Start | Enter |
Select | Ctrl |
本文为作者原创 转载时请注明出处 谢谢
乱码三千 – 码出一个新世界
最近开发了一个工具站点, 旨在解决自己的日常需求, 希望也能帮助到大家
网站长这样:
工具百宝箱: 点击进入
目前已经集成的工具有:
网站会持续更新和优化, 希望大家多多支持~
本文为作者原创 转载时请注明出处 谢谢
乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
如果自己购买服务器搭建分布式集群, 虽然流程繁琐, 但是成本相对可控, 不过所需服务器的数量不少, 至少7台起步, 运维压力还是有的
今天本着学习的目的, 来探讨一下搭建分布式集群的些事
也就是总共至少七台服务器 可实现了基础的分布式集群架构
微服务架构, 至少需要15台服务器
从单体应用改成微服务架构 服务器数据暴增 主要集中在数据库和应用上
如果嫌自己购买服务器搭建集群麻烦, 那么单体应用可以考虑使用现成的高可用分布式集群全托管方案 比如阿里云SAE/ECI
它内置了负载均衡器和应用集群,我们只需要再购置一台云数据库(内含主从复制机制),然后上传开发好的程序即可
如此一来,可以大大减少运维消耗,把更多精力集中在应用本身 这是省时省力的做法
微服务架构同样也可以使用SAE
来托管 除了该方案外,还有一些自由度更高的方案,比如MSE
等
有必要给每个微服务设置独立的负载均衡器吗?
给每个微服务都配置独立的负载均衡器是传统单体架构思维的延伸,它不仅会造成巨大的资源浪费和成本飙升,更会带来运维噩梦。微服务架构通过 统一入口 和 服务发现 机制,优雅地解决了这个问题。
下面我通过一张图来对比两种模式的根本区别:
为了节省成本 是否可以将API网关和注册中心共用在两台服务器上?
首先, 我们来看一下两种方案的对比图:
除非是测试环境 或者想快速验证想法 否则 必须将API网关和注册中心分开部署, 尤其是生产环境,两台服务器部署网关+三台服务器部署注册中心是个可靠的选择
关于服务器系统的选择
负载均衡器和数据库服务器选择CentOS
,以获得最高的稳定性,应用服务器可以选择ubuntu
以或者更新的软件版本
以下是最小化配置参考, 用于项目起步阶段:
centos
+硬盘50g+弹性公网ip
ubuntu
+硬盘80g+nat
网关只进不出 centos
+硬盘100g+完全内网 无需公网ip
这里以一次性购买五年为例, 做一个费用估算:
全托管方案: 阿里云SEA 两实例 2核2g每月600万cu消耗 折后资源包, 五年10000+数据库1核2g 硬盘80g 6600元=16600元
半托管方案: 阿里云负载均衡器3504元+五台ecs5075元+带宽流量包最低450最高2100元=9029-10679元
自建方案一: 七台ecs 7175元+按流量计费弹性ip+流量包450-2100=7625-9275元
自建方案二: 七台ecs 7175元+2M固定带宽弹性ip1380元=8558元
自建方案三: 使用DNS负载均衡, 两台各带1M带宽ecs 3653元+五台ecs 5075元=8728元
本文为作者原创 转载时请注明出处 谢谢
文章数量过多, 执行hexo g
渲染时报错, 如下:
1 | <--- Last few GCs ---> |
这是由于node.js
内存限制导致的, 默认堆内存上限为1024MB
解决方法也很简单, 那就是加大堆内存上限, 有四种方案
比如用以下命令来替代hexo g
:
1 | node --max-old-space-size=16384 ./node_modules/hexo/bin/hexo generate |
这里--max-old-space-size
属性的数值可以自定义, 我这里选择的是16G, 你也可以设置为8G, 也就是--max-old-space-size=8192
, 以此类推
修改电脑上的node
配置文件
第一步 打开launchd.conf
配置文件
1 | # 编辑 Node.js 全局启动配置 |
添加以下内容
1 | setenv NODE_OPTIONS "--max-old-space-size=16384" |
运行配置
1 | sudo launchctl load /etc/launchd.conf |
验证是否生效
1 | echo $NODE_OPTIONS # 应显示 --max-old-space-size=8192 |
系统级配置, 针对所有用户生效
内存大小的设置需要根据自己电脑的实际情况来定, 避免设置过高 从而导致导致系统整体性能下降
由于 /etc/launchd.conf
在新版macOS
中已被弃用,推荐使用以下方式:
创建或修改 launchd plist
文件(系统级)
1 | sudo nano /Library/LaunchDaemons/com.custom.node.env.plist |
添加内容:
1 | <?xml version="1.0" encoding="UTF-8"?> |
加载配置:
1 | sudo launchctl load /Library/LaunchDaemons/com.custom.node.env.plist |
通过修改环境变量的方式
编辑 shell
配置文件
1 | nano ~/.zshrc # macOS Catalina 及以后版本 |
添加以下行
1 | # 设置 Node.js 内存限制 |
使配置生效
1 | source ~/.zshrc # 或 source ~/.bash_profile |
该配置仅对当前用户生效, 适合用户配置隔离
在 Hexo
项目的 package.json
中修改scripts
:
1 | "scripts": { |
之后始终使用:
1 | npm run build # 代替 hexo generate |
这算是一种一劳永逸的方案, 哪怕更换电脑也不怕, 而且进行了项目隔离, 不会影响到其他nodejs
工程, 缺点是如果多个工程需要配置, 则得挨个添加
如果运行后进程被终止, 比如报错:
1 | zsh: killed node --max-old-space-size=16384 ./node_modules/hexo/bin/hexo generate |
主要原因是没有足够的物理内存 + 交换空间(swap)
来满足需求,
首先运行top -o mem
指令检查内存占用:
随着node
编译的进行, 我们会发现它的占用内存指标在不断上升,
此时我们可以考虑通过关闭其他应用来给node
足够的空间
本文为作者原创 转载时请注明出处 谢谢
Astro
是一个基于JavaScript
的静态站点生成器, 和Hexo
有点类似, 支持Markdown
构建内容, 但Astro
性能会更好, 它具有独特的岛屿架构,按需加载JS
,能显著减少初始加载时间, 非常适合需要快速首屏加载的场景比如如博客、营销网站、企业官网等等
Astro
官网: 点击进入
这里以MacOs
平台为例:
安装npm
1 | brew install npm |
安装nodejs
这里指定nodejs
版本为v18
1 | npm install -g n |
然后
1 | n v18 |
创建工程模板
1 | npm create astro@latest 工程名称 |
根据提示一步步往下走即可
完成后会在当前目录生成工程文件夹, 目录如下:
运行工程
1 | npm run dev |
开启调试, 此时在浏览器地址栏输入http://localhost:4321/
即可实时访问
打包静态文件
工程编写完毕后, 即可输出网站静态文件
1 | npm run build |
执行完毕后, 在工程目录下会自动生成dist
文件夹
将dist
目录下的所有文件上传到你的静态服务器上就可访问了
Astro
不仅可以和vue
结合使用 还可以和React
结合, 这里做一个简单Tailwind
风格的网站演示
创建项目
1 | npm create astro@latest my-toolbox -- --template framework-react |
安装依赖
1 | cd my-toolbox |
初始化Tailwind
1 | npx tailwindcss init -p |
配置Tailwind.config.js
1 | export default { |
配置astro.config.mjs
1 | import { defineConfig } from 'astro/config'; |
编写主页
工作流页面
工具注册中心
以下是示例
1 | src/ |
本文为作者原创 转载时请注明出处 谢谢
之前用python
从网络爬了一些引流文, 在使用hexo
渲染时出现大批量的报错, 如下:
1 | {% raw %} |
该错误是由于Nunjucks
模板引擎将文档中的双花括号{{}}
误解析为模板语法导致的冲突
解决方案也很简单, 那就是在双花括号前后添加raw
标签包裹, 如下:
1 | {% raw %}{{xxx}}{% endraw %} <!-- raw标签包裹 --> |
其目的是告诉Nunjucks
将花括号当做普通文本来显示
如果只是一两处修改还好, 问题是大量的文章存在这样的问题, 手动一一修改肯定不现实
要不写一个python
脚本自动替换一下?
可是可以, 没有办法的情况下只能这么干, 不过目前来说大可不必, 我们其实可以借助IDE的全局正则搜索替换功能, 比如vscode
打开替换面板 快捷键Ctrl+H (Windows/Linux)
或 Cmd+Option+F (macOS)
启用正则表达式模式 (点击.*
按钮或按 Alt+R
)
搜索框输入:
1 | {% raw %} |
[^{}]
确保只匹配非花括号字符*?
非贪婪匹配任意数量字符替换框输入:
1 | `{% raw %}$1{% endraw %}` |
执行全部替换
优化点说明:
[^{}]
确保不会错误匹配{{a{b}c}}
这类嵌套结构*?
比.
更安全,避免过度匹配$1
会保持原变量的大小写和特殊字符特殊场景处理:
[\s\S]*?
(?<!prefix)\{\{
除了双花括号之外, 还有类似的字符也需要进行替换, 不然hexo
渲染也会报错, 下面列举一些常见的需要去除或者替换的字符
hexo
标题不允许出现以下字符:
1 | : |
hexo
内容需要进行替换的字符:
1 | {% raw %} 这个忽略 |
对于{% xxx %}
的替换, 可以使用以下搜索正则表达式:
1 | \{%(?!(?:\s*raw\s|\s*endraw\s))([^%]+)%\} |
替换内容:
1 | {% raw %}{%$1%}{% endraw %} |
说明:
(?:)
非捕获组同时排除raw
和endraw
标签\s*
允许标签内可能存在的空格提示标签未闭合
1 | Template render error: (unknown path) |
往往是因为出现了类似于{#xxx}
的语法, 正确写法应该是{#xxx#}
如果数量比较多 可以使用正则搜索替换:
\]+)\}
如果碰上更复杂情况, 比如{#user,#user}
, 也是会报错的, 这时我们可以使用增强表达式:
1 | (?:^|(?<!\{% raw %\}))\{#([^#]*(?:#(?!\})[^#]*)*)\}(?!\s*\{% endraw %\}) |
替换成:
1 | {% raw %}{#$1}{% endraw %} |
提示unexpected token
1 | {% raw %} |
问题处在未闭合的{{
解决方案就是使用raw
标签对花括号进行包裹
如果数量比较多, 则依然使用正则全局替换, 在搜索框中输入以下正则表达式:
1 | \{\{(?!(?:[^{}]*}})) |
然后在替换框中输入:
1 | {% raw %}{{{% endraw %} |
表达式解释:
\{\{
- 匹配 {{
字面量(转义特殊字符)(?!(?:[^{}]*}}))
- 负向先行断言,确保后面没有 }}
闭合标签(?:[^{}]*}})
- 匹配任意非 {}
字符后跟 }}
?!
- 表示后面不能跟着这个模式这个正则表达式只会匹配未闭合的 {{
标签,而不会匹配已闭合的 {{...}}
标签。
根据上面的探讨, 我们来做一个整合
按照以下步骤依次替换 能解决90%以上的问题, 剩下的手动改一下即可:
第一步 替换带引号的{% xxx %}
1 | `\{%(?!(?:\s*raw\s|\s*endraw\s))([^%]+)%\}` |
替换:
1 | `{% raw %}{#$1}{% endraw %}` |
第二步 替换带引号{{
和}}
搜索:
1 | `\{\{` |
替换:
1 | `{% raw %}{{{% endraw %}` |
第三步 替换带引号{{xxx}}
搜索:
1 | `(\{\{+.*?\}\}+)` |
替换:
1 | `{% raw %}$1{% endraw %}` |
第四步 替换{#xxx}
搜索:
1 | (?:^|(?<!\{% raw %\}))\{#([^#]*(?:#(?!\})[^#]*)*)\}(?!\s*\{% endraw %\}) |
替换:
1 | {% raw %}{#$1}{% endraw %} |
第五步 替换不带引号的{{xxx}}
由于没有引号限制, 覆盖的范围会更广, 包括代码和注释
搜索:
1 | (\{\{+.*?\}\}+) |
替换:
1 | {% raw %}$1{% endraw %} |
第六步 替换不带引号{% xxx %}
搜索:
1 | \{%(?!(?:\s*raw\s|\s*endraw\s))([^%]+)%\} |
替换:
1 | {% raw %}{#$1}{% endraw %} |
前三步可以放心大胆替换, 后面几步按需替换, 因为有些代码里面的花括号可以保留
如果你想省事, 以牺牲文章部分内容和格式的前提下, 还有一种简单粗暴且有效的方法
那就是把整篇文章进行raw
标签包裹, 也就是文章开头加一个raw
标签, 文章结尾加一个endraw
标签
本文为作者原创 转载时请注明出处 谢谢
先看看我的操作步骤
第一步 使用git init
创键本地仓库
第二步 使用git submodule add -b master xxx
添加子模块
第三步 手动删除了该子模块
此时.git
目录下文件依然存在
第四步 使用git commit
提交并使用git push
推送到远程仓库
这时, 需求来了 我想恢复子模块, 该如何操作?
假如我先进行commit
再删除, 那么我直接使用git submodule update --init --recursive
就能立马从.git
本地仓库中检出恢复
可偏偏我是先删除后 再进行commit
, 远程仓库肯定是不包含子模块的, 这时该怎么办呢?
不用担心, 只要.git
仓库中依然占用了存储空间, 意味着本地仓库还存在之前添加的子模块代码, 那我们就能从里面抓出来
只需要换个指令即可 如下:
1 | git submodule add -b master -f git@github.com:xxx.git |
这个命令不是从远程仓库重新拉取代码, 而是优先从本地检出, 无论文件删除是在commit
前还是后都可用, 关键一定要加上-f
, 否则没有效果
本文为作者原创 转载时请注明出处 谢谢
子工程数量太多, 挨个clone
实在有些慢, 于是乎我写了一个自动化脚本, 如下:
1 | # 循环添加子模块 |
可问题来了, 每拉取一个仓库都需要手动输入ssh
密钥密码, 实在有些繁琐, 该如何解决呢?
将密钥添加到ssh-agent
中,执行以下指令:
1 | ssh-add ~/.ssh/id_rsa |
默认密钥名称为id_rsa
, 如果你有自定义的名称, 进行对应修改即可
使用第三方工具, 这里以Mac
为例, 使用sshpass
工具来实现, 具体操作如下:
安装sshpass
包
1 | brew install hudochenkov/sshpass/sshpass |
修改自动化脚本
在脚本中添加export SSHPASS
代码, 如下:
1 | export SSHPASS="这里填ssh密码" |
该方案由于是明文存储密码, 所以安全性自然差一些
在生成ssh
密钥时, 不设置密码, 直接回车即可
也就是说单独生成一个无需密码的新ssh
密钥来使用
使用自动化部署的时候, 我通常会这么干
本文为作者原创 转载时请注明出处 谢谢
网上关于如何以U盘为媒介制作Win
系统安装引导盘的教程很多, 但是大部分都是基于Windows
平台的, 比如《优启通-如何使用U盘给电脑重新安装系统》
这个优启通软件是exe
程序, 只支持Windows
系统, 虽然我们可以在Mac
平台上通过CrossOver
工具来运行该程序, 但是写入时报错:
此外我还尝试了在Mac
上使用Boot Camp ISO Converter
工具来制作启动盘, 但是它只支持ISO
格式的系统文件:
如果你的刚好是ISO
格式, 那么可以直接使用该工具制作启动盘, 详细的教程可以查看知乎教程:
那如果是GHO
格式的系统呢, 该如何在Mac
上制作相应的启动盘呢
GHO
格式的系统备份文件, 一般用于系统还原, 在Windows
还能正常使用的时候,可使用还原工具进行一键还原, 如果原先系统无法使用, 那么需要借助PE系统来进行还原
PE系统本身通常也是一个ISO
镜像文件, 在Windows
上我们借助优启通等工具可以快速将PE系统刻录到U盘中
由于在Mac
中, 这类型工具不多, 我们只好通过原始的流程来进行, 也就是手动下载PE
系统的ISO
镜像, 然后将其刻录到U盘中
详细的操作方法如下
下载Win
系统GHO
镜像
这里以Win10
为例:
下载Win
系统PE
镜像
由于我选择的是Win10
系统, 所以这里的PE镜像也需要选择支持Win10
的
将U盘格式化为FAT32
可以使用Mac
自带的磁盘格式化功能, 进入实用工具-->磁盘工具
:
或者使用命令行:
1 | diskutil eraseDisk FAT32 "格式化后U盘名称" MBR 需要进行格式化的U盘标识名称 |
关于U盘的标识, 可以使用以下指令查看:
1 | diskutil list |
下载镜像刻录工具
balenaEtcher
是一个免费开源且跨平台的镜像刻录工具, 支持Windows
、Linux
、Mac
平台
官网 : 点击进入
GitHub : 点击进入
如果官网下载比较慢, 可以使用国内网盘下载:
将PE
镜像通过balenaEtcher
刻录到U盘中
如果你懒得下载软件, 也可以使用命令行工具进行拷贝, 首先双击iso文件进行挂载, 然后使用cp指令进行复制, 如下:
1 | cp -R -P /Volumes/iso挂载名称/* /Volumes/U盘名称/ |
刻录完成后将GHO
镜像拷贝到U盘中
如果GHO
镜像过大, 无法拷贝, 可以考虑将U盘格式化为NTFS
这里推荐大家使用omi NTFS
磁盘专家进行格式化:
即将刻录好的U盘插入需要装机的电脑中进行系统引导安装
不同的主板启动键不一样, 可以查看以下表格:
本文为作者原创 转载时请注明出处 谢谢