Monday, August 9, 2021

V2EX - 技术

V2EX - 技术


2021 年下半年后端开发求推荐合适的笔记本

Posted: 09 Aug 2021 04:17 AM PDT

当前需求:

  • 主要写后端,偶尔会写前端。并且使用 docker 做开发环境。
  • 不打算用这本子玩游戏,只用来存放和运行工作资料。
  • 屏幕控制在 14 寸以上,因为我要笔记本的目的主要就是公司、租房时工作用,因此需要便携,工作时我打算外接显示器,所以笔记本屏幕不要求大。
  • 预算 9k 左右

备注:

  • 不买二手
  • 想可以扩展内存
  • 不太想买苹果

34 岁程序员, 今天去面试, 还是有点紧张的

Posted: 09 Aug 2021 04:12 AM PDT

34 岁程序员,6 年没有面试过了,今天去面试, 还是有点紧张的

mongo 如何对比一个文档的更改?

Posted: 09 Aug 2021 04:10 AM PDT

各位大佬,mongo 如何对比一个文档改了哪些字端?更改了哪些值?
比如 a = {'name': 'zz', 'age': 18, 'scope': [1,2,3]}
更改为了 a = {'name': 'zzz', 'age': 28, 'scope': [4,5,6]}
如何接口判断到哪个值变换了

Android 保活黑科技

Posted: 09 Aug 2021 03:51 AM PDT

有没有要做 Android App 保活功能的老板和开发者啊,接入我的 sdk,实现 Android 保活,App 就再也杀不死啦,具有永生能力。增加更多运营的可能,实现更多赚钱的机会。
本 sdk 优势:
1 、保活能力优秀,app 杀不死
2 、极端情况下 app 被杀死后可以起死回生
3 、app 可以开机自启 https://www.duiyou360.com/service/detail/202108091027188278669107?utm_source=sharea

为何前端构建工具这么麻烦

Posted: 09 Aug 2021 03:48 AM PDT

被 webpack 整晕的一天。想问问后端构建工具是不是很方便🌚🌚

Go 成功让我实现了人格分裂

Posted: 09 Aug 2021 03:41 AM PDT

从开发者的角度,非常讨厌 Go 语言的语法,极其讨厌,所以至今不愿意去学,也不愿意去用,新项目宁愿守着 java 、kt 。

从使用者的角度,非常喜欢 Go 语言开发的各种软件,非常喜欢,零依赖的一个 binary 太他妈的好用了。

Go 这坨屎真的让我很纠结很矛盾。

各位,请问现在用 elasticsearch 的哪个版本好? 7.x 还是 6.x

Posted: 09 Aug 2021 03:40 AM PDT

如题,随便问下 elasticsearch 文档哪里看比较好,有没有最新版中文的?官网不翻墙的情况下,打开是在太慢了。感谢~

被静默推送了臭名昭著的 Chrome Privacy Sandbox,大家都关了吗?

Posted: 09 Aug 2021 03:29 AM PDT

真的恶心,坐标海外,默默的就给推送然后自动开启了。

美其名曰屏蔽 tracking cookie,实际就是一个官方的后门收集个人爱好然后分享给有合作的广告商。

这个推送是默认开启状态,而且完全没有任何的提示 /通知,Google 这样真的吃相难看。

image.png

求一个 iOS SwiftUI 课程: 哪位能推荐一个用 SwiftUI 做一个抖音 app 这样的课程?

Posted: 09 Aug 2021 03:17 AM PDT

找了一圈,没找到合适的

收费免费都可以

阿里云退款不原路返回也就算了,提现竟然至少要 10 天以上,引以为戒

Posted: 09 Aug 2021 03:14 AM PDT

"指定账号提现原则上也要遵循原路退回,需要您提交相关资料(原付款凭证,销户证明等),小二人工复核后提现到账,预计 10-15 天;"------ 快赶上域名备案的时间了,转人工客服如果是退订类的,连真人都不分配给你,只生成一个工单让你慢慢等

阿里云的网页永远是这么卡,塞了一堆东西,幸好可以退坑了,把能迁移的都迁出去

如何知道自己适合前端开发还是后端开发

Posted: 09 Aug 2021 03:11 AM PDT

在校生,人工智能专业,不过自己对人工智能兴趣不大,还是想做研发岗。比较迷茫以后工作是做前端还是后端,没有项目经历,对于二者没有清晰的认识,希望大家给予一些指导。

异形屏的时代终于要过去了吗?

Posted: 09 Aug 2021 03:03 AM PDT

MIX4 使用了屏下镜头技术,正面是一块完整的屏幕。等到明年应该会有更多的手机使用这一技术吧

搬家后换了个网络 申请了公网 IP, nas 内网穿透得速度居然变慢了,这是为啥,,

Posted: 09 Aug 2021 02:49 AM PDT

用 Go 轻松完成一个 TCC 分布式事务,保姆级教程

Posted: 09 Aug 2021 02:39 AM PDT

什么是 TCC,TCC 是 Try 、Confirm 、Cancel 三个词语的缩写,最早是由 Pat Helland 于 2007 年发表的一篇名为《 Life beyond Distributed Transactions:an Apostate's Opinion 》的论文提出。

TCC 组成

TCC 分为 3 个阶段

  • Try 阶段:尝试执行,完成所有业务检查(一致性), 预留必须业务资源(准隔离性)
  • Confirm 阶段:如果所有分支的 Try 都成功了,则走到 Confirm 阶段。Confirm 真正执行业务,不作任何业务检查,只使用 Try 阶段预留的业务资源
  • Cancel 阶段:如果所有分支的 Try 有一个失败了,则走到 Cancel 阶段。Cancel 释放 Try 阶段预留的业务资源。

TCC 分布式事务里,有 3 个角色,与经典的 XA 分布式事务一样:

  • AP/应用程序,发起全局事务,定义全局事务包含哪些事务分支
  • RM/资源管理器,负责分支事务各项资源的管理
  • TM/事务管理器,负责协调全局事务的正确执行,包括 Confirm,Cancel 的执行,并处理网络异常

如果我们要进行一个类似于银行跨行转账的业务,转出( TransOut )和转入( TransIn )分别在不同的微服务里,一个成功完成的 TCC 事务典型的时序图如下: image.png

TCC 网络异常

TCC 在整个全局事务的过程中,可能发生各类网络异常情况,典型的是空回滚、幂等、悬挂,由于 TCC 的异常情况,和 SAGA 、可靠消息等事务模式有相近的地方,因此我们把所有异常的解决方案统统放在这篇文章《还被分布式事务的网络异常困扰吗?一个函数调用帮你搞定它》进行讲解

TCC 实践

对于前面的跨行转账操作,最简单的做法是,在 Try 阶段调整余额,在 Cancel 阶段反向调整余额,Confirm 阶段则空操作。这么做带来的问题是,如果 A 扣款成功,金额转入 B 失败,最后回滚,把 A 的余额调整为初始值。在这个过程中如果 A 发现自己的余额被扣减了,但是收款方 B 迟迟没有收到余额,那么会对 A 造成困扰。

更好的做法是,Try 阶段冻结 A 转账的金额,Confirm 进行实际的扣款,Cancel 进行资金解冻,这样用户在任何一个阶段,看到的数据都是清晰明了的。

下面我们进行一个 TCC 事务的具体开发

目前可用于 TCC 的开源框架,主要为 Java 语言,其中以 seata 为代表。我们的例子采用 go 语言,使用的分布式事务框架为https://github.com/yedf/dtm,它对分布式事务的支持非常优雅。下面来详细讲解 TCC 的组成

我们首先创建两张表,一张是用户余额表,一张是冻结资金表,建表语句如下:

CREATE TABLE dtm_busi.`user_account` (   `id` int(11) AUTO_INCREMENT PRIMARY KEY,   `user_id` int(11) not NULL UNIQUE ,   `balance` decimal(10,2) NOT NULL DEFAULT '0.00',   `create_time` datetime DEFAULT now(),   `update_time` datetime DEFAULT now() );  CREATE TABLE dtm_busi.`user_account_trading` (   `id` int(11) AUTO_INCREMENT PRIMARY KEY,   `user_id` int(11) not NULL UNIQUE ,   `trading_balance` decimal(10,2) NOT NULL DEFAULT '0.00',   `create_time` datetime DEFAULT now(),   `update_time` datetime DEFAULT now() ); 

trading 表中,trading_balance 记录正在交易的金额。

我们先编写核心代码,冻结 /解冻资金操作,会检查约束 balance+trading_balance >= 0,如果约束不成立,执行失败

func adjustTrading(uid int, amount int) (interface{}, error) {   幂等、悬挂处理   dbr := sdb.Exec("update dtm_busi.user_account_trading t join dtm_busi.user_account a on t.user_id=a.user_id and t.user_id=? set t.trading_balance=t.trading_balance + ? where a.balance + t.trading_balance + ? >= 0", uid, amount, amount)   if dbr.Error == nil && dbr.RowsAffected == 0 { // 如果余额不足,返回错误     return nil, fmt.Errorf("update error, balance not enough")   }   其他情况检查及处理 } 

然后是调整余额

func adjustBalance(uid int, amount int) (ret interface{}, rerr error) {   幂等、悬挂处理   这里略去进行相关的事务处理,包括开启事务,以及在 defer 中处理提交或回滚   // 将原先冻结的资金记录解冻   dbr := db.Exec("update dtm_busi.user_account_trading t join dtm_busi.user_account a on t.user_id=a.user_id and t.user_id=? set t.trading_balance=t.trading_balance + ?", uid, -amount)   if dbr.Error == nil && dbr.RowsAffected == 1 { // 解冻成功     // 调整金额     dbr = db.Exec("update dtm_busi.user_account set balance=balance+? where user_id=?", amount, uid)   }   其他情况检查及处理 } 

下面我们来编写具体的 Try/Confirm/Cancel 的处理函数

RegisterPost(app, "/api/TransInTry", func (c *gin.Context) (interface{}, error) {   return adjustTrading(1, reqFrom(c).Amount) }) RegisterPost(app, "/api/TransInConfirm", func TransInConfirm(c *gin.Context) (interface{}, error) {   return adjustBalance(1, reqFrom(c).Amount) }) RegisterPost(app, "/api/TransInCancel", func TransInCancel(c *gin.Context) (interface{}, error) {   return adjustTrading(1, -reqFrom(c).Amount) })  RegisterPost(app, "/api/TransOutTry", func TransOutTry(c *gin.Context) (interface{}, error) {   return adjustTrading(2, -reqFrom(c).Amount) }) RegisterPost(app, "/api/TransOutConfirm", func TransInConfirm(c *gin.Context) (interface{}, error) {   return adjustBalance(2, -reqFrom(c).Amount) }) RegisterPost(app, "/api/TransOutCancel", func TransInCancel(c *gin.Context) (interface{}, error) {   return adjustTrading(2, reqFrom(c).Amount) })  

到此各个子事务的处理函数已经 OK 了,然后是开启 TCC 事务,进行分支调用

// TccGlobalTransaction 会开启一个全局事务 _, err := dtmcli.TccGlobalTransaction(DtmServer, func(tcc *dtmcli.Tcc) (rerr error) {   // CallBranch 会将事务分支的 Confirm/Cancel 注册到全局事务上,然后直接调用 Try   res1, rerr := tcc.CallBranch(&TransReq{Amount: 30}, host+"/api/TransOutTry", host+"/api/TransOutConfirm", host+"/api/TransOutRevert"   进行错误检查,以及其他逻辑   res2, rerr := tcc.CallBranch(&TransReq{Amount: 30}, host+"/api/TransInTry", host+"/api/TransInConfirm", host+"/api/TransInRevert")   进行错误检查,有任何错误,返回错误,回滚交易   // 如果没有错误,函数正常返回后,全局事务会提交,TM 会调用各个事务分支的 Confirm,完成整个事务 }) 

至此,一个完整的 TCC 分布式事务编写完成。

如果您想要完整运行一个成功的示例,那么按照 dtm 项目的说明搭建好环境之后,运行下面命令运行 tcc 的例子即可

go run app/main.go tcc_barrier

TCC 的回滚

假如银行将金额准备转入用户 2 时,发现用户 2 的账户异常,返回失败,会怎么样?我们修改代码,模拟这种情况:

RegisterPost(app, "/api/TransInTry", func (c *gin.Context) (interface{}, error) {   return gin.H{"dtm_result":"FAILURE"}, nil }) 

这是事务失败交互的时序图 image.png

这个跟成功的 TCC 差别就在于,当某个子事务返回失败后,后续就回滚全局事务,调用各个子事务的 Cancel 操作,保证全局事务全部回滚。

小结

在这篇文章里,我们介绍了 TCC 的理论知识,也通过一个例子,完整给出了编写一个 TCC 事务的过程,涵盖了正常成功完成,以及成功回滚的情况。相信读者通过这边文章,对 TCC 已经有了深入的理解。

关于分布式事务中需要处理的幂等、悬挂、空补偿,请参考另一篇文章:分布式事务你不能不知的坑,一个函数调用帮你搞定它

关于分布式事务更多更全面的知识,请参考分布式事务最经典的七种解决方案

文中使用的例子节选自yedf/dtm,支持多种事务模式:TCC 、SAGA 、XA 、事务消息 跨语言支持,已支持 golang 、python 、PHP 、nodejs 等语言的客户端。提供子事务屏障功能,优雅解决幂等、悬挂、空补偿等问题。 ​ 阅读完此篇干货,欢迎大家访问https://github.com/yedf/dtm项目,给颗星星支持!

培训机构 以阿里之名 剽窃我 Android 文章

Posted: 09 Aug 2021 02:31 AM PDT

某培训机构,未经授权,私自剽窃我 Android 文章的前言,在其基础上添加 "阿里" 两字,用作公众号软文,

我已和涉事文案人员沟通,但目前未得到正面回应,先在此留个标记,

此外如对 "业务架构"、"Android 基础进阶" 感兴趣,大可自行爬坑、查阅官网、运行 GitHub 热门项目的方式来学习掌握,任何教程都无法代替自己亲自走一遍。

请问一下大家有没有推荐的 go markdown 相关转换库

Posted: 09 Aug 2021 01:23 AM PDT

如题,需求是将一段普通的文本按照样式生成 markdown 语法的文本,涉及标题大小、字体颜色、插入链接和表格绘制等操作。本来打算自己封装一下就好,但是要画表格感觉工作量突增了。。自行搜索了一下没发现相关的工具(可能是我姿势不对),想问问各位 V 友有没有推荐的呢,非常感谢:)

请问哪里有网闸程序源码?

Posted: 09 Aug 2021 12:57 AM PDT

最近公司要搞一个网闸程序, 在网上搜了很多只有网闸的方案介绍,

很少有网闸程序,

想问下各位大佬, 哪里有网闸程序源码可以供参考的, 谢谢!

用 goframe 框架的朋友们,后台你们都用什么框架呢?

Posted: 09 Aug 2021 12:45 AM PDT

github 上好像就一个 gf-vue-admin,有人用过吗?怎么样?我自己用过他的 gin-vue-admin 还行。
难道都是用 element admin 自己写权限系统吗?

HTML5 网页录音开源库,小巧功能丰富,欢迎把玩��

Posted: 09 Aug 2021 12:41 AM PDT

得益于 WebRTC 的标准化推进,今年越来越多的浏览器已经能够进行 H5 录音。

去年折腾的要死的各种国产套壳浏览器今年已经有了非常大的改善,包括折腾到吐的 iOS 也已经不那么傲娇了终于放开了 App 里面的限制,基本上只要升级了浏览器或系统就能使用 H5 的录音功能。

开源库: https://github.com/xiangyuecn/Recorder

测试: https://xiangyuecn.gitee.io/recorder/

这个库是很久以前写的一个网页版录音插件,经过几年的优化更新、功能添加,现在算是一个比较完整好用的 H5 录音开源解决方案了。


目前已经提供了:mp3 、wav 、pcm 、ogg 、webm 、amr 录音格式的支持,当前最新的 wav 格式录音的 js min 文件 9.73kb,小巧精致,mp3 的 js 文件 153kb (理论上只要能提供编码器,任何音频格式都能很方便的进行扩展支持)

库里面带有丰富的扩展功能插件,包括好几个音频可视化插件、变速变调处理、还带了一个 DTMF 编码解码插件。

支持实时处理,可以做到边录音边处理、边录音边上传;除了可以实时处理麦克风录制的音频流外,其他的音频流均能处理,包括但不限于:getUserMedia 返回的流、WebRTC 中的 remote 流、audio 、video 标签的 captureStream 方法返回的流、自己创建的流 等等;另外提供了对音频数据的实时播放功能。


在线测试>>

编写代码运行>>

发现群晖 dsm7.0 的 photo,无论是 web 版还是 app 版,均不支持杜比视界的视频播放

Posted: 09 Aug 2021 12:32 AM PDT

具体效果是跳帧+花屏。但很奇怪的是个别的杜比视界的视频并不花屏。

这导致 iphone 12 pro max 拍摄的视频不能通过 photo 在自身、ipad 、pc 等设备回放(用视频播放器、或 IOS 自带的"照片"应用可以)

不知道各位有没有什么在保留杜比视界规格的前提下,改进体验的方法。

Golang 写桌面 GUI 应用的体验

Posted: 08 Aug 2021 11:41 PM PDT

之前闲着无事,用 Go 的一个开源 GUI 库 fyne 撸了一个小工具,就是一个通过抓取虎牙直播源地址,并且调用本地的播放器比如 MPV 看直播的东西。

刚开始,觉得 Go 写 GUI 还挺有意思,但是写着写着发现想实现一个稍微复杂的 UI 和交互,真的很难。。。fyne 这个库本身的自带的组件功能很少,简单东西可以搞一搞,稍微复杂点无能为力了。

后来又去看了看一个 QT 绑定库 therecipe/qt,以前没用过 qt,发现这个库贼难用,一个方法点进去连注释都没有,全是 rpc 调用,我都看懵了,找了下 QT 的文档,全是 C++的写法,和这个库的调用又不是完全一样的,折腾了一下,看了那一些 example,又是 QML 啥的,搞蒙了,总结就是发现没法用,除非你以前就会 QT 这一套东西另说。

总结,Go 在开发桌面 GUI 应用这块依然是个玩具,自娱自乐玩一玩可以。。。桌面原生 GUI 开发还得看 C++啊

windows10/11 怎么让文件资源管理器里能按所有文件/文件夹混合排序,而不是文件和文件夹单独排序?

Posted: 08 Aug 2021 10:58 PM PDT

请问大佬,国内人工智能在专业领域应用如何?

Posted: 08 Aug 2021 10:38 PM PDT

前段时间看到,美国通过 AI (一张 3080 显卡),预测蛋白质结构,在效率和能效上比传统方法高 5 个数量级,太可怕了吧
积极的想,这个运用到制药,疫苗等领域,社会效益,经济效益肯定很大。
悲观的想,这个运用到军事领域,设计一种专门的病毒,针对特定人种,也不是不可能 。

国内这方面,我看到的最多新闻就是自动驾驶,语言翻译,老片重置这方面民用的应用.
请问有将 AI 运用到传统专业领域的例子吗, 比如腾讯的凡人修仙传动画,里面人物很多都是一个模型,外观脸型已知,配音口型这些就不谈了,AI 在这方面应该能有作为吧
腾讯也是 AI 大厂,如果花点心思在这方面,让 AI 更多贡献于产业,而不是用来发专利发测试炫技。


这方面中美哪个领先?

[开源] 基于微信机器人的 ToDoList

Posted: 08 Aug 2021 09:59 PM PDT

我是一个很懒的人, 基本不维护任何笔记。一直用一个在线文档(最近是 flomo )存放 ToDoList,需要查看的时候打开。 打开频率基本看心情, 隔断时间没维护就另起一份新的 ToDoList 。不知道大家是用什么办法维护自己的 ToDoList 。

PushTodo 基于微信机器人每天推送 ToDoList 到个人微信上, 确保我这种懒人每天都能看一下 ToDoList 。

目前功能比较简单, 就是一个文本框。 每日 0 点推送

ROADMAP

  1. 支持 todo.txt 语法
  2. 可视化操作
  3. 群聊(团队) ToDoList
  4. 自定义推送时间

欢迎体验和提意见。

项目开源地址 https://github.com/tans/push-todo

多列表格的数据结构设计

Posted: 08 Aug 2021 08:50 PM PDT

现有一表格,4 列,要能通过前三列找到对应第 4 列的值。应该如何设计数据结构? 4 列都为 int 型

构建指北 #10 Android 开发工具兼容性/版本搭配

Posted: 08 Aug 2021 08:15 PM PDT

『构建指北』是探索 Android 构建相关的一系列文章,涵盖了 Gradle 、Android Gradle Plugin 、Kotlin Script 等工具,以及相关架构上的应用。

由于几个月前电脑 CPU 烧了,被迫换了 M1 的 Mac Mini,所以整个开发环境重新搭建了一遍。趁这个机会,我想整理几个基础工具的版本搭配策略、兼容性、以及在 M1 芯片上的表现。对于版本搭配和兼容性的一些讨论不局限于当前使用的版本和平台。

下方提及的版本分别是:

  • Zulu JDK: 11.0.11
  • Kotlin: 1.5.21
  • Gradle: 7.1.1
  • Android Gradle Plugin ( AGP ): 7.0 & 7.1
  • Android Studio: Arctic Fox 2020.3.1 & BumbleBee 2021.1.1 Canary 6

JDK

自 AGP 7.0 起,JDK 11 便是最低要求。JDK 11 成为 LTS ( Long-term Support) 版本已经有将近 3 年历史( Sep 2018 ),自身经历了 12 个小版本( 11.0.12 )的迭代目前相对成熟了。作为对比,上一个 LTS 的 JDK 8 2014 年发布,已经陪着我们走过了 7 年时光和 300 个小版本迭代。事实上作为 Android 开发者,即便目前项目是 Java 为主的情况,一般 Language Level 也仅 target to 1.8 (一些 9-12 的特性 D8 、R8 有支持,Android 11 12 也有融入)。Android 官方虽然说不会放弃 Java,但实际上对 Kotlin 的支持确实更给力。

从这个角度来看,JDK 11 带来给我们的更多是:

  • Kotlin Compiler 、Gradle 、IDE 层面上性能的升级;
  • JDK 8 将停止维护的情况下( 3 年后),安全层面的持续保障;
  • 适应新的发布机制,每半年一个小版本,三年一个 LTS 大版本,减少历史包袱跑得更快;

而 JDK 的升级策略我认为是:

  • 保守派:如果不在意新语言特性,可以等每年 AGP 升级的情况来决定 JDK 的版本,因为 IDE 一般 bundle 了一个 JDK,Kotlin 编译器、Gradle 一直追着最新 JDK 并有不错的向下兼容——所以根据木桶原理等 AGP 升级了再升即可,目前看来 AGP 可能也只跟进比较稳定的 LTS 版本;
  • 激进派:Gradle 支持后即可测试;

在 M1 Mac 上,由于 Oracle 还未有的 ARM64 版本,所以目前主流的做法是安装 Azul 维护的 Zulu JDK11

需要注意的是,常用的 JDK 管理工具 SDKMAN! 在我的测试中依旧跑在 Rosetta 2 的转译环境中。这会造成即便你是安装的 Zulu JDK11,通过 SDKMAN! 的脚本启动依然会显示 Gradle java 的进程跑在 Intel ABI 下。故目前建议从官网下载安装,等后续配套工具支持后再考虑切换。

Kotlin

Kotlin 的版本搭配限制相对不多,一般我考虑三个点:

  • 有没有特别吸引人的新功能,比如刚放出稳定版的 Coroutine 、Flow,或者新版本 Kotlin Multiplatform Mobile 的更好支持等;
  • 用不用大迭代的第一个版本,例如观察刚发布时的 1.4.01.5.0,这条其实广泛适用于各类 Library ;
  • Gradle 目前 bundle/test 的 Kotlin 的版本,例如最新的 7.1.1 stable 依旧是用的 1.4.31 的 Kotlin ( 7.2 RC 则跳到 1.5.21 了);

关于最后一点,如果使用的 Kotlin 版本和 Gradle bundle 的不一致,会出现如下 Warning:

w: Runtime JAR files in the classpath should have the same version. >These files were found in the classpath: ... /Users/2bab/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk7/1.4.31/84ce8e85f6e84270b2b501d44e9f0ba6ff64fa71/kotlin-stdlib-jdk7-1.4.31.jar (version 1.4) /Users/2bab/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.5.21/2f537cad7e9eeb9da73738c8812e1e4cf9b62e4e/kotlin-stdlib-1.5.21.jar (version 1.5) /Users/2bab/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.5.21/cc8bf3586fd2ebcf234058b9440bb406e62dfacb/kotlin-stdlib-common-1.5.21.jar (version 1.5) w: Consider providing an explicit dependency on kotlin-reflect 1.5 to prevent strange errors w: Some runtime JAR files in the classpath have an incompatible version. Consider removing them from the

用一个简单的例子看下问题是怎么发生的:

plugins {     id("com.android.application")     // 没有指定版本,用的就是 Gradle bundle 的版本,     // Gradle 7.1.1 对应的就是 Kotlin 1.4.31 的各种类库和编译工具     kotlin("android")  }  dependencies {     // 而这里我们却用了 1.5.21 的最新版 Kotlin,就会出现如上问题     implementation("org.jetbrains.kotlin:kotlin-stdlib:1.5.21") } 

解决起来也很简单:

plugins {     id("com.android.application")     // 手动指定版本     kotlin("android") version "1.5.21" } 

Kotlin 官方的文档直接就演示了加版本号的写法。但是,这个版本是 Kotlin 基于 Gradle 测试通过,而 Gradle 自身还没有基于它测试过并打包进去(见 Gradle 部分的配图),若出现了问题可能难以解决

所以我推荐的升级策略是:

  • 保守派:等 Gradle 升级的时候再升级,例如 1.5.0 到 1.5.21 中间仅隔了两个月,Gradle 就跟进了;
  • 激进派:有实用的新功能或者大版本迭代后的第一个补丁版本就升。

Gradle

前面提到 Kotlin 的官方文档解释了各类和 Gradle 配合兼容的情况,反过来 Gradle 这边也有一个标明了 Java 、Kotlin 、Android 等各语言和平台的支持文档

像前面提到的 Java 版本支持,Kotlin 版本支持在这里便一目了然。除了 Kotlin 的支持会稍落后一两个月,其他工具的最新版本兼容都不成问题。而 Gradle 自身的向下兼容我觉得还不错,我基本上每个版本都升级。而上层的 AGP DSL,特别是老版本,则挺经常有大改动(好在 7.0 后终于强多了)。

所以我推荐的升级策略是:

  • 保守派:根据 AGP 的文档按最低版本进行升级(详见下图),例如 AGP 4.2.0+ 对应 Gradle 6.7.1+;
  • 激进派:每个补丁版本(x.y.1/2/3)或者每个版本都升( Gradle 没有 -betaX 的版本习惯,一般就是 Nightly 和 RC )。

另外,Gradle 7.0 后的版本原生支持了 M1,我个人的使用体验还不错。

Android Gradle Plugin

AGP 的版本搭配限制我们在前面基本都介绍完了,以 7.0 为例,我们来看官方 Release Note 的兼容说明:

额外补充一点:从 AGP 7.0 起,其版本会同步 Gradle 的 major 版本,严格遵守 Semantic Versioning 体系(之前同步的是 AS 的版本)。也即 AGP 7.x 会适配 Gradle 7.x 的版本。不过 AGP 的发布时间依旧是随着 AS 一起发布,并且目前来看其 alpha/beta 的数字是跟随 AS 的,所以其实可以当成三者形成了某种默契的同步机制。

所以我推荐的升级策略是:

  • 保守派:随 AS 正式版升级(或适当跳过第一个大版本更迭);
  • 激进派:每个版本都升,或从 alpha/beta 开始升级,例如要做 Gradle 插件适配。

Android Studio

AS 基本上没有什么搭配限制,只要你用的之前正式版的 AGP,AS 就可以向下兼容。我推荐的升级策略是:

  • 保守派:适当跳过第一个大版本更迭;
  • 激进派:每个版本都升,或从 alpha/beta 开始升级,例如要做 IDE 插件适配或者对 Compose 、调试工具新功能等有需求的。

另外,由于 AS 基于的 IDEA 社区版二次开发,整体稳定性、新特性支持的速度都不如 IDEA Ultimate,例如 Gradle 的 nesting Composite Build 目前就不在 AS 支持范围,见该 issue

最后,自 Arctic Fox 2020.3.1 起,AS 原生支持了 M1,但如果想有更流畅的体验,我认为 BumbleBee 2021.1.1 Canary 效果更好一些。

IDEA

IDEA 的主要搭配限制来自于 Android Plugin ( Android IDE 插件)的版本适配。一般来说,在 AS 新的正式版本发布之后,下一个 IDEA 的正式版本就会带上该新版插件,从而对 Android 开发包括 AGP 做支持。

偶尔也有等比较久的时候,比如今年 AS&AGP 4.2 在 4 月发布,而直到 7 月 IDEA 2021.2 发布时,才更新了 Android Plugin,官方的说法是 Google 放出 AGP 4.2 的源码时间晚了些,导致没赶上 2021.1 的版本。

我推荐的升级策略是:

  • 保守派:仅升级正式版本;
  • 激进派:从 EAP 或 RC 开始升级,例如会获得比较好的 Kotlin 支持、更早的 AGP 支持,以及 M1 平台的优化等。

最后,2021.2 也是让我在 M1 感觉终于不再有什么卡顿的版本了。

总结

我自己由于使用 M1 的平台 + 适配一些 Gradle Plugin,经常会使用 beta 甚至 alpha 的 AGP (作为 Runtime 的 library ),配合最新的 IDEA Ultimate 开发起来还是挺顺手。

而公司项目,现阶段 x86 平台我觉得可以使用如下配置,ARM M1 则根据上文调整对应的工具版本:

  • JDK 11 (由于 AGP 升了迟早要升级)
  • Gradle 7.1.1 ( 7.2 支持 1.5.21 后可以升级)
  • Kotlin 1.4.31
  • AGP 4.2.2 ( 7.0 稳定了新版的 Variant API,马上 7.1 也稳定新版的 DSL,不需要 Compose 的话可以观望观望)
  • AS 4.2.2 (不需要 Compose 的话可以观望观望)
  • IDEA 2021.2

(欢迎订阅"Android 高效开发"↑)

之前看 v 友的帖子,本想证明 centos 比 freebsd 弱不了多少,没想到引出 ubuntu server 20.04 成为黑马

Posted: 08 Aug 2021 06:46 PM PDT

之前的 v 友的帖子: https://v2ex.com/t/782948

本想证明 centos 没有那么弱,是不是测试的配置有问题。周末花了 2 天自己测试,最后发现 freebsd13 强者如斯,同时 ubuntu server 20.04 黑马杀出,或者是 debian11 的功劳?

压测的系统:freebsd13, ubuntu20.04, debian10, centos 8 stream, rocky linux 8

特定领域算法从业人员的前景

Posted: 08 Aug 2021 03:13 PM PDT

比如现在研究计算机视觉的人非常多。如果以后这方面的需求减少,该领域的从业人员怎么办呢?

IT 历史上有没有类似的经验呢?

我要读研了,想到这个问题情绪就比较低落。(我不是做计算机视觉的)

大佬们,快来帮帮我看一下我设备是不是被黑了,人在外地设备在家里,现在慌的一笔 没见过这种场面

Posted: 08 Aug 2021 03:08 PM PDT

电脑大概开了一个星期了 没关机,偶尔要远程回家里,开机的设备是 mac 和 win,win 用的是虚拟机

映射了一个外网端口 3899 默认端口到 win 虚拟机,今天下午突然显示 win 被锁了。用的是这个软件: https://www.appinn.com/clearlock/

然后我赶紧远程我的 mac 显示电脑密码不正确,

能做到只通过网络修改 mac 的开机密码吗?现在 win 虚拟机和 mac 在同一个内网。

刚刚试了一下我的 openwrt 密码也错误了,可是我的 openwrt 弄的比较复杂的密码,有特俗符号大小写和数字。并且没有记住过密码,至少在 mac 上没有,win 虚拟机不记得有没有了

现在我人回不去家里 慌的一笔。怎么办啊

收到了有关 Google Plus 集体诉讼的赔偿款

Posted: 08 Aug 2021 11:41 AM PDT

去年 8 月收到了 Google Plus 集体诉讼和解相关的 Email,就随手填了一个表提交了,没想到真的收到了 2.15 刀。我差点都忘了还有这回事了。

企业微信后台这个静默下载的是什么啊?

Posted: 08 Aug 2021 09:12 AM PDT

监控网速发现的,掐表测试了两次,企业微信登录十分钟之后会准时开始下载,前十分钟不会下载

家里 200M 的宽带,这个带宽只占到 500k 左右,基本上是无感的

手动观测网速,有明显的内部限速迹象(刚开始下载达到 2M 以上,迅速降低至 500k 上下)

结合之前 QQ 微信也是登录十分钟后扫描历史浏览记录,总是感觉企业微信也不是什么好鸟

看资源管理器还是调用的 system 写的

看着像是小程序相关的?也不知道除了静默下载有没有其他的动作

No comments:

Post a Comment