Saturday, October 9, 2021

V2EX - 技术

V2EX - 技术


XDM,个人开发的小程序因为有发布功能无法上架怎么办

Posted: 09 Oct 2021 04:57 AM PDT

google 搜中文太毒了吧,是不是已经放弃中文搜索了

Posted: 09 Oct 2021 04:54 AM PDT

http://asset.eienao.com/20211009101236.png

这种垃圾搜索信息是不是能赚很多钱,我看里面都是广告,实现成本高吗。 就我搜索这个内容,google 出了 100 条,有 95 条都是小 xx 知识网,而且网址都不同,根本屏蔽不完

一个看似简单的 sql 优化问题,但是把我给难住了

Posted: 09 Oct 2021 04:47 AM PDT

在我看来,这是个很合理的需求,我在项目中没做优化,对于 ToB 项目的数据量实测完全没问题,但是对于数据量大的情况下,确实需要优化,可是我想不出解决方案。

以下例子基于 postgres,但是这个问题应该不限于 postgres 。

有一张货币表 c: create table currency (id bigserial not null primary key, rate double precision not null);

造数据: insert into currency (rate) select random()*10 from generate_serial(1, 100);

有一张薪资表 s: create table salary(id bigserial not null primary key, salary double precision not null, currency_id bigint not null references currency(id));

造 1000w 条数据: insert into salary(salary, currency_id) select random()*1000, random()*99::int+1 from generate_series(1, 10000000);

薪资表通过 currency_id 外键引用 c,c 里面记录了每个货币的汇率,这个汇率会定期更新,所以不方便将汇率直接写入 salary 表。

当过滤薪资条件时,会使用 SQL: explain analyze select * from salary s left join currency c on s.currency_id = c.id where salary/rate > 1000;

这个查询不会使用索引,会很慢,怎么优化?

有大佬有思路的吗?

上传文件时,如何设计不会保存未引用的文件

Posted: 09 Oct 2021 04:43 AM PDT

例如一个图床服务。

1 、数据库使用了 file 和 image 两个表设计 2 、系统接入了第三方对象存储 3 、使用直传对象存储方式 4 、入库储存的是对象存储的 key 值 5 、我知道一些云是有回调服务器的功能,可以利用此功能将文件 key 写进 file 表 

在这种情况下,如果我上传了文件,但是我不提交到 image,那文件就会存在 file 里面,也就是微博图床的现状。

当然实际情况肯定不只只有 image 使用了 file,还会有各种地方。

我目前的做法是服务器中转来创建文件,让后创建 image 的同时创建 file 以此保证一致性

func CreateXXX -> func CreateFile func CreateXXX -> func CreateFile 

另一个想法是在 file 表加 ack 机制然后做定时任务去删除

所以在上传这种场景中,如何设计才能保证一致性而不会被滥用?

腾讯云的客服现在是真坑,是外包的吧?

Posted: 09 Oct 2021 04:41 AM PDT

在腾讯云买的域名,用的域名,腾讯云早期域名服务商都是接的新网,刚刚去续费域名,结果发现可以升级"注册商"大概就是把原新网注册商换到腾讯云来。 注册商在哪无所谓,反正解析都是 dnspod,升级注册商 COM 续费可以从 70 变 30,像我们这有几百个米的还是能省不少,于是就操作了三个升级。 大概业务流程是:

续费 - 勾选升级服务商 - 操作转出后新服务商所有人信息模板选择 - 付费 - 付费成功 - 腾讯云下发转出需求到他们和新网合作的接口 - 新网下发该域名的转出确认函给用户 - 用户邮件确认转出 - 新网操作转出到腾讯云 - 转出成功 - 续费成功

但是我这里收到的确认函,确认连接根本点不了,F12 看了一眼 A 是空的根本没链接,找到腾讯云在线客服,讲明情况第一个客服,说我是新网邮件,让我自己找新网解决....说明了我域名注册-续费操作-使用升级注册商功能导致的这个情况,客服回答我"明白的,你要自己找新网。"

然后截图了我刚刚付费订单的截图,客服给我换了一个所谓技术支持,上来就告诉我已经转出中...和他确认了一下因为我付费了 20 多分钟了,域名仍然是"未续费"状态,订单是"处理中"状态,问他是不是域名转出注册商转出成功才续费成功。

他回答"是"。

然后反问我"你现在是不是还没完成支付"....截图了付费结果,还来问我是不是没完成支付....

真的是大无语。

然后又说我域名是转出中状态,是正常的!

废话,从"腾讯云下发转出需求到新网,新网下发确认邮件给我的时候"状态就已经更新为"转出中",这跟我反馈的问题是一件事儿吗???

我反馈的问题是"无法手动确认",希望得到的结果是"能否重新下发手动确认邮件"我好尽快完成域名续费。

前后俩客服根本对业务基本都是半懂状态,能推给别人就推给别人,这 TM 就无语了,一般域名转出如果不点击确认转出那个链接,大概等个 7-15 天域名注册商一般也有视为"默认同意"的逻辑,过了这个默认时间域名才会进入下一步操作,目前只能等了。

腾讯云客服给他说完半天,然后就没动静了,过了大概 25 分钟,又复活,告知我不操作的话新网是 5-7 天后视为默认同意。

害,大部分的好业务,一半毁在客服上。

开启 tpm 竟然要收费,这是什么操作?

Posted: 09 Oct 2021 04:40 AM PDT

我的是惠普战 66 二代,BIOS 上找不到 tpm 开启选项,经过与客服沟通得知,我的笔记本支持 tpm,但需要到官方维修中心解锁 tpm 功能,然后骚操作来了,客服说由于我的笔记本已经过保,解锁 tpm 需要收费,具体收费多少需要咨询维修工程师。

在线文档需要防止被截图,防止下载,但是能直接打印,前后端需要怎么设计?

Posted: 09 Oct 2021 04:35 AM PDT

给用户的开发的功能就是在线文档能预览电子版和直接打印,但要防止用户截屏和保存电子版,前端后端怎么设计文档格式,怎么调用打印功能?就指导思路

请问大家用 idea 的时候用什么主题呢,默认几个主题看着眼睛都不咋好受…

Posted: 09 Oct 2021 04:08 AM PDT

请问大家用 idea 的时候用什么主题呢,默认几个主题看着眼睛都不咋好受…求推荐几个对比较柔和护眼的主题,非常感谢~

win10 怎样禁止一个文件夹下所有的程序联网?

Posted: 09 Oct 2021 04:06 AM PDT

自带的防火墙貌似只能单独禁止某一 exe 文件联网,能不能实现禁止一个文件夹下所有的程序联网,并且可以方便一键开启和一键关闭。

如果自带防火墙不能实现,有没有好用的第三方软件实现?

请教一下,使用 jest 的写测试的时候,怎么 mock 掉一个 module 里面的 generator 函数?

Posted: 09 Oct 2021 04:04 AM PDT

// module1.js export function a() {   yield 1;   yield 2;   // blabla... }  // module2.js export function b() {   dispatch(createActionForA()); // redux 发送一个消息,redux-saga 会把这个消息转到对应的 saga 函数,比如 a()。 } 

然后

// test.js jest.mock("../../saga/moduel1", () => {   const actual = jest.requireActual("../../saga/module1");   return {     ...actual,     a: jest.fn() // 这样写是不能工作的     })   }; }); 

但,现在,我在测试 b 的时候,我想把 a mock 掉。上面这个方法,我用来 mock 一般的 module,都能够正常工作。但 generator 不行。

请教一下大神,有没有好的方法?

另,我也想过,监听或者 mock redux 里面的 action 和 action 方法貌似也不方便。

有广告推销腾讯云充值服务的?靠谱吗?感觉有点像过去 9.5 折充值 Q 币

Posted: 09 Oct 2021 03:50 AM PDT

很奇怪的,9.5 折充值,比如我充值 100 元,实际花费 95 元?按说卖优惠券那种是服务类优惠,充钱优惠的话,5%的前难道腾讯有内部价卖云服务的?
V 友们有尝过瓜的么?甜不甜?

centos console 系统怎么对 amd gpu(firepro s7150)进行压力测试

Posted: 09 Oct 2021 03:46 AM PDT

求各位老哥,无界面的 centos 怎么测试 amd gpu,有啥脚本、工具的?

Golang 中的 web app error 处理

Posted: 09 Oct 2021 03:15 AM PDT

这篇文章是我对 Bill Kennedy, <<Go 语言实战>>作者,关于 Web App 中处理 error 方法的总结。方法来自他的高阶收费课程 Ardan Labs Service 2.0, 源码在 https://github.com/ardanlabs/service
ardanlabs/service 提供了我自认为是最好的 design pattern 。 我将我几个项目从 mvc 改成了它的架构以后,十分舒服,logging+error handling 都是从底层开始,处理方式始终如一,规范。我认为 ardan labs 的几个 golang 课程都是市面上最好的高阶进阶课程,没有之一。Bill 从严谨的工程设计角度讲解代码。

-------------------------------------------------------------------------------------------------
" Do things that are easier to understand, not easier to do"
"代码要容易被理解,而不是更容易写"
_Bill Kennedy

-------------------------------------------------------------------------------------------------
几天前那位兄弟写了一篇 error 处理的方法, 贴子里莫名其妙就和别人吵了起来。我觉得还是写点有用的。
-------------------------------------------------------------------------------------------------
ardanlabs/service repo 非常值得学习,尤其是中间件的使用方式
-------------------------------------------------------------------------------------------------

https://medium.com/p/f6a9fb74a4c7

Java 关于构建公共模块的问题

Posted: 09 Oct 2021 02:44 AM PDT

1,有两个业务模块 A 和 B 2,A 和 B 的 contronller 都需要记录日志去数据库 3,我想在 公共模块 C 用 AOP 去做。

C 公共模块是不是需要连接数据库,配置一些信息。但是一般公共模块我看不配置的

K8S 运行相同的镜像,配置 32 核/64G/1GPU(2080ti) OOM, 16 核/60G/1GPU(1080ti) 却正常运行?

Posted: 09 Oct 2021 02:33 AM PDT

K8S 自建集群里运行相同的镜像,当配置 32 核 /64G/1GPU(2080ti) 一创建 Pod 容器就 OOM 了,16 核 /60G/1GPU(1080ti) 却正常运行?为啥会这样呢?

已知系统和内核版本都一样:

NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME ai-1080ti-24 Ready 1080ti,training 164d v1.13.5 10.200.0.81 <none> Debian GNU/Linux 9 (stretch) 4.19.0-0.bpo.9-amd64 docker://18.6.2 NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME ai-2080ti-04 Ready 2080ti,training 2y190d v1.13.5 10.90.1.149 <none> Debian GNU/Linux 9 (stretch) 4.19.0-0.bpo.9-amd64 docker://18.6.2

如何解释 Google 搜索同一关键词不同的人结果不同

Posted: 09 Oct 2021 02:29 AM PDT

看到 https://v2ex.com/t/806592 的帖子说的,google 搜索 c 语言二进制输出,我浏览器上的 google 搜索结果跟帖主的搜索结果差不多,而有的人根本没有出现垃圾网站的搜索结果,那么差别在哪里呢?

里面的 snuglove 说是"很显然你用了镜像站的 google,直接在 google 并没有你的问题,使用镜像站立马就出现了",但是我只是挂着梯子访问 Google,难道也访问了镜像站?

k8s 中有关 service 的 iptables 的疑问

Posted: 09 Oct 2021 12:13 AM PDT

k8s 版本:v1.19.14
网络插件:cilium

kubernetes 服务的 IP 为 10.96.0.1,对应后端 pod 的 IP 为 10.225.4.247。查看 nat 表中 KUBE-SERVICES 链的规则:

...... Chain KUBE-SERVICES (2 references)  pkts bytes target     prot opt in     out     source               destination     3   180 KUBE-MARK-MASQ  tcp  --  *      *      !10.244.0.0/16        10.96.0.1            /* default/kubernetes:https cluster IP */ tcp dpt:443     3   180 KUBE-SVC-NPX46M4PTMTKRN6Y  tcp  --  *      *       0.0.0.0/0            10.96.0.1            /* default/kubernetes:https cluster IP */ tcp dpt:443 ...... 

根据上面的规则,当使用 10.96.0.1 访问 api server 时, 根据第一条规则,数据包会跳到 KUBE-MARK-MASQ 做标记。由于用户自定义的链的默认策略是 RETURN,因此打完标记后数据包会返回到 KUBE-SERVICES 链中继续做处理,因此数据包会执行第二条规则,即跳转到 KUBE-SVC-NPX46M4PTMTKRN6Y 链。
查看 KUBE-SVC-NPX46M4PTMTKRN6Y 链的规则:

Chain KUBE-SVC-NPX46M4PTMTKRN6Y (1 references)  pkts bytes target     prot opt in     out     source               destination     4   240 KUBE-SEP-CTNR2LSYMQN7HLKM  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/kubernetes:https */ 

可知数据包继续跳转到 KUBE-SEP-CTNR2LSYMQN7HLK 链。
继续查看此链的规则:

    0     0 KUBE-MARK-MASQ  all  --  *      *       10.225.4.247         0.0.0.0/0            /* default/kubernetes:https */     4   240 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/kubernetes:https */ tcp to::0 persistent:0 persistent0.0.0.0 persistent 

第一条规则应该也是给数据包打标记,但是第二条 DNAT 的规则好奇怪,不理解是怎样把数据包转到后端 pod 里的。有懂的 v 有解释一下吗?如果上面描述有问题也请指出

为什么最近 Google 搜索会出现这么多垃圾靠 seo 的站点

Posted: 08 Oct 2021 11:53 PM PDT

排名靠前的很多站点都是完全不想关的垃圾站点,如图。这个也太影响使用体验了。 大家也可以试下自己的搜索结果。 关键词举例:z170 amd 专用条 Snipaste_2021-10-08_22-59-31.jpg Snipaste_2021-10-08_23-07-00.png

开源 DevOps 平台 OneDev 5.1 发布 - 支持在 Code/Diff 上查看 Java 代码分析信息

Posted: 08 Oct 2021 11:50 PM PDT

项目地址: https://github.com/theonedev/onedev

5.1 版本可以分析 JUnit/CheckStyle/OpenClover/SpotBugs/JaCoCo/PMD/CPD 等 Java 工具产生的报告,并将代码覆盖率及发现的问题标注到源代码和 Diff 上:

https://github.com/theonedev/onedev/wiki/5.1/code-annotation.png

CI 运行结果也提供了集中查看所有分析报告:

https://github.com/theonedev/onedev/wiki/5.1/build-report.png

为什么我调用百度 api 的时候,有时候会返回 html 给我?正常都是 json, 然后错误的时候会跳到 "你访问的页面不存在"这个问题

Posted: 08 Oct 2021 09:10 PM PDT

这是为什么呀,我并发也不大呀,python 而已,一秒绝对没有 50 的呀,郁闷

各位 v 友,帮忙看看这个思路对不?

Posted: 08 Oct 2021 08:46 PM PDT

各位 v 友,帮忙看看这个思路对不对

项目里面有个函数调用频率很高(极高), 大概长这样,

char *cmd=input //string,输入 if (cmd == "cmd1")     dosomething1 else if cmd== "cmd2"     dosomething2 

这里 cmd1 cmd2 是举例的常数,实际是 30 位以内的字符串

if 大概有 200 多个分支,( 就是你们批判的那种,一个 if 几百分支,我接下了) 我想优化下, 目前有两个想法,望各位指正

思路 1: 统计每个 cmd 使用频率,调整 if 顺序,高频在前,低频在后,这样优化估计(目测)有些作用。(这主要是作为思路 2 被卡住了的备选


思路 2,把 string 快速转换成 int,利用 switch case 跳转,这样当然是最好的(吗?),初步想法是 把 sting 各位按不同权重求和得到 int,这个做成一个宏,这样,即使冲突了,编译器会报错。 最终代码是这样,

int cmdn = sum ( cmd )//这个是输入,运行时计算  switch cmdn:  case M(CMD1)://M 是宏,返回一个常数        DO SOMETHING  case M(cmd2 ):        do something 2 

这样,新加 cmd3 命令 即使求权重和前面冲突了,编译器会立即报错,我只需要修改字符串某几位权重或者换个命令名就行。 关键点来了,如何写这个宏呢?
要优雅,不要污,最好是接受一个参数
不要这样
M ( c,m,d,1 )
要这样
M(cmd)

ps:我其实有点怀疑宏能不能做到这个 (分割字符串)

go 语言如何进阶?

Posted: 08 Oct 2021 06:10 PM PDT

最近学习了下 go,感觉从语言本身来说挺简单的。两天看了下书就上手写了个小工具。但是不知道后面该学什么?公司也不使用 go,没有实践的机会。之前学了 scala 也是一直没机会时间,过了一段时间碰上个 spark 的应用才用上了,前两天会看代码发现又忘了……

xmake v2.5.8 发布,新增 Pascal/Swig 程序和 Lua53 运行时支持

Posted: 08 Oct 2021 05:41 PM PDT

xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt ,配置语法更加简洁直观,对新手非常友好,短时间内就能快速入门,能够让用户把更多的精力集中在实际的项目开发上。

这个版本,我们主要增加了对 Pascal 语言项目和 Swig 模块的构建支持,而对于上个版本新增的 Vala 语言支持,我们也做了进一步改进,增加了对动态库和静态库的构建支持。

除此之外,xmake 现在也已经支持了可选的 Lua5.3 运行时,提供更好的跨平台支持能力,目前 xmake 已经能够在 LoongArch 架构上正常运行。

新特性介绍

Pascal 语言支持

目前,我们可以使用跨平台的 Free pascal 工具链 fpc 去编译构建 Pascal 程序,例如:

控制台程序

add_rules("mode.debug", "mode.release") target("test")     set_kind("binary")     add_files("src/*.pas") 

动态库程序

add_rules("mode.debug", "mode.release") target("foo")     set_kind("shared")     add_files("src/foo.pas")  target("test")     set_kind("binary")     add_deps("foo")     add_files("src/main.pas") 

我们也可以通过 add_fcflags() 接口添加 Pascal 代码相关的编译选项。

更多例子见:Pascal examples

Vala 库编译支持

上个版本,我们新增了对 Vala 语言的支持,但是之前只能支持控制台程序的编译,无法生成库文件。而这个版本中,我们额外增加了对静态库和动态库的编译支持。

静态库程序

我们能够通过 add_values("vala.header", "mymath.h") 设置导出的接口头文件名,通过 add_values("vala.vapi", "mymath-1.0.vapi") 设置导出的 vapi 文件名。

add_rules("mode.release", "mode.debug")  add_requires("glib")  target("mymath")     set_kind("static")     add_rules("vala")     add_files("src/mymath.vala")     add_values("vala.header", "mymath.h")     add_values("vala.vapi", "mymath-1.0.vapi")     add_packages("glib")  target("test")     set_kind("binary")     add_deps("mymath")     add_rules("vala")     add_files("src/main.vala")     add_packages("glib") 

动态库程序

add_rules("mode.release", "mode.debug")  add_requires("glib")  target("mymath")     set_kind("shared")     add_rules("vala")     add_files("src/mymath.vala")     add_values("vala.header", "mymath.h")     add_values("vala.vapi", "mymath-1.0.vapi")     add_packages("glib")  target("test")     set_kind("binary")     add_deps("mymath")     add_rules("vala")     add_files("src/main.vala")     add_packages("glib") 

更多例子见:Vala examples

Swig 模块支持

我们提供了 swig.cswig.cpp 规则,可以对指定的脚本语言,调用 swig 程序生成 c/c++ 模块接口代码,然后配合 xmake 的包管理系统实现完全自动化的模块和依赖包整合。

相关 issues: #1622

Lua/C 模块

add_rules("mode.release", "mode.debug") add_requires("lua")  target("example")     add_rules("swig.c", {moduletype = "lua"})     add_files("src/example.i", {swigflags = "-no-old-metatable-bindings"})     add_files("src/example.c")     add_packages("lua") 

其中,swigflags 可以设置传递一些 swig 特有的 flags 选项。

Python/C 模块

add_rules("mode.release", "mode.debug") add_requires("python 3.x")  target("example")     add_rules("swig.c", {moduletype = "python"})     add_files("src/example.i", {scriptdir = "share"})     add_files("src/example.c")     add_packages("python") 

如果设置了 scriptdir,那么我们执行安装的时候,会将对应模块的 python wrap 脚本安装到指定目录。

Python/C++ 模块

add_rules("mode.release", "mode.debug") add_requires("python 3.x")  target("example")     add_rules("swig.cpp", {moduletype = "python"})     add_files("src/example.i", {scriptdir = "share"})     add_files("src/example.cpp")     add_packages("python") 

Lua5.3 运行时支持

xmake 之前一直使用的 Luajit 作为默认的运行时,因为当初考虑到 Luajit 相对更加快速,并且固定的 lua 5.1 语法更加适合 xmake 内部实现的需要。

但是考虑到 Luajit 的更新不给力,作者维护不是很积极,并且它的跨平台性比较差,对于一些新出的架构,比如:Loongarch,riscv 等支持不及时,这多少限制了 xmake 的平台支持力度。

为此,新版本中,我们也将 Lua5.3 作为可选的运行时内置了进来,我们只需要通过下面的命令编译安装 xmake,就可以从 Luajit 切换到 Lua5.3 运行时:

Linux/macOS

$ make RUNTIME=lua 

Windows

$ cd core $ xmake f --runtime=lua $ xmake 

目前,当前版本还是默认采用的 luajit 运行时,用户可以根据自己的需求切换到 Lua5.3 运行时,但这对于用户的项目 xmake.lua 配置脚本几乎没有任何兼容性影响。

因为 xmake 的配置接口都已经做了一层的抽象封装,一些 Luajit/Lua5.3 存在兼容性差异的原生接口是不会开放给用户使用的,所以对项目构建来说,是完全无感知的。

唯一的区别就是,带有 Lua5.3 的 xmake 支持更多的平台和架构。

性能对比

我做过一些基础构建测试,不管是启动时间,构建性能还是内存占用,Lua5.3 和 Luajit 的 xmake 都几乎没有任何差别。因为对于构建系统,主要的性能瓶颈是在编译器上,自身脚本的损耗占比是非常小的。

而且 xmake 内部的一些底层 Lua 模块,比如 io,字符编码,字符串操作等,都自己用 c 代码全部重写过的,完全不依赖特定的 Lua 运行时引擎。

是否会考虑默认切换到 Lua?

由于我们刚刚支持 Lua5.3,尽管目前测试下来已经比较稳定,但是为了确保用户环境不受到任何影响,我们还需要再观察一段时间,短期还是默认使用 Luajit 。

等到 2.6.1 版本开始,我们会全面开始切换到 Lua5.3 作为默认的运行时环境,大家有兴趣的话,也可以线帮忙测试下,如果遇到问题,欢迎到 issues 上反馈。

LoongArch 架构支持

由于我们增加了 Lua5.3 运行时支持,所以现在我们已经可以支持再 LoongArch 架构上运行 xmake,并且所有测试例子都已经测试通过。

Lua 5.4

目前,我们对 Lua 5.4 还保持观望状态,如果后面等 lua5.4 稳定了,我们也会尝试考虑继续升级到 Lua5.4 。

第三方源码混合编译支持

集成 CMake 代码库

新版本中,我们已经能够通过 xmake 的包模式直接集成自己项目中带有 CMakeLists.txt 的代码库,而不是通过远程下载安装。

相关 issues: #1714

例如,我们有如下项目结构:

├── foo │   ├── CMakeLists.txt │   └── src │       ├── foo.c │       └── foo.h ├── src │   └── main.c ├── test.lua └── xmake.lua 

foo 目录下是一个使用 cmake 维护的静态库,而根目录下使用了 xmake 来维护,我们可以在 xmake.lua 中通过定义 package("foo") 包来描述如何构建 foo 代码库。

add_rules("mode.debug", "mode.release")  package("foo")     add_deps("cmake")     set_sourcedir(path.join(os.scriptdir(), "foo"))     on_install(function (package)         local configs = {}         table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:debug() and "Debug" or "Release"))         table.insert(configs, "-DBUILD_SHARED_LIBS=" .. (package:config("shared") and "ON" or "OFF"))         import("package.tools.cmake").install(package, configs)     end)     on_test(function (package)         assert(package:has_cfuncs("add", {includes = "foo.h"}))     end) package_end()  add_requires("foo")  target("demo")     set_kind("binary")     add_files("src/main.c")     add_packages("foo") 

其中,我们通过 set_sourcedir() 来设置 foo 包的代码目录位置,然后通过 import 导入 package.tools.cmake 辅助模块来调用 cmake 构建代码,xmake 会自动获取生成的 libfoo.a 和对应的头文件。

!> 如果仅仅本地源码集成,我们不需要额外设置 add_urlsadd_versions

关于包的配置描述,详情见:包描述说明

定义完包后,我们就可以通过 add_requires("foo")add_packages("foo") 来集成使用它了,就跟集成远程包一样的使用方式。

另外,on_test 是可选的,如果想要严格检测包的编译安装是否成功,可以在里面做一些测试。

完整例子见:Library with CMakeLists

集成 autoconf 代码库

我们也可以使用 package.tools.autoconf 来本地集成带有 autoconf 维护的第三方代码库。

package("pcre2")      set_sourcedir(path.join(os.scriptdir(), "3rd/pcre2"))      add_configs("jit", {description = "Enable jit.", default = true, type = "boolean"})     add_configs("bitwidth", {description = "Set the code unit width.", default = "8", values = {"8", "16", "32"}})      on_load(function (package)         local bitwidth = package:config("bitwidth") or "8"         package:add("links", "pcre2-" .. bitwidth)         package:add("defines", "PCRE2_CODE_UNIT_WIDTH=" .. bitwidth)         if not package:config("shared") then             package:add("defines", "PCRE2_STATIC")         end     end)      on_install("macosx", "linux", "mingw", function (package)         local configs = {}         table.insert(configs, "--enable-shared=" .. (package:config("shared") and "yes" or "no"))         table.insert(configs, "--enable-static=" .. (package:config("shared") and "no" or "yes"))         if package:debug() then             table.insert(configs, "--enable-debug")         end         if package:config("pic") ~= false then             table.insert(configs, "--with-pic")         end         if package:config("jit") then             table.insert(configs, "--enable-jit")         end         local bitwidth = package:config("bitwidth") or "8"         if bitwidth ~= "8" then             table.insert(configs, "--disable-pcre2-8")             table.insert(configs, "--enable-pcre2-" .. bitwidth)         end         import("package.tools.autoconf").install(package, configs)     end)      on_test(function (package)         assert(package:has_cfuncs("pcre2_compile", {includes = "pcre2.h"}))     end) 

package.tools.autoconfpackage.tools.cmake 模块都是可以支持 mingw/cross/iphoneos/android 等交叉编译平台和工具链的,xmake 会自动传递对应的工具链进去,用户不需要做任何其他事情。

集成其他构建系统

我们还支持集成 Meson/Scons/Make 等其他构建系统维护的代码库,仅仅只需要导入对应的构建辅助模块,这里就不一一细讲了,我们可以进一步查阅文档:集成本地第三方源码库

改进编译器特性检测

在之前的版本中,我们可以通过 check_features 辅助接口来检测指定的编译器特性,比如:

includes("check_features.lua")  target("test")     set_kind("binary")     add_files("*.c")     add_configfiles("config.h.in")     configvar_check_features("HAS_CONSTEXPR", "cxx_constexpr")     configvar_check_features("HAS_CONSEXPR_AND_STATIC_ASSERT", {"cxx_constexpr", "c_static_assert"}, {languages = "c++11"}) 

config.h.in

${define HAS_CONSTEXPR} ${define HAS_CONSEXPR_AND_STATIC_ASSERT} 

config.h

/* #undef HAS_CONSTEXPR */ #define HAS_CONSEXPR_AND_STATIC_ASSERT 1 

如果当前 cxx_constexpr 特性支持,就会在 config.h 中启用 HAS_CONSTEXPR 宏。

新增 C/C++ 标准支持检测

2.5.8 之后,我们继续新增了对 cstd 和 c++ std 版本检测支持,相关 issues: #1715

例如:

configvar_check_features("HAS_CXX_STD_98", "cxx_std_98") configvar_check_features("HAS_CXX_STD_11", "cxx_std_11", {languages = "c++11"}) configvar_check_features("HAS_CXX_STD_14", "cxx_std_14", {languages = "c++14"}) configvar_check_features("HAS_CXX_STD_17", "cxx_std_17", {languages = "c++17"}) configvar_check_features("HAS_CXX_STD_20", "cxx_std_20", {languages = "c++20"}) configvar_check_features("HAS_C_STD_89", "c_std_89") configvar_check_features("HAS_C_STD_99", "c_std_99") configvar_check_features("HAS_C_STD_11", "c_std_11", {languages = "c11"}) configvar_check_features("HAS_C_STD_17", "c_std_17", {languages = "c17"}) 

新增编译器内置宏检测

我们还能检测编译器存在一些内置的宏定义,比如:__GNUC__ 等,我们可以通过 check_macrosconfigvar_check_macros 辅助脚本来检测它们是否存在。

相关 issues: #1715

-- 检测宏是否定义 configvar_check_macros("HAS_GCC", "__GNUC__") -- 检测宏没有被定义 configvar_check_macros("NO_GCC", "__GNUC__", {defined = false}) -- 检测宏条件 configvar_check_macros("HAS_CXX20", "__cplusplus >= 202002L", {languages = "c++20"}) 

增加对 Qt 4.x 的支持

除了 Qt 5.x 和 6.x,我们对于一些基于 Qt 4.x 的老项目,xmake 也增加了支持。

增加对 Android NDK r23 的支持

由于 google 对 Android NDK 的一些结构改动,导致 r23 影响了 xmake 对 android 项目部分编译特性的支持,在这个版本中,我们也做了修复。

修复 vsxmake 插件 Unicode 编码问题

另外,如果基于 Unicode 作为项目目录,那么生成的 vsxmake 项目会收到影响,导致 vs 项目编译和访问上存在很多问题,我们也在新版本中做了修复。

更新内容

新特性

  • #388: Pascal 语言支持,可以使用 fpc 来编译 free pascal
  • #1682: 添加可选的额 lua5.3 运行时替代 luajit,提供更好的平台兼容性。
  • #1622: 支持 Swig
  • #1714: 支持内置 cmake 等第三方项目的混合编译
  • #1715: 支持探测编译器语言标准特性,并且新增 check_macros 检测接口
  • xmake 支持在 Loongarch 架构上运行

改进

  • #1618: 改进 vala 支持构建动态库和静态库程序
  • 改进 Qt 规则去支持 Qt 4.x
  • 改进 set_symbols("debug") 支持 clang/windows 生成 pdb 文件
  • #1638: 改进合并静态库
  • 改进 on_load/after_load 去支持动态的添加 target deps
  • #1675: 针对 mingw 平台,重命名动态库和导入库文件名后缀
  • #1694: 支持在 set_configvar 中定义一个不带引号的字符串变量
  • 改进对 Android NDK r23 的支持
  • set_languages 新增 c++latestclatest 配置值
  • #1720: 添加 save_scoperestore_scope 去修复 check_xxx 相关接口
  • #1726: 改进 compile_commands 生成器去支持 nvcc

Bugs 修复

  • #1671: 修复安装预编译包后,*.cmake 里面的一些不正确的绝对路径
  • #1689: 修复 vsxmake 插件的 unicode 字符显示和加载问题

C++中根据传入的字符串顺序执行函数

Posted: 08 Oct 2021 04:27 PM PDT

晚上有个沙雕需求,上游请求传过来一个字段,比如是"1;3;2;4;5;6;9;" 那么我按照顺序执行函数 f1(xx),f3(xx),f2(xx)……f9(xx)

伪代码:

exec_vec = phrase_exec_conf(xxxx); for(int i = 0;i < exec_vec.size();i++)     call_func(exec_vec[i]); 

我晚上自己写了下,不优雅,很垃圾,请教下各位在 C/C++中有没有优雅点的实现?

你们的 epic 可以下载吗

Posted: 08 Oct 2021 11:08 AM PDT

看到上线商店版本,兴冲冲卸载、商店下载
所有条件都符合,但是下载就错误,好像提示要更新商店,难道要等商店更新版本吗

Quickemu

Posted: 08 Oct 2021 09:34 AM PDT

一个基于 QEMU 的,可以用于在 Linux 上快速启动和测试虚拟化桌面环境的工具。

https://github.com/wimpysworld/quickemu

google 跟黑色模式刚上了?

Posted: 08 Oct 2021 05:21 AM PDT

安卓 12 快捷设置和时钟都是深色背景,太难看,白天还容易反光看到自己。
不知道谷歌是怎么想的,明亮主题搞个深色背景,还不能设置。

各位 v 友有没有被谷歌搜索中的一些“xx 百科网”困扰过

Posted: 08 Oct 2021 12:44 AM PDT

比如我刚刚搜索"静态方法块什么时候执行",谷歌搜索结果中包含了大量的 XX 百科网、XX 知识网

/************************************************************

静态块什么时候执行 - 小窗百科网 https://www.520shoping.com › 静态块什么时候执行 加入黑名单 15 小时前 — 静态块什么时候执行最新消息,还有 static 静态块什么时候执行,java 静态块什么时候执行,静态方法什么时候执行等内容,父类优先执行注意:静态代码块是 ...

static 静态块什么时候执行_java 静态执行顺序 - 小望知识网 http://zc1024.com › static 静态块什么时候执行 加入黑名单 1 天前 — static 静态块什么时候执行最新消息,还有 java 静态执行顺序,父类访问子类成员变量,java 构造方法执行顺序等内容,{ public static void main ( String ...

静态代码块什么时候执行 - 小杠百科网 https://2587862.com › 静态代码块什么时候执行 加入黑名单 2 天前 — 父类优先执行注意:静态代码块是在 JVM 加载类的时候执行的,而且静态代码块执行且仅执行一次在调用类中的方法时,在方法体执行之前,首先要对类中的成员 ...

static 方法什么时候执行 - 小梭知识网 https://www.shenlisy.com › static 方法什么时候执行 加入黑名单 4 天前 — static 方法什么时候执行最新消息,还有 static 静态块什么时候执行,static 方法什么时候加载,static 代码块什么时候执行等内容,如果题主所说的主方法 ...

************************************************************/

No comments:

Post a Comment