SourceTree可视化git管理工具功能很强大,支持自定义操作可以写脚本,现在教大家做一个导出更新文件的脚本吧!
添加自定义操作
选择自定义文件导出
sourcetree_exports_file.sh
1 | sh复制代码#!/bin/bash |
选择版本号内容导出文件
sourcetree_commit_exports.sh
1 | sh复制代码#!/bin/bash |
最后选择对应的版本、文件右键
可能的错误
1 | bash复制代码当提示一下错误: |
本文转载自: 掘金
开发者博客 – 科技是第一生产力
SourceTree可视化git管理工具功能很强大,支持自定义操作可以写脚本,现在教大家做一个导出更新文件的脚本吧!
sourcetree_exports_file.sh
1 | sh复制代码#!/bin/bash |
sourcetree_commit_exports.sh
1 | sh复制代码#!/bin/bash |
1 | bash复制代码当提示一下错误: |
本文转载自: 掘金
LLama 3 模型已经开源了,感觉有一大波 Chinese -LLama 3 正在赶来的路上。如果你也想基于 LLama 3 训练一个自己的模型,那这篇教程就教你怎么来做。
在本文中,我们将介绍LLama 3,这是下一代最先进的开源大型语言模型。我们将了解LLama 3相对于LLama 2的进步。然后,我们将利用 Paperspace GPU 云的能力来深入探索,并尝试上手这个模型。因为 Paperspace 上有包括 H100、A100 等一系列 GPU 资源可以使用。
这里给还未了解 LLama 3 的开发者们,简要地介绍一下它。如果你已经是 AI 圈的老手,那么可以跳过这个章节。
Meta 最近宣布了LLama 3,这是下一代最先进的开源大型语言模型。
LLama 3 现在拥有 8B(80亿)和 70B(700亿)参数的语言模型。该模型已在各种任务中都有不俗的表现,并提供更好的推理能力。该模型已经开源,可供商业使用,并且开发者们可以在 AI 应用、开发者工具等方面进行创新。
LLama 3 有四个版本的大型语言模型(LLM)。这些模型有两种参数规模:8B 和 70B 参数,每种都有基础(预训练)和 instruct-tuned 版本。它们可以在不同类型的消费级硬件上平稳运行,并支持 8K(8000)token 的上下文长度。
最新的 8B 和 70B 参数的 LLama 3 模型,相比 LLama 2 有显著进步。有一些人表示,这是为大型语言模型设定了新的标准。由于更好的预训练和微调方法,它们已成为同类模型中的顶级存在。后训练增强中错误明显减少了,并提高了模型在推理、生成代码和遵循指令方面的性能。简而言之,LLama 3 比之前的很多模型都更先进、更灵活。下图是源自 Meta 官方的数据。
图:LLama 3 性能基准
在开发 LLama 3时,主要关注点是模型在现实生活情境中的优化。为此,他们创建了一个评估集,包含 1800 个 prompt,涵盖 12 个关键任务:寻求建议、编码和总结。此外,验证数据集也被禁止研发团队访问,以防止模型过拟合。将 LLama 3 与 Claude Sonnet、Mistral Medium 和 GPT-3.5 进行人工评估后,发现它在各种任务和场景中的结果都有不错的表现。
图:显示了人工评估在几个类别和提示下的结果
为了增强 LLama 3 的能力,Meta 专注于扩大预训练规模和完善后训练技术。
他们扩大了预训练规模,并制定了一系列详细的 scaling laws,以优化计算性能。令人惊讶的是,即使在训练了大量数据——高达 15T(万亿) 个 token 之后——其性能仍呈对数线性增长。结合使用各种并行化方法和定制的 GPU 集群,与LLama 2 相比,训练效率有效提高了三倍。
对于指令微调,Meta 考虑了不同的技术,如监督微调和偏好优化。此外,详细制定了训练数据和从偏好排名中学习,这有效提高了模型的性能,特别是在推理和编码任务中。这些改进使模型能够更好地理解和响应复杂任务。
在设计 LLama 3 时,采用标准的解码器只有变换器架构,优化了编码效率和推理效率。与LLama 2相比,采用了有 128K 个标记词汇表的分词器,能更有效地对语言进行编码。此外,为了在推理期间让 LLama 3 模型更快,还引入了不同大小的分组查询注意力(GQA)。在训练期间,使用了 8192 个 token 的序列和一种掩码技术,以保持文档边界内的注意力。
LLama 3 在超过 15T token 的公开数据集上进行了预训练——比 LLama 2 使用的数据大 7 倍,而且代码量也大了 4 倍。该模型包含超过 5% 的非英语数据,涵盖 30 种语言,以便实现支持多语言。
为了保持在高质量的数据上进行训练,Meta 还构建了一系列数据过滤管道,还使用了启发式过滤器和文本分类器等,目的就是为了提高了模型性能。
在我们开始之前,请确保在 huggingface.co 上获得对“meta-llama/Meta-Llama-3-70B”模型的访问权限。另外,我们在这里使用的是 Paperspace 平台上的 GPU,如果你手上还没有合适的 GPU 和机器,可以考虑这个平台。
要使用 Llama 3,我们首先要升级 transformers 包。
1 | lua复制代码#upgrade the transformer package |
接下来,运行以下代码段。根据 Hugging Face 博客的提示,该模型通常需要大约 16GB 的 RAM,包括像 3090 或 4090 这样的 GPU。
1 | ini复制代码import transformers |
如果你收到错误信息 “RuntimeError: cutlassF: no kernel found to launch!”,请尝试下面的代码,并再次运行该cell。
1 | python复制代码torch.backends.cuda.enable_mem_efficient_sdp(False) |
生成的文本:“Hey how are you doing today? I hope you’re having a great day so far! I just”
在这里需要注意几件事情:
1 | python复制代码pipeline = transformers.pipeline( |
尽管当前的 8B(80亿)和 70B(700亿)参数模型给人留下了深刻印象,但 Meta 的工程师正在研究支持超过 400B(4000亿)参数的更大模型。这些模型仍在训练中。在未来几个月里,它们将更强的新功能,如多模态性、多语言对话能力、更长的上下文理解能力以及整体更强的能力。
Meta的LLama 3 最引人注目的一点就是开源。发布的基于文本的模型是LLama 3系列模型中的第一批。正如 Meta 所说,他们的主要目标是使 LLama 3 多语言和多模态,拥有更长的上下文支持,并持续改进核心大型语言模型(LLM)能力(如推理和编码)的整体性能。
我们迫不及待地想看看 GenAI 领域的下一个热点会是什么了。
最后,如果你正在计划训练自己的大语言模型,欢迎注册体验 DigitalOcean 旗下的 GPU 云服务 “Paperspace”,支持包括 H100、A100、4090 等多种 GPU,并预装 ML 框架。随时扩展,按需停止,只需按使用量付费。
如果需要预约更多 GPU 资源或希望了解方案详情,可以与 DigitalOcean 中国区独家战略合作伙伴卓普云咨询。
本文转载自: 掘金
之前的文章已经介绍过向量数据库在RAG(Retrieval Augmented Generative)中的应用,本文将会讨论另一个重要的工具-Embedding模型。一般来说,构建生产环境下的RAG系统是直接使用Embedding模型对用户输入的Query进行向量化表示,并且从已经构建好的向量数据库中检索出相关的段落用户大模型生成。但是这种方法很明显会受到Embedding模型性能的影响,比如是否支持多语言、跨语言检索、训练数据的质量等。因此,以改进Embedding模型为目标提升RAG系统性能一般会有两种做法:
方法1,在使用向量模型获取密集向量后,再使用Cross-encoder作为精排模型,对第一次召回的结果进行重排,以提高最终结果的质量。
方法2,使用稀疏向量搭配密集向量进行召回。密集向量即对整个文本进行向量化表示产生的向量,稀疏向量则是对原始文本的编码表示,如TF-IDF,BM25等。其中,稀疏向量可以帮助识别和捕捉特定的语义信息,比如文本中的关键词,而密集向量则可以提供更丰富的语义表达,是通过大量长文本学习而来的。通过同时将这两种向量进行召回,可以获得更丰富、更全面的信息,从而提升 RAG 的效果。
方法1和方法2既可以独立使用,也可以搭配使用,这就大大增加了算法工程师的武器库,通过搭积木的方式来提高RAG系统的效果。
本文主要讨论二阶段检索的方法,对于稀疏向量的讨论不在本文范围之内。
原因之一,向量数据库中存储大量的向量数据,而想要从大量数据中精确地检索出最相似的向量势必会带来极大的延迟,这在任何应用中都是无法接受的,因此向量数据库一般都会通过建立索引来优化查找过程,这实际上是一种近似检索而非精确检索,是准确与效率的折衷方案。如果数据库中没有那么多的向量,或者全表检索的时间损耗能够接受,则完全没必要用近似检索,但这在实际生产系统中是不可能的。
其二,LLM受限于上下文长度的限制,所以能利用到的向量片段数量是有限的,尽管现在越来越多的研究使得LLM的上下文窗口越来越长,如改进位置编码或者注意力机制等,但也有实验表明再长的上下文输入给大模型总会由遗失或者处理不好的情况,称为“Lost in middle”现象。因此,更好的办法是把更有用的上下文筛选出来,重点在于提升质而不是量。
下面有两个模型,分别是Bi-Encoder和Cross-Encoder。左边的Bi-Encoder实际上就是我们常见的向量化模型,需要注意的是模型的结构并不是有2个Bert,而是只有1个Bert模型,但是对于两个句子分别做了向量化表示,最终比较这两个向量的相似度。这里‘Bi’表示的是处理的过程,而不是实际的结构。
而精排模型用到的Cross-Encoder结构则是把两个句子的输入concat到一起,最终预测这两个句子是否相关,有点类似于Bert训练时的next sentence prediction(NSP)。不难发现,这实际上就是一个分类模型,而且并不会产生具体的向量表示,只会产生一个介于0和1之间的值,用于表示句子对的相似性。而且,在使用时,需要将Query与待查询的句子拼接到一起再输入给模型,所以这就决定了输入的句子对数量不能太多,否则带来的计算耗时将会是无法估量的。
直观上来讲,用Bi-Encoder“目的更加通用”,是为了得到输入的向量化表示,这些向量不仅有大小,还有方向,因此就有这么一个学习向量化时遇到的经典例子:国王−男人=女王−女人国王-男人=女王-女人国王−男人=女王−女人。
而使用了Cross-Encoder的精排模型,因为输入部分包含了两个原始的句子,因此是从文本空间直接表示句子的相似度,而不是到了向量空间再表示。具体而言就是:传统的向量是经过了模型输出之后再根据不同的算子计算向量之间的相似度,而这个模型是句子对由模型得到端到端的结果。
能否再使用一次向量比较?或者说一阶段后再对检索出的向量计算精确的相似度有意义吗?
意义不大。因为这时候就算再计算精确的向量相似度,也只是在经过转换后的向量空间进行比较,因为这个空间比较“通用”,必定有所损失,无法在某种程度上准确表示所有的向量。
精排模型为什么准呢?
如前面说的,Bi-Encoder必须将所有的文档都映射到一个向量中,这个过程会丢失信息。而且,检索时query和已有的向量是没有交互的,是离线的状态,只是通过额外的相似度计算方法得到比较相似的向量,对query来说,缺乏必要的上下文信息。
而刚好精排模型是同时对两个句子进行编码的,这时候对query来说会含有上下文信息,而且从原始空间映射到隐空间是一个句子对而不是单独的句子,也更保证最终得到的相似度包含用户查询的文档信息。但是相对的,精排模型的结构决定了它的计算是实时的,而且计算量会比单纯的相似度计算大不少。
现有开源的Reranker模型已经非常多了,国内比较出门的有Jina-8k、bge-reranker以及bce-reranker等,且更新得非常快,目前看起来就是哪个最新用哪个,基本差异不大。值得一提的是Jina的模型是基于Alibi改进的注意力机制,所以能支持8K的上下文窗口,而bce本身只支持512k的上下文窗口,但是对较长的上下文进行切分,并且以其中一段最好的得分作为最终的相似度。bge模型没看过源码,等以后有时间针对这几个模型再研究一番。
虽然目前二阶段方法用来提升RAG的性能表现越来越受到关注,但是具体来看,其中所含的技术都是早就有的内容。Cross-Encoder这种架构在当时显得比较鸡肋,只能用来比较句子的相似度,甚至无法输出向量,在大部分自然语言处理场景中都不受待见,谁能想到在如今又焕发生机了呢?
本文转载自: 掘金
hi,你好,我是猿java
最近,有小伙伴私信反馈微软一面的系统设计题:订单超时未支付,如何自动关闭?
说实话,微软能问出这种面试题确实很诧异,难道是互联网人已经大量涌进了微软这个养老基地,开始卷它?言归正传,有网购经验的小伙伴应该知道,如果订单在规定的时间内没有支付,订单就会被系统自动关闭,作为技术人员,该如何设计这个功能,今天我们来分析 4种有概括性的方案。
说明:
定时器应该是我们最可能想到的方案,通过定时器去数据库轮询待支付的订单信息,然后在业务代码中判断订单是否超时,更新订单状态。
下单的时候把超时需要关闭订单的具体时间值(pay_expire_time)保存到表里,给pay_expire_time字段添加一个索引,然后设置一个定时器,每 3s/5s 去数据库查询一次数据,查询 SQL 如下:
1 | sql复制代码select id from order where order_status = '待支付' && pay_expire_time > now() |
定时器方案最大的优点就是实现简单
适用于数据量比较小的业务场景,比如,很多小公司在业务处于 0-1 的过程中,该方案比较常见。
服务器不做订单的主动关闭,而是在客户端拉取订单时按需被动关闭订单,比如,客户端通过接口获取服务器的时间以及订单超时时间,然后计算并判断订单是否超时,如果超时,将订单显示成超时的样式,
并隐式向服务器发送一个订单超时关闭的请求,服务器再做相应的逻辑处理。
适用于数据量比较小的业务场景,被动关闭通常会结合定时器方案使用。
有些 MQ有延时消息的特性,比如阿里开源的 RocketMQ,用户创建订单时,同时往 MQ中发送一条延时消息,用户支付成功后,删除对应的延时消息(开源版本的没有此功能)
,当消费者消费到消息时再做超时的相关处理
适用于搭建了 RocketMQ的公司,想利用 RocketMQ的延时消息来实现该功能
很多大厂都有自己的分布式超时系统 TOC(Timeout Coordinator System),不同的公司可能叫法不一样,这里给出一种实现思路:
1. 订单创建
2. 注册超时事件
3. 超时监控
4. 超时处理
5. 订单关闭
6. 超时后处理
适合数据量比较大的中大型公司,需要专门的团队负责
架构领域有句经典名言:没有最好的架构,只有够用(合适)的架构。
这个理论用于订单超时关闭场景同样适用,分布式超时中心方案看起来高大上,而且能处理海量数据,但是,如果把这套方案用于几个人的团队,有一种杀鸡用牛刀的架势,可能不但解决不了问题,还会给团队带来技术难题和成本负担。
因此,架构一定要基于业务,方案也一定要基于业务。
对于定时器方法,看起来简单粗暴,但是很多公司的业务在 0-1的过程中,它就是首选,因为实现的成本很低,没有什么技术难点,
假设每条订单的数据大小是 1K,5万条订单的数据大概在 50M左右,用定时器把数据加载到内存中处理也是ok的,所以该方案适合每天的订单量在万级别,或者再保守一些,每日订单总量在 1万以下。
对于 MQ延时消息方案,首先需要考虑自建 MQ 还是购买 MQ云产品,以及两种方案带来的技术难点或者购买成本,基于先有 MQ这个条件再看它适合的业务场景,在根据每日的订单量是百万级别,十万级别还是万级别来选择 MQ的配置。
分布式超时中心方案技术难度和维护成本都比较高,一般适合一些独角兽企业,大厂或者财力和技术能力都不错的公司。
本文分析了具有概括性的 4种订单超时关闭方案,也是业内使用比较多的方案,可能每个公司实现的细节或者叫法略有差异,但是思想是相通的。
当然还有其他方案实现,比如 Redis,但是不推荐
通过本文,我们可以根据不同的业务体量给出不同的方案或者设计思路,以及各个方案的优缺点,具体细节可以结合具体业务细节。
没有最好的架构,只有够用(适合)的架构,很多时候在选择方案的时候一定要结合实际业务,切勿过度设计,但是也不能缺乏设计的能力
本文转载自: 掘金
I’m a very very quick learner. – Lou Bloom, Nightcrawler
本章主题是神经网络如何自主地从数据中学习,从而得到最优权重和偏置参数值。由此引入了损失函数的概念,用来量化当前的权重参数的不合适度,学习的目标就是找到让损失函数最小的那一组参数值,使用的方法是梯度法。
由于实际的神经网络具有海量的层数和参数,参数可达成千上万乃至上亿个,凭人力根本无法进行计算,因此需要深度学习来确定参数。
对于机器学习来说,在识别手写数字的场景里,通常需要先从图像中提取特征量(表现为向量的形式),然后通过机器学习技术来学习这些特征量的模式。特征量用来把图片转换为向量。
而对于深度学习而言,提取特征量这一操作也是由机器学习完成的。
图:人工学习->机器学习->深度学习
指参数对某一个数据集过度拟合的情况,即对该数据集精确度很高,但对其它数据集则不然。
过拟合是深度学习中经常要面对的一个问题。
神经网络以损失函数作为量化指标,来寻找最优权重参数,一般采用均方误差和交叉熵误差。
图:均方误差算式
各参数说明如下:
1 | py复制代码# 均方误差 |
将正确解标签表示为1,其他标签表示为0。如在数字识别的例子里,一条监督数据是[0,0,1,0,0,0,0,0,0,0],表示当前数字为2。如果使用非one-hot表示,则t直接就是2。
图:交叉熵误差的算式
解标签tk采用one-hot表示,只有正确解为1,其它值为0。因此上式可以简化为E=-logyk。自然对数log是在(0,1]区间单调递增的,递增范围是负无穷大~0,因此yk越接近1,E的值越小,也就表明越接近正确(最佳)结果。
1 | py复制代码# 交叉熵误差 |
作为保护性对策,增加一个极小值delta防止出现log(0)的边缘场景。
为了在一次运算中使用更多数据验证参数的损失值,可以通过mini-batch的思路,即每次对批量数据计算损失函数,先求和再平均,已进行正规化。
图:批量计算交叉熵误差
叫mini-batch是因为相对于完整的数据集,只选取其中的一小部分(mini)进行计算。防止计算量过大。可以理解为抽样调查
1 | py复制代码# 通过numpy进行抽样 |
这段逻辑用如果用Java也能实现,但肯定比不上python简洁
1 | py复制代码# nparray_test.py 测试 |
导数用来表示某个瞬间的变化量,即瞬时速度。
图:导数
f(x+h)与f(x)之间的差分,因为偏离所以有误差f(x+h)与f(x-h)之间的差分,更接近真实值1 | py复制代码# 中心差分 |
对于下述二次函数,通过python代码计算其微分,以及在函数上x=5处的斜率,并绘图。
1 | py复制代码import numpy as np |
含有多个变量的函数的导数称为偏导数,在使用时应当声明是对其中哪一个变量求导。
上式的python实现为:
1 | py复制代码def function_2(x): |
对应图像是:
其中对x0、x1求导分别写作:
在求导时,将已知参数值带入,对未知参数进行中心差分求导,例如求x0=3、x1=4时关于x0的偏导数:
1 | py复制代码def function_tmp1(x0): |
导数代表某个时间的瞬时速度,对于多维向量每一维求导,则得到了它的梯度(gradient)。当我们声明梯度时,需要说明是在x0=?、x1=?、...xn=?所有变量处的梯度。
对于函数f和多维参数x计算梯度的方法如下(含批处理):
谨记:x是一个多维向量(即张量)
1 | py复制代码import numpy as np |
梯度指向各点处函数值减小最快的方向。
梯度法就是利用梯度的概念来寻找函数最小值的方法,通过不断沿着梯度方向前进,进而不断缩小损失函数值。
寻找最小值的梯度法称为梯度下降法(gradient descent method),寻找最大值的梯度法称为梯度上升法(gradient ascent method)。一般来说神经网络中梯度法是指梯度下降法。
在某一点上根据梯度方向前进,这就是梯度法的大白话表述。前进的步长用η表示,称为学习率(learning rate)。学习率决定在一次学习(前进)中,应当学习多少,以及在多大程度上更新参数。像学习率这样影响深度学习的值,称为超参数,以与权重等普通参数区分。
图:更新(学习)一次
学习率过大或者过小,都无法抵达一个“好的位置”,在神经网络中一般会一边改变学习率的值一半尝试学习,以便确认学习是否正常进行。
梯度下降法的python实现:
1 | py复制代码def gradient_descent(f, init_x, lr=0.01, step_num=100): |
在使用神经网络时,需要得出最优的权重矩阵,利用梯度法可以对这个矩阵进行计算,权重W神经网络和梯度表示如下:
由上例,定义一个simpleNet的简单神经网络:
1 | py复制代码import sys, os |
有了上面的梯度算法,就可以设置步长和步数,经过迭代得到最小损失函数。
调整权重和偏置以便拟合训练数据的过程称为学习,分为以下步骤:(由于第一步是随机抽样,因此该方法也称为随机梯度下降法 stochastic gradient descent)
首先定义双层网络的结构,它包含每一层的权重和偏置,并且提供计算输出的predict函数,计算交叉熵损失的loss函数,计算批量精确度的accuracy函数,以及生成梯度矩阵的numerical_gradient函数。
1 | py复制代码# coding: utf-8 |
引入epoch的概念,它是一个单位,表示训练集中全部数据均被使用过一次时的更新次数。对于10000条数据的训练集来说,如果每个mini-batch学习100条,则epoch=100。
1 | py复制代码# coding: utf-8 |
在每个epoch里,计算一次训练集和测试集的精度accuracy,并且显示在图像上,两条曲线吻合,说明没有发生过拟合。
图:未发生过拟合
本文转载自: 掘金
目前公司和华为达成了合作,计划在鸿蒙正式发布next版本之前,上架公司APP的鸿蒙版本。方便用户升级手机到鸿蒙next之后,能正常使用公司APP,保证用户的既得利益。
最近我们计划在4月底上线公司的鸿蒙第一版APP,在开发和测试中遇到一个问题。那就是如何把开发同学的APP包直接丢给测试同学进行测试。由于这一块鸿蒙可能借鉴了iOS的经验,导致我们目前没办法直接给到测试同学一个APP,然后进行安装。因此目前我们有如下做法:
以上方法可想而知,对开发和测试都是极其不友好的。
因此考虑是否能进行优化这其中的流程。
方式1:单HAP+可选(多HSP)+可选(多HAR)方式2:多HAP+可选(多HSP)+可选(多HAR)目前我们项目采用的是方式1
目前鸿蒙next版本的APP想要安装到鸿蒙测试手机上,(都必须得对APP进行签名)。
HarmonyOS通过数字证书(.cer文件)和Profile文件(.p7b文件)来对应用/元服务进行管控。
因此只有签名过的HAP才能安装到设备上运行。
有以下两种方式:
自动签名or手动签名进行安装就目前来看,好像没有办法像Android一样丢一个APK给测试,或者给他一个网站,让测试下载下来直接安装。
真的就不行吗?确实不行,但可以优化。
然后我观察到idea是如何将HAP安装到测试手机上。在控制台我看到如下输出:
1 | shell复制代码$ hdc shell aa force-stop com.byhk.app |
简单介绍一下上面的命令作用:
hdc shell aa force-stop:强制停止APP,后面跟包名hdc uninstall:卸载APP,后面跟包名hdc shell mkdir:使用shell命令创建一个目录。hdc file send:将hap和hsp发送到这个目录中,可能有人会问,为什么没有HAR。因为HAR的代码复制到了其依赖的module里面了。hdc shell bm install -p:安装这个目录里面所有的东西hdc shell rm -rf:移除刚刚的目录hdc shell aa start -a AppAbility -b 包名 -D:启动APP需要注意的是,send到这个目录的HAP,和HSP,都是进行了签名的。
重点:这个时候我就在想,如果我有一个已经签名的.app文件,我直接给到测试或者丢到一个网站上。并且给他写一份脚本,这个脚本将APP进行解压,然后把解压后的hap、hsp文件send到这个目录进行安装,是不是就行了。有道理。说干就干。
这个很简单直接在DevEco Studio上进行操作。操作如下:
最后会在build目录下生成两个.app文件,如下:
其中一个签名了,一个未签名。
这儿有个坑,app签名了,但你解压之后的hap、hsp是没有进行签名的。
因此我需要对HAP和HSP分别进行签名。
对HAP和HSP进行签名,需要java环境和鸿蒙的签名工具:hap_sign_tool.jar
hap_sign_tool.jar目录: 在${HOS_SDK_HOME}\HarmonyOS-NEXT-DP2\base\toolchains\lib,
如图:
使用如下命令对HAP进行签名。
1 | matlab复制代码java -jar hap-sign-tool.jar sign-app -keyAlias "key0" -signAlg "SHA256withECDSA" -mode "localSign" -appCertFile "test.cer" -profileFile "test.p7b" -inFile "hap-unsigned.hap" -keystoreFile "test.p12" -outFile "result\hap-signed.hap" -keyPwd "123456" -keystorePwd "123456" -signCode "1" |
关于该命令中需要修改的参数说明如下,其余参数不需要修改:
这儿我使用的是Python语言,脚本分为:
1 | python复制代码def unzip_app(app_file, signed_dir, output_dir): |
1 | python复制代码def signed_app(extracted_dir, signed_dir): |
1 | lua复制代码def zip_signed_files(signed_dir): |
1 | ini复制代码app_file = "xxx/jojo-read-default-signed.app" //app地址 |
完成以上,就会在out目录下生成一个.zip文件,这个文件就可以丢给测试了。但测试还需要将其解压send到手机上,因此还需要一个安装脚本。
1 | python复制代码def unzip_app(app_file, output_dir): |
1 | python复制代码def stop_and_uninstall_app(package_name): |
1 | scss复制代码def send_files_to_device(extracted_dir, package_name): |
1 | python复制代码def start_app(package_name): |
1 | ini复制代码app_file = "xxx/app-signed.zip" |
只需要测试在本地安装hdc命令环境和python环境,配置好zip包路径,即可运行脚本安装app。
后续计划使用flutter写一个桌面工具,包含app下载和安装。
完整脚本,放在文章末尾。有需要的自提。
以下是关于自动签名和手动签名的方法。
这种方式,仅限于开发者自己调试使用。方便快捷。操作如下:
进入File > Project Structure… > Project > Signing Configs界面,勾选“Automatically generate signature”(如果是HarmonyOS工程,需同时勾选“Support HarmonyOS”),即可完成签名。如果未登录,请先单击Sign In进行登录,然后自动完成签名。如下:
相比自动签名,手动签名就相对来说比较麻烦一点。官方文档:developer.huawei.com/consumer/cn…
需要通过DevEco Studio来生成密钥(.p12)和证书请求文件(.csr)。
点击“Next”
选择路径和输入名称及其后缀。
至此完成了。密钥(.p12)和证书文件(.csr),Android同学很熟悉。
登录AppGallery Connect,选择“用户与访问”。
在左侧导航栏选择“证书管理”,进入证书管理页面,。
点击右上角“新增证书”
选择刚刚生成的csr文件。
会生成一个cer格式的证书文件,将其报错下来。
在刚刚的证书管理下面,点击设备管理。
如果有多个设备,可以批量添加
1、登录AppGallery Connect,选择“我的项目”。
2. 找到您的项目,点击您创建的HarmonyOS应用/元服务。
至此,我们已经完成了profile的文件生成。(后缀名为.p7b),将其下载下来保存到本地。
(备注:每次新增设备,都需要重新生成调试profile文件)
目前我们电脑上有以下文件了:
本文转载自: 掘金
Volo 是字节跳动服务框架团队研发的 高性能、可扩展性强 的 Rust RPC 框架,使用了 Rust 最新的 AFIT 和 RPITIT 特性。
文章来源|CloudWeGo 开源社区
Volo 0.10.0 版本中,我们更多地关注可扩展性和易用性。
原先的错误类型存在诸如语义不清晰、可维护性不强、可扩展性不强、容易误用等问题,因此在新版中,我们重构了整个错误处理部分,极大加强了错误处理部分的语义清晰度和可维护性,并通过类型系统降低误用概率。
anyhow::Result,把anyhow:Result改为 volo_thrift::ServerResult 即可:Result<XResp, anyhow::Error> ,将 anyhow::Error 改为 volo_thrift::ServerError 即可:Exception 的用户,需要将返回类型 Result<XResp, volo_thrift::UserException<XException>>改为Result<volo_thrift::MaybeException<XResp, XException>,volo_thrift::ServerError>,同时将原先返回 Err(UserError::UserException(exception)) 的地方改为使用 Ok(MaybeException::Exception(exception)) 即可:anyhow::Error 时出现报错,可以手动加一个 .into()。? 返回错误处出现报错,可以尝试先转换成 anyhow::Error 再返回。对于不感知用户错误的中间件来说,本次修改应该不带来 break change;如果有需要感知用户错误,那么只需要把原来的 volo_thrift::Error 改为 volo_thrift::ServerError/ClientError 即可。
client 部分的错误从原来的 ResponseError 改为了 ClientError,按编译器报错提示匹配新的错误 variant 即可。
新版 yml 配置的结构更加清晰,且更易于维护,并主要解决了旧版中无法支持 git 跨仓库引用的问题,具体的功能和配置参数见 config。另外,对于 volo-cli 命令行工具,我们将之前的 idl 命令名字修改为了 repo。
config: www.cloudwego.io/zh/docs/vol…
安装 volo-cli 0.10.0 版本,并在 volo.yml 目录下执行 volo migrate 命令即可自动迁移。
在新版生成代码中,默认生成的 Enum 类型修改为了 i32 wrapper 的 newtype 类型,以便于更好的向前兼容 IDL enum 字段中枚举值的修改。
将 enum 字段中枚举值名字修改为对应生成的名字即可,如 Foo::Bar -> Foo::BAR。
完整的 Release Note 可以参考 Volo Changelog。
项目地址
GitHub:github.com/cloudwego
本文转载自: 掘金
C/C++ 的开发工具有很多,相信大家多多少少都有所了解,比如 Visual C++、Codeblocks、VSCode、Dev C++ 等等;本篇 Huazie 介绍一个比较轻量级的开发环境 Sublime Text 3,并用它来配置 C/C++ 开发环境。
Sublime Text 3 是一款流行的文本编辑器,它的特点是体积小巧、启动速度快、界面简洁美观。它具有强大的代码编辑功能,支持多种编程语言。此外,Sublime Text 3 还具有丰富的插件生态系统,用户可以根据自己的需求安装各种插件来扩展其功能。
Sublime Text 3 的一些主要特点,如下所示:
Mingw-w64 是一个用于在 Windows 系统上支持 GCC 编译器的完整运行时环境。这个项目是原始 Mingw.org 项目的进一步发展,旨在支持 64位 和 32位 Windows 操作系统原生的二进制文件。在 2007 年,Mingw-w64 从原始 Mingw.org项目分叉出来,提供对 64位和 新API 的支持。从那时起,它逐渐得到了广泛的应用和传播。
Mingw-w64 提供了一百万行以上的头文件、库和运行时,用于在 Windows 上链接和运行代码。它包括 Winpthreads 库(用于 C++11 线程支持)和 Winstorecompat库(一个便利库,可简化与 Windows 应用商店的一致性)。与VisualStudio 相比,Mingw-w64 在数学支持方面更为完善,并且执行速度更快。
参考这个帖子内容,下载一下 mingw-w64:
我目前用的 MinGW-w64 9.0.0,有需要的可以在评论回复 或者 私信我。
不管是安装版的,还是免安装版的,都会有类似如下的目录:
上图中的 bin 目录,我们点进去看下:
实际上这里的 gcc.exe 和 g++.exe 就是 C/C++ 程序编译和运行的关键所在,当然这里还有其他的可执行程序,感兴趣的朋友可以自行搜索了解,这里不展开了。
现在,Huazie 以 window 11 系统为例,介绍下配置环境变量,如下:
右击 Window 图标,打开下图并选择 系统:
点击 高级系统设置,打开系统属性页面,点击 环境变量 :
找到 Path 环境变量,配置上面你的 mingw64 的 bin 目录进去:
打开 Sublime Text 3,我们可以看到如下的界面:
菜单栏选择 Tools => Build System => New Build System
1 | c复制代码{ |
上述内容保存在,前面打开的 New Build System 中,并命名为 C.sublime-build:
1 | c复制代码{ |
重新 New Build System,将上述内容保存其中,并命名为 CPP.sublime-build
现在让我们开始编写吧!!!
1 | c复制代码#include<stdio.h> |
1 | cpp复制代码#include <iostream> |
菜单栏 Tools => Build System ,然后 选择 C,就是前面的 C.sublime-build。
然后直接 Ctrl + B,编译运行当前的程序,运行截图如下所示:
菜单栏 Tools => Build System ,然后 选择 CPP,就是前面的 CPP.sublime-build。
然后直接 Ctrl + B,编译运行当前的程序,运行截图如下所示:
本篇 Huazie 介绍了 Sublime Text 3 配置 C/C++ 的相关内容,感兴趣的朋友赶紧配置起来,有任何问题可以随时评论区沟通。
经过上面的配置,大家都能写自己的第一个 C/C++ 代码了,但是有些小伙伴慢慢使用发现,如果输出的内容包含中文,打印出来的信息是乱码的。有关这个问题,请查看笔者的另一篇博文《Sublime Text 3 解决中文乱码问题》。
本文转载自: 掘金
这里每天分享一个 iOS 的新知识,快来关注我吧
Apple 宣布将于北京时间 5 月 7 日晚上 10 点举行一场特别活动,预计将发布新的 iPad Pro 和 iPad Air 型号,以及更新的 Apple Pencil 和妙控键盘等配件。
以下是一些关于新 iPad 的一些预测:
在苹果的历史上,5 月只举办过两场苹果活动:1999 年的 WWDC,和 1998 年 5 月的第一代 iMac 发布!这次是第三场。
Apple 发布了即将推出的 iOS 17.5 和 iPadOS 17.5 更新的第三个测试版。
本次更新更改包括 Apple News+、 Game Center 排行榜集成、播客小组件的颜色匹配等功能。
根据郭明錤的一份分析报告,苹果已经下调了 Vision Pro 的出货量预期。苹果现在的目标是今年 Vision Pro 的出货量在 40 万至 45 万台之间。这低于最初市场共识的 70 万至 80万台。
Vision Pro 在美国的需求“大幅下降,超出了预期”,这直接导致了其出货量削减。
另外该分析透露,苹果将在 6 月的 WWDC 之前在其他国家/地区发布 Vision Pro。
据经济日报报道,iPhone 16 可能会配备新的触摸电容式按钮。
这些按钮会提供触觉反馈,而不是传统的物理按钮,有点类似于 iPhone 7 上的 Home 按钮。
苹果收购了总部位于巴黎的人工智能初创公司 Datakalab,该公司专注于算法压缩和嵌入式 AI 系统。
这项收购于去年 12 月 17 日完成,是悄悄进行的。虽然该交易的财务细节尚未披露,但此举可以肯定是苹果 AI 战略的一部分,预计将在 iOS 18 中引入的 iPhone 16 等设备。
这里每天分享一个 iOS 的新知识,快来关注我吧
本文同步自微信公众号 “iOS新知”,每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!
本文转载自: 掘金
下边这个问题困扰我有段时间了:
因为文章是在掘金,知乎这类技术网站发表的,在发表时文章中的图片都是上传到了掘金 or 知乎的图床上了,不管是用的哪家哪个大厂的图床,我总是担心哪一天网站崩掉或者其他什么不可控的事情发生,那我博客中的所有的图床文件(大部分都是图片)那岂不是都访问不到了? 像这样:
这就尴尬了,我一般写文章很重视图解,没有图片的文章那没法串联起来,所以我总是想的把文章复制到本机上,但是复制到本地上的文章中的图片不用说也仍然是访问的三方的图床呀,如下:
我不可能一个个手动去下载替换,那样士可忍孰不可忍。所以我决定使用python批量替换,基本逻辑是:
读取指定文件夹中的文章集合,并解析,正则匹配与下载替换:
1 | python复制代码 |
下载图片 download_util 工具类:
1 | python复制代码 |
logger 工具类:
1 | python复制代码 |
file_util 工具类:
1 | python复制代码 |
执行过程:
本机图片:
markdown中展示:
所有文章都替换完成:
同样的,知乎等其他网站上的文章只要是markdown格式的 图床文件能请求成功的 都可以使用此工具实现下载到本地并替换到文章中去实现本机存储图片永久保留。如果帮助到了你,麻烦点赞收藏评论三连!😋😋😋😋😋😋😋😋😋😋😋😋😋😋😋😋😋😋😋😋😋😋
本文转载自: 掘金