首页
实用链接
图床推荐
友链
关于
Search
1
彻底卸载Cloudflare Tunnel(解决 cloudflared service uninstall 报错问题)
483 阅读
2
从零开始注册Hugging Face账号到部署网页应用
102 阅读
3
Debian 11.2 搭建 Typecho 个人博客教程
90 阅读
4
紫电猫8.8元随身WIFI刷Debian系统教程
88 阅读
5
Linux配置frps与frpc的四种隧道并设置开机启动
87 阅读
默认分类
教程
随笔
软件开发
笔记
登录
/
注册
Search
标签搜索
Datawhale
AI+X
Fun-Transformer
#Datewhale组队学习
隧道
Debian
Transformer
教程
随身wifi
frp
frpc
frps
内网穿透
Linux
toml
我的世界
Minecraft
MySQL
单片机
OLED
Simuoss
累计撰写
20
篇文章
累计收到
12
条评论
首页
栏目
默认分类
教程
随笔
软件开发
笔记
页面
实用链接
图床推荐
友链
关于
搜索到
16
篇与
的结果
2024-08-17
【2024 Datawhale AI 夏令营】Task3:RAG实战
RAG 技术简介技术用途RAG(检索增强生成)是为解决基础大模型在实际业务场景中所面临的一些局限性问题而提出的一种方法。主要解决的问题包括:知识局限性:大模型的知识来源于训练数据,无法覆盖实时性或非公开的数据。数据安全性:企业需要保护数据安全,而大模型训练往往需要接触大量数据,这可能带来数据泄露的风险。大模型幻觉:大模型基于概率生成回答,有时会在没有知识的领域生成不准确的内容。RAG 通过引入外部知识库来增强大模型的生成能力,通常分为以下三个步骤:索引:将文档分割为文本块,并构建向量索引。检索:根据问题检索与其相似的文本块。生成:将检索到的文本块作为背景信息,用于生成更加准确的回答。当前,RAG 已成为解决知识盲区和生成准确答案的主流方法,在实际应用中非常有效。构建流程离线计算:离线计算是 RAG 系统的基础,主要工作是对知识库中的文档进行解析、清理、切割、向量化,并将这些向量存储到数据库中,具体包括以下步骤:文档解析与清洗:知识库包含多种文档格式(如 PDF、Word、PPT 等)。首先对文档进行解析,清理无关内容,切割成较短的文本块(Chunk),同时去除重复内容。这样可以提高系统的知识覆盖率和查询的准确性。向量化(Vectorization):每个文本块会被转换为一个向量,这需要一个预训练的向量模型(Embedding Model)。该模型可以将具有相似语义的文本映射到语义空间中相近的位置,而语义不同的文本则会被映射到更远的地方。存储:由于知识库的规模较大,向量化后的结果会存储在向量数据库中,如 Milvus、Faiss 等。向量数据库有助于高效管理这些向量,并在后续的检索过程中提高性能。离线计算的核心在于提前做好大规模的计算和存储准备,确保在线计算时可以高效、准确地响应用户查询。在线计算:用户查询与检索:用户输入查询时,系统首先会将该查询向量化,并与数据库中的向量进行相似度计算,检索出一系列与查询最相关的文本块。这一过程的效率与数据库规模相关,因此可能会使用召回机制来缩小计算范围。召回与精排:召回阶段快速获取大概率相关的文本块,通常采用简单的基于字符串的匹配算法(如 TF-IDF、BM25 等),然后在这些文本块中进一步进行精排,即基于向量相似度对文本块排序。精排确保相关性更高的文本块排在前列。重排(Rerank):为提高检索精度,在精排之后还可以进行重排。重排模型通过更复杂的算法对精排结果重新排序,确保最相关的内容优先被选中。随着知识库规模的增加,重排能够有效提升整体检索效果。生成回复:最终,将检索到的 k 个最相关文本块与用户的查询拼接成一个提示(prompt),输入到大模型中。大模型基于这些背景信息生成更加准确的回答,解决用户的问题。通过离线与在线计算的配合,RAG 系统能够在保证数据安全的前提下,提供快速且精确的问答服务。场景举例:法律咨询服务系统:离线计算:解析、切割和向量化法律法规、合同模板等法律文档,并将它们存入数据库。在线计算:用户输入具体问题(如“租赁合同中的解除条款是什么?”),系统检索相关法律条文和合同条款,将其作为背景信息,结合大模型生成具体的法律建议。实战体验注册社区注册社区启动实例的部分可以参照前几天发布的[【2024 Datawhale AI 夏令营】Task1:借助魔塔(ModelScope)社区基于[源-2B]模型构建智能编程助手](https://blog.simuoss.cn/index.php/archives/15/)操作。搭建Demo环境进入实例,点击终端。 运行下面代码,下载文件,并将 Task 3:源大模型RAG实战中的内容拷贝到当前目录。git lfs install git clone https://www.modelscope.cn/datasets/Datawhale/AICamp_yuan_baseline.git cp AICamp_yuan_baseline/Task\ 3:源大模型RAG实战/* .双击打开 Task 3:源大模型RAG实战.ipynb,然后运行所有单元格。 通过下面的命令,我们可以看到 ModelScope 已经提供了所需的大部分依赖,如 torch,transformers 等。pip list但是为了进行模型微调以及 Demo 搭建,还需要在环境中安装 streamlit。pip install streamlit==1.24.0安装成功后,我们的环境就准备好了。模型下载在 RAG 实战中,我们需要构建一个向量模型。向量模型通常采用 BERT 架构,它是一个 Transformer Encoder。 输入向量模型前,首先会在文本的最前面额外加一个 [CLS] token,然后将该 token 最后一层的隐藏层向量作为文本的表示。 在本次学习中,我们选用基于 BERT 架构的向量模型 bge-small-zh-v1.5,它是一个 4 层的 BERT 模型,最大输入长度 512,输出的向量维度也为 512。向量模型下载:from modelscope import snapshot_download model_dir = snapshot_download("AI-ModelScope/bge-small-zh-v1.5", cache_dir='.')这里使用的是 modelscope 中的 snapshot_download 函数,第一个参数为模型名称 AI-ModelScope/bge-small-zh-v1.5,第二个参数 cache_dir 为模型保存路径,这里 . 表示当前路径。 模型大小约为 91.4M,由于是从魔搭直接进行下载,速度会非常快。 下载完成后,会在当前目录增加一个名为 AI-ModelScope 的文件夹,其中 bge-small-zh-v1___5 里面保存着我们下载好的向量模型。 另外,还需要下载源大模型 IEITYuan/Yuan2-2B-Mars-hf。下载方法和 Task 1:零基础玩转源大模型 一致。from modelscope import snapshot_download model_dir = snapshot_download('IEITYuan/Yuan2-2B-Mars-hf', cache_dir='.')RAG实战模型下载完成后,就可以开始 RAG 实战了。索引为了构造索引,这里我们封装了一个向量模型类 EmbeddingModel:# 定义向量模型类 class EmbeddingModel: """ class for EmbeddingModel """ def __init__(self, path: str) -> None: self.tokenizer = AutoTokenizer.from_pretrained(path) self.model = AutoModel.from_pretrained(path).cuda() print(f'Loading EmbeddingModel from {path}.') def get_embeddings(self, texts: List) -> List[float]: """ calculate embedding for text list """ encoded_input = self.tokenizer(texts, padding=True, truncation=True, return_tensors='pt') encoded_input = {k: v.cuda() for k, v in encoded_input.items()} with torch.no_grad(): model_output = self.model(**encoded_input) sentence_embeddings = model_output[0][:, 0] sentence_embeddings = torch.nn.functional.normalize(sentence_embeddings, p=2, dim=1) return sentence_embeddings.tolist()通过传入模型路径,新建一个 EmbeddingModel 对象 embed_model。 初始化时自动加载向量模型的 tokenizer 和模型参数。print("> Create embedding model...") embed_model_path = './AI-ModelScope/bge-small-zh-v1___5' embed_model = EmbeddingModel(embed_model_path)EmbeddingModel 类还有一个 get_embeddings() 函数,它可以获得输入文本的向量表示。 注意,这里为了充分发挥 GPU 矩阵计算的优势,输入和输出都是一个 List,即多条文本及其向量表示。2.3.2 检索为了实现向量检索,我们定义了一个向量库索引类 VectorStoreIndex:# 定义向量库索引类 class VectorStoreIndex: """ class for VectorStoreIndex """ def __init__(self, doecment_path: str, embed_model: EmbeddingModel) -> None: self.documents = [] for line in open(doecment_path, 'r', encoding='utf-8'): line = line.strip() self.documents.append(line) self.embed_model = embed_model self.vectors = self.embed_model.get_embeddings(self.documents) print(f'Loading {len(self.documents)} documents for {doecment_path}.') def get_similarity(self, vector1: List[float], vector2: List[float]) -> float: """ calculate cosine similarity between two vectors """ dot_product = np.dot(vector1, vector2) magnitude = np.linalg.norm(vector1) * np.linalg.norm(vector2) if not magnitude: return 0 return dot_product / magnitude def query(self, question: str, k: int = 1) -> List[str]: question_vector = self.embed_model.get_embeddings([question])[0] result = np.array([self.get_similarity(question_vector, vector) for vector in self.vectors]) return np.array(self.documents)[result.argsort()[-k:][::-1]].tolist()通过传入知识库文件路径,新建一个 VectorStoreIndex 对象 index。 初始化时会自动读取知识库的内容,然后传入向量模型,获得向量表示。print("> Create index...") doecment_path = './knowledge.txt' index = VectorStoreIndex(doecment_path, embed_model)VectorStoreIndex 类还有一个 get_similarity() 函数,用于计算两个向量之间的相似度,采用余弦相似度。VectorStoreIndex 类的入口是查询函数 query()。传入用户的提问后,首先会送入向量模型获得其向量表示,然后与知识库中的所有向量计算相似度,最后将 k 个最相似的文档按顺序返回,k 默认为 1。question = '介绍一下广州大学' print('> Question:', question) context = index.query(question) print('> Context:', context)生成为了实现基于 RAG 的生成,我们还需要定义一个大语言模型类 LLM:# 定义大语言模型类 class LLM: """ class for Yuan2.0 LLM """ def __init__(self, model_path: str) -> None: print("Creat tokenizer...") self.tokenizer = AutoTokenizer.from_pretrained(model_path, add_eos_token=False, add_bos_token=False, eos_token='<eod>') self.tokenizer.add_tokens(['<sep>', '<pad>', '<mask>', '<predict>', '<FIM_SUFFIX>', '<FIM_PREFIX>', '<FIM_MIDDLE>', '<commit_before>', '<commit_msg>', '<commit_after>', '<jupyter_start>', '<jupyter_text>', '<jupyter_code>', '<jupyter_output>', '<empty_output>'], special_tokens=True) print("Creat model...") self.model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.bfloat16, trust_remote_code=True).cuda() print(f'Loading Yuan2.0 model from {model_path}.') def generate(self, question: str, context: List): if context: prompt = f'背景:{context}\n问题:{question}\n请基于背景,回答问题。' else: prompt = question prompt += "<sep>" inputs = self.tokenizer(prompt, return_tensors="pt")["input_ids"].cuda() outputs = self.model.generate(inputs, do_sample=False, max_length=1024) output = self.tokenizer.decode(outputs[0]) print(output.split("<sep>")[-1])我们传入 Yuan2-2B-Mars 的模型路径,新建一个 LLM 对象 llm。 初始化时自动加载源大模型的 tokenizer 和模型参数。print("> Create Yuan2.0 LLM...") model_path = './IEITYuan/Yuan2-2B-Mars-hf' llm = LLM(model_path)LLM 类的入口是生成函数 generate(),它有两个参数:question: 用户提问,是一个 strcontext: 检索到的上下文信息,是一个 List,默认是 [],代表没有使用 RAG运行下面的代码,即可体验使用 RAG 技术之后 Yuan2-2B-Mars 模型的回答效果:print('> Without RAG:') llm.generate(question, []) print('> With RAG:') llm.generate(question, context)
2024年08月17日
18 阅读
0 评论
1 点赞
2024-08-17
彻底卸载Cloudflare Tunnel(解决 cloudflared service uninstall 报错问题)
问题引入Cloudflare 是一家国际知名的互联网基础设施服务的公司。对国内用户来说,很多人用 Cloudflare 的免费服务来给网页带上 https (比如本站),又或者是用 Cloudflare Tunnel(Cloudflare Argo Tunnel) 来穿透本地网页到公网。但是,由于众所周知的原因,国内访问 Cloudflare 服务通常不是很通畅,而在配置 Cloudflare Tunnel 时也偶尔会因为各种原因失败,需要重新安装。这时,cloudflared 会提示如下:这是由于 cloudflared 没有完全清理安装文件导致的。如何解决在执行卸载指令之后,执行指令清除 cloudflared 的所有配置文件:sudo cloudflared service uninstall sudo rm /etc/systemd/system/cloudflared*这时再重新执行安装指令即可。切换到HTTP2连接有时候在隧道创建成功后,Cloudflare 后台会显示隧道状态是 degraded (退化状态),这可能是由于新版的Cloudflare隧道“强制”使用QUIC进行连接,而国内的网络接入服务商对UDP协议支持很不好造成的。可以通过以下方式设置默认使用HTTP2连接。编辑配置文件:sudo vi /etc/systemd/system/cloudflared.service在 ExecStart 一行的启动指令里添加如下参数:--protocol http2此时启动指令应该是类似 ExecStart=/usr/bin/cloudflared --no-autoupdate --protocol http2 tunnel run --token <your_token> 的形式。重新启动服务sudo systemctl daemon-reload sudo systemctl restart cloudflared #由于网络环境原因可能启动不成功,多执行几次本句参考链接:遇事不决,量子力学!搞定Cloudflare Tunnels无法建立隧道的问题【便笺】配置Cloudflare隧道默认使用HTTP2Cloudflare Tunnel 中文文档Cloudflared service not removed after uninstall
2024年08月17日
483 阅读
0 评论
2 点赞
2024-08-13
【2024 Datawhale AI 夏令营】Task2:头脑风暴会(发言人分享)
三个Idea首先感谢浪潮科技提供了系统化学习平台。我们团队提出了三个创新想法,旨在为AI开发提供启发。以下为各项构想的简要介绍。1. 公文大模型的开发与应用背景与初衷当前,各类AI模型在生成文本、图像和语音方面展现出巨大潜力,但实际应用中用户反馈常与预期不符。以QQ 9.0版的机器人功能为例,尽管具备多项实用功能,但使用率并不高,表明应用场景和用户体验存在改进空间。因此,设想通过融合AI模型,聚焦具体应用场景,以提升用户兴趣。功能概述公文生成模型通过以下三大功能提升写作效率:公文润色:针对语言口语化现象,提供公文写作风格的迁移工具,平衡上级要求与通俗易懂性。情景化公文模板:自动生成特定场景下的标准化公文模板,简化重复性工作。立意深化:引用政策报告和领导发言等,提升文章深度。2. AI赋能线下零售应用场景与目标尽管电商零售技术已广泛应用,线下中小型商超对AI技术的利用仍较为有限。开发了一个系统,汇总中小企业ERP数据,分析大量企业的零售数据,以发掘潜在的业务价值。该系统旨在帮助零售企业从大量数据中提取有用信息,支持决策和业务优化。功能概述信息查询:通过自然语言查询销售数据、库存情况等信息,AI检索并整合相关数据。数据对比:未来计划引入线上电商价格对比功能,增强线下零售企业的市场竞争力。3. 高校新生问答模型模型的起源每年高校论坛上,新生反复提出相同或类似的问题,增加了老生和管理者的负担。为解决这一问题,设计了专门针对高校新生常见问题的AI问答模型。功能概述模型利用增强型检索技术(RAG),不仅检索现有资料,还能整合信息,生成简明扼要的回答。典型应用场景包括:课程相关问题:例如“如何查看下学期课表?”、“选修课有哪些?”。校园生活问题:例如“宿舍住几人?”、“假期能否留校?”。资源使用问题:例如“功率限制是多少?”、“电费如何计算?”。学术相关问题:例如“保研资格是什么?”、“保研率是多少?”。优势与改进方向与传统FAQ相比,模型不仅检索相关内容,还能整合生成结构清晰的回答,提升用户体验。
2024年08月13日
25 阅读
0 评论
0 点赞
2024-08-11
Linux配置frps与frpc的四种隧道并设置开机启动
前言对于个人爱好者而言,国内的绝大多数家庭宽带都没有公网IP,即使能要到动态公网IP,也需要配置DDNS服务,比较麻烦。但是购买云服务器,又面临着算力较低,开销较大的问题。所以,在家中配置一台高性能服务器,并购买一台低配置大带宽的云服务器做端口转发,甚至是全端口转发,是一件性价比较高的实现方式。在开设穿透上,我们这里使用 FRP。frp 采用 C/S 模式,将服务端部署在具有公网 IP 的机器上,客户端部署在内网或防火墙内的机器上,通过访问暴露在服务器上的端口,反向代理到处于内网的服务。 在此基础上,frp 支持 TCP, UDP, HTTP, HTTPS 等多种协议,提供了加密、压缩,身份认证,代理限速,负载均衡等众多能力。此外,还可以通过 xtcp 实现 P2P 通信。下载预编译包这一步对于服务端和用户端都一样,没有区别,因为预编译包里面同时包含frps和frpc选择合适的平台与系统打开 FRP的Github Releases界面。一般推荐直接下载最新版(截止本文撰写是0.59.0版本)。可以看到,图中有很多版本的Release包,都是frp_版本_系统_平台的命名格式。通常来讲,云服务商提供的服务器,直接选择frp_0.59.0_linux_amd64.tar.gz即可。系统自然不必说,常见的ubuntu、centos、debian等等都属于Linux。平台的对应关系:|平台|意义||:-:|:-:||arm|32位的arm芯片,通常用在机顶盒、手机等等设备,目前比较少见||arm64|64位的arm芯片,通常用在机顶盒、高端路由器,手机等等设备,比如高通骁龙、联发科天玑等等||amd64|【最常见】64位的x86架构芯片,Intel和AMD在2003年以后的芯片都选这个||arm_hf|带有硬件浮点单元的32位arm芯片||mips|32位的mips芯片,通常用在一些路由器、医疗和工控设备里||mips64|64位的mips芯片,通常用在一些路由器、医疗和工控设备里|下载预编译包到本地并解压可以直接在远端服务器上使用curl下载(以frp_0.59.0_linux_amd64.tar.gz为例):curl -L https://github.com/fatedier/frp/releases/download/v0.59.0/frp_0.59.0_linux_amd64.tar.gz如果你选择了别的版本,可以直接改动后面的文件名。如果远程服务器下载缓慢,也可以在本地下载好后,使用(s)ftp协议或其他方式上传至远程服务器。这里推荐使用自带ftp协议的ssh终端,如 MobaXterm下载好后,解压文件:tar -xzvf frp_0.59.0_linux_amd64.tar.gz-x:表示解压。 -z:表示文件是 gzip 格式的(.gz)。 -v:表示显示解压的文件列表(可选)。 -f:指定文件名。在服务端搭建frps服务修改配置文件进入frp文件目录:cd frp_0.59.0_linux_amd64用vim文本编辑器修改 frps.toml 配置文件vi frps.toml注意,对于初学者来说,vim编辑器可能比较难以使用,使用方式可以参照这篇文章:vim使用教程图文教程(零基础超详细)。如果还是觉得难以使用,推荐Windows用户下载MobaXterm,并在连接到服务器后,用右侧的sftp文件界面来修改toml文件内容。清除原先内容,复制以下内容到文件并保存:bindPort = 7000 # frp服务的端口。最基础的服务有这一行就够了,后面的都可以不要。需要注意如果你有防火墙,防火墙也需放开该端口 # 服务面板可查看frp服务状态信息,无论开启还是关闭都不影响服务正常使用。想要关闭就把后面四行用#号注释掉 webServer.addr = "0.0.0.0" # 后台管理地址,默认是127.0.0.1,如果是公网访问则改成0.0.0.0 webServer.port = 7500 # 后台管理端口 webServer.user = "admin" # (可选)后台登录用户名 webServer.password = "admin" # (可选)后台登录密码 # 身份认证。如果不配置这一项,那么任何想连接至你的服务器的frpc请求都会被同意。不过不开启这个配置起来简单一些。 #transport.tls.force = true # 服务端将只接受 TLS链接 #auth.method = 'token' # 客户端访问验证方式 #auth.token = "54321" # 客户端访问验证密码,frpc要与frps一致 # 自定义的监听的端口,所有对服务器该端口访问将被转发到本地内网,做了反向代理可不处理防火墙放行 #vhostHTTPPort = 8000 #vhostHTTPSPort = 45443保存退出。这时,输入./frps -c ./frps.toml即可运行服务,如果正常运行,就先按ctrl+c关闭程序,因为我们后面要配置后台运行和开机启动。设置开机启动在这里,我们使用 systemd 来将frps注册为系统服务。systemd 是一个用于 Linux 操作系统的系统和服务管理器。它是大多数现代 Linux 发行版中用于启动和管理系统服务的主要工具。systemd 负责管理系统启动、服务运行、系统资源分配以及进程和日志管理等。在多数主流的 Linux 发行版中,systemd 已经成为默认的系统管理工具。使用以下指令创建frps.service服务文件并编辑:sudo vim /etc/systemd/system/frps.service这里会提示你输入密码,因为此目录有root等级权限。如果没有提示输入密码,证明你用了root用户直接操作日常人物,这是不好的。如果你想用我前面提到的sftp工具直接修改,那你需要在Session里面重新开一个具有root权限的stfp会话,因为左边自带的stfp没有root权限,不能直接修改这个路径的文件。所以尽量还是学一下 vim 吧:vim使用教程图文教程(零基础超详细)。如果还是觉得难以使用,推荐Windows用户下载MobaXterm写入内容,注意修改frp文件路径:[Unit] # 服务名称,可自定义 Description = frp server After = network.target syslog.target Wants = network.target [Service] Type = simple # 启动命令,改为实际存放frps的路径 ExecStart = /path/to/frps -c /path/to/frps.toml # 自动重启设置 Restart = always # 适用于重启策略的额外设置 RestartSec = 5s [Install] WantedBy = multi-user.target注意修改你的frps路径。如果你想修改自动重启配置,可参照下面的细则调整配置文件(一般没有必要,可以直接跳过):Restart: - no:默认值,不会自动重启服务。 - always:无论服务的退出状态如何(正常退出或崩溃),systemd 都会自动重启服务。 - on-failure:只有在服务因非零退出状态或超时而失败时,systemd 才会重启服务。 - on-abnormal:只有在服务异常退出(如段错误、崩溃等)时,systemd 才会重启服务。 - on-success:仅当服务正常退出(退出码为0)时,systemd 才会重启服务。 - on-abnormal:只有在服务异常退出(如段错误、崩溃等)时,systemd 才会重启服务。 RestartSec:定义在服务重启之前等待的时间。这里设置为 5 秒。保存文件。随后,依次执行以下命令(如有启动失败,评论区联系):启动frpsudo systemctl start frps停止frpsudo systemctl stop frps重启frpsudo systemctl restart frps查看frp状态sudo systemctl status frps设置为开机自启sudo systemctl enable frps恭喜你,你已经完成了服务端的搭建工作,随后该服务会在系统开机时自启,无惧重启了。在用户端搭建frps服务修改配置文件进入frp文件目录:cd cd frp_0.59.0_linux_amd64用vim文本编辑器修改 frpc.toml 配置文件vi frpc.toml注意,对于初学者来说,vim编辑器可能比较难以使用,使用方式可以参照这篇文章:vim使用教程图文教程(零基础超详细)。如果还是觉得难以使用,推荐Windows用户下载MobaXterm,并在连接到服务器后,用右侧的sftp文件界面来修改toml文件内容。清除原先内容,复制以下内容到文件,理解你的每一项配置并按需修改和删除:transport.tls.enable = true # 从 v0.50.0版本开始,transport.tls.enable的默认值为 true serverAddr = "47.76.92.71" # 服务端ip,改成你的 serverPort = 7000 # 服务端端口,和之前配置frps.toml时候一致 #auth.method = 'token' # 客户端访问验证方式,如果你前面开启了访问验证,这里需要和之前配置frps.toml时候一致 #auth.token = '54321' # 客户端访问验证密码,如果你前面开启了访问验证,这里需要和之前配置frps.toml时候一致 # TCP隧道配置方式(如MySQL、Minecraft等等服务) [[proxies]] name = "thisclient.mc" # 客户端服务名,建议写成“xxx.xxx”的形式好分辨 type = "tcp" # 通讯方式 localIP = "127.0.0.1" # 客户端的ip(本机就写127.0.0.1,局域网下其他主机也可以写其它局域网IP) localPort = 25565 # 客户端服务端口(比如MC的默认端口是25565,MySQL是3306) remotePort = 13306 # 映射到服务端端口(服务器需放行。注意有些服务可能要求端口一致,但大部分不需要) # UDP隧道配置方式(如语音服务、MC基岩版) [[proxies]] name = "mc-bedrock" type = "udp" # 注意这里变了 localIP = "127.0.0.1" localPort = 19132 # MCBE的默认端口 remotePort = 39132 # 走TCP通道的HTTP流量,穿透网站用,但这种方式需要在网站后面加端口号 [[proxies]] name = "test-http" type = "tcp" localIP = "127.0.0.1" # 需要暴露的服务的IP localPort = 80 # 将本地80端口的服务暴露在公网的6060端口 remotePort = 6060 # 暴露服务的公网入口 # SSH隧道,远程连接用 [[proxies]] name = "ssh" type = "tcp" localIP = "127.0.0.1" localPort = 22 # ssh隧道默认端口是22 remotePort = 6000 #customDomains = ["xxx.xxx.xxx.xxx"] #如果想用域名访问,就在这里改 # HTTP隧道代理方式,穿透网站用,远程端口可以不是80并且不需要在访问时加端口号 [[proxies]] name = "web" type = "http" localPort = 80 #customDomains = ["域名"] # HTTPS隧道代理方式,需要注意配置证书 [[proxies]] name = "web-80" type = "https" localPort = 45443 #customDomains = ["cloud.your-service.com"]保存退出。这时,输入./frpc -c ./frpc.toml即可运行服务,如果正常运行,就先按ctrl+c关闭程序,因为我们后面要配置后台运行和开机启动。设置开机启动客户端设置开机启动方法与服务端一致,唯一不同的是创建的文件名和配置文件的frpc路径不同。所以相同的内容读者可以自行跳过在这里,我们使用 systemd 来将frpc注册为系统服务。systemd 是一个用于 Linux 操作系统的系统和服务管理器。它是大多数现代 Linux 发行版中用于启动和管理系统服务的主要工具。systemd 负责管理系统启动、服务运行、系统资源分配以及进程和日志管理等。在多数主流的 Linux 发行版中,systemd 已经成为默认的系统管理工具。使用以下指令创建frpc.service服务文件并编辑:sudo vim /etc/systemd/system/frpc.service这里会提示你输入密码,因为此目录有root等级权限。如果没有提示输入密码,证明你用了root用户直接操作日常人物,这是不好的。如果你想用我前面提到的sftp工具直接修改,那你需要在Session里面重新开一个具有root权限的stfp会话,因为左边自带的stfp没有root权限,不能直接修改这个路径的文件。所以尽量还是学一下 vim 吧:vim使用教程图文教程(零基础超详细)。如果还是觉得难以使用,推荐Windows用户下载MobaXterm写入内容,注意修改frp文件路径:[Unit] # 服务名称,可自定义 Description = frp client After = network.target syslog.target Wants = network.target [Service] Type = simple # 启动命令,改为实际存放frpc的路径 ExecStart = /path/to/frpc -c /path/to/frpc.toml # 自动重启设置 Restart = always # 适用于重启策略的额外设置 RestartSec = 5s [Install] WantedBy = multi-user.target注意修改你的frpc路径。如果你想修改自动重启配置,可参照下面的细则调整配置文件(一般没有必要,可以直接跳过):Restart: - no:默认值,不会自动重启服务。 - always:无论服务的退出状态如何(正常退出或崩溃),systemd 都会自动重启服务。 - on-failure:只有在服务因非零退出状态或超时而失败时,systemd 才会重启服务。 - on-abnormal:只有在服务异常退出(如段错误、崩溃等)时,systemd 才会重启服务。 - on-success:仅当服务正常退出(退出码为0)时,systemd 才会重启服务。 - on-abnormal:只有在服务异常退出(如段错误、崩溃等)时,systemd 才会重启服务。 RestartSec:定义在服务重启之前等待的时间。这里设置为 5 秒。保存文件。随后,依次执行以下命令(如有启动失败,评论区联系):启动frpsudo systemctl start frpc停止frpsudo systemctl stop frpc重启frpsudo systemctl restart frpc查看frp状态sudo systemctl status frpc设置为开机自启sudo systemctl enable frpc恭喜你,你已经完成了客户端的搭建工作,随后该服务会在系统开机时自启,无惧重启了。至此,我们就完成了所有服务的搭建。如果对过程有什么问题,或者出现了报错,请在下方评论留言联系。
2024年08月11日
87 阅读
0 评论
4 点赞
2024-08-10
THE —— TTF2HEX_Extractor | 单片机字库提取器
THE —— TTF2HEX_Extractor | 单片机字库提取器📖 介绍THE —— TTF2HEX_Extractor_单片机字库提取器是一个可以将ttf字体文件转换为单片机字库的工具。它可以将ttf字体文件转换为单片机字库的C语言格式头文件,以便于在单片机上使用。我写这个软件的初衷是因为想在oled屏幕上显示中文,而一个一个字码的手动输入HEX实在是太麻烦了,所以就想着写一个软件来自动生成字库头文件。Github页面:https://github.com/Simuoss/THE-TTF2HEX_Extractor🧰 特性列表{x} 支持ttf字体文件 {x} 画幅、字体大小可调{x} 支持位移、旋转、镜像、反色{x} 所见即所得字符预览{x} 进度条显示生成进度{x} 输出为.h的C语言格式字库头文件{x} 支持更多字体文件格式 { } 多语言支持{ } 从本地/网络字体库选择字体 { } 图片转HEX { } 添加自动适配宽高模式{ } 自定义屏幕尺寸预览待转文字 { } 添加数学符号、emoji等选区支持 { } 美化界面 { } 重构代码✨ 快速开始使用准备一款或多款ttf字体文件,推荐像素字体,提取出来效果比较好下载最新的 release 版本运行 .exe 文件,选择字体文件,设置字体大小、画幅大小等参数,预览确认无误后点击 提取字体 按钮导出格式:#ifndef __WENQUANYI_BITMAP_SONG_12PX_TTF_FONT_H__ #define __WENQUANYI_BITMAP_SONG_12PX_TTF_FONT_H__ const unsigned char code F_zh_cn_8x8[][8] = { // \u8fd9: 这 {0x00, 0x42, 0x84, 0xF0, 0x07, 0x24, 0x44, 0x84, 0x44, 0x34, 0x0A, 0xF1, }, // \u662f: 是 {0x00, 0xF8, 0x08, 0xF8, 0x08, 0xF8, 0x00, 0xFF, 0x24, 0xE4, 0x2A, 0xF1, }, // \u4e00: 一 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, }, // \u6bb5: 段 {0x00, 0xD8, 0x46, 0x42, 0x2E, 0x02, 0xEE, 0x22, 0x42, 0x8F, 0x42, 0x32, }, // \u6d4b: 测 {0x00, 0x7D, 0x46, 0x54, 0x55, 0x56, 0x54, 0x54, 0x13, 0x2A, 0x46, 0x02, }, // \u8bd5: 试 {0x00, 0x82, 0x84, 0xF8, 0x80, 0xF7, 0xA4, 0xA4, 0x24, 0x64, 0x1C, 0x04, }, // \u5b57: 字 {0x00, 0x20, 0xFE, 0x02, 0xF9, 0x40, 0x20, 0xFF, 0x20, 0x20, 0x20, 0x38, }, // \u7b26: 符 {0x00, 0x84, 0xBC, 0x4A, 0x21, 0x08, 0xF4, 0x06, 0x25, 0x44, 0x04, 0x84, }, }; #endif // 提取完成,应提取8个字符,实际提取8个字符,有0个字符不在字体里。这里感谢且安利文泉驿点阵体,演示时使用的字体就是它。使用时注意LICENSE。开发克隆项目到本地git clone
[email protected]
:Simuoss/THE-TTF2HEX_Extractor.git在目录打开命令行,安装依赖(主要就是一个Pyslide6)pip install -r requirements.txt使用你的IDE打开项目开发即可。main.py : 主程序入口extractor.py : QT界面和界面逻辑处理 woker.py : 字体提取器 in_font.py : 判断字体是否在字体文件中的一个函数
2024年08月10日
27 阅读
0 评论
1 点赞
1
2
3
4