Monday, August 16, 2021

V2EX - 技术

V2EX - 技术


redis 怎样读回已过期的数据?

Posted: 16 Aug 2021 04:18 AM PDT

现在做一个需求,某个数据量比较大而且存在频繁读写,所以我想放到 redis 里面,但这样又怕太占内存,所以我想过期时间设定 2 小时,要用的时候再读回来. 现在的问题是这个"读回来"怎么实现,要么是 redis 本身就有相应的机制,要么在数据将要过期时写入数据库,但目前搜索了半天都没看到有相关的用法,是不是我这种用法本身不对呢?有没有更好的解决办法?

各位不加班的时候会习惯性熬夜吗?我打算改掉这个习惯, 11 点半之前要上床睡觉

Posted: 16 Aug 2021 04:16 AM PDT

好像程序员都有这个通病,我最近几年都是凌晨一点多才睡,然后前段时间体检发现血压偏高了,最近打算下定决心 11 点半之前要睡。

开源一款淘宝客项目,支持打包成 App、微信小程序、QQ 小程序、Web 站点

Posted: 16 Aug 2021 03:57 AM PDT

项目地址:https://github.com/silently9527/coupons

从前端到后端完全开源的淘宝客项目 Coupons

目前项目已经支持打包成 App 、微信小程序、QQ 小程序、Web 站点;理论上其他小程序支持,可能需要微调

觉得还不错的朋友记得 star 哦

已实现的功能列表

  • 推荐穿衣搭配
  • 搭配筛选
  • 搭配详情
  • 相关搭配推荐
  • 用户点赞
  • 商品分类
  • 分类查询商品列表
  • 首页轮播
  • APP 、Web 支持唤醒淘宝
  • 9.9 包邮
  • 疯抢排行榜
  • 首页优质商品推荐
  • 商品、优惠券搜索
  • 商品详情
  • 相似商品推荐
  • 商品收藏、收藏夹
  • 口令购买、领券购买
  • 用户登录、微信登录、QQ 登录、手机验证码登录
  • 用户新手教程

效果预览

代码优雅实现讨论

Posted: 16 Aug 2021 03:57 AM PDT

RT, Java 代码,一个方法中,逻辑特别多,于是把里面逻辑封装成了几个单独方法,但是也有七八个单独方法,看起来也有点难受:

 fun() {      fun1(); // 数据初始化          // 这里有几行代码,处理特殊逻辑          fun2();          fun3(); // 调用第三方          fun4();          // 这里有打印日志          fun5(); // 缓存处理          fun6();          // 这里有一些代码,做对象转换等          fun7();          // 打印日志等          fun8(); // 缓存处理          return xxx;     } 

感觉还是在面向过程去写,有点难受看着,但是有没有优化思路,或者优秀代码参考。

手机百度、夸克浏览器播放网页视频,播放器会被浏览器的内置浏览器拦截

Posted: 16 Aug 2021 03:53 AM PDT

使用手机百度、夸克浏览器播放网页视频,播放器会被内置播放器的拦截;但是浏览 b 站的移动端网页播放视频,发现并没有被拦截;看了网页的代码也是普通的 video 标签,并没有什么特殊之处,有 v 友知道相关解决问题的吗

终于知道我的职业是什么了!新生代农民工!

Posted: 16 Aug 2021 03:47 AM PDT

中了 crpytowall 勒索病毒

Posted: 16 Aug 2021 03:24 AM PDT

周末没关机,周一一来就这样了,还好没有什么重要资料,电脑里没装什么奇奇怪怪的程序。不知道是不是和开了远程桌面端口 3389 连了腾讯云主机的 frp 有关系

Regular Expression 为何会翻译成正则表达式,而不是规则表达式

Posted: 16 Aug 2021 03:20 AM PDT

一直对正则二字的含义不理解,所以去查了下,原来是古汉语词汇,意为:常规,规则

以下是百度百科的引用

正则是一个汉语词汇,拼音为 zhèng zé,基本意思是正其礼仪法则;正规;常规;正宗等。出自《楚辞·离骚》、《插图本中国文学史》、《东京赋》等文献。

那么为什么当初不翻译成更加浅显易懂的规则表达式呢?

想过两年出国卷,现在有什么努力的方向吗

Posted: 16 Aug 2021 03:04 AM PDT

要学习英语还是怎么说,需要先考雅思之类的吗

对远程帧缓冲协议 RFB 的解析

Posted: 16 Aug 2021 02:55 AM PDT

RFB (Remote Framebuffer Protocol) 远程帧缓冲协议,是一种允许用户通过网络连接控制远端计算机的七层网络协议。 在 RFB 协议中,用户通过本地鼠标、键盘输入,经由远端计算机计算后,将图形用户界面( GUI )回传本地进行输出。

撸了 gitbook,请大家移步观看 https://rfb.vincentcui.cn/

SpringSecurity 我怕了

Posted: 16 Aug 2021 02:47 AM PDT

最近项目用了 security 需要对接钉钉和企业微信的登录,看了下官方文档,在 5.2 之前需要引入一个 oauth 包,后面 5.2 需要引 ouah2-client 包,开开心心的引入了,才知道噩梦才开始
官方自带的配置文件使用 client_id 字段作为默认 appKey,但钉钉叫 appid 、、、需要单独配置一个 resolver 去替换
换好了,发起授权正常,轮到回调 code 了,默认的直接是直接把 code 码 post 到指定的网址,结果钉钉也不一样,需要签名,然后又配置一个 converter,
我现在犹如吃了屎一样难受,我直接自己写个应该已经好了也不至于浪费一天时间

总结一句话,如果要对接 oauth2,请直接避开官方提供的代码,直接手撸

config

有前端友友知道这种 markdown 内容与目录同步是怎样实现的吗

Posted: 16 Aug 2021 02:41 AM PDT

就是类似于这种 图片

OPPO 手机真机调试 instant run,每次必须重新安装

Posted: 16 Aug 2021 02:30 AM PDT

OPPO 手机真机调试每次必须重新安装 r11s 安卓 9 的系统

分享一个 Safari 与其它浏览器书签同步的方案

Posted: 16 Aug 2021 02:29 AM PDT

适用群体:习惯 MAC 、iOS 、iPadOS 使用 Safari,Win 使用 Chrome 。

其实 apple 提供了 icloud 和 chrome 可以同步的插件,这个大家都知道,但目前有几个问题:

  1. 只能在 windows 上同步,无法做到在没有使用 windows 时实时同步;
  2. 如果有多台 windows 使用这个插件,一定会出现书签重复等各种问题;

解决方案:

1. 买一台 Win 小主机(有 NAS 可虚拟机,一定要使用 win7 以上的正式版,不用使用什么服务器版、THIN 版,否则装不上 iCloud 。),成本二三百左右,为了稳定服务,我选择了小主机。 2. 给该 windows 配置 google 访问权限; 3. 下载 icloud 及同步插件,配置同步。  

这样就相当于配置了一台服务器,把同步的问题放在一台机器上,其它机器都使用原生同步方案。已经稳定使用多年,除了 windows 死机几次,目前没出现过任何问题。

[开源] 一款图片编辑器

Posted: 16 Aug 2021 02:01 AM PDT

FastImageEditor 是一款图片编辑器,采用 React + Typescript + React-knova 框架开发

地址: https://github.com/jiechud/taro-mall
体验地址: http://39.97.252.98:3000/

如果觉得不错。路过的 V 友给个 star 吧

千万不要手贱升级 Firefox 91 版, Proton 禁用也无法换回原来的 Tab 栏了。

Posted: 16 Aug 2021 01:23 AM PDT

Proton 目前个人感觉很耗资源,禁用后速度有明显提升,而且 Proton 的 Tab 占据太多空间,以前很多基于 Firefox 的 UI 测试直接无法运行。

Firefox 91 之前的版本,包括默认启用 Proton 的 Firefox 90 版本,都可以在 about:config 里面 disable 掉 Proton,从而恢复成原来紧凑的模式,如下图所示:

更新到 91 版之后,即使是 disable 掉了 Proton,紧凑的 Tab 栏也回不去了,如下图所示:

目前在网上找了一圈,github 上有个 Firefox UI 用自定义的方式实现了类似的风格,但是是在启用 Proton 的条件下(原文没仔细看,好象是利用 Proton 能自定义界面的特性实现的),跟以前紧凑的风格明显不一样,而且能感觉明显卡顿。网址: https://github.com/black7375/Firefox-UI-Fix 显示风格如下:

JAXB 怎么实现带泛型 XML 转 Bean。

Posted: 16 Aug 2021 01:12 AM PDT

  • 转换的 xml 格式*(其中 DataTable 节点下 a 、b 字段是 X 类,c 、d 字段是 Y 类的,后续还需要适配更多类)
<?xml version="1.0" encoding="GB2312"?> <DocumentElement>   <Result>0</Result>   <Error></Error>   <DataTable>       <a>/<a>       <b>/<b>   </DataTable>   <DataTable>       <a>/<a>       <b>/<b>   </DataTable> </DocumentElement> <!--------------------------或者--------------------------> <?xml version="1.0" encoding="GB2312"?> <DocumentElement>   <Result>0</Result>   <Error></Error>   <DataTable>       <c>/<c>       <d>/<d>   </DataTable>   <DataTable>       <c>/<c>       <d>/<d>   </DataTable> </DocumentElement> 
  • 目的 bean
@XmlRootElement(name = "DocumentElement") @XmlSeeAlso({X.class, Y.class}) @XmlAccessorType(XmlAccessType.FIELD) public class ResponseEntity <T> {      @XmlElement(name = "Result")     private String result;     @XmlElement(name = "Error")     private String error;     @XmlAnyElement(lax = true)     private List<T> dataTable;      public ResponseEntity() {      }     // getter/setter 省略 } 
  • X 类
@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class X {     private String a;     private String b; } 
  • Y 类
@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Y {     private String c;     private String d; } 
  • 转换方法
        //获得 JAXBContext 类的新实例。参数为类的地址         JAXBContext context = JAXBContext.newInstance(t.getClass());         //创建一个可以用来将 XML 数据转换为 java 内容树的 Unmarshaller 对象。         Unmarshaller um = context.createUnmarshaller();         //创建一个 StringReader 将 xml 报文转成流         StringReader sr = new StringReader(xml);         //调用 unmarshal 进行转换,并把 Object 类型强转为调用者的类型         t = (T) um.unmarshal(sr);         //将对象返回给调用者         return t; 

目前的问题

  • 如果 X 、Y 类 @XmlRootElement 不加 name = "DataTable",转换后的 Bean 的 list 为空
  • 如果 X 、Y 类 @XmlRootElement 其中一个类加 name = "DataTable",转换后的 Bean 的 list 类型内容一直都是那个类
  • 如果 X 、Y 类 @XmlRootElement 都加 name = "DataTable",转换后的 Bean 的 list 类型会不匹配(猜测 java 泛型在编译时类型被擦去, 反射不能确定具体那个类,参考[当 Jaxb 遇到泛型]: https://www.cnblogs.com/mumuxinfei/p/8948299.html)

不知道各位有没有遇到过或提供一下解决思路。不胜感激

安卓下视频压缩和转换格式的问题

Posted: 15 Aug 2021 10:32 PM PDT

安卓下调用 ffmpeg 来压缩视频,转换视频格式。
而 ios 下使用自带的 API 来达到同样效果。
30 s 视频,安卓基本需要 30 s 来完成,
而 ios 只需要 3 秒不到。

有什么办法可以提高安卓下的速度?

laravel 的图片加水印功能有问题

Posted: 15 Aug 2021 09:00 PM PDT

尝试使用 laravel intervention/image

给图片加水印有问题。

只要水印超过 50%的原图面积或按原图大小进行覆盖,加出来的图片一定黑掉一半。

哪位有遇到该问题?

请教一个问题, arm 架构下 64 位操作系统, Java 如何进行串口通信

Posted: 15 Aug 2021 08:12 PM PDT

  • 树莓派 4 装了 64 位 ubuntu,然后 pi4j 的动态库好像只支持 32 位
  • 有成功实践的朋友分享下经验不,感谢

线上的分布式事务是什么样的?以 Python 的 saga 为例

Posted: 15 Aug 2021 04:32 PM PDT

银行跨行转账业务是一个典型分布式事务场景,假设 A 需要跨行转账给 B,那么就涉及两个银行的数据,无法通过一个数据库的本地事务保证转账的 ACID,只能够通过分布式事务来解决。

分布式事务

分布式事务在分布式环境下,为了满足可用性、性能与降级服务的需要,降低一致性与隔离性的要求,一方面遵循 BASE 理论:

  • 基本业务可用性( Basic Availability )
  • 柔性状态( Soft state )
  • 最终一致性( Eventual consistency )

另一方面,分布式事务也部分遵循 ACID 规范:

  • 原子性:严格遵循
  • 一致性:事务完成后的一致性严格遵循;事务中的一致性可适当放宽
  • 隔离性:并行事务间不可影响;事务中间结果可见性允许安全放宽
  • 持久性:严格遵循

SAGA

Saga 是这一篇数据库论文SAGAS提到的一个分布式事务方案。其核心思想是将长事务拆分为多个本地短事务,由 Saga 事务协调器协调,如果各个本地事务成功完成那就正常完成,如果某个步骤失败,则根据相反顺序一次调用补偿操作。

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

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

  • AP/应用程序,发起全局事务,定义全局事务包含哪些事务分支
  • RM/资源管理器,负责分支事务各项资源的管理
  • TM/事务管理器,负责协调全局事务的正确执行,包括 SAGA 正向 /逆向操作的执行

下面看一个成功完成的 SAGA 时序图,就很容易理解 SAGA 分布式事务:

image.png

SAGA 实践

对于我们要进行的银行转账的例子,我们将在正向操作中,进行转入转出,在补偿操作中,做相反的调整。

首先我们创建账户余额表:

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() );  

我们先编写核心业务代码,调整用户的账户余额

def saga_adjust_balance(cursor, uid, amount):   affected = utils.sqlexec(cursor, "update dtm_busi.user_account set balance=balance+%d where user_id=%d and balance >= -%d" %(amount, uid, amount))   if affected == 0:     raise Exception("update error, balance not enough") 

下面我们来编写具体的正向操作 /补偿操作的处理函数

@app.post("/api/TransOutSaga") def trans_out_saga():   saga_adjust_balance(c, out_uid, -30)   return {"dtm_result": "SUCCESS"}  @app.post("/api/TransOutCompensate") def trans_out_compensate():   saga_adjust_balance(c, out_uid, 30)   return {"dtm_result": "SUCCESS"}  @app.post("/api/TransInSaga") def trans_in_saga():   saga_adjust_balance(c, in_uid, 30)   return {"dtm_result": "SUCCESS"}  @app.post("/api/TransInCompensate") def trans_in_compensate():   saga_adjust_balance(c, in_uid, -30)   return {"dtm_result": "SUCCESS"}  

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

# 这是 dtm 服务地址 dtm = "http://localhost:8080/api/dtmsvr" # 这是业务微服务地址 svc = "http://localhost:5000/api"      req = {"amount": 30}     s = saga.Saga(dtm, utils.gen_gid(dtm))     s.add(req, svc + "/TransOutSaga", svc + "/TransOutCompensate")     s.add(req, svc + "/TransInSaga", svc + "/TransInCompensate")     s.submit() 

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

如果您想要完整运行一个成功的示例,那么参考这个例子yedf/dtmcli-py-sample,将它运行起来非常简单

# 部署启动 dtm # 需要 docker 版本 18 以上 git clone https://github.com/yedf/dtm cd dtm docker-compose up  # 另起一个命令行 git clone https://github.com/yedf/dtmcli-py-sample cd dtmcli-py-sample pip3 install flask dtmcli requests flask run  # 另起一个命令行 curl localhost:5000/api/fireSaga 

处理网络异常

假设提交给 dtm 的事务中,调用转入操作时,出现短暂的故障怎么办?按照 SAGA 事务的协议,dtm 会重试未完成的操作,这时我们要如何处理?故障有可能是转入操作完成后出网络故障,也有可能是转入操作完成中出现机器宕机。如何处理才能够保障账户余额的调整是正确无问题的?

这类网络异常的妥当处理,是分布式事务中的大难题,异常情况包括三类:重复请求、空补偿、悬挂,都需要正确处理

DTM 提供了子事务屏障功能,保证上述异常情况下的业务逻辑,只会有一次正确顺序下的成功提交。(子事务屏障详情参考分布式事务最经典的七种解决方案的子事务屏障环节)

我们把处理函数调整为:

@app.post("/api/TransOutSaga") def trans_out_saga():   with barrier.AutoCursor(conn_new()) as cursor:     def busi_callback(c):       saga_adjust_balance(c, out_uid, -30)     barrier_from_req(request).call(cursor, busi_callback)   return {"dtm_result": "SUCCESS"} 

这里的 barrier_from_req(request).call(cursor, busi_callback)调用会使用子事务屏障技术,保证 busi_callback 回调函数仅被提交一次​

您可以尝试多次调用这个 TransIn 服务,仅有一次余额调整。

处理回滚

假如银行将金额准备转入用户 2 时,发现用户 2 的账户异常,返回失败,会怎么样?我们调整处理函数,让转入操作返回失败

@app.post("/api/TransInSaga") def trans_in_saga():   return {"dtm_result": "FAILURE"} 

我们给出事务失败交互的时序图

image.png

这里有一点,TransIn 的正向操作什么都没有做,就返回了失败,此时调用 TransIn 的补偿操作,会不会导致反向调整出错了呢?

不用担心,前面的子事务屏障技术,能够保证 TransIn 的错误如果发生在提交之前,则补偿为空操作; TransIn 的错误如果发生在提交之后,则补偿操作会将数据提交一次。

您可以将返回错误的 TransIn 改成:

@app.post("/api/TransInSaga") def trans_in_saga():   with barrier.AutoCursor(conn_new()) as cursor:     def busi_callback(c):       saga_adjust_balance(c, in_uid, 30)     barrier_from_req(request).call(cursor, busi_callback)   return {"dtm_result": "FAILURE"} 

最后的结果余额依旧会是对的,原理可以参考:分布式事务最经典的七种解决方案的子事务屏障环节

小结

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

文中使用的 dtm 是新开源的 Golang 分布式事务管理框架,功能强大,支持 TCC 、SAGA 、XA 、事务消息等事务模式,支持 Go 、python 、PHP 、node 、csharp 等语言的。同时提供了非常简单易用的接口。

阅读完此篇干货,欢迎大家访问项目https://github.com/yedf/dtm,给颗星星支持!

intelij idea 能不能使用 wsl2 里面的 jdk?不用 Windows 的 jdk

Posted: 15 Aug 2021 11:28 AM PDT

我知道 go 语言可以在 vscode 里这样做,但是 Java 用 idea 可以吗?

软件工程师能力的相关性哪个占比更大

Posted: 15 Aug 2021 10:39 AM PDT

作为软件工程师,对 A:工程设计能力和 B:代码质量能力比较而言 C:人设能力

哪一项是更为重要的?

个人认为:

A:代码质量是基础,但是又很考验人的心思缜密性,是一项较为深度的能力。

B:工程设计能力更多像是锦上添花的能力,是站在第一个基础上才有的,但有时候事实又不是这样的。类似玩转各种设计模式,找到各种第三方库合理并优化的引入项目中。

C: 为啥人设也列为软件工程师能力范围内呢,因为我觉得即使做软件一样离不开和人打交道,而有时候可以见到很多不敲代码,只沟通和社交就解决问题的人,这里不指 PM,企业家等...单纯指软件工程师范畴。

大家说说这三项 A,B,C 能力的提高方式,以及大家是怎么一步步过来的,

如何可以逐渐过度,而不使人焦虑呢。

如何将 material-ui 的样式参数移到其他文件

Posted: 15 Aug 2021 10:37 AM PDT

前端初学者,目前在学习 material-ui 的使用,遇到如下问题 例如一个 Grid

<Grid   container   direction="row"   justifyContent="center"   alignItems="center" /> 

经过 prettier 格式化后,参数占用了太多行,导致结构看起来不清晰,我希望把 container,direction 等参数移动到其他文件里,如

<Grid class={"grid-root"}/> 
grid-root: {   container   direction="row"   justifyContent="center"   alignItems="center" } 

目前看到的办法

一个是自定义<Mygrid>,这种的问题是 grid 比较多的话需要自定义很多 grid,改起来不好改,

一个是用 material-ui 自带的 makeStyles,但是好像只能使用 css 的参数,我更想使用 material 的参数。

想请教正式项目中如何处理这一类问题。

一核一 GB 的主机,用编程语言开发业务,最佳是不是 nodejs AIO?

Posted: 15 Aug 2021 04:00 AM PDT

No comments:

Post a Comment